1. 程式人生 > >js運動應用:多物體運動框架(上)

js運動應用:多物體運動框架(上)

多物體運動框架原理:

1、所有屬性不可公用

2、屬性與運動物件繫結:速度,透明度等其他屬性值

案例一:多個div變寬:

<!DOCTYPE HTML>
<html>
<head>
	<meta charset="utf-8" />
	<title></title>
	<style>
		
			
		div{
			width:100px;
			height:50px;
			background:red;
			margin:10px;
		}
		
		
	</style>
	<script>
		/**js運動應用--多個div變寬
			1、用單個定時器,會存在一個物體開始運動的時候會影響另一個物體的關閉
			2、解決方案:將定時器作為物體的屬性,每個div定義一個定時器
		*/
		window.onload = function (){
			var oDiv = document.getElementsByTagName('div');
			for(var i=0;i<oDiv.length;i++){
				//每個div對應一個定時器
				oDiv[i].timer = null;
				oDiv[i].onmouseover = function(){
					startMove(this,500);
					
				}
				oDiv[i].onmouseout = function (){
					startMove(this,100);
				}
			}
			
		};
		//如果定義一個定時器,其中一個div開始運動的時候會影響另一個div的關閉。
		//var timer = null;
		function startMove(obj,iTarget){
			//關閉當前物體對應的timer
			clearInterval(obj.timer);
			obj.timer = setInterval(function(){
				var speed = (iTarget - obj.offsetWidth)/6;
				speed=speed>0?Math.ceil(speed):Math.floor(speed);
				
				if(obj.offsetWidth == iTarget){
					clearInterval(obj.timer);
				}else{
					obj.style.width = obj.offsetWidth + speed + 'px';
					document.title = obj.offsetWidth;
				}
			},30);
			
			
		};
	</script>
</head>
<body>
	<div></div>
	<div></div>
	<div></div>
	
</body>
</html>

案例二:多個div淡入淡出:

<!DOCTYPE HTML>
<html>
<head>
	<meta charset="utf-8" />
	<title></title>
	<style>
		
			
		div{
			width:200px;
			height:200px;
			background:red;
			float:left;
			margin:10px;
			filter:alpha(opacity:30);
			opacity:0.3;
			
		}
		
		
	</style>
	<script>
		
		/**js運動應用--多個div變寬
			每個div對應自己的透明度
		*/
		window.onload = function (){
			var oDiv = document.getElementsByTagName('div');
			for(var i=0;i<oDiv.length;i++){
				//每個div對應一個定時器
				oDiv[i].timer = null;
				oDiv[i].alpha = 30;
				oDiv[i].onmouseover = function(){
					startMove(this,100);
					
				}
				oDiv[i].onmouseout = function (){
					startMove(this,30);
				}
			}
			
		};
		//定義一個透明度。
		//var alpha = 30;
		function startMove(obj,iTarget){
			//關閉當前物體對應的定時器
			clearInterval(obj.timer);
			obj.timer = setInterval(function(){
				var speed = (iTarget - obj.alpha)/6;
				speed=speed>0?Math.ceil(speed):Math.floor(speed);
				
				if(obj.alpha == iTarget){
					clearInterval(obj.timer);
				}else{
					obj.alpha += speed;
					obj.style.filter = 'alpha(opacity:'+obj.alpha+')';
					obj.style.opacity =obj.alpha/100;
				}
			},30);
			
			
		};
	</script>
</head>
<body>
	<div></div>
	<div></div>
	<div></div>
	<div></div>
	
</body>
</html>

案例三:div變寬和變高

通過obj.offsetAttr來獲取樣式,通過這種方法來獲取元素的寬高時,如果沒有邊框border,可以正確獲取,如果使用邊框屬性則會出現問題, 為了解決這個問題,可以使用另一種方法,通過getComputedStyle屬性來獲取css樣式(非行間)。   還有一種是通style屬性來獲取css樣式(行間)。

<!DOCTYPE HTML>
<html>
<head>
	<meta charset="utf-8" />
	<title></title>
	<style>
		
			
		div{
			width:200px;
			height:200px;
			background:yellow;
			float:left;
			margin:10px;
			border:1px solid black;
			
		}
		
	</style>
	<script>
	
		
		/**可作為獲取樣式的公共方法*/
		function getStyle(obj,attr){
			if(obj.currentStyle){
				return obj.currentStyle[attr];
			}else{
				return getComputedStyle(obj,false)[attr];
			}
		}
		
		
		window.onload = function (){
			var oDiv = document.getElementById('div1');
			var oDiv2 = document.getElementById('div2');
			oDiv.onmouseover = function (){
				startMove(this,400,'width');
			}
			oDiv.onmouseout = function(){
				startMove(this,200,'width');
			}
			oDiv2.onmouseover = function (){
				startMove(this,400,'height');
			};
			oDiv2.onmouseout = function (){
				startMove(this,200,'height');
			}
			
		};
		
		function startMove(obj,iTarget,attr){
			//關閉當前物體對應的定時器
			clearInterval(obj.timer);
			
			obj.timer = setInterval(function(){
				var 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);
				}else{
					obj.style[attr] = cur + speed + 'px';
				}
			},30);
			
			
		};
		
		
	</script>
</head>
<body>
	<div id="div1">變寬</div>
	<div id="div2">變高</div>
	
	
</body>
</html>

案例四:文字框展示div透明度,知識點:parseFloat小數點需四捨五入 Math.round()

<!DOCTYPE HTML>
<html>
<head>
	<meta charset="utf-8" />
	<title></title>
	<style>
		
			
		div{
			width:200px;
			height:200px;
			background:yellow;
			float:left;
			margin:10px;
			border:10px solid black;
			filter:alpha(opacity:30);
			opacity:0.3;
		}
		
	</style>
	<script>
	
		
		/**可作為獲取樣式的公共方法*/
		function getStyle(obj,attr){
			if(obj.currentStyle){
				return obj.currentStyle[attr];
			}else{
				return getComputedStyle(obj,false)[attr];
			}
		}
		
		
		window.onload = function (){
			var oDiv = document.getElementById('div1');
		
			oDiv.onmouseover = function (){
				startMove(this,100,'opacity');
			}
			oDiv.onmouseout = function(){
				startMove(this,30,'opacity');
			}
			
			
		};
		
		function startMove(obj,iTarget,attr){
			//關閉當前物體對應的定時器
			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);
				}else{
					if(attr =='opacity'){
						obj.style.filter = 'alpha(opacity:'+(cur+speed)+')';
						obj.style.opacity =(cur+speed)/100;
						document.getElementById('txt1').value = obj.style.opacity
					}else{
						obj.style[attr] = cur + speed + 'px';
					}
					
				}
			},30);
			
			
		};
		
		
	</script>
</head>
<body>
	<input type ="text" id="txt1"/>
	<div id="div1"></div>
	
	
	
</body>
</html>