原生JavaScript实现精美的淘宝轮播图效果示例【附demo源码下载】

标题:原生JavaScript实现精美的淘宝轮播图效果示例【附demo源码下载】攻略

1. 确定页面结构

在实现轮播图之前,首先要确定页面结构。可以考虑使用如下结构:

<div class="carousel">
  <ul class="carousel-list">
    <li class="carousel-item"><img src="image1.jpg" alt="图片1"></li>
    <li class="carousel-item"><img src="image2.jpg" alt="图片2"></li>
    <li class="carousel-item"><img src="image3.jpg" alt="图片3"></li>
    <li class="carousel-item"><img src="image4.jpg" alt="图片4"></li>
  </ul>
  <ul class="carousel-dots">
    <li class="dot active"></li>
    <li class="dot"></li>
    <li class="dot"></li>
    <li class="dot"></li>
  </ul>
  <a href="#" class="arrow arrow-prev"></a>
  <a href="#" class="arrow arrow-next"></a>
</div>

上述代码中,.carousel为轮播图容器,.carousel-list为轮播图列表,.carousel-item为轮播项,.carousel-dots为轮播点列表,.dot为轮播点,.active为激活态的轮播点,.arrow为箭头,.arrow-prev为向左箭头,.arrow-next为向右箭头。

2. 实现轮播图效果

接下来就可以使用JavaScript完成轮播图效果,可以考虑使用如下步骤:

2.1 获取元素并初始化

首先要获取轮播图容器和其它相关元素,并初始化相关状态。全部代码如下:

const carousel = document.querySelector('.carousel');
const carouselList = document.querySelector('.carousel-list');
const carouselItems = document.querySelectorAll('.carousel-item');
const dots = document.querySelectorAll('.dot');
const arrowPrev = document.querySelector('.arrow-prev');
const arrowNext = document.querySelector('.arrow-next');

const imgWidth = carousel.clientWidth;
const imgCount = carouselItems.length;
let currIndex = 0;
let prevIndex = imgCount - 1;
let nextIndex = 1;
let isAnimating = false;
let imgTimer = null;

上述代码中,imgWidth为轮播图宽度,imgCount为轮播图数量,currIndex为当前索引,prevIndex为上一个索引,nextIndex为下一个索引,isAnimating为是否正在动画中,imgTimer为图片轮播的计时器。

2.2 完成图片轮播

接下来要完成图片的轮播,使用如下代码:

function move(offset) {
  if (isAnimating) {
    return;
  }
  isAnimating = true;
  const duration = 500;
  const interval = 16;
  const frames = duration / interval;
  const speed = Math.ceil(offset / frames);
  let newLeft = parseInt(carouselList.style.left) + offset;

  const go = function () {
    if ((offset < 0 && newLeft < targetLeft) || (offset > 0 && newLeft > targetLeft)) {
      carouselList.style.left = targetLeft + 'px';
      isAnimating = false;
      dotSlect(currIndex);
    } else {
      newLeft += speed;
      carouselList.style.left = newLeft + 'px';
      setTimeout(go, interval);
    }
  };
  const targetLeft = -currIndex * imgWidth;
  go();
}

上述代码中,move函数为轮播函数,offset为图片偏移量,duration为动画持续时间,interval为动画帧间隔,frames为动画帧数,speed为每帧偏移量,newLeft为新的轮播项左边界位置,targetLeft为目标左偏移量,go为迭代函数,用于实现图片移动动画效果。

2.3 控制向前、向后

接下来要控制向前、向后按钮的点击事件,使用如下代码:

arrowPrev.addEventListener('click', function (event) {
  event.preventDefault();
  if (isAnimating) {
    return;
  }
  prevIndex = currIndex;
  currIndex = --currIndex < 0 ? imgCount - 1 : currIndex;
  nextIndex = ++nextIndex > imgCount - 1 ? 0 : nextIndex;
  move(imgWidth);
})

arrowNext.addEventListener('click', function (event) {
  event.preventDefault();
  if (isAnimating) {
    return;
  }
  prevIndex = currIndex;
  currIndex = ++currIndex > imgCount - 1 ? 0 : currIndex;
  nextIndex = --nextIndex < 0 ? imgCount - 1 : nextIndex;
  move(-imgWidth);
})

上述代码中,arrowPrev.addEventListener为向前按钮的点击事件,prevIndex为上一个轮播项索引,currIndex为当前轮播项索引,nextIndex为下一个轮播项索引,move为轮播函数,arrowNext.addEventListener为向后按钮的点击事件。

2.4 控制轮播点

最后要实现的是轮播点,要实现自动切换、鼠标悬浮等功能,使用如下代码:

dots.forEach(function (dot, index) {
  dot.addEventListener('click', function (event) {
    event.preventDefault();
    if (isAnimating || index === currIndex) {
      return;
    }
    prevIndex = currIndex;
    currIndex = index;
    move(-imgWidth * (currIndex - prevIndex));
  })
})

function dotSlect(index) {
  dots.forEach(function (dot) {
    dot.classList.remove('active');
  })
  dots[index].classList.add('active');
}

function autoPlay() {
  imgTimer = setInterval(function () {
    arrowNext.click();
  }, 5000);
}

function stopPlay() {
  clearInterval(imgTimer);
}

carousel.addEventListener('mouseenter', function () {
  stopPlay();
})

carousel.addEventListener('mouseleave', function () {
  autoPlay();
})

autoPlay();

上述代码中,dots.forEach为轮播点鼠标点击事件,dotSelect用于切换轮播点样式,autoPlay用于自动轮播,stopPlay用于停止自动轮播,carousel.addEventListener为鼠标悬浮停止自动轮播,移开恢复自动轮播。

依照上述步骤,即可完成一款动态、美观的淘宝轮播图效果。完整代码可参考此处

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:原生JavaScript实现精美的淘宝轮播图效果示例【附demo源码下载】 - Python技术站

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

相关文章

  • React路由动画切换实现过程详解

    下面是关于“React路由动画切换实现过程详解”的完整攻略: 1. 确定动画需求 在开始实现React路由动画切换之前,我们需要先明确需要实现的动画效果。可能会有多种选择,例如渐入渐出、滑动、旋转等等。此外,根据页面切换的特点,我们需要选择适当的页面切换时机来触发动画,例如页面进入前、页面进入时、页面离开时等。 2. 在React项目中引入动画库 为了简单明…

    css 2023年6月10日
    00
  • CSS设置列表样式和创建导航菜单实现代码

    下面是“CSS设置列表样式和创建导航菜单实现代码”的完整攻略。 CSS设置列表样式 当我们需要在页面中使用列表时,我们可以通过CSS来设置不同样式的列表,以提高页面的可读性和美观性。下面是两个示例: 1. 设置无序列表(ul)的样式 ul { list-style: none; /* 去除默认样式 */ padding: 0; margin: 0; } ul…

    css 2023年6月10日
    00
  • csdn 博客的css样式 v3

    那我来为你详细讲解一下“CSDN 博客的 CSS 样式 V3”的完整攻略。 背景介绍 作为国内最大的 IT 技术社区和开发者社区,CSDN 在博客板块一直占据着重要的地位。而在博客编写过程中,CSS 样式的运用往往是不可忽视的一个环节。CSDN 博客 CSS 样式 V3 作为目前最高版本的样式,提供了更加丰富的样式编辑功能,能够满足大部分博客作者的需求。 步…

    css 2023年6月9日
    00
  • 酷! 不同风格页面布局幻灯片特效js实现

    下面我来详细讲解如何实现“酷! 不同风格页面布局幻灯片特效js实现”的完整攻略。 1. 准备工作 首先需要准备好以下工作: 编辑器:推荐使用 VS Code 或者 Sublime Text; 前端框架:可以选择使用 Bootstrap、Foundation 等 CSS 框架,或者自己手写 CSS; JavaScript 库:推荐使用 jQuery、swipe…

    css 2023年6月10日
    00
  • css3个性化字体_动力节点Java学院整理

    CSS3个性化字体攻略 1. 引入字体文件 首先,需要引入自定义字体文件,常见的字体文件格式有.woff、.eot、.ttf、.otf等。可以使用@font-face规则将自定义字体文件引入到网页中: @font-face { font-family: myFont; /*自定义字体名称*/ src: url(‘myFont.woff’) format(‘w…

    css 2023年6月9日
    00
  • 兼容IE和FF的js脚本代码小结(比较常用)

    下面我就为你详细讲解“兼容IE和FF的js脚本代码小结”。 核心思路 为了实现JS的兼容性,我们需要了解两个概念:DOM和事件模型。DOM是文档对象模型,即浏览器把HTML和XML文档解析成树形结构,并提供了一组API,使得开发人员可以轻易地操作文档中的元素。而事件模型则是指浏览器处理事件(比如用户点击某个元素,或者页面加载完成等)的方式。 根据这两个概念,…

    css 2023年6月11日
    00
  • 浅析CSS等高布局的6种方式

    浅析CSS等高布局的6种方式 CSS等高布局是指在一个网页中多个容器的高度相等,不管其中任何一个容器的高度发生了变化,其他容器也跟随进行调整。这篇文章将会介绍6种常用的CSS等高布局方法。 1. flexbox布局 flexbox是CSS3新增加的一种布局模式,可以很方便的实现网页的等高布局。其主要特点是元素可以沿着容器的主轴(main axis)或交叉轴(…

    css 2023年6月9日
    00
  • CSS 定位之 z-index 问题分析

    下面是“CSS 定位之 z-index 问题分析”的完整攻略。 一、z-index 是什么 z-index 是 CSS 中用来设置元素在 z 轴上的层级关系的属性。它可以控制元素的垂直堆叠顺序,使一些元素覆盖其他元素。 二、z-index 的取值 z-index 属性可以接收以下值: 数字:取值范围为整数、负整数。数字越大,表示越靠近用户,也就是越显示在上层…

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