原生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日

相关文章

  • 超级好用的jQuery圆角插件 Corner速成

    超级好用的jQuery圆角插件 Corner速成 简介 Corner是一个超级好用的jQuery圆角插件,可以帮助我们快速地实现各种圆角效果,支持自定义圆角半径、边框宽度和颜色等。 安装 可以通过以下两种方式安装Corner插件: 手动下载Corner的源代码文件,并将其引入到HTML文档中: “`html “` 使用CDN引入Corner: “`ht…

    css 2023年6月10日
    00
  • 浅谈使用 Yii2 AssetBundle 中 $publishOptions 的正确姿势

    下面是详细的攻略: 什么是 Yii2 AssetBundle? Yii2 为我们提供了一个非常实用的 AssetBundle 类,用于管理资源文件,包括 CSS、JS、图片等文件,使得我们能够更好地组织资源文件,减少重复代码,提高代码可读性与可维护性。 为什么要使用 $publishOptions? 在 Yii2 中,我们可以通过以下方式来注册资源文件: $…

    css 2023年6月10日
    00
  • HTML blockquote 标签使用与美化

    接下来我将详细讲解一下 HTML blockquote 标签使用与美化的完整攻略。 什么是HTML blockquote标签? HTML blockquote 标签用于表示长的引用。这个标签可以用于表示一长段的引用,比如一篇文章的一部分,它可以自动添加缩进并改变文字颜色,使得该段引用内容在页面中更加醒目。 如何使用HTML blockquote标签 在 HT…

    css 2023年6月9日
    00
  • CSS解决页面图片水平垂直居中问题的方法

    CSS解决页面图片水平垂直居中问题是Web开发中常见的需求,那么该怎样解决呢?以下是完整攻略: 方法一:使用绝对定位和负边距 我们可以使用绝对定位将图片的左上角定位在父元素的正中间,再使用负边距将图片向中心移动,从而实现水平垂直居中。示例代码如下: <div class="container"> <img src=&qu…

    css 2023年6月10日
    00
  • CSS3结构性伪类选择器九种写法

    CSS3结构性伪类选择器可以根据元素在结构中的位置进行选择。在本文中,我将详细讲解CSS3结构性伪类选择器九种写法,并提供两个实际的示例来说明其用法。 1. :first-child 该选择器选取父元素的第一个子元素。 示例代码: <ul> <li>第一个</li> <li>第二个</li> &lt…

    css 2023年6月9日
    00
  • 通过设置CSS中的position属性来固定层的位置

    通过设置CSS中的position属性来固定层的位置,一般常用的属性是position:fixed和position:absolute。其中,position:fixed是相对于浏览器窗口而言的固定定位,而position:absolute是相对于最近的带有定位属性(position不为static)的父级元素进行定位的,如果不存在父级元素,则是相对于bod…

    css 2023年6月9日
    00
  • AngularJS入门之动画

    AngularJS入门之动画 动画简介 在AngularJS中,动画可以通过ngAnimate模块来实现。ngAnimate会在带有ng-enter、ng-leave类的元素上绑定CSS3动画,从而实现HTML元素的动态效果。AngularJS中提供了一些预定义的事件,如ngRepeat、ngView、ngInclude的动画事件,当这些事件被触发时,ngA…

    css 2023年6月9日
    00
  • AngularJS 指令详细介绍

    AngularJS 是一个功能强大的 JavaScript 框架,它提供了大量的指令来扩展 HTML。这些指令可以用于创建自定义标记、重写元素和属性行为,以及组合来构建功能丰富的应用程序。在这篇文章中,我们将全面介绍 AngularJS 指令,涵盖所有类型的指令及其用法,以及如何在应用程序中使用它们。 指令类型 AngularJS 中的指令被分为四种类型。它…

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