1. 程式人生 > >(43)JS運動之鏈式運動框架

(43)JS運動之鏈式運動框架

鏈式運動框架就是一系列的運動分階段進行,在普通的運動框架上加上一個引數function,這個function表示下一個要執行的動作,具體程式碼如下:

<!DOCTYPE HTML>
<!--鏈式運動框架:運動分階段進行,當運動停止的時候,執行下一個運動-->
<html>
<head>
<meta charset="utf-8">
<title></title>
<style>
#div1 {width:100px;height:100px;background:red;filter:alpha(opacity:30);opacity:0.3}
</style>
 

<script>
window.onload=function ()
{
	var oDiv=document.getElementById('div1');//先獲取div元素
	oDiv.onmouseover=function ()
	{
		startMove(oDiv,'width',300,function(){//先是寬變300
			startMove(oDiv,'height',300,function(){//當寬變300的時候,即運動結束時候開啟另一個運動,使其高變為300
				startMove(oDiv,'opacity',100);//使透明度變成100,原來是30

			});
		
		});
	};
	oDiv.onmouseout=function ()//當滑鼠移出的時候,跟移進的時候效果相反即可。
	{
		startMove(oDiv,'opacity',30,function(){
			startMove(oDiv,'height',100,function(){
				startMove(oDiv,'width',100);
			});
		
		});
	};

};//以下是運動框架的內容
function getStyle(obj, name)
{
	if(obj.currentStyle)
	{
		return obj.currentStyle[name];
	}
	else
	{
		return getComputedStyle(obj, false)[name];
	}
}

function startMove(obj, attr, iTarget, fnEnd)//比普通的運動框架寫多了一個函式,說明下一階段要執行的運動
{
	clearInterval(obj.timer);
	obj.timer=setInterval(function (){
		var cur=0;
		
		if(attr=='opacity')
		{
			cur=Math.round(parseFloat(getStyle(obj, attr))*100);
		}
		else
		{
			cur=parseInt(getStyle(obj, attr));
		}
		
		var speed=(iTarget-cur)/6;
		speed=speed>0?Math.ceil(speed):Math.floor(speed);
		
		if(cur==iTarget)
		{
			clearInterval(obj.timer);
			
			if(fnEnd)fnEnd();
		}
		else
		{
			if(attr=='opacity')
			{
				obj.style.filter='alpha(opacity:'+(cur+speed)+')';
				obj.style.opacity=(cur+speed)/100;
			}
			else
			{
				obj.style[attr]=cur+speed+'px';
			}
		}
	}, 30);
}

</script>
</head>
<body>
	<div id="div1"></div>
</body>
</html>
效果圖:

當滑鼠移進的時候,先橫向變寬,再縱向變高,最後透明度變成100,效果如下:




當滑鼠移出的時候,效果剛好和上面相反: