/*
* elem: 操作哪一个元素
* json:表示多个属性
* attr: 操作的那个元素的css中的什么属性
* value: 操作的那个元素的css中的那个属性的目标值
* cb:回调函数,前一个运动执行后,这一段代码才被执行
*/
var startMove = (elem, json, cb)=>{
// 每当执行运动函数的时候,都先把上一次的运动结束掉
clearInterval(elem.timer);
// 开启定时器,让elem的attr属性,不断的变化
elem.timer = setInterval( ()=>{
// 循环,把json中的每一个属性,都做处理(让json中的每一个属性,都运动起来)
var flag = true; //是不是所有的属性,都运动到了目标值
for( var attr in json ){
// attr属性的目标值
var value = json[attr]; //此时的json是一个只有一个元素的对象,如: left:500;
//所以value是500
// 求当前属性值
var v = getComputedStyle(elem)[attr]; //attr应该是left
if( attr=="opacity" ){
v = Math.round(v*100);
}else{
v = parseInt(v);
}
//console.log(v);
// 求目标值与当前值的间距
var dist = value-v;
// 求步长值(注意:缓冲运动中,步长值是逐渐减小的)
var step = dist/6;
//console.log(step);
// 如果属性逐渐变大的运动,那么step最后几次的值类似 0.1,我们希望把0.1变为1
// 如果属性逐渐变小的运动,那么step最后几次的值类似 -0.1,我们希望把-0.1变为-1
if( step>0 ){
step = Math.ceil(step);
}else{
step = Math.floor(step);
}
// 更新属性值
//console.log(v, step);
if( attr=="opacity" ){
elem.style[attr] = (v+step)/100;
}else{
elem.style[attr] = (v+step)+'px';
}
// 如果到达目标值,运动停止
//if( v==value ){
// clearInterval(elem.timer);
//}
if( v!=value ){// 只要有1个属性,没有到达目标值,就让flag等于false
flag = false;
}
}
// 判断是否所有的属性,都已经到达了目标值
if( flag ){
clearInterval(elem.timer);
if( cb ){ // 如果设置了回调函数,则执行它。不写if的话,当cd没有设置时,会报错
cb();
}
}
}, 30 );
}
startMove( div1, {"left":100} ,()=>{
startMove(div1 , {"top" :300});
});
05-11 10:54