缓动动画跟前面的匀速动画相比肯定会更加细腻,在现实中还是缓动应用的较多,
下面的同样列出实现主要有几个点:
- 效果是实现一个对象
(obj)
移动到目标位置(target)
- 用之前先清一下定时器,防止导致出现存在多个定时器,无法停下来,导致出现bug;
- 定时器间隔设为25ms是因为现在主流的大多是25ms效果比较好一点,具体你也可以根据需要改变;
- step是指的步长,在这里的step是实现缓动效果的关键,step是通过目标点和当前位置的距离差来决定的,这样就会有随着距离减小会慢慢变小,也就是会有慢慢减速,先快后慢的效果
- 清除定时器的时间点判断-这次就不用向匀速动画中那样通过手动在快接近目标点的时候将其赋值为目标点,因为这里上面的step都是除以10,并且也对step在0位置做了判断,所以可以达到当前位置等于目标位置,也就是可以顺利清除定时器;
下面是具体代码实现:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15function animate(obj, target) { //缓动动画 事实证明还是缓动效果比较细腻
clearInterval(obj.timer); //防止重复调用,用前先清定时器
obj.timer = setInterval(function() {
var leader = obj.offsetLeft; //读取的时候用offsetTop确保也能读取到不是行内的样式
var step = (target - leader) / 10;
step = step > 0 ? Math.ceil(step) : Math.floor(step);
//通过下面这个方法能够在控制台中体会到数据的渐变
console.log("target:" + target + "---leader:" + leader + "---step:" + step);
if (leader != target) {
obj.style.left = leader + step + "px"; //赋值的时候就用top设置行间样式
} else {
clearInterval(obj.timer);
}
}, 25)
}
下面是使用这个封装的animate实现的缓动动画效果,
另外这个案例当中还穿插了一下无缝滚动的效果,能够实现最后一张平滑的切换到第一张,下面附上代码:
下面的代码并不是特别规范,只是站在初学者的角度通俗的将几个重要的点展示出来
1 |
|