当前位置:首页 > JavaScript

原生js实现一个轮播图

2026-01-31 11:32:02JavaScript

实现基础结构

HTML部分需要创建一个容器,包含轮播图片列表和导航按钮:

<div class="slider-container">
  <div class="slider">
    <img src="image1.jpg" class="slide active">
    <img src="image2.jpg" class="slide">
    <img src="image3.jpg" class="slide">
  </div>
  <button class="prev-btn">&lt;</button>
  <button class="next-btn">&gt;</button>
  <div class="dots-container"></div>
</div>

添加基本样式

CSS确保轮播图可见且布局正确:

.slider-container {
  position: relative;
  width: 600px;
  height: 400px;
  margin: auto;
  overflow: hidden;
}

.slider {
  display: flex;
  transition: transform 0.5s ease;
}

.slide {
  min-width: 100%;
  height: 400px;
  object-fit: cover;
}

.prev-btn, .next-btn {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  background: rgba(0,0,0,0.5);
  color: white;
  border: none;
  padding: 10px;
  cursor: pointer;
  z-index: 10;
}

.prev-btn { left: 10px; }
.next-btn { right: 10px; }

.dots-container {
  position: absolute;
  bottom: 20px;
  left: 50%;
  transform: translateX(-50%);
  display: flex;
}

.dot {
  width: 12px;
  height: 12px;
  border-radius: 50%;
  background: #bbb;
  margin: 0 5px;
  cursor: pointer;
}

.dot.active {
  background: #333;
}

JavaScript核心功能

实现轮播逻辑和事件处理:

document.addEventListener('DOMContentLoaded', function() {
  const slider = document.querySelector('.slider');
  const slides = document.querySelectorAll('.slide');
  const prevBtn = document.querySelector('.prev-btn');
  const nextBtn = document.querySelector('.next-btn');
  const dotsContainer = document.querySelector('.dots-container');

  let currentIndex = 0;
  const totalSlides = slides.length;

  // 创建指示点
  slides.forEach((_, index) => {
    const dot = document.createElement('div');
    dot.classList.add('dot');
    if(index === 0) dot.classList.add('active');
    dot.addEventListener('click', () => goToSlide(index));
    dotsContainer.appendChild(dot);
  });

  const dots = document.querySelectorAll('.dot');

  // 更新轮播位置和活动状态
  function updateSlider() {
    slider.style.transform = `translateX(-${currentIndex * 100}%)`;

    slides.forEach(slide => slide.classList.remove('active'));
    slides[currentIndex].classList.add('active');

    dots.forEach(dot => dot.classList.remove('active'));
    dots[currentIndex].classList.add('active');
  }

  // 跳转到指定幻灯片
  function goToSlide(index) {
    currentIndex = (index + totalSlides) % totalSlides;
    updateSlider();
  }

  // 下一张
  function nextSlide() {
    goToSlide(currentIndex + 1);
  }

  // 上一张
  function prevSlide() {
    goToSlide(currentIndex - 1);
  }

  // 按钮事件
  nextBtn.addEventListener('click', nextSlide);
  prevBtn.addEventListener('click', prevSlide);

  // 自动轮播
  let interval = setInterval(nextSlide, 3000);

  // 鼠标悬停暂停
  slider.addEventListener('mouseenter', () => clearInterval(interval));
  slider.addEventListener('mouseleave', () => {
    interval = setInterval(nextSlide, 3000);
  });
});

添加触摸支持

为移动设备添加触摸事件处理:

let touchStartX = 0;
let touchEndX = 0;

slider.addEventListener('touchstart', (e) => {
  touchStartX = e.changedTouches[0].screenX;
  clearInterval(interval);
});

slider.addEventListener('touchend', (e) => {
  touchEndX = e.changedTouches[0].screenX;
  handleSwipe();
  interval = setInterval(nextSlide, 3000);
});

function handleSwipe() {
  const threshold = 50;
  if (touchEndX < touchStartX - threshold) {
    nextSlide();
  } else if (touchEndX > touchStartX + threshold) {
    prevSlide();
  }
}

响应式调整

添加窗口大小变化的处理:

function resizeHandler() {
  const container = document.querySelector('.slider-container');
  const slides = document.querySelectorAll('.slide');

  container.style.height = `${container.offsetWidth * 0.666}px`;
  slides.forEach(slide => {
    slide.style.height = `${container.offsetWidth * 0.666}px`;
  });
}

window.addEventListener('resize', resizeHandler);
resizeHandler();

无限循环优化

修改跳转逻辑实现无缝循环:

function goToSlide(index) {
  currentIndex = (index + totalSlides) % totalSlides;

  // 添加过渡效果
  slider.style.transition = 'transform 0.5s ease';

  // 处理边界情况
  if (currentIndex === totalSlides - 1) {
    setTimeout(() => {
      slider.style.transition = 'none';
      currentIndex = 0;
      slider.style.transform = `translateX(0)`;
    }, 500);
  } else if (currentIndex === 0) {
    setTimeout(() => {
      slider.style.transition = 'none';
      currentIndex = totalSlides - 2;
      slider.style.transform = `translateX(-${currentIndex * 100}%)`;
    }, 500);
  }

  updateSlider();
}

原生js实现一个轮播图

标签: js轮播图
分享给朋友:

相关文章

vue.js实现轮播

vue.js实现轮播

Vue.js 实现轮播功能 使用第三方库(推荐) Vue.js 生态中有许多成熟的轮播组件库,例如 vue-awesome-swiper 或 swiper,它们功能丰富且易于集成。 安装 swipe…

js实现vue

js实现vue

Vue.js 简介 Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。其核心库专注于视图层,易于与其他库或现有项目整合。 实现 Vue.js 的基本步骤 安装 Vue.j…

js实现跳转

js实现跳转

使用 window.location 跳转 通过修改 window.location.href 实现页面跳转,这是最常用的方法。 window.location.href = 'https:/…

js实现

js实现

实现 JavaScript 功能的方法 在 JavaScript 中实现特定功能通常涉及多个步骤。以下是常见的实现方法: 基础语法和变量声明 使用 let 或 const 声明变量: let co…

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 通过监听鼠标事件(mousedown、mousemove、mouseup)实现拖拽功能。以下是核心代码逻辑: const draggableElement = document…

js实现全屏

js实现全屏

实现全屏的基本方法 使用JavaScript实现全屏功能主要依赖Element.requestFullscreen()方法。现代浏览器均支持此API,但不同浏览器可能需要添加前缀。 // 触发全屏…