You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用jQuery的this关键字,单函数实现图片点击滑出DIV且单实例展示

解决方案:图片网格点击滑出剧集信息面板

嘿,我明白你想要实现的效果了——图片网格点击滑出带剧集名称和HTML5音频的面板,而且同一时间只能显示一个。结合你有jQuery基础但有点生疏的情况,我给你整理了一套完整的实现方案,一步步来:

一、先搭好HTML和基础样式

首先我们需要基础的结构,包含图片网格和对应的隐藏面板,我已经帮你写好了可直接复用的代码,样式也做了基础适配:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>剧集图片网格</title>
    <!-- 只引入一个jQuery版本就行,避免冲突 -->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
    <style>
        /* 响应式图片网格 */
        .image-grid {
            display: grid;
            grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
            gap: 15px;
            padding: 20px;
            max-width: 1200px;
            margin: 0 auto;
        }
        .grid-item {
            cursor: pointer;
            transition: transform 0.2s ease;
        }
        .grid-item:hover {
            transform: scale(1.03);
        }
        .grid-item img {
            width: 100%;
            height: auto;
            border-radius: 8px;
            box-shadow: 0 2px 8px rgba(0,0,0,0.1);
        }
        /* 滑出面板样式 */
        .episode-panel {
            position: fixed;
            right: -420px; /* 初始隐藏在屏幕右侧 */
            top: 0;
            width: 400px;
            height: 100vh;
            background: #ffffff;
            box-shadow: -2px 0 12px rgba(0,0,0,0.15);
            padding: 20px;
            transition: right 0.3s cubic-bezier(0.4, 0, 0.2, 1);
            overflow-y: auto;
            z-index: 100;
        }
        .episode-panel.active {
            right: 0; /* 激活后滑入屏幕 */
        }
        .close-btn {
            cursor: pointer;
            font-size: 24px;
            text-align: right;
            margin-bottom: 18px;
            color: #666;
        }
        .close-btn:hover {
            color: #000;
        }
        .episode-title {
            font-size: 22px;
            font-weight: 600;
            margin-bottom: 12px;
            color: #333;
        }
        audio {
            width: 100%;
            margin-top: 10px;
        }
    </style>
</head>
<body>
    <!-- 图片网格容器 -->
    <div class="image-grid">
        <!-- 示例图片项,data-panel绑定对应的面板ID -->
        <div class="grid-item" data-panel="panel-episode-1">
            <img src="your-episode-1-cover.jpg" alt="剧集1封面">
        </div>
        <div class="grid-item" data-panel="panel-episode-2">
            <img src="your-episode-2-cover.jpg" alt="剧集2封面">
        </div>
        <!-- 可以继续添加更多图片项 -->
    </div>

    <!-- 剧集信息面板 -->
    <div class="episode-panel" id="panel-episode-1">
        <div class="close-btn">×</div>
        <div class="episode-title">《XX剧集 第一季 第一集》</div>
        <p>这里可以添加剧集的简短描述内容,比如剧情简介之类的</p>
        <audio controls>
            <source src="episode-1-audio.mp3" type="audio/mpeg">
            你的浏览器不支持HTML5音频播放
        </audio>
    </div>
    <div class="episode-panel" id="panel-episode-2">
        <div class="close-btn">×</div>
        <div class="episode-title">《XX剧集 第一季 第二集》</div>
        <p>这是第二集的简介内容,按需添加即可</p>
        <audio controls>
            <source src="episode-2-audio.mp3" type="audio/mpeg">
            你的浏览器不支持HTML5音频播放
        </audio>
    </div>

    <script>
        // jQuery核心交互逻辑
        $(document).ready(function() {
            // 点击图片项打开对应面板
            $('.grid-item').click(function() {
                const targetPanel = $(this).data('panel');
                
                // 先关闭所有已打开的面板(确保同一时间只显示一个)
                $('.episode-panel.active').removeClass('active');
                
                // 打开目标面板
                $('#' + targetPanel).addClass('active');
            });

            // 点击关闭按钮关闭面板
            $('.close-btn').click(function() {
                $(this).closest('.episode-panel').removeClass('active');
            });

            // 点击面板外部区域关闭所有面板
            $(document).click(function(e) {
                const isClickInsideGrid = $(e.target).closest('.grid-item').length;
                const isClickInsidePanel = $(e.target).closest('.episode-panel').length;
                
                if (!isClickInsideGrid && !isClickInsidePanel) {
                    $('.episode-panel.active').removeClass('active');
                }
            });
        });
    </script>
</body>
</html>

二、关键逻辑拆解(帮你回忆jQuery用法)

  • 响应式网格:用CSS Grid的repeat(auto-fill, minmax(200px, 1fr))实现自动适配屏幕的列数,不用写媒体查询也能在手机、平板上正常显示。
  • 滑出动画:通过CSS的transition属性配合right值变化实现平滑滑入滑出,比用jQuery的animate()更流畅。
  • 核心jQuery交互:
    • 用data-panel属性把图片和对应的面板绑定起来,点击图片时通过$(this).data('panel')拿到目标面板ID。
    • 每次打开新面板前,先移除所有面板的active类,这样就保证了同一时间只有一个面板显示。
    • 关闭按钮用closest('.episode-panel')找到父级面板,不用写重复代码,新增面板也不用改JS。
    • 点击外部关闭面板的逻辑,判断点击区域是否在图片或面板内,不在的话就关闭所有面板,提升用户体验。

三、自定义调整建议

  • 如果你想让面板从左侧滑出,只需要把CSS里的right改成left,初始值设为-420px,active时设为0就行。
  • 网格的列宽可以修改minmax(200px, 1fr)里的200px,比如改成250px让图片更大。
  • 面板的样式(背景色、宽度、阴影)都可以在.episode-panel类里调整,改成你想要的风格。
  • 记得把示例里的图片和音频路径替换成你自己的资源路径哦。

小提醒

你之前的代码里引入了两个不同版本的jQuery(2.1.1和3.3.1),这样很容易引发冲突,建议只保留一个较新的版本(比如示例里的3.6.0)。

内容的提问来源于stack exchange,提问作者Arnie C

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:45:53