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

yizhihongxing

标题:原生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日

相关文章

  • CSS3 Media Queries(响应式布局可以让你定制不同的分辨率和设备)

    CSS3 Media Queries是CSS3的一个重要特性,它允许我们根据设备不同的宽度、高度或分辨率等特征,对不同的设备使用不同的样式。这样,我们就可以通过响应式布局来实现适配不同屏幕大小的需求。下面是CSS3 Media Queries的完整攻略。 什么是CSS3 Media Queries? CSS3 Media Queries是CSS3的一个模块,…

    css 2023年6月9日
    00
  • js实现扫雷源代码

    以下是JS实现扫雷游戏的完整攻略。 1. 界面设计 扫雷游戏的界面设计非常重要,需要清晰明了地展示扫雷格子以及游戏信息等元素。 我们可以通过HTML和CSS来实现扫雷游戏的界面设计。 1.1 HTML 在HTML文件中,我们可以使用表格来展示扫雷格子。每个扫雷格子的状态需要通过CSS来定义。 示例代码: <table> <tr> &l…

    css 2023年6月10日
    00
  • Vue中动画与过渡的使用教程

    Vue中动画与过渡的使用教程 Vue中动画与过渡的使用可以让网页效果更加流畅自然,提高用户体验。本教程将讲解Vue中动画与过渡的使用方法。 过渡 过渡是元素从一种样式变成另一种样式的效果,在Vue中,可以通过transition组件来实现过渡效果。 基本用法 在<transition>标签中添加要过渡的元素,使用name属性指定过渡效果的名字,然…

    css 2023年6月10日
    00
  • CSS中右对齐float:right换行的解决办法

    CSS中右对齐float:right换行的解决办法是一个常见的问题。当你使用float:right时,如果没有对应的解决办法,文本会在浮动元素的左侧出现。本文解决了这个问题,提供两种解决办法,分别是使用clear属性和使用overflow属性。 使用clear属性 当我们使用float:right时,可以在元素上面添加clear:both属性,这可以让浮动元…

    css 2023年6月10日
    00
  • js 操作css实现代码

    JavaScript 可以通过操作 DOM 来动态地修改页面的内容和样式。其中,修改页面样式主要就是操作 CSS。本文将详细讲解如何使用 JavaScript 操作 CSS 实现代码的完整攻略。 在 JavaScript 中操作 CSS 的基本方法 在 JavaScript 中操作 CSS 样式,通常使用 DOM 的 style 属性。这个属性是一个对象,可…

    css 2023年6月10日
    00
  • IE7 float:right 右浮动时元素换行错位的bug解决方法

    当使用IE7浏览器时,在将元素设置为float:right右浮动时,可能会出现元素换行错位的bug,这种问题通常可以通过以下两种方法来解决。 方法一 在IE7浏览器中,可以通过为右浮动元素添加display:inline属性值来解决错误换行的问题。代码示例如下: .right-float { float: right; display: inline; /*…

    css 2023年6月10日
    00
  • 利用Bootstrap Multiselect实现下拉框多选功能

    下面我将提供一份完整的攻略,讲解如何利用Bootstrap Multiselect实现下拉框多选功能。 步骤一:准备工作 首先,我们需要在网站的HTML页面中引入以下资源: <!– 引入 样式 –> <link rel="stylesheet" href="https://cdn.jsdelivr.net/…

    css 2023年6月9日
    00
  • 使用CSS的border属性构建变形边框的方法总结

    使用CSS的border属性构建变形边框是一种常见的页面设计技巧,可以让网页元素拥有更富有艺术感的外观。下面是关于如何使用CSS的border属性构建变形边框的详细攻略。 1. 了解border属性 border属性是CSS样式中用于设置元素边框的属性,它包含width、style和color三个属性值,分别用于设置边框的宽度、样式和颜色。具体用法可以参见下…

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