使用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
相关产品推荐
相关产品推荐

