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

相关文章

  • PJBLOG使用技巧

    PJBLOG使用技巧攻略 PJBLOG是一款常见的开源博客系统,它可以帮助博主快速搭建自己的博客网站。在本文中,我们将提供一些PJBLOG的使用技巧,以满足用户较为个性化的需求。 1. 自定义主题 PJBLOG有五种默认主题供用户选择,如果您想让您的博客网站更加个性化,可以自定义主题。下面是一个示例: // 在PJBLOG根目录下的config.yaml文件…

    css 2023年6月10日
    00
  • JS溶解形式的文字切换特效

    为了实现JS溶解形式的文字切换特效,我们可以使用以下步骤: 第一步:创建HTML结构 首先我们需要在HTML代码中创建一些必需的结构,包括一个包裹元素、一个用于显示文本内容的元素和若干个用于存放动画效果的元素(可以是span、div或其他包裹元素)。 <div class="wrap"> <h1 id="tex…

    css 2023年6月11日
    00
  • jquery修改网页背景颜色通过css方法实现

    实现通过jquery修改网页背景颜色主要有两种方法,分别通过CSS方法和修改DOM元素颜色实现,下面详细介绍如何使用jquery实现这两种方法。 使用CSS方法 引入jquery库文件 首先需要在头部引入jquery库文件,代码示例如下: <head> <script src="http://code.jquery.com/jqu…

    css 2023年6月9日
    00
  • 在Django的form中使用CSS进行设计的方法

    在 Django 的表单中使用 CSS 进行样式设计,可以使表单更美观,便于用户操作。下面是一个完整的攻略: 步骤一:将 Django 表单类绑定到 HTML 表单上 让我们考虑一个简单的表单,它包含一个文本输入框和一个提交按钮。 # forms.py from django import forms class MyForm(forms.Form): na…

    css 2023年6月10日
    00
  • css中margin:0 auto居中问题深入探讨

    对于“css中margin:0 auto居中问题深入探讨”的完整攻略,以下是我的详细讲解: 什么是margin: 0 auto? margin:0 auto; 是CSS中实现水平居中的一种方式。这个属性值可以让元素的左右margin取值相等,并将元素水平居中。 首先,0表示上下margin为0,其次,auto表示左右margin会尽可能地均分元素的剩余宽度,…

    css 2023年6月10日
    00
  • 前端从浏览器的渲染到性能优化

    前端从浏览器的渲染到性能优化是一个在构建Web应用程序中非常重要的过程。本攻略将介绍从网页加载到渲染完毕,以及到如何优化网页性能,以下是详细说明: 网页加载 HTTP 请求 网页加载的第一步是浏览器为网页资源(HTML、CSS和JavaScript等)发送HTTP请求。如需优化性能,我们应确保最小化HTTP请求。 HTML 解析和 DOM 树构建 浏览器将接…

    css 2023年6月9日
    00
  • 设置div的z-index属性让div在另外一个div之上

    在网页设计中,我们经常需要设置 div 元素的 z-index 属性,以控制其在另一个 div 元素之上的显示顺序。下面是一个完整攻略,包含了如何使用 CSS 设置 div 元素的 z-index 属性的过程和两个示例说明。 CSS 如何设置 div 元素的 z-index 属性 我们可以使用 CSS 的 z-index 属性来设置 div 元素的层叠顺序。…

    css 2023年5月18日
    00
  • 网络广告的发展历程的详细分析与心得体会(图文)

    下面我将详细讲解如何撰写一篇网络广告发展历程的详细分析文章,包括步骤和注意事项,帮助你完成这篇文章。 步骤一:确定文章主题 首先需要确定文章的主题,这里我们选择“网络广告的发展历程的详细分析与心得体会”。确定主题后,需要开展文献调查,了解网络广告的历史发展和现状,收集相关数据和材料。 步骤二:撰写文章大纲 文章大纲是文章撰写的基础,要把各个章节、段落的内容和…

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