一、缓动动画基本代码实现
缓动动画就是让元素运动速度有所变化,最常见的是让速度慢慢停下来
思路:
1.让盒子每次移动的距离慢慢变小,速度就会慢慢落下来
2.核心算法:(目标值 - 现在的位置)/ 10 做为每次移动的距离 步长
3.停止的条件:让当前盒子位置等于目标位置就停止定时器
4.注意:步长值需要取整
<!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>测试</title><style>*{margin: 0;padding: 0;}span{position: absolute;top: 100px;left: 0;display: block;width: 100px;height: 100px;background-color: purple;}</style></head><body><button class="start">紫色盒子</button><button class="reset">复位</button><span></span><script>//简单动画函数封装 obj目标对象 target目标位置//给不同的元素指定了不同的定时器//缓动动画function animate (obj,target) {clearInterval(obj.timer);//让盒子在当前位置+1距离//定时器重复操作,最后清除定时器obj.timer = setInterval(function(){//步长值写到定时器的里面var step = Math.ceil((target - obj.offsetLeft) / 10);//获得盒子当前的位置var x = obj.offsetLeft;if(x == target){clearInterval(obj.timer);}obj.style.left = x + step + 'px';},15);}//获取元素var span = document.querySelector('span');var btnStart = document.querySelector('.start');var btnReset = document.querySelector('.reset');btnStart.addEventListener('click',function(){animate(span,500);});btnReset.addEventListener('click',function(){location.reload();});</script></body></html>
二、多个目标值之间移动
可以让动画函数从800到500
当我们点击按钮时,判断步长是正值还是负值。
1.如果为正,则步长往大了取整
2.如果为负,则步长往小了取整
<!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>测试</title><style>*{margin: 0;padding: 0;}span{position: absolute;top: 100px;left: 0;display: block;width: 100px;height: 100px;background-color: purple;}</style></head><body><button class="start500">紫色盒子到500</button><button class="start800">紫色盒子到800</button><button class="reset">复位</button><span></span><script>//简单动画函数封装 obj目标对象 target目标位置//给不同的元素指定了不同的定时器//缓动动画function animate (obj,target) {clearInterval(obj.timer);//让盒子在当前位置+1距离//定时器重复操作,最后清除定时器obj.timer = setInterval(function(){//步长值写到定时器的里面var step = (target - obj.offsetLeft) / 10;step = step > 0 ? Math.ceil(step) : Math.floor(step);//获得盒子当前的位置var x = obj.offsetLeft;if(x == target){clearInterval(obj.timer);}obj.style.left = x + step + 'px';},15);}//获取元素var span = document.querySelector('span');var btnStart500 = document.querySelector('.start500');var btnStart800 = document.querySelector('.start800');var btnReset = document.querySelector('.reset');btnStart500.addEventListener('click',function(){animate(span,500);});btnStart800.addEventListener('click',function(){animate(span,800);});btnReset.addEventListener('click',function(){location.reload();});</script></body></html>
三、添加回调函数
回调函数原理:函数可以作为一个参数。将这个函数作为参数传到另一个函数里面,当那个函数执行完毕之后,再执行传进去的这个参数,这个过程叫做回调。
回调函数写的位置:定时器结束的位置。
<!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>测试</title><style>*{margin: 0;padding: 0;}span{position: absolute;top: 100px;left: 0;display: block;width: 100px;height: 100px;background-color: purple;}</style></head><body><button class="start500">紫色盒子到500</button><button class="start800">紫色盒子到800</button><button class="reset">复位</button><span></span><script>//简单动画函数封装 obj目标对象 target目标位置//给不同的元素指定了不同的定时器//缓动动画function animate (obj,target,callback) {clearInterval(obj.timer);//让盒子在当前位置+1距离//定时器重复操作,最后清除定时器obj.timer = setInterval(function(){//步长值写到定时器的里面var step = (target - obj.offsetLeft) / 10;step = step > 0 ? Math.ceil(step) : Math.floor(step);//获得盒子当前的位置var x = obj.offsetLeft;if(x == target){clearInterval(obj.timer);//回调函数写在定时器结束的位置if(callback){//调用函数callback();}}obj.style.left = x + step + 'px';},15);}//获取元素var span = document.querySelector('span');var btnStart500 = document.querySelector('.start500');var btnStart800 = document.querySelector('.start800');var btnReset = document.querySelector('.reset');btnStart500.addEventListener('click',function(){animate(span,500);});btnStart800.addEventListener('click',function(){animate(span,800,function(){span.style.backgroundColor = 'red';span.style.transition = 'all' + ' 2s';});});btnReset.addEventListener('click',function(){location.reload();});</script></body></html>
.
