当前位置:首页 > JavaScript

js实现轮播海报

2026-02-03 01:36:08JavaScript

实现轮播海报的基本思路

轮播海报通常通过定时切换图片或内容实现动态展示效果。核心逻辑包括:图片切换、动画过渡、定时器控制以及用户交互(如手动切换)。

HTML 结构

基础HTML结构包含一个容器包裹多个轮播项(图片或其他内容),以及导航按钮或指示器:

<div class="slider-container">
  <div class="slider-wrapper">
    <div class="slider-item">内容1</div>
    <div class="slider-item">内容2</div>
    <div class="slider-item">内容3</div>
  </div>
  <!-- 导航按钮 -->
  <button class="prev-btn">上一张</button>
  <button class="next-btn">下一张</button>
  <!-- 指示器 -->
  <div class="indicator"></div>
</div>

CSS 样式

通过CSS设置轮播项的布局和过渡效果:

.slider-container {
  position: relative;
  overflow: hidden;
  width: 100%;
}

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

.slider-item {
  min-width: 100%;
  height: 300px;
}

.prev-btn, .next-btn {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  z-index: 10;
}

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

JavaScript 核心逻辑

通过操作DOM和定时器实现自动轮播:

document.addEventListener('DOMContentLoaded', function() {
  const sliderWrapper = document.querySelector('.slider-wrapper');
  const sliderItems = document.querySelectorAll('.slider-item');
  const prevBtn = document.querySelector('.prev-btn');
  const nextBtn = document.querySelector('.next-btn');
  const indicator = document.querySelector('.indicator');

  let currentIndex = 0;
  const totalItems = sliderItems.length;

  // 初始化指示器
  function initIndicator() {
    for (let i = 0; i < totalItems; i++) {
      const dot = document.createElement('span');
      dot.classList.add('dot');
      if (i === 0) dot.classList.add('active');
      dot.addEventListener('click', () => goToIndex(i));
      indicator.appendChild(dot);
    }
  }

  // 切换至指定索引
  function goToIndex(index) {
    currentIndex = (index + totalItems) % totalItems;
    sliderWrapper.style.transform = `translateX(-${currentIndex * 100}%)`;
    updateIndicator();
  }

  // 更新指示器状态
  function updateIndicator() {
    const dots = document.querySelectorAll('.dot');
    dots.forEach((dot, i) => {
      dot.classList.toggle('active', i === currentIndex);
    });
  }

  // 自动轮播
  let timer = setInterval(() => {
    goToIndex(currentIndex + 1);
  }, 3000);

  // 鼠标悬停暂停轮播
  sliderWrapper.addEventListener('mouseenter', () => clearInterval(timer));
  sliderWrapper.addEventListener('mouseleave', () => {
    timer = setInterval(() => {
      goToIndex(currentIndex + 1);
    }, 3000);
  });

  // 按钮事件
  prevBtn.addEventListener('click', () => goToIndex(currentIndex - 1));
  nextBtn.addEventListener('click', () => goToIndex(currentIndex + 1));

  initIndicator();
});

无限循环优化

通过克隆首尾元素实现无缝轮播:

// 克隆首尾元素
const firstItem = sliderItems[0].cloneNode(true);
const lastItem = sliderItems[totalItems - 1].cloneNode(true);
sliderWrapper.appendChild(firstItem);
sliderWrapper.insertBefore(lastItem, sliderItems[0]);

// 调整初始位置
sliderWrapper.style.transform = 'translateX(-100%)';
currentIndex = 1;

// 修改切换逻辑
function goToIndex(index) {
  currentIndex = index;
  sliderWrapper.style.transition = 'transform 0.5s ease';
  sliderWrapper.style.transform = `translateX(-${currentIndex * 100}%)`;

  // 边界检测
  if (currentIndex === totalItems + 1) {
    setTimeout(() => {
      sliderWrapper.style.transition = 'none';
      currentIndex = 1;
      sliderWrapper.style.transform = `translateX(-${currentIndex * 100}%)`;
    }, 500);
  } else if (currentIndex === 0) {
    setTimeout(() => {
      sliderWrapper.style.transition = 'none';
      currentIndex = totalItems;
      sliderWrapper.style.transform = `translateX(-${currentIndex * 100}%)`;
    }, 500);
  }
}

触摸事件支持

添加移动端触摸滑动支持:

let startX = 0;
let moveX = 0;

sliderWrapper.addEventListener('touchstart', (e) => {
  startX = e.touches[0].clientX;
  clearInterval(timer);
});

sliderWrapper.addEventListener('touchmove', (e) => {
  moveX = e.touches[0].clientX - startX;
  sliderWrapper.style.transform = `translateX(calc(-${currentIndex * 100}% + ${moveX}px))`;
});

sliderWrapper.addEventListener('touchend', () => {
  if (moveX > 50) {
    goToIndex(currentIndex - 1);
  } else if (moveX < -50) {
    goToIndex(currentIndex + 1);
  } else {
    sliderWrapper.style.transform = `translateX(-${currentIndex * 100}%)`;
  }
  timer = setInterval(() => {
    goToIndex(currentIndex + 1);
  }, 3000);
});

js实现轮播海报

标签: 海报js
分享给朋友:

相关文章

js实现倒计时

js实现倒计时

实现倒计时的基本方法 使用 JavaScript 实现倒计时功能可以通过 setInterval 或 setTimeout 结合日期计算来完成。以下是几种常见的实现方式: 使用 setInterv…

js实现验证码

js实现验证码

使用Canvas生成图形验证码 在HTML中创建一个Canvas元素用于绘制验证码。通过JavaScript随机生成数字或字母组合,并添加干扰线、噪点等干扰元素增强安全性。 <canvas…

js实现继承

js实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例可以访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Parent…

js 实现倒计时

js 实现倒计时

实现倒计时的基本方法 使用 JavaScript 实现倒计时可以通过 setInterval 或 setTimeout 结合日期计算来完成。以下是两种常见实现方式。 使用 setInterval…

js实现日历

js实现日历

实现日历的基本思路 使用JavaScript实现日历的核心是动态生成日期表格,并处理月份切换逻辑。需要计算当前月的天数、起始星期几,并动态渲染到页面上。 获取当前日期信息 通过Date对象获取当前…

js 实现继承

js 实现继承

原型链继承 通过让子类的原型对象指向父类的实例来实现继承。子类实例可以访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Par…