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

我们从需求的角度开始,首先给出一个简单需求:
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)
好了,一个轮播图需要的最基本的缓动函数完成了~
这里补充一个比较完整的缓动函数:它的功能更全面一点,可以同时更改多样式。
function perfectAnimate(tag, obj, fn) {// 传三个参数,运动的盒子,对象(可以传多个属性),回调函数(在执行完后可以再执行自定义的功能)
clearInterval(tag.timer);// 这里将定时器作为tag标签的属性保存,可以多次调用函数清除上一个定时器。
tag.timer = setInterval(function () {
var flag = true;
for (var k in obj) {
// 因为并不是所有属性都带px单位,所以这里进行判断分别设置
if (k == 'opacity') {
var currentDistance = getStyle(tag, k) * 100,
target = obj[k] * 100,
step = (target - currentDistance) / 10;
step = step > 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];
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# js
# 轮播图
# 缓动函数
# JavaScript中cookie工具函数封装的示例代码
# JavaScript函数封装的示例详解
# 原生javascript运动函数的封装示例【匀速、抛物线、多属性的运动等】
# JS基于封装函数实现的表格分页完整示例
# 纯js封装的ajax功能函数与用法示例
# JS实现运动缓冲效果的封装函数示例
# JavaScript前端实用的工具函数封装
# 要让
# 都是
# 回调
# 好了
# 停下来
# 自己的
# 这时候
# 也不
# 放在
# 有个
# 都要
# 多个
# 也要
# 要有
# 也能
# 是从
# 我们可以
# 一辆
# 可以通过
# 跑到
相关文章:
如何确保西部建站助手FTP传输的安全性?
如何零基础在云服务器搭建WordPress站点?
如何高效完成自助建站业务培训?
网站制作公司排行榜,四大门户网站排名?
实例解析angularjs的filter过滤器
商务网站制作工程师,从哪几个方面把握电子商务网站主页和页面的特色设计?
如何在Windows虚拟主机上快速搭建网站?
如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南
济南专业网站制作公司,济南信息工程学校怎么样?
如何在香港免费服务器上快速搭建网站?
宠物网站制作html代码,有没有专门介绍宠物如何养的网站啊?
北京专业网站制作设计师招聘,北京白云观官方网站?
高防服务器租用如何选择配置与防御等级?
孙琪峥织梦建站教程如何优化数据库安全?
已有域名和空间,如何快速搭建网站?
企业网站制作公司网页,推荐几家专业的天津网站制作公司?
小说建站VPS选用指南:性能对比、配置优化与建站方案解析
湖北网站制作公司有哪些,湖北清能集团官网?
制作营销网站公司,淘特是干什么用的?
如何选择高性价比服务器搭建个人网站?
如何高效完成独享虚拟主机建站?
南宁网站建设制作定制,南宁网站建设可以定制吗?
微网站制作教程,不会写代码,不会编程,怎么样建自己的网站?
深圳网站制作平台,深圳市做网站好的公司有哪些?
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法
如何基于云服务器快速搭建个人网站?
成都网站制作报价公司,成都工业用气开户费用?
小程序网站制作需要准备什么资料,如何制作小程序?
如何解决VPS建站LNMP环境配置常见问题?
如何解决ASP生成WAP建站中文乱码问题?
如何通过网站建站时间优化SEO与用户体验?
制作网站的基本流程,设计网站的软件是什么?
七夕网站制作视频,七夕大促活动怎么报名?
如何用AWS免费套餐快速搭建高效网站?
如何续费美橙建站之星域名及服务?
专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
如何快速登录WAP自助建站平台?
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
如何用免费手机建站系统零基础打造专业网站?
专业网站制作服务公司,有哪些网站可以免费发布招聘信息?
如何通过可视化优化提升建站效果?
测试制作网站有哪些,测试性取向的权威测试或者网站?
建站之星如何配置系统实现高效建站?
如何有效防御Web建站篡改攻击?
网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?
家具网站制作软件,家具厂怎么跑业务?
网站制作多少钱一个,建一个论坛网站大约需要多少钱?
C#如何在一个XML文件中查找并替换文本内容
*请认真填写需求信息,我们会在24小时内与您取得联系。