js实现轮播图效果 纯js实现图片自动切换

yizhihongxing

下面我将为您详细讲解如何使用纯js实现轮播图效果,并提供两个示例。

轮播图效果的实现

核心思路

实现轮播图效果,主要的核心思路是使用定时器(setInterval)对图片进行自动切换,并且在用户触发左右切换按钮时进行图片的手动切换。

具体来说,实现图片的自动切换需要以下步骤:

  1. 获取图片容器和图片列表的宽度、当前图片的索引
  2. 使用定时器不断地切换图片,每隔一定的时间,将图片列表向左偏移一个图片的宽度,同时将当前图片的索引加1
  3. 当当前图片的索引大于等于图片列表的长度时,将图片列表设置为初始状态,将当前图片的索引置为0

实现图片的手动切换需要以下步骤:

  1. 给左右切换按钮添加点击事件监听器
  2. 在事件监听器中根据点击按钮的不同,调整当前图片索引的值
  3. 利用当前索引的值重新计算图片列表的偏移量并实现偏移

示例1:基本轮播图实现

下面提供一个基本的轮播图实现示例。这个轮播图包含两个按钮,即左右切换按钮,同时可以自动轮播。在轮播期间,用户可以通过点击左右切换按钮实现图片的手动切换。

HTML 代码:

<div class="slider">
  <ul class="slider__list">
    <li class="slider__item"><img src="img/01.jpg" alt=""></li>
    <li class="slider__item"><img src="img/02.jpg" alt=""></li>
    <li class="slider__item"><img src="img/03.jpg" alt=""></li>
    <li class="slider__item"><img src="img/04.jpg" alt=""></li>
    <li class="slider__item"><img src="img/05.jpg" alt=""></li>
  </ul>
  <button class="slider__btn slider__btn--prev">上一张</button>
  <button class="slider__btn slider__btn--next">下一张</button>
</div>

CSS 代码:

.slider {
  position: relative;
  width: 400px;
  height: 300px;
  overflow: hidden;
}

.slider__list {
  position: absolute;
  top: 0;
  left: 0;
  width: 2000px;
  height: 300px;
  margin: 0;
  padding: 0;
  transition: all 500ms ease;
}

.slider__item {
  position: relative;
  float: left;
  width: 400px;
  height: 300px;
  list-style: none;
}

JS 代码:

// 获取相关元素
const slider = document.querySelector('.slider');
const sliderList = slider.querySelector('.slider__list');
const sliderItem = slider.querySelectorAll('.slider__item');
const sliderBtnPrev = slider.querySelector('.slider__btn--prev');
const sliderBtnNext = slider.querySelector('.slider__btn--next');

// 轮播图参数设置
const imgWidth = sliderItem[0].offsetWidth; // 图片宽度
let currentImgIndex = 0; // 当前显示的图片索引
let timerId = null; // 定时器id

// 启动轮播
function startSlider() {
  timerId = setInterval(() => {
    currentImgIndex++;
    if (currentImgIndex >= sliderItem.length) {
      currentImgIndex = 0;
    }
    const offset = -currentImgIndex * imgWidth;
    sliderList.style.transform = `translateX(${offset}px)`;
  }, 3000);
}

// 停止轮播
function stopSlider() {
  clearInterval(timerId);
}

// 注册事件监听器
slider.addEventListener('mouseover', stopSlider);
slider.addEventListener('mouseout', startSlider);

sliderBtnPrev.addEventListener('click', () => {
  currentImgIndex--;
  if (currentImgIndex < 0) {
    currentImgIndex = sliderItem.length - 1;
  }
  const offset = -currentImgIndex * imgWidth;
  sliderList.style.transform = `translateX(${offset}px)`;
});

sliderBtnNext.addEventListener('click', () => {
  currentImgIndex++;
  if (currentImgIndex >= sliderItem.length) {
    currentImgIndex = 0;
  }
  const offset = -currentImgIndex * imgWidth;
  sliderList.style.transform = `translateX(${offset}px)`;
});

startSlider();

以上代码中,startSlider 函数用于启动轮播定时器,stopSlider 函数用于停止定时器。使用事件监听器在鼠标移入、移出时启动/停止轮播。在左右按钮的点击事件监听器中,根据点击不同的按钮调整当前图片的索引,并计算新的偏移量。

示例2:带自动滑动缓动的轮播图实现

下面提供一个带有自动滑动缓动效果的实现示例。在这个示例中,轮播图的移动不是突兀的,而是带有一定的滑动缓动效果。除此之外,这个轮播图和上一个示例基本相同。

HTML 代码:

<div class="slider">
  <ul class="slider__list">
    <li class="slider__item"><img src="img/01.jpg" alt=""></li>
    <li class="slider__item"><img src="img/02.jpg" alt=""></li>
    <li class="slider__item"><img src="img/03.jpg" alt=""></li>
    <li class="slider__item"><img src="img/04.jpg" alt=""></li>
    <li class="slider__item"><img src="img/05.jpg" alt=""></li>
  </ul>
  <button class="slider__btn slider__btn--prev">上一张</button>
  <button class="slider__btn slider__btn--next">下一张</button>
</div>

CSS 代码:

.slider {
  position: relative;
  width: 400px;
  height: 300px;
  overflow: hidden;
}

.slider__list {
  position: absolute;
  top: 0;
  left: 0;
  width: 2000px;
  height: 300px;
  margin: 0;
  padding: 0;
  transition: all 0.5s ease-out;
}

.slider__item {
  position: relative;
  float: left;
  width: 400px;
  height: 300px;
  list-style: none;
}

JS 代码:

// 获取相关元素
const slider = document.querySelector('.slider');
const sliderList = slider.querySelector('.slider__list');
const sliderItem = slider.querySelectorAll('.slider__item');
const sliderBtnPrev = slider.querySelector('.slider__btn--prev');
const sliderBtnNext = slider.querySelector('.slider__btn--next');

// 启动轮播
const imgWidth = sliderItem[0].offsetWidth; // 图片宽度
let currentImgIndex = 0; // 当前显示的图片索引
let timerId = null; // 定时器id

function slide() {
  currentImgIndex++;
  if (currentImgIndex >= sliderItem.length) {
    currentImgIndex = 0;
  }
  const offset = -currentImgIndex * imgWidth;
  sliderList.style.transform = `translateX(${offset}px)`;
}

function startSlider() {
  timerId = setInterval(() => {
    slide();
    sliderList.style.transition = 'all 0.5s ease-out';
  }, 3000);
}

// 停止轮播
function stopSlider() {
  clearInterval(timerId);
}

// 注册事件监听器
slider.addEventListener('mouseover', stopSlider);
slider.addEventListener('mouseout', () => {
  startSlider();
  sliderList.style.transition = 'none';
});

sliderBtnPrev.addEventListener('click', () => {
  currentImgIndex--;
  if (currentImgIndex < 0) {
    currentImgIndex = sliderItem.length - 1;
  }
  const offset = -currentImgIndex * imgWidth;
  sliderList.style.transform = `translateX(${offset}px)`;
  sliderList.style.transition = 'all 0.5s ease-out';
});

sliderBtnNext.addEventListener('click', () => {
  slide();
  sliderList.style.transition = 'all 0.5s ease-out';
});

startSlider();

以上代码中,slide 函数用于实现图片的自动切换。在启动定时器时,除了执行 slide 函数外,还将轮播图容器的 transition 属性设为缓动效果。在鼠标移出时,将 transition 属性设为 none,这样轮播图就可以在切换时没有缓动效果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:js实现轮播图效果 纯js实现图片自动切换 - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • JavaScript 防抖和节流详解

    JavaScript 防抖和节流详解 前言 在 JavaScript 开发中,我们经常会遇到一些高频触发的事件,如 resize、scroll、input等,这些事件在触发时由于其高频次和高并发性,往往会造成网页的性能问题,影响用户体验。所以我们需要一些手段来限制这些事件的触发次数、缩短响应间隔,以避免过度渲染,浪费资源等性能问题。 常见的限制高频触发的方法…

    JavaScript 2023年6月10日
    00
  • 解析element-ui中upload组件传递文件及其他参数的问题

    解析element-ui中upload组件传递文件及其他参数的问题,需要分步骤进行操作。 第一步:引入Element-ui组件 首先需要在Vue项目中引入Element-ui组件: <template> <el-upload class="upload-demo" ref="upload" :acti…

    JavaScript 2023年6月10日
    00
  • JavaScript中的Screen屏幕对象

    当我们在Web中使用JavaScript时,有一些内置对象可以帮助我们进行与页面相关的操作,其中就包括了Screen屏幕对象。本文将详细介绍JavaScript中的Screen对象,包括其常见属性和方法,并给出两个示例说明。 Screen对象概述 所谓Screen对象,指的是代表用户屏幕的对象,该对象包含了屏幕的基本信息,例如屏幕的宽度、高度、像素密度等,同…

    JavaScript 2023年6月11日
    00
  • javascript深拷贝的几种情况总结

    JavaScript深拷贝的几种情况总结 在 JavaScript 中,对于对象的赋值,常常会遇到浅拷贝和深拷贝的问题。浅拷贝只复制对象的引用,而深拷贝则是复制对象的值。这篇文章将总结 JavaScript 中深拷贝的几种情况以及对应的实现方法。 基本数据类型 字符串、数值、布尔类型(string, number, boolean) 基本数据类型的深拷贝非常…

    JavaScript 2023年6月10日
    00
  • JavaScript 滚轮事件使用说明

    下面为大家详细讲解JavaScript滚轮事件使用说明的完整攻略。 一、什么是JavaScript滚轮事件 JavaScript可以监听各种用户输入事件,其中包括鼠标滚轮事件。鼠标滚轮事件通常用来控制页面或者应用的滚动条滚动,也可以用来做一些交互效果。 二、滚轮事件原理 鼠标滚轮事件原理和其他鼠标事件类似,需要通过事件监听和回调函数来实现。当鼠标滚轮发生滚动…

    JavaScript 2023年6月10日
    00
  • 一文详解JavaScript中的replace()函数

    当我们需要对字符串中的某个子串进行替换时,JavaScript中的 replace() 函数是一个非常有用的工具。本文将详细讲解该函数的基本语法、常用选项以及一些实际的应用示例。 基本语法 replace() 函数的基本语法如下: string.replace(regexp|substr, newSubstr|function) 其中,string 是原始字…

    JavaScript 2023年5月28日
    00
  • 跟我学习javascript的严格模式

    接下来我将为大家详细介绍“跟我学习JavaScript的严格模式”的完整攻略。 什么是严格模式 严格模式是JavaScript的一种运行模式,通过严格模式可以对代码的执行进行限制,使代码更加严谨,减少出错的可能性。在ES5中, JavaScript引入了严格模式概念,它是一组限制 JavaScript语言的特性。在严格模式中,一些在正常模式中默许的行为,会被…

    JavaScript 2023年6月10日
    00
  • JavaScript 三种创建对象的方法

    我来详细讲解 JavaScript 三种创建对象的方法。 1. 工厂函数创建对象 通过工厂函数可以返回一个对象。我们可以在函数内部定义一个对象,然后向这个对象添加各种属性和方法,最后完整的返回这个对象。这种方法的优点,可以根据不同的参数,返回多个相似的对象;缺点是不能识别每个具有同样属性和方法的对象类型。 以下是一个例子: function createPe…

    JavaScript 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部