原理:盒子本身的位置 + 步长
动画类型:
1.闪动(瞬间到达)
btn.onclick = function () {
div.style.left = "500px";
}
2.匀速 (每次走一样的距离)
function animate(ele,target){
//要用定时器,先清除定时器
//一个盒子只能有一个定时器,这样儿的话,不会和其他盒子出现定时器冲突
//而定时器本身讲成为盒子的一个属性
clearInterval(ele.timer);
//我们要求盒子既能向前又能向后,那么我们的步长就得有正有负
//目标值如果大于当前值取正,目标值如果小于当前值取负
var speed = target>ele.offsetLeft?10:-10;
ele.timer = setInterval(function () {
//在执行之前就获取当前值和目标值之差
var val = target - ele.offsetLeft;
ele.style.left = ele.offsetLeft + speed + "px";
//目标值和当前值只差如果小于步长,那么就不能在前进了
//因为步长有正有负,所有转换成绝对值来比较
if(Math.abs(val)<Math.abs(speed)){
ele.style.left = target + "px";
clearInterval(ele.timer);
}
},30)
}
3.缓动(开始特快,越走越慢,步长越来越小)(类似刹车、弹簧、电梯停止)
动画原理 = 盒子位置+步长(步长越来越小)
盒子位置 = 盒子本身位置 + (目标位置 - 盒子本身位置)/ 10
公式: leader = leader + (target - leader)/10
盒子位置(改变后) = 盒子位置(改变前) + 目标位置与盒子位置的差/10
盒子位置(没有到目标位置之前) + 目标位置与盒子位置的差/10 = 永远到不了的位置
例子: 把一桶水,倒进另一通,每次倒一半,永远倒不完。
//缓动动画封装
function animate(ele,target) {
//要用定时器,先清定时器
//一个萝卜一个坑儿,一个元素对应一个定时器
clearInterval(ele.timer);
//定义定时器
ele.timer = setInterval(function () {
//获取步长
//步长应该是越来越小的,缓动的算法。
var step = (target-ele.offsetLeft)/10;
//对步长进行二次加工(大于0向上取整,小于0项下取整)
step = step>0?Math.ceil(step):Math.floor(step);
//动画原理: 目标位置 = 当前位置 + 步长
ele.style.left = ele.offsetLeft + step + "px";
//检测缓动动画有没有停止
console.log(1);
if(Math.abs(target-ele.offsetLeft)<=Math.abs(step)){
//处理小数赋值
ele.style.left = target + "px";
clearInterval(ele.timer);
}
},30);
网友评论