为了账号安全,请及时绑定邮箱和手机立即绑定

修改后的运动框架仍然在同时运行的时候存在bug~希望大家继续完善修改

//getStyle封装函数
    function getStyle(obj,attr){
        if(obj.currentStyle){
            return obj.currentStyle[attr];
        }else{
            return getComputedStyle(obj,false)[attr];
        }
    }
    //运动框架封装函数
    function startMove(obj,json,fn){
        clearInterval(obj.timer);
        obj.timer = setInterval(function(){
        var flag=true;
        for(var attr in json){
            if(attr=='opacity'){
                var curStyle= Math.round(parseFloat(getStyle(obj,attr))*100);
            }else{
            var curStyle = parseInt(getStyle(obj,attr));
            }
            var rate = (json[attr]-curStyle)/6;
            rate = rate>0?Math.ceil(rate):Math.floor(rate);
                if(json[attr] != curStyle){
                      flag= false;
                  }
                if(attr=='opacity'){
                    obj.style.opacity= (curStyle+rate)/100;
                    obj.style.filter= 'alpha(opacity='+(curStyle+rate)+')';
                    }else{
                    obj.style[attr] = curStyle+rate+'px';
                    }
                if(flag){
                    if(fn){
                          fn()
                      }else{
                          clearInterval(obj.timer);
                      }
                  }
                }
            },30)
        }

参考了问答里大家的回复,这个运动框架已经比较完美~

正在回答

7 回答

在评论看到你了,回调函数不能使用,我的解决办法如下:

【在每次时间间隔开始置flag为true】,就是下面代码的第6行。

// 完美运动框架
function startMove(obj,json,fn){//	json={attr1:iT1,attr2:iT2}  opacity:0.5
	var flag = true;
	clearInterval(obj.timer);
	obj.timer = setInterval(function(){
			flag = true;//    在这里把flag设一下true哦
			var speed = 0,
				icur = null;
			for(var attr in json)
			{
				//	判断速度
				if(attr == "opacity"){
					icur = Math.round(parseFloat(getStyle(obj,attr))*100);
				}else{
					icur = parseInt(getStyle(obj,attr));
				}
				speed = (json[attr] - icur)/8;
				speed = speed>0?Math.ceil(speed):Math.floor(speed);
				
				//	判断临界值
				if(icur != json[attr]){//有一个属性没达到要求iT,flag就等于false
					flag = false;
				}
				if(attr == "opacity"){
					obj.style.filter = "alpha(opacity:"+(icur+speed)+")";
					obj.style.opacity = (icur+speed)/100;
				}else{
					obj.style[attr] = icur+speed+"px";
				}
				//	设置值
				if(flag){//	全部属性都达到要求iT拉
					clearInterval(obj.timer);
					//alert(333);
					if(fn)fn();
					//console.log("fn:"+fn);fn();
				}
				//console.log("flag"+flag);			
			}
		},30);
}


0 回复 有任何疑惑可以回复我~

单个物体html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Document</title>
<style type="text/css">
*{
margin: 0;
padding: 0;
}

ul{
margin-top: 20px;
}
ul,li{
list-style: none;
}

ul li{
width:200px;
height: 100px;
background: red;
margin-bottom: 20px;
filter:alpha('opacity':30);
opacity: 0.3;
border: 1px solid #ccc; 
}
</style>
<script type="text/javascript" src="js/move(json).js"></script>
<script type="text/javascript">
window.onload = function(){
var Li = document.getElementById('li1');
Li.onmouseover = function(){
starMove(Li,{width:400,height:200,opacity:100});
}

Li.onmouseout = function(){
starMove(Li,{height:100,width:200,opacity:30});
}
}
</script>
</head>
<body>
<ul>
<li id="li1"></li>
</ul>
</body>
</html>

多个物体html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Document</title>
<style type="text/css">
*{
margin: 0;
padding: 0;
}

ul{
margin-top: 20px;
}
ul,li{
list-style: none;
}

ul li{
width:200px;
height: 100px;
background: red;
margin-bottom: 20px;
filter:alpha('opacity':30);
opacity: 0.3;
border: 1px solid #ccc; 
}
</style>
<script type="text/javascript" src="js/move(json)-Fix.js"></script>
<script type="text/javascript">
window.onload = function(){
var aLi = document.getElementsByTagName('li');
for(var i=0; i<aLi.length;i++){
aLi[i].timer = null;
aLi[i].timer2 = null;
aLi[i].alpha = 30;
aLi[i].onmouseover = function(){
var This=this;
starMove(This,{width:400,height:200,opacity:100});
}
aLi[i].onmouseout = function(){
var This=this;
starMove(This,{height:100,width:200,opacity:30});
}
}
}


</script>
</head>
<body>
<ul>
<li></li>
<li></li>
<li></li>
</ul>
</body>
</html>

move-json

function getStyle(obj,attr){
	if(obj.currentStyle){
		return obj.currentStyle[attr];
	}else{
		return getComputedStyle(obj,false)[attr];
	}
}

function starMove(obj,json,fn){
	var flag = true;//假设
	clearInterval(obj.timer);
	obj.timer = setInterval(function(){

		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)/8;
			speed = speed>0?Math.ceil(speed):Math.floor(speed);
			
			if(icur != json[attr]){
				flag = false ;
			}
			
			if(attr == 'opacity'){
				obj.style.filter = 'alpha(opacity:"+(icur+speed)+")';
				obj.style.opacity = (icur+speed)/100;
			}else{
				obj.style[attr] = icur + speed + 'px';
			}

			if(flag){
				clearInterval(obj.timer);
				if(fn){
					fn();
				}
			}
		}

	},30)
}

这个是我的,测试没问题。

0 回复 有任何疑惑可以回复我~
#1

那些微笑

看你的代码发现了我的问题所在,多物体链式运动必须定义var This = this,直接用this的话就会出问题
2016-07-15 回复 有任何疑惑可以回复我~

if(flag){}应该放到for(  in  josn)  {} 外边这样一楼就差不多没有大的毛病啦!

0 回复 有任何疑惑可以回复我~

在IE中还是运行不了

0 回复 有任何疑惑可以回复我~
function startMove(obj,json,fn){
	clearInterval(obj.timer);
	var icur = 0;
	obj.timer = setInterval(function(){
	//flag的位置
		var flag = true;
		for(var attr in json){
			//第一步:取当前值
			if(attr == 'opacity'){
				icur = Math.round(parseFloat(getStyle(obj,attr))*100);
			}else{
				icur = parseInt(getStyle(obj,attr));
			}
			// 第二步:算速度
			var speed = (json[attr]-icur)/10;
			speed = speed>0?Math.ceil(speed):Math.floor(speed);
			//第三步:判断是否所有的元素都到达;如果不是则把flag设为false;
			if(icur != json[attr]){
				flag = false;
			}
			if(attr == "opacity"){
				obj.style.filter = "alpha(opacity:" + (icur+speed) + ")";
				obj.style.opacity = (icur+speed)/100;
			}else{
				obj.style[attr] = icur + speed + "px";
			}
		}
		if(flag){
			clearInterval(obj.timer);
			if(fn){
				fn();
			}
		}
	},30);
}


2 回复 有任何疑惑可以回复我~

首先要理解for in循环,他们返回属性名的顺序是不可预测的。然后你这个只要有一个满足,就会执行flag=true,这样还是一样不能同时运动。

0 回复 有任何疑惑可以回复我~
#1

hey自然 提问者

你来修改一下~我借鉴一下
2015-09-14 回复 有任何疑惑可以回复我~
#2

L路_ZR 回复 hey自然 提问者

我不会,不管怎么想就是无法判断for里都完成的情况,除非定义多个定时器。
2015-09-14 回复 有任何疑惑可以回复我~
#3

hey自然 提问者 回复 L路_ZR

确实还是有bug~我又试了一下~
2015-09-14 回复 有任何疑惑可以回复我~

还是有问题,在同时运动的时候

0 回复 有任何疑惑可以回复我~
#1

hey自然 提问者

能具体点吗???
2015-09-10 回复 有任何疑惑可以回复我~
#2

东风破 回复 hey自然 提问者

应该把if(flag){if(fn){fn();}else{clearInterval(obj.timer)};}放在for循环的外面, 否则的话只要有一个满足条件,flag就等于了true;就会清除定时器,这样就不能同时运动了 我是这样理解的。
2015-09-11 回复 有任何疑惑可以回复我~
#3

hey自然 提问者 回复 东风破

您看我是放在哪?
2015-09-11 回复 有任何疑惑可以回复我~
#4

hey自然 提问者 回复 东风破

我是for循环外面先定义了一个flag为真,这样如果按照你的写法,执行这个函数的时候连遍历for循环都不需要直接就满足条件了,flag为真,直接关闭计时器。这个函数不会去执行任何操作。
2015-09-11 回复 有任何疑惑可以回复我~
#5

hey自然 提问者 回复 东风破

你一定要实地的去操作。if(json[attr] != curStyle){flag= false;}这个条件从句,是只有所有的当前值全部等于目标值的时候,才会去置真,执行else操作。
2015-09-11 回复 有任何疑惑可以回复我~
#6

东风破 回复 hey自然 提问者

额,你的在for循环里面吧?
2015-09-12 回复 有任何疑惑可以回复我~
#7

hey自然 提问者 回复 东风破

我今天又试了一下~确实同时运行的时候还有bug~麻烦你贴一下你的代码~我参考一下:)
2015-09-14 回复 有任何疑惑可以回复我~
#8

东风破 回复 hey自然 提问者

我在下面把代码贴上了
2015-09-14 回复 有任何疑惑可以回复我~
#9

慕雪8863458

运动效果没问题,但都不执行callback
2015-09-25 回复 有任何疑惑可以回复我~
#10

kwangroy 回复 东风破

是的, 要全部属性遍历完再判断flag变量的布尔值。放在for循环外面正解。
2015-11-19 回复 有任何疑惑可以回复我~
查看7条回复

举报

0/150
提交
取消

修改后的运动框架仍然在同时运行的时候存在bug~希望大家继续完善修改

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信