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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 07:54:33