葛乌
2016-04-21 12:03
我就纳闷了。按代码所示。flag放在定时器外面,最开始是true,执行第一次动画时,不是所有动画都到达,于是定时器的flag被设置为false,然后该干嘛就干嘛,接下来执行30毫秒后的第二次动画,于是乎,问题来了,作为startmove内的变量,定时器外的变量flag,已经被上一次的动画设置为了false,所以,接下来的判断语句flag永远是false, 等同于if(flag)这个是不可能实现的!!定时器内部也没有设置flag为true的语句,动画讲永远不停止!!真正的问题来了:屏幕中老师这样敲的代码,浏览器中居然能实现动画!!!求大神解释!!
你再看一看。
NeoWu222同学的方法,我试了,发现好像flag一直是处于为1,并没有加到3,也就是定时器还一直是开着的
我觉得不要加flag也可以吧,定时器一直开着应该没关系吧,所有的运动也能同时实现(个人想法,不知道行不行)
这个问题和回答给力!给你们点个赞!
不好意思json没有获取长度的属性或方法,所以要自己定义一个方法来获取
把最后一个if(flag == json.length)改为if(flag == getLength(json))
方法定义代码:
function getLength(json){
var length = 0;
for(var attr in json){
length++;
}
return length;
}
把flag初始为0;当有一个属性达到目标值时,flag自增1;当flag 等于 json的长度时再清楚定时器;
代码如下:
function startMove(obj,json,fn){
clearInterval(obj.timer);
obj.timer = setInterval(function(){
var flag = 0;
for(var attr in json){
//1.取当前值
var icur = 0;
if(attr == 'opacity'){
icur = Math.round(parseFloat(getStyle(obj,attr))*100);
//是不是不需要parseFloat
}else{
icur = parseInt(getStyle(obj,attr));
}
//2.算速度
var speed = (json[attr] - icur)/8;
speed = speed>0?Math.ceil(speed):Math.floor(speed);
//3.检测停止
if(icur == json[attr]){
flag++;
}
if(attr == 'opacity'){
obj.style.filter = 'alpha(opacity:' + (icur + speed) + ')';//针对IE
obj.style.opacity = (icur + speed)/100;
//针对chrome、FF
}else{
obj.style[attr] = icur + speed + 'px';
}
if(flag == json.length){
clearInterval(obj.timer);
if(fn){
fn();
}
}
};
},20)
}
你试一下不就知道老师写的代码是对是错了。加个fn,做链式运动。看链式运动有木有?我个人估计应该是没有。flag设置成false之后,就再也没有变回true了。。。老师代码是有bug
JS动画效果
113925 学习 · 1443 问题
相似问题