原生JS实现移动端web轮播图详解(结合Tween算法造轮子)

下面是 "原生JS实现移动端web轮播图详解(结合Tween算法造轮子)" 的完整攻略:

概述

移动端web轮播图十分常见,本文将利用原生JavaScript实现一款移动端web轮播图,并采用Tween算法实现动画效果。

实现步骤

步骤一:HTML结构

首先,我们需要在HTML中创建一个轮播图的容器,并在其中添加若干个图片元素,如下所示:

<div class="swiper-container">
  <div class="swiper-wrapper">
    <div class="swiper-slide">
      <img src="1.jpg">
    </div>
    <div class="swiper-slide">
      <img src="2.jpg">
    </div>
    <div class="swiper-slide">
      <img src="3.jpg">
    </div>
  </div>
</div>

步骤二:CSS样式

接着,我们需要为轮播图的容器和图片添加CSS样式,如下所示:

.swiper-container {
  width: 100%;
  height: 200px;
  overflow: hidden;
}

.swiper-wrapper {
  width: 300%;
  height: 100%;
  display: flex;
  transition: transform 0.3s;
  transform: translate3d(-100%, 0, 0);
}

.swiper-slide {
  width: 33.3333%;
  height: 100%;
  flex-shrink: 0;
}

.swiper-slide img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

其中,.swiper-container是轮播图的容器,设置了宽度和高度,并将overflow属性设为了hidden;.swiper-wrapper是图片容器,设置了宽度为3倍容器宽度,并通过flex布局实现图片排列;.swiper-slide是每一张图片的容器,定义了宽度和高度,并设置了flex-shrink属性可以实现自适应;.swiper-slide img是图片元素,通过object-fit属性实现图片的自适应。

步骤三:JavaScript代码

接下来,我们开始编写JavaScript代码。

3.1 获取DOM元素

首先,我们需要获取HTML中的DOM元素,包括轮播图容器、图片容器和每一张图片,代码如下:

let container = document.querySelector('.swiper-container');
let wrapper = document.querySelector('.swiper-wrapper');
let slides = document.querySelectorAll('.swiper-slide');

3.2 初始化轮播图

接着,我们需要对轮播图进行初始化,如下所示:

let index = 1;
let timer = null;
let isAnimating = false;

slides[0].classList.add('active');

其中,index表示当前显示的图片索引,timer用于存储自动轮播的定时器,isAnimating表示当前是否正在进行动画。同时,我们将第一张图片设为active状态。

3.3 实现轮播功能

在实现轮播功能时,我们采用Tween算法,具体实现如下:

function animate(offset) {
  let time = 300;  // 动画持续时间
  let interval = 10;  // 每帧间隔时间
  let speed = offset / (time / interval);  // 计算每帧移动距离
  let targetLeft = parseFloat(getComputedStyle(wrapper).getPropertyValue('transform').split(',')[4]) + offset;  // 计算目标位置
  let currLeft = parseFloat(getComputedStyle(wrapper).getPropertyValue('transform').split(',')[4]);  // 记录当前位置
  isAnimating = true;  // 标记动画进行中

  let timer = setInterval(() => {
    if ((speed > 0 && parseFloat(getComputedStyle(wrapper).getPropertyValue('transform').split(',')[4]) < targetLeft) || (speed < 0 && parseFloat(getComputedStyle(wrapper).getPropertyValue('transform').split(',')[4]) > targetLeft)) {
      wrapper.style.transform = `translate3d(${currLeft + speed}px, 0, 0)`;
      currLeft += speed;
    } else {
      wrapper.style.transform = `translate3d(${targetLeft}px, 0, 0)`;
      clearInterval(timer);
      isAnimating = false;  // 标记动画结束
    }
  }, interval);
}

其中,offset为每次轮播的偏移量,time为动画持续时间,interval为每帧间隔时间。根据计算出的偏移量和持续时间,我们可以计算出每帧移动的距离speed,然后通过setInterval函数实现轮播动画。

3.4 实现自动轮播

除了手动切换之外,我们还需要实现自动轮播的功能,代码如下:

function autoPlay() {
  timer = setInterval(() => {
    if (!isAnimating) {
      index++;
      play();
    }
  }, 2000);
}

function stop() {
  clearInterval(timer);
}

function play() {
  if (index === slides.length) {
    index = 1;
  } else if (index === 0) {
    index = slides.length - 1;
  }

  let offset = -100 * (index - 1);
  animate(offset);

  for (let i = 0; i < slides.length; i++) {
    slides[i].classList.remove('active');
  }
  slides[index - 1].classList.add('active');
}

container.addEventListener('touchstart', (event) => {
  stop();
});

container.addEventListener('touchend', (event) => {
  let direction = event.changedTouches[0].pageX - event.touches[0].pageX;
  direction > 0 ? index++ : index--;

  play();
  autoPlay();
});

其中,autoPlay函数用于启动自动轮播,stop函数用于停止自动轮播,play函数实现了手动轮播和切换当前显示图片的active状态。在touchstart事件中,我们需要停止自动轮播,而在touchend事件中,我们需要根据手指滑动的方向来判断当前的图片索引,然后通过play函数实现轮播。

示例说明

下面,我们通过两个示例来说明轮播图的使用方法。

示例一:基本轮播

如果你只需要实现一个基本的移动端web轮播图,可以按照上面的步骤,直接复制代码到你的网站中即可。

示例二:高级轮播

如果你希望实现一个更加高级的移动端web轮播图,可以按照以下步骤进行:

  1. 为轮播图添加左右按钮(可选);
  2. 添加动画效果,例如可以采用fade、zoom-in等方式实现。

关于添加左右按钮的具体实现,可以参考以下代码:

<div class="swiper-container">
  <div class="swiper-wrapper">
    <div class="swiper-slide">
      <img src="1.jpg">
    </div>
    <div class="swiper-slide">
      <img src="2.jpg">
    </div>
    <div class="swiper-slide">
      <img src="3.jpg">
    </div>
  </div>
  <div class="swiper-button-prev"></div>
  <div class="swiper-button-next"></div>
</div>
.swiper-button-prev,
.swiper-button-next {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  width: 30px;
  height: 30px;
  background-color: rgba(0,0,0,0.3);
  border-radius: 50%;
  cursor: pointer;
}

.swiper-button-prev {
  left: 10px;
}

.swiper-button-next {
  right: 10px;
}
let prevBtn = document.querySelector('.swiper-button-prev');
let nextBtn = document.querySelector('.swiper-button-next');

prevBtn.addEventListener('click', (event) => {
  if (!isAnimating) {
    index--;
    play();
  }
});

nextBtn.addEventListener('click', (event) => {
  if (!isAnimating) {
    index++;
    play();
  }
});

通过上述代码,我们实现了左右按钮的添加和事件绑定。

如果你想要添加动画效果,可以通过修改CSS样式,例如可以将每一个swiper-slide的默认display属性设置为none,利用opacity和transform实现fade效果。

.swiper-slide {
  width: 100%;
  height: 100%;
  position: absolute;
  top: 0;
  left: 0;
  display: none;
  opacity: 0;
  z-index: 1;
}

.swiper-slide.active {
  display: block;
  opacity: 1;
  z-index: 2;
  transform: scale(1.2);
  transition: transform 0.5s, opacity 0.5s;
}

通过上述代码,我们实现了fade和zoom-in的效果。在play函数中,我们同时需要修改active状态的添加和删除方式。

function play() {
  if (index === slides.length) {
    index = 1;
  } else if (index === 0) {
    index = slides.length - 1;
  }

  for (let i = 0; i < slides.length; i++) {
    slides[i].classList.remove('active');
    slides[i].style.display = 'none';
  }

  slides[index - 1].style.display = 'block';
  slides[index - 1].classList.add('active');
}

通过以上步骤,你就能够轻松实现一个高级的移动端web轮播图了。

总结

以上就是实现移动端web轮播图的详细攻略。在这个过程中,我们学习了原生JavaScript编程和Tween算法,并通过编写代码实现了移动端web轮播图的所有功能。如果你对轮播图的实现还有其他的疑问,欢迎留言和讨论。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:原生JS实现移动端web轮播图详解(结合Tween算法造轮子) - Python技术站

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

相关文章

  • node.js中的fs.futimes方法使用说明

    fs.futimes()是Node.js中的一个API,它用于修改指定文件的时间戳信息。该方法有以下两个重载形式: 1.改变指定路径的文件描述符所代表文件的访问和修改时间戳: fs.futimes(fd, atime, mtime, callback) 参数说明: fd :文件描述符; atime :access time 即文件访问时间戳; mtime :…

    node js 2023年6月8日
    00
  • 基于jenkins实现发布node.js项目

    下面是基于Jenkins实现发布Node.js项目的完整攻略。 步骤一:安装Jenkins 首先,在你的服务器上安装Jenkins。安装方法可参考官方文档 https://jenkins.io/zh/doc/book/installing/。 步骤二:安装Node.js插件 Jenkins需要运行Node.js应用程序所需的环境,所以需要安装Node.js插…

    node js 2023年6月8日
    00
  • 详解Nodejs之静态资源处理

    下面是详解Nodejs之静态资源处理的完整攻略: 什么是静态资源 静态资源即指在服务器端不需要通过任何逻辑处理,直接返回给客户端的文件,例如图片、CSS、JavaScript代码等。 静态资源处理方式 在Node.js中,处理静态资源主要有以下几种方式: 1. 使用原生的http模块 const http = require(‘http’); const f…

    node js 2023年6月8日
    00
  • node.js chat程序如何实现Ajax long-polling长链接刷新模式

    Node.js是一个基于事件驱动、非阻塞IO模型的服务器端JavaScript运行环境。开发人员可以使用Node.js来轻松构建高性能的网络应用程序,包括聊天程序。Ajax long-polling长链接刷新模式可以使聊天程序更具响应性和实时性。下面是实现的完整攻略: 步骤1:创建Express应用程序 首先,需要使用Node.js的Express框架创建一…

    node js 2023年6月8日
    00
  • PHP中安装使用mongodb数据库

    下面是PHP中安装使用mongodb数据库的完整攻略。 安装 MongoDB PHP扩展 在PHP中使用mongodb数据库,需要安装MongoDB PHP扩展。这里以Linux系统为例,演示安装步骤: 使用终端进入服务器并使用root权限登录; 安装PHP MongoDB扩展所需的依赖库: apt-get update apt-get install ph…

    node js 2023年6月8日
    00
  • Node.js插件的正确编写方式

    这里是“Node.js插件的正确编写方式”的完整攻略。 什么是Node.js插件? Node.js插件是用C/C++编写的二进制模块,它们使Node.js能够与不同的操作系统和其他编程语言协作。 插件的编写方式 以下是Node.js插件的正确编写方式。 步骤1:安装node-gyp node-gyp是一个Node.js本地构建工具,允许你编写C/C++插件并…

    node js 2023年6月8日
    00
  • node.js 基于cheerio的爬虫工具的实现(需要登录权限的爬虫工具)

    下面我将为大家讲解“node.js 基于cheerio的爬虫工具的实现(需要登录权限的爬虫工具)”的完整攻略。 什么是node.js基于cheerio的爬虫工具? Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环境,可以在服务器端运行 JavaScript 代码。Cheerio 是 Node.js 中一个非常流行的小型解…

    node js 2023年6月9日
    00
  • node-sass一直安装不上、安装失败的原因分析

    下面是解决 “node-sass一直安装不上、安装失败” 的完整攻略: 原因分析 “node-sass” 失败的原因可能有以下几种: 网络不通畅,无法从npm源或Github上下载相关代码。 「node-gyp」编译环境错误,根据node-sass的依赖文件node-gyp的版本来安装或重新安装node-gyp。 「Python环境」未安装或未配置正确,根据…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部