JS轮播图中缓动函数的封装

作者:Binnear 时间:2023-08-22 20:50:11 

轮播图的根本其实就是缓动函数的封装,如果说轮播图是一辆跑动的汽车,那么缓动函数就是它的发动机,今天本文章就带大家由简入繁,封装属于自己的缓动函数~~

我们从需求的角度开始,首先给出一个简单需求:

1、我想让页面中的一个盒子从开始的位置匀速向右运动到200px的地方,该怎么实现?

分析:

1)我们需要知道盒子在哪个地方,这个可以通过offsetLeft属性去获取;

 2)要让盒子匀速运动,对于js肯定需要setInterval了;

3)要让盒子向右边跑起来?那就是需要不停改变盒子与左边起始点的距离,有margin-left,还有定位的left,这里我选择了改变绝对定位的left;

 4)跑到离开始点200px的距离我们要停下来,使用clearInterval就可以了。 

接下来直接上代码了


<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Document</title>
<style type="text/css">
 * {
 margin: 0;
 padding: 0;
 }
 div {
 position: absolute;
 top: 50px;
 width: 100px;
 height: 100px;
 background-color: red;
 }
 input {
 width: 100px;
 height: 30px;
 color: #fff;
 background-color: yellowgreen;
 }

</style>
</head>

<body>
<div></div>
<input type="button" value="移动到200" />

<script type="text/javascript">
 // 获取到元素(这里有个小细节,如果给元素设置了id名,即便不使用获取元素的方法,也能通过这个id名获取到元素哦~~大家可以自己尝试一下)
 var btn = document.querySelector('input'),
  dv = document.querySelector('div');
 // 添加点击事件
 btn.addEventListener('click',function() {
 var timer = null,// 保存定时器
  currentDistance = dv.offsetLeft, // 当前离父盒子的距离
  step = 8,// 每次改变的距离
  target = 200;// 目标距离
 timer = setInterval(function() {
  currentDistance += step;// 当前距离 = 上一个当前距离 + 改变的距离
  if((target - currentDistance) < step) {
  currentDistance = target; // 如果目标距离与当前距离的差小于了要改变的距离,这时候我们就直接让当前距离等于目标距离,防止盒子停下来的时候有误差
  clearInterval(timer); // 清楚定时器
  timer = null; // 将timer解绑,释放内存
  }
  dv.style.left = currentDistance + 'px'; // 最核心的一步,改变盒子的left为当前距离
 },17)
 })
</script>
</body>
</html>

 2、一个初步运动的效果实现了,那么接下来我们改进了需求:

盒子运动到200px的位置后,我们要让盒子继续运动到400px的位置?

分析:

1)、这时候要有两个按钮点击,一个运动到200px,一个运动到400px

 2)、虽然有两个运动,但是其使用的功能都是一样,都是从一个点移动到另一个点,所以我们考虑将1中的运动封装一个函数,以供复用。

上代码~


<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Document</title>
<style type="text/css">
* {
margin: 0;
padding: 0;
}
div {
position: absolute;
top: 50px;
width: 100px;
height: 100px;
background-color: red;
}
input {
width: 100px;
height: 30px;
color: #fff;
background-color: yellowgreen;
}

</style>
</head>

<body>
<div></div>
<input type="button" value="移动到200" />
<input type="button" value="移动到400" />
<script type="text/javascript">
// 封装函数,盒子和目标距离都是不确定的,我们可以将他们作为参数传递。
function animation(tag,target) {
var timer = null,
 currentDistance = tag.offsetLeft,
 step = 5;
step = currentDistance < target? step: -step;// 判断step的正负,200到400时是递增,400到200时是递减
timer = setInterval(function() {
if(Math.abs(currentDistance - target) > Math.abs(step)) { // 这里判断条件也要略作改动,使用绝对值进行比较
 currentDistance += step; /
 tag.style.left = currentDistance + 'px';
}else {
 tag.style.left = target + 'px' // 当当前距离与目标距离之间的差值小于step改变的距离时,我们直接让盒子移动到目标距离。
 clearInterval(timer);
 timer = null;
}
},17)
}
var btns = document.querySelectorAll('input'),
dv = document.querySelector('div');
btns[0].addEventListener('click',function() {
animation(dv,200);
})
btns[1].addEventListener('click',function() {
animation(dv,400);
})
</script>
</body>
</html>

3、盒子来回运动的函数我们封装好了,但是我们再想一下轮播图的滚动效果,它并不是匀速移动,而是最开始很块,在接近滚动完成时,速度又逐渐减低。

需求: 让盒子缓动(也就是变速运动)

上代码~


function animation(tag,target) {
var timer = null;
timer = setInterval(function() {
var currentDistance = tag.offsetLeft,
 step = (target - currentDistance) / 5;// 通过目标距离与当前距离的差除以5便达到了我们需要的变速运动,因为step每次定制器执行都要改变,所以放入定时器内
step = step > 0 ? Math.ceil(step):Math.floor(step);// 这里如果将currentDistance定时器外面声明可以不用写,如果放在定时器内声明,因为offsetLeft取整的特性,要对step进行取整
if(Math.abs(currentDistance - target) > Math.abs(step)) {
 currentDistance += step;
 tag.style.left = currentDistance + 'px';
}else {
 tag.style.left = target + 'px'
 clearInterval(timer);
 timer = null;
}
},17)
标签:js,轮播图,缓动函数
0
投稿

猜你喜欢

  • Python使用docx模块处理word文档流程详解

    2023-03-08 15:45:06
  • 使用 Python 在京东上抢口罩的思路详解

    2023-06-01 01:10:30
  • composer.lock文件的作用

    2023-06-06 13:05:24
  • Python matplotlib通过plt.scatter画空心圆标记出特定的点方法

    2023-06-26 14:19:03
  • 探讨:如何查看和获取SQL Server实例名

    2024-01-18 03:47:42
  • 在Python的Flask框架下使用sqlalchemy库的简单教程

    2021-02-23 23:58:40
  • SQL Transcation的一些总结分享

    2012-08-21 10:21:28
  • Python项目实战之使用Django框架实现支付宝付款功能

    2021-12-11 23:28:11
  • Python简单实现词云图代码及步骤解析

    2021-05-13 00:25:52
  • 使用jQuery简化Ajax开发

    2010-04-11 21:09:00
  • Python拼接字符串的7种方式详解

    2021-03-30 11:12:32
  • sql2005 数据同步方法

    2024-01-15 03:28:54
  • redis服务器环境下mysql实现lnmp架构缓存

    2024-01-20 01:44:29
  • 取巧的边框等高

    2009-12-16 12:11:00
  • Python heapq库案例详解

    2022-12-27 12:26:52
  • JS实现隔行换色的表格排序

    2024-04-29 13:35:55
  • python中类变量与成员变量的使用注意点总结

    2022-01-08 03:39:51
  • python中sample函数的介绍与使用

    2021-02-02 15:38:56
  • Python retrying 重试机制的使用方法

    2023-09-21 22:52:36
  • python+selenium实现12306模拟登录的步骤

    2021-06-18 15:32:56
  • asp之家 网络编程 m.aspxhome.com