当前位置:首页 > JavaScript

js实现选中缩略图

2026-01-31 08:07:59JavaScript

实现选中缩略图的基本思路

通过监听缩略图的点击事件,动态切换选中状态样式,通常结合高亮边框或透明度变化来区分选中与未选中状态。核心逻辑包括DOM操作、事件监听和样式切换。

HTML结构示例

<div class="thumbnail-container">
  <img src="thumb1.jpg" class="thumbnail" data-index="0">
  <img src="thumb2.jpg" class="thumbnail" data-index="1">
  <img src="thumb3.jpg" class="thumbnail" data-index="2">
</div>

CSS样式准备

.thumbnail {
  width: 100px;
  height: 100px;
  margin: 5px;
  cursor: pointer;
  border: 2px solid transparent;
  transition: border-color 0.3s;
}

.thumbnail.selected {
  border-color: #007bff;
  opacity: 0.8;
}

JavaScript实现方案

方案一:基础事件监听

document.querySelectorAll('.thumbnail').forEach(thumb => {
  thumb.addEventListener('click', function() {
    // 移除所有缩略图的选中状态
    document.querySelectorAll('.thumbnail').forEach(t => {
      t.classList.remove('selected');
    });
    // 为当前点击的缩略图添加选中状态
    this.classList.add('selected');
  });
});

方案二:事件委托优化

js实现选中缩略图

document.querySelector('.thumbnail-container').addEventListener('click', (e) => {
  if (e.target.classList.contains('thumbnail')) {
    document.querySelectorAll('.thumbnail').forEach(t => {
      t.classList.remove('selected');
    });
    e.target.classList.add('selected');
  }
});

方案三:带数据索引的扩展

let currentSelectedIndex = null;

document.querySelector('.thumbnail-container').addEventListener('click', (e) => {
  const thumb = e.target.closest('.thumbnail');
  if (!thumb) return;

  const index = thumb.dataset.index;
  if (currentSelectedIndex !== index) {
    document.querySelector(`.thumbnail[data-index="${currentSelectedIndex}"]`)
      ?.classList.remove('selected');
    thumb.classList.add('selected');
    currentSelectedIndex = index;
  }
});

高级功能实现

缩略图与主图联动

js实现选中缩略图

const mainImage = document.getElementById('main-image');

document.querySelector('.thumbnail-container').addEventListener('click', (e) => {
  const thumb = e.target.closest('.thumbnail');
  if (!thumb) return;

  document.querySelectorAll('.thumbnail').forEach(t => {
    t.classList.remove('selected');
  });
  thumb.classList.add('selected');

  // 同步更新主图
  mainImage.src = thumb.src.replace('thumb', 'large');
});

键盘导航支持

document.addEventListener('keydown', (e) => {
  if (!['ArrowLeft', 'ArrowRight'].includes(e.key)) return;

  const thumbs = document.querySelectorAll('.thumbnail');
  const currentIndex = Array.from(thumbs).findIndex(t => 
    t.classList.contains('selected')
  );

  let newIndex = currentIndex;
  if (e.key === 'ArrowLeft') newIndex = Math.max(0, currentIndex - 1);
  if (e.key === 'ArrowRight') newIndex = Math.min(thumbs.length - 1, currentIndex + 1);

  if (newIndex !== currentIndex) {
    thumbs[currentIndex]?.classList.remove('selected');
    thumbs[newIndex].classList.add('selected');
    thumbs[newIndex].scrollIntoView({ behavior: 'smooth', block: 'nearest' });
  }
});

性能优化建议

使用事件委托替代单独的事件监听器,减少内存占用。对于大量缩略图,考虑虚拟滚动技术。动态加载缩略图时,使用Intersection Observer实现懒加载。

const observer = new IntersectionObserver((entries) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      const img = entry.target;
      img.src = img.dataset.src;
      observer.unobserve(img);
    }
  });
});

document.querySelectorAll('.thumbnail[data-src]').forEach(img => {
  observer.observe(img);
});

标签: 缩略图js
分享给朋友:

相关文章

js实现图片轮播

js实现图片轮播

实现基础图片轮播 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS设置样式和动画效果,JavaScript处理轮播逻辑。 <div cl…

js实现类

js实现类

JavaScript 实现类的几种方式 JavaScript 是一种基于原型的语言,但在 ES6 之后引入了 class 语法糖,使得实现类更加直观。以下是几种常见的实现方式: 使用构造函数 传统的…

js实现延迟

js实现延迟

实现延迟的方法 在JavaScript中,实现延迟操作有多种方式,以下是几种常见的方法: 使用setTimeout函数 setTimeout是JavaScript中最常用的延迟执行方法。它接受一个回…

js类实现

js类实现

使用类实现 JavaScript 功能 在 JavaScript 中,类(Class)是一种语法糖,基于原型继承机制。通过 class 关键字可以更直观地定义对象模板。 基本类定义 class…

js实现游标

js实现游标

使用JavaScript实现游标 在JavaScript中,可以通过操作DOM元素的cursor样式属性来实现自定义游标效果。以下是几种常见的实现方法: 修改默认鼠标指针样式 通过CSS的curso…

js实现下拉刷新

js实现下拉刷新

监听触摸事件 通过监听 touchstart、touchmove 和 touchend 事件来检测用户下拉手势。记录触摸起始位置和移动距离。 let startY = 0; let currentY…