flag 放在计时器里跟没定义一个卵样,会出现bug,有些同志没有经过完全的调试就以为找出了一个bug;其实不然,运行的时候打开F12看看高宽就知道了,
flag是要放到计时器里的,同时if(flag)要放到for in循环的后面而不是里面,这样宽高就都对了
我的也有问题,加了if(flag)后链式运动执行不了了,因为链式运动一次只改变一个属性,然后达到后定时器就清空了,后面的就不执行了
楼主是没把if (flag)放在计时器外?
我的运行的很正常 也么有什么数据误差,,,
在flag为false时定时器会一直执行,每次执行时都会重置为true,直到所有的都达到目标值,就不会再为false了,然会就能执行下一个运动
//同步运动函数
function move(obj, json, fn) {
//清除定时器,避免出现多个定时器
clearInterval(obj.timer);
//设定定时器
obj.timer = setInterval(function () {
//声明标杆变量
var flag = true;
//遍历同步运动属性
for (var attr in json) {
//获取属性值
var icur = 0;
if (attr == 'opacity') {
icur = Math.round(parseFloat(getStyle(obj,attr)) * 100);
} else {
icur = parseInt(getStyle(obj, attr));
}
//设置运动速度
var speed = (json[attr] - icur)/100;
speed = speed>0?Math.ceil(speed):Math.floor(speed);
// 判断是否所有值都达到了目标值,判定暂停定时器的指标
if (icur != json[attr]) {
flag = false;
}
if (attr == 'opacity') {
obj.style.opacity = (icur + speed) / 100;
obj.style.filter = 'alpha(opacity:' + (icur + speed) + ')';
} else {
obj.style[attr] = (icur + speed) + 'px';
}
}
//清除定时器
if(flag){
clearInterval(obj.timer);
if(fn){
fn();
}
}
}, 1);
}
//获取任意属性
function getStyle(obj, attr) {
if (obj.currentStyle) {
return obj.currentStyle[attr]; //IE取样式
} else {
return getComputedStyle(obj, false)[attr];
}
}