原理:盒子本身的位置 + 步长
动画类型:
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);
JS中的动画
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 注:本文章内容基于 Three.js 88dev 实现 作为刚接触three.js的小萌新,励志将自己开荒历程记录...
- 原文:Far from The Madding Crowd(《帝国》Empire影评) 作者:Angie Erri...