JavaScript缓动动画怎样实现封装,思路和代码是什么
Admin 2022-07-12 群英技术资讯 1133 次浏览
这篇文章给大家分享的是JavaScript缓动动画怎样实现封装,思路和代码是什么。小编觉得挺实用的,因此分享给大家做个参考,文中的介绍得很详细,而要易于理解和学习,有需要的朋友可以参考,接下来就跟随小编一起了解看看吧。(1)如何重复调用?
答:封装一个函数,用一次调用一次
代码分析:
function animate(obj, target, callback) { //详细实现步骤 };
animate :(动画函数)
obj(动画对象):给谁添加动画效果
target(目标值):移动到什么距离
callback(回调函数):同时要执行什么功能
(2)如何实现缓动效果?(缓动动画核心算法)
答:移动距离 =(目标值 - 现在盒子位置)/ 10,移动距离会慢慢变小,直至停下,就实现了缓动原理
代码分析:
var step = (target - obj.offsetLeft) / 10;
step(移动距离): 元素要移动的距离
target(目标值):移动到什么距离
obj.offsetLeft(盒子现在的位置):盒子现在距离左侧的距离
(3)为什么移动不到指定位置?(给的目标距离是500px,移动到496.4就停下了)
答:因为需要取整,正数往上取整,负数向下取整

代码分析:
step = step > 0 ? Math.ceil(step) : Math.floor(step);
如果setp要移动的距离是正数,就向上取整,如果是负数,就向下取整,采取三元表达式以优化代码,提升整体质量
(4)如何让目标元素真正移动起来?
答:添加定时器,并将实时移动距离(步长)赋值给元素
代码分析:
var timer = setInterval(function () { //详细实现代码 }, 15); //添加定时器
obj.style.left = obj.offsetLeft + step + 'px'; //步长
1.给定时器添加名字是为了好清除定时器,时间设置为15(实际开发常用15)
2.元素的左侧的值 = 元素离左侧的距离 + 移动距离 + 'px' (记得一定要加px单位),实现原理就是不断将最新的值赋值给元素,实现动起来的效果
(5)为什么会鬼畜或者越点越快?
答:因为定时器重复添加,需要每次调用时清除定时器
代码分析:
clearInterval(timer);
两个地方需要清除,第一是刚调用缓动动画函数时,避免鬼畜和破速,第二是判断元素到达指定位置没有,如果到达了就停止定时器
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.sliderbar {
/* width: 240px; */
/* height: 40px; */
/* 父盒子定位根据实际要求来 */
position: absolute;
right: 0;
top: 100px;
text-align: center;
line-height: 40px;
/* display: block; */
width: 40px;
height: 40px;
cursor: pointer;
}
.sp {
position: relative;
color: #fff;
}
.con {
/* 设置了绝对定位就在父盒子里飘起来 */
position: absolute;
left: 0;
top: 0;
width: 200px;
height: 40px;
background-color: pink;
z-index: -1;
color: #fff;
}
</style>
<script src="./animate.js"></script>
</head>
<body>
<div class="sliderbar">
<span class="sp">←</span>
<div class="con">问题反馈</div>
</div>
<script>
var sliderbar = document.querySelector('.sliderbar');
// var sp = document.querySelector('.sp');
var con = document.querySelector('.con');
sliderbar.addEventListener('mouseenter', function() {
//animate(obj, target, callback);
animate(con, -160, function() {
sliderbar.children[0].innerHTML = '→';
});
})
sliderbar.addEventListener('mouseleave', function() {
//animate(obj, target, callback);
animate(con, 0, function() {
sliderbar.children[0].innerHTML = '←';
});
})
</script>
</body>
</html>
整体思路:通过给盒子添加鼠标事件来调用动画函数,最终实现效果
运行效果:


function animate(obj, target, callback) {
//调用函数就清除一次定时器,避免问题发生
clearInterval(obj.timer)
//添加定时器
obj.timer = setInterval(function () {
//步长值写到计时器里面 改为整数(往上取整)
var step = (target - obj.offsetLeft) / 10;
//整数往大了取,负数往小了取
step = step > 0 ? Math.ceil(step) : Math.floor(step);
if (obj.offsetLeft == target) {
//如果已经到达指定位置就停止定时器
clearInterval(obj.timer);
//回调函数写到定时器结束之后
callback && callback();
}
//把每次加一步长值改变为慢慢变小的值
obj.style.left = obj.offsetLeft + step + 'px';
}, 15);
}
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
commentBox1.创建管理员首先开启Mongo服务,然后切换admin数据库,一开始是没有这个数据库的。>useadmin12.然后创建用户和密码:>db.createUser({user:’root’,pwd:’root1234’,rol
本篇文章给大家带来了关于JavaScript的相关知识,其中主要为大家详细介绍了JavaScript变量类型以及变量之间的转换,文中示例代码介绍的非常详细,具有一定的参考价值,希望对大家有帮助。
这篇文章主要介绍了Js模块打包exports require import的用法和区别,对模块打包感兴趣的同学,可以参考下
相信很多小伙伴们都一直在疑惑,setState 到底是同步还是异步。本文就详细的介绍一下React中setState同步或异步问题,感兴趣的可以了解一下
目录写在前面javscript 中函数和对象的关系面向对象编程(OOP)继承多态封装函数编程编程(FP)闭包和高阶函数柯里化偏函数组合和管道函子写在最后写在前面浏览下文我觉得还是要有些基础的!下文涉及的知识点太多,基本上每一个拿出来都能写几篇文章,我在写文章的过程中只是做了简单的实现,我只是提供了一个思路,更多的细节还
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008