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

前端之家收集整理的这篇文章主要介绍了JS轮播图中缓动函数的封装前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

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

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

分析:

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

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

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

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

接下来直接上代码了  

<div class="jb51code">
<pre class="brush:xhtml;">
<!DOCTYPE html>
<html lang="en">

Document

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

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

代码~    

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)

好了,一个轮播图需要的最基本的缓动函数完成了~

这里补充一个比较完整的缓动函数:它的功能更全面一点,可以同时更改多样式。  

0 ? Math.ceil(step) : Math.floor(step); currentDistance += step; tag.style[k] = currentDistance / 100; } else if (k == 'zIndex') { tag.style[k] = obj[k]; else { var currentDistance = parseInt(getStyle(tag,k)) || 0,target = obj[k],step = (target - currentDistance) / 10; step = step > 0 ? Math.ceil(step) : Math.floor(step); currentDistance += step; tag.style[k] = currentDistance + 'px'; } if (target != currentDistance) { flag = false // 只要还有属性没有运动完成,就不会清楚定时器 } } if (flag) { clearInterval(tag.timer) fn && fn();// 所有定时器走完,这里执行回调函数,短路操作避免不传回调函数也不会报错。 } },17) }
获取样式的兼容函数,上面的缓动函数的依赖 function getStyle(tag,attr) { if (tag.currentStyle) { return tag.currentStyle[attr]; } else { return getComputedStyle(tag,null)[attr]; } }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程之家。

猜你在找的JavaScript相关文章