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

下面我将为您详细讲解如何使用纯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 function函数种类详解

    JavaScript Function函数种类详解 JavaScript是一门非常强大的脚本语言,其中函数是最重要的部分之一。函数是用于执行特定任务的代码块,它接收输入并返回输出。JavaScript中的函数有多种种类。在这里,我们将详细探讨不同函数种类的特点和用法,并提供一些示例。 函数定义 在JavaScript中,定义函数有两种方法:函数声明和函数表达…

    JavaScript 2023年5月27日
    00
  • 浅析Java 对象引用和对象本身

    浅析 Java 对象引用和对象本身 在 Java 编程中,我们经常会涉及到对象的引用和对象本身的概念。这两者之间的关系非常密切,理解它们的作用和区别对于编写高质量的 Java 代码非常重要。 Java 对象引用 Java 中的对象引用指的是一个变量或表达式,该变量或表达式包含了对象的内存地址。简单来说,即是将对象的地址赋值给一个变量,以方便后续操作。 以下是…

    JavaScript 2023年6月10日
    00
  • js对象实现数据分页效果

    实现数据分页效果,可以使用 JavaScript 中的对象技术。具体而言,可以将需要分页的数据存储在一个 JavaScript 对象中,并根据用户的分页请求,从对象中提取出需要的数据子集以供展示。 以下是实现对象数据分页效果的完整攻略: 1. 创建数据对象 创建一个 JavaScript 对象来存储需要分页的数据。对象中应该包含两个属性:data 和 pag…

    JavaScript 2023年6月10日
    00
  • javascript 动态创建表格的2种方法总结

    当我们需要在网页中插入大量的数据时,常常会选择将数据以表格的形式展示出来。使用JS动态创建表格,不仅可以大大减轻前端工作量,还可以根据数据动态生成表格,增加用户体验。 本篇攻略将介绍2种最常见的JS动态创建表格的方法,分别是通过innerHTML方法和DOM API的createElement方法。下面依次介绍这两种方法: 一、innerHTML方法 通过i…

    JavaScript 2023年6月10日
    00
  • javascript函数式编程基础

    JavaScript函数式编程基础攻略 什么是函数式编程 函数式编程是一种编程范式,它将计算机程序看作是一系列的函数组合,以此来避免在程序中使用状态(状态指的是可变的数据)。函数式编程中的函数不会修改输入的数据,而是始终将其转换为输出。它强调纯函数,不可变性以及函数的组合性。 纯函数和不可变性 纯函数:在函数式编程中,纯函数是指: 函数执行的结果只依赖于它的…

    JavaScript 2023年6月10日
    00
  • JavaScript变量声明var,let.const及区别浅析

    JavaScript变量声明var,let,const及区别浅析 在JavaScript中,我们可以使用 var,let 和 const 关键字来声明变量,但这些关键字的用法和区别是比较容易混淆的。本文将对这三种关键字进行详细讲解。 var 在ES6之前,JavaScript中只有 var 这一个声明变量的关键字。var 关键字声明的变量作用域是函数级别的。…

    JavaScript 2023年6月10日
    00
  • yepnope.js 异步加载资源文件

    yepnope.js是一个轻量级的异步资源加载工具,可以帮助我们在加载网页中的资源文件时,进行更灵活高效的操作。下面我为大家介绍一下如何使用yepnope.js进行异步加载资源文件的操作。 安装yepnope.js yepnope.js可以通过npm安装,也可以直接在HTML文件中通过CDN链接引入。 <!DOCTYPE html> <ht…

    JavaScript 2023年5月27日
    00
  • HTML5中视频音频的使用详解

    HTML5中视频音频的使用详解 HTML5提供了一种在网页中嵌入音频和视频的新方法,使得开发者可以更好地控制和展示媒体内容。本篇攻略将为您详细讲解如何在HTML5中使用音频和视频。 视频标签 HTML5 提供了一个用于嵌入视频的 “video” 标签。如下所示: <video controls> <source src="movi…

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