原生JS实现匀速图片轮播动画

下面我就详细讲解“原生JS实现匀速图片轮播动画”的完整攻略:

一、概述

图片轮播动画是网页设计中常用的效果,它能够增加页面的美感,并且能够呈现多个图片,帮助用户更好的了解网站的内容。本攻略将介绍如何使用原生JS实现匀速图片轮播动画。

二、实现步骤

1. HTML结构

首先,在HTML中需要创建一个容器,用于存储图片和轮播进度条。HTML结构如下:

<div class="slider-container">
  <div class="slider-list">
    <img src="xxx.jpg" alt="">
    <img src="yyy.jpg" alt="">
    ...
  </div>
  <ul class="slider-nav"></ul>
</div>

在上述代码中,slider-container是轮播的容器,slider-list是图片列表容器,slider-nav是轮播进度条容器。需要注意的是,slider-list容器中需要添加多个img元素,这些元素就是需要展示的图片。另外,轮播进度条可以选择使用ulli元素实现。

2. CSS样式

对于轮播容器和列表容器,需要添加如下CSS样式:

.slider-container {
  width: 600px;
  height: 400px;
  overflow: hidden;
  position: relative; /*轮播容器需要设置相对定位*/
}
.slider-list {
  position: absolute; /*图片列表容器需要设置绝对定位*/
  top: 0;
  left: 0;
  width: 6000px; /*图片列表容器需要设置超出可见区域*/
  height: 400px;
}
.slider-list img {
  float: left; /*图片需要设置浮动,以便列表容器能够自适应高度*/
  width: 600px;
  height: 400px;
}

对于轮播进度条容器,需要添加如下CSS样式:

.slider-nav {
  position: absolute; /*轮播进度条容器需要设置绝对定位*/
  bottom: 20px;
  left: 50%;
}
.slider-nav li {
  display: inline-block; /*轮播进度条子项需要设置为行内块元素*/
  width: 10px;
  height: 10px;
  margin: 0 5px;
  background-color: #fff;
  border-radius: 50%; /*实现圆形效果*/
  cursor: pointer;
}
.slider-nav li.active {
  background-color: #666; /*设置激活状态下的背景色*/
}

3. JS实现

在JS中,需要通过获取相应的元素,计算图片的宽度和总页数,以及添加轮播进度条的子项等操作。核心逻辑如下:

var $sliderContainer = document.querySelector('.slider-container');
var $sliderList = document.querySelector('.slider-list');
var $sliderImgs = document.querySelectorAll('.slider-list img');
var $sliderNav = document.querySelector('.slider-nav');
var $sliderNavItems = null;

var imgWidth = $sliderImgs[0].offsetWidth;
var pageCount = $sliderImgs.length;
var curIndex = 0;

// 初始化
init();

function init() {
  renderNav(); // 添加轮播进度条子项
  bindEvents(); // 绑定事件
  startTimer(); // 启动自动播放
}

// 添加轮播进度条子项
function renderNav() {
  var navHtml = '';
  for (var i = 0; i < pageCount; i++) {
    navHtml += '<li></li>';
  }
  $sliderNav.innerHTML = navHtml;
  $sliderNavItems = $sliderNav.querySelectorAll('li');
  setActive(0);
}

// 绑定事件
function bindEvents() {
  // 鼠标悬停事件
  $sliderContainer.addEventListener('mouseover', function() {
    stopTimer();
  });
  $sliderContainer.addEventListener('mouseleave', function() {
    startTimer();
  });
  // 轮播进度条子项点击事件
  $sliderNav.addEventListener('click', function(e) {
    if (e.target.tagName === 'LI') {
      var index = Array.prototype.indexOf.call($sliderNavItems, e.target);
      setActive(index);
      slideTo(index);
    }
  });
}

// 设置当前轮播进度条项
function setActive(index) {
  for (var i = 0; i < pageCount; i++) {
    if (i === index) {
      $sliderNavItems[i].className = 'active';
    } else {
      $sliderNavItems[i].className = '';
    }
  }
}

// 滑动到指定序号
function slideTo(index) {
  var curLeft = -$sliderList.offsetLeft;
  var targetLeft = imgWidth * index;

  var startTime = new Date().getTime();
  var duration = 500; // 动画时长
  var timer = setInterval(function() {
    var curTime = new Date().getTime() - startTime;
    var percent = curTime / duration;
    if (percent > 1) {
      percent = 1;
    }
    var newLeft = curLeft + (targetLeft - curLeft) * percent;
    $sliderList.style.left = -newLeft + 'px';
    if (percent === 1) {
      clearInterval(timer);
    }
  }, 10);
}

// 启动自动播放
function startTimer() {
  clearInterval(timer);
  timer = setInterval(function() {
    curIndex++;
    if (curIndex >= pageCount) {
      curIndex = 0;
    }
    setActive(curIndex);
    slideTo(curIndex);
  }, 3000);
}

// 停止自动播放
function stopTimer() {
  clearInterval(timer);
}

4. 示例说明

接下来,本攻略将给出两个不同的示例,帮助读者更好地理解和实践上述代码:

示例1

在第一个示例中,假设轮播的图片只有两张,即:

<div class="slider-container">
  <div class="slider-list">
    <img src="xxx.jpg" alt="">
    <img src="yyy.jpg" alt="">
  </div>
  <ul class="slider-nav"></ul>
</div>

此时,只需要将JS中的init()函数中的startTimer()语句注释掉,即可实现静态的轮播效果。具体实现可以参考以下代码:

function init() {
  renderNav();
  bindEvents();
  // startTimer();
}

示例2

在第二个示例中,假设轮播的图片有五张,并且需要添加文字说明,即:

<div class="slider-container">
  <div class="slider-list">
    <img src="xxx.jpg" alt="">
    <div class="slider-item-desc">
      <p>图1说明文字</p>
    </div>
    <img src="yyy.jpg" alt="">
    <div class="slider-item-desc">
      <p>图2说明文字</p>
    </div>
    ...
  </div>
  <ul class="slider-nav"></ul>
</div>

此时,我们需要通过添加CSS样式,来使得图片和文字可以重叠在一起。具体代码如下:

.slider-item-desc {
  position: absolute;
  bottom: 0;
  left: 0;
  width: 100%;
  height: 50px;
  line-height: 50px;
  text-align: center;
  background-color: rgba(0, 0, 0, 0.5); /*添加半透明背景色*/
  color: #fff;
}
.slider-item-desc p {
  margin: 0;
  padding: 0;
}

同时,需要在JS中添加以下语句,以便轮播效果照常工作:

var $sliderItemDescs = $sliderList.querySelectorAll('.slider-item-desc');

function setActive(index) {
  for (var i = 0; i < pageCount; i++) {
    if (i === index) {
      $sliderNavItems[i].className = 'active';
      $sliderItemDescs[i].style.display = 'block';
    } else {
      $sliderNavItems[i].className = '';
      $sliderItemDescs[i].style.display = 'none';
    }
  }
}

三、总结

通过以上步骤,我们成功实现了匀速图片轮播动画。需要注意的是,本攻略中所提到的代码和示例只能用于参考,如果想要实现更多的效果,还需要根据实际情况进行修改和拓展。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:原生JS实现匀速图片轮播动画 - Python技术站

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

相关文章

  • 介绍一下requestAnimationFrame和requestIdleCallback

    当我们需要执行动画或其他高性能操作时,常常会遇到以下问题: – 任务的执行频率过高,对 CPU 和内存造成了大量的压力。- 任务的优先级较高,导致其他任务无法及时得到处理。 为了解决这些问题,JavaScript 提供了两个调度 API:requestAnimationFrame 和 requestIdleCallback。   requestAnimati…

    JavaScript 2023年4月18日
    00
  • javascript的惯性运动实现代码实例

    下面是“JavaScript的惯性运动实现代码实例”的完整攻略。 理解惯性运动 在开始编写代码实现惯性运动之前,我们需要先理解惯性运动的概念。 所谓惯性运动,指的是对象在受到外力作用后,由于惯性而产生的运动。比如说,当你用力向前推一个物体,它并不会立刻静止,而会先快速运动一段时间,然后逐渐减缓,最终停下来。 我们可以通过数学公式来描述物体的运动状态,其中包括…

    JavaScript 2023年6月11日
    00
  • js最全的数组的降维5种办法(小结)

    下面是详细讲解”js最全的数组的降维5种办法(小结)”的内容。 1. 理解数组的降维 数组的降维是指将多维数组转化为一维数组的过程,使得数组的数据变得更加简洁、易于处理。在JavaScript中,我们可以使用一些方法来实现数组的降维,本文将会介绍5种方法。 2. 五种降维方法 2.1 concat方法 在JavaScript中,我们可以使用concat方法将…

    JavaScript 2023年5月27日
    00
  • js严格模式总结(分享)

    JS严格模式总结(分享) JS严格模式,也叫做严格模式,是ES5中定义的一种JS运行的模式。它可以让代码在更加安全的环境下运行,且更加严格地执行代码。本文将为您详细讲解JS严格模式的使用、注意事项以及相关示例。 使用严格模式的方法 使用严格模式只需要在JS代码的开头添加’use strict’;即可,例如: ‘use strict’; function fo…

    JavaScript 2023年6月10日
    00
  • yii form 表单提交之前JS在提交按钮的验证方法

    当我们在 Yii 的视图中使用表单时,我们可能需要对用户输入的数据进行验证,以确保它们符合我们的要求。为了达到这个目的,我们可以使用客户端 JavaScript 在提交表单之前对数据进行验证。下面是如何在 Yii 框架中使用 JavaScript 在提交按钮的验证方法之前进行表单验证的详细攻略: 步骤1:在视图中创建表单 首先,我们需要在 Yii 的视图中创…

    JavaScript 2023年6月10日
    00
  • JavaScript中捕获与冒泡详解及实例

    下面给出详细讲解JavaScript中捕获与冒泡的攻略。 什么是事件冒泡和捕获 事件冒泡和捕获是JS中处理事件的两种机制。 当一个元素上发生了事件时,如果该元素定义了事件处理函数,那么这个事件会先按照捕获的顺序从父元素一直传递到子元素,再由子元素向上冒泡直到父元素。 事件冒泡 当一个元素上发生事件时,它会把这个事件交给它的父元素处理,父元素再把这个事件交给自…

    JavaScript 2023年6月11日
    00
  • 深入了解JavaScript 私有化

    深入了解 JavaScript 私有化攻略 JavaScript 是一种弱类型语言,它的对象属性默认是可以随意更改的,这意味着对象的属性可能被意外修改,给代码的可维护性和可靠性带来很大的隐患。在这种情况下,私有化属性是一个非常实用的工具,它可以保护代码不受外部干扰,提高代码的稳定性。下面介绍几种私有化 JavaScript 属性的方法。 一、使用闭包 闭包(…

    JavaScript 2023年6月10日
    00
  • Javascript中的作用域及块级作用域

    一、作用域 在Javascript中,作用域是指访问变量、函数的代码的范围。根据变量的定义位置,作用域可以分为全局作用域、局部作用域。 1.全局作用域 全局作用域是指在代码内部的任何地方都可以访问到的变量。我们可以在任何地方访问和修改全局作用域的变量,这种方式对变量的维护管理不利,并且容易引起变量名冲突。 示例代码: var name = "Tom…

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