当前位置:首页 > JavaScript

js实现轮播海报

2026-02-03 01:36:08JavaScript

实现轮播海报的基本思路

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

HTML 结构

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

js实现轮播海报

<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和定时器实现自动轮播:

js实现轮播海报

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实现验证码

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

js实现换肤

js实现换肤

使用CSS变量实现换肤 通过CSS变量可以轻松实现主题切换功能。CSS变量在根元素中定义,通过JavaScript动态修改这些变量值。 :root { --primary-color: #349…

js jquery

js jquery

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画设计和 Ajax 交互。它兼容多种浏览器,提供易于使用的 API,使开发者能够…

js实现图

js实现图

JavaScript 实现图的常用方法 在 JavaScript 中,图(Graph)可以通过多种方式实现,常见的包括邻接表(Adjacency List)和邻接矩阵(Adjacency Matrix…

利用js实现

利用js实现

使用 JavaScript 实现 在 JavaScript 中,可以通过多种方式实现功能,具体取决于需求。以下是几种常见的方法: 方法一:使用原生 JavaScript // 示例代码…

节流js实现

节流js实现

节流(Throttle)的实现原理 节流是一种限制函数执行频率的技术,确保函数在一定时间间隔内最多执行一次。适用于高频触发事件(如滚动、输入、窗口调整等)的场景。 基础实现方式 使用时间戳判断是否执…