亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

修改后的運動框架仍然在同時運行的時候存在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下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號