当前位置:首页 > 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实现防洪

防抖(Debounce)实现 防抖的核心思想是在事件触发后延迟执行回调函数,若在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口调整等场景。 function debounce(func,…

利用js实现

利用js实现

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

js实现的游戏

js实现的游戏

JavaScript 游戏开发基础 JavaScript 是开发网页游戏的流行选择,因其无需插件即可在浏览器中运行。以下是一些关键技术和资源: HTML5 Canvas Canvas 提供了绘制图形…

js实现 拖动

js实现 拖动

实现拖动的步骤 HTML 结构 创建一个可拖动的元素和一个放置区域: <div id="draggable" draggable="true">拖动我</div> <d…

js 实现图片轮播

js 实现图片轮播

基础实现方案 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS负责样式布局,JavaScript处理轮播逻辑。 <div class="…

js实现左右滑动

js实现左右滑动

实现左右滑动的 JavaScript 方法 监听触摸事件 通过 touchstart、touchmove 和 touchend 事件来检测用户的手势操作。记录触摸的起始位置和移动距离,判断滑动方向。…