JS图片轮播如何实现缩略图主图联动及淡入效果
图片轮播组件联动+淡入效果实现方案
原有箭头切换的基础DOM结构可用,废弃原来移动DOM节点的切换逻辑,改用索引匹配的方式实现联动,同时叠加淡入过渡,代码可直接运行。
改动说明
- 废弃原有移动DOM节点的切换逻辑,统一通过图片索引同步主图、缩略图的激活状态
- 主图区域改为相对定位,所有轮播图绝对定位叠放,通过
opacity属性实现0.4s的淡入淡出过渡 - 箭头切换、缩略图点击都调用同一个切换函数,自动处理循环轮播边界、active状态更新
- HTML结构无需修改,直接替换CSS和JS代码即可生效
完整CSS代码
* { box-sizing: border-box; } body { background-color: #555; height: 100vh; display: grid; align-items: center; justify-items: center; } div#slides_wrapper { width: 400px; display: flex; border: 2px solid #efefef; justify-content: space-between; margin-bottom: 20px; } div#slides_wrapper div#slides { width: 300px; height: 225px; overflow: hidden; position: relative; background-color: #0ff3; } img.slide { width: 100%; height: 100%; object-fit: cover; position: absolute; top: 0; left: 0; opacity: 0; transition: opacity 0.4s ease; } img.slide.active { opacity: 1; } img.thumbnail { width: 50px; height: 50px; object-fit: cover; } div.slide_arrow { font-size: 20px; background-color: #0f0f0f; color: #f0f0f0; height: 40px; width: 40px; display: grid; justify-items: center; align-items: center; align-self: center; z-index: 10; } div.slide_arrow:hover { cursor: pointer; } div.slide_arrow#slide_left { border-top-right-radius: 10px; border-bottom-right-radius: 10px; } div.slide_arrow#slide_right { border-top-left-radius: 10px; border-bottom-left-radius: 10px; } div#thumbnails { width: 400px; display: flex; flex-wrap: wrap; justify-content: space-around; } div#thumbnails img.thumbnail { background-color: #888; margin: 5px; } div#thumbnails img.thumbnail:hover { cursor: pointer; } div#thumbnails img.thumbnail.active { border: 2px solid #0ff; }
完整JS代码
// 获取DOM节点 const leftArrow = document.querySelector('#slide_left') const rightArrow = document.querySelector('#slide_right') const slides = document.querySelectorAll('.slide') const thumbnails = document.querySelectorAll('.thumbnail') // 初始化当前激活索引,默认显示第一张 let currentIndex = 0 const total = slides.length // 统一切换方法 function switchTo(targetIndex) { // 循环边界处理 if (targetIndex < 0) targetIndex = total - 1 if (targetIndex >= total) targetIndex = 0 // 清空所有激活状态 slides.forEach(item => item.classList.remove('active')) thumbnails.forEach(item => item.classList.remove('active')) // 激活目标索引对应的主图和缩略图 slides[targetIndex].classList.add('active') thumbnails[targetIndex].classList.add('active') // 更新当前索引 currentIndex = targetIndex } // 左箭头切换 leftArrow.addEventListener('click', () => switchTo(currentIndex - 1)) // 右箭头切换 rightArrow.addEventListener('click', () => switchTo(currentIndex + 1)) // 缩略图点击切换 thumbnails.forEach((thumb, idx) => { thumb.addEventListener('click', () => switchTo(idx)) }) // 初始化默认状态 switchTo(0)
HTML说明
原有HTML结构完全保留即可,不需要做任何修改,主图和缩略图的顺序一一对应,代码会自动按索引匹配。
实现效果:
- 点击左右箭头循环切换图片,带0.4s淡入淡出效果,对应缩略图自动高亮
- 点击任意缩略图,主图直接切换到对应图片,带淡入效果
- 图片自动适配容器尺寸,不会出现拉伸变形
内容的提问来源于stack exchange,提问作者Matrion
相关产品推荐
相关产品推荐

