摘要:動畫函數(shù)封裝單物體運動對一個進行寬高屬性的變化,對透明度屬性進行變化。這里還要注意的是定時器不能共用,要多帶帶設置自己的定時器。具體學習視頻參考慕課網動畫效果
js動畫函數(shù)封裝--單物體運動
對一個div進行寬高屬性的變化,對透明度屬性進行變化。
*{margin: 0; padding: 0;} /*樣式*//*結構*/ #parent {position: relative; width: 200px; height: 200px; background-color: #f00; margin-left: -200px;} #son {position: absolute; width: 30px; height: 50px; background-color: green; top: 50%; right:-30px; transform: translateY(-50%); text-align: center; } window.onload=function(){ //首先加載函數(shù)在dom加載后 var parent=document.getElementById("parent"); //獲得父級dom元素 parent.onmousemove=function(){ //當鼠標在父級元素上移動時,觸發(fā)事件 move(10,0); //move 函數(shù)對進行處理 } parent.onmouseout=function(){ //當鼠標離開父級元素時,觸發(fā)事件 move(-10,-200); }} var timer=null; function move(speed,target){ clearInterval(timer); //每次在進入move之前都清除定時器 var parent=document.getElementById("parent"); timer=setInterval(function(){ //設置定時器 if(parent.offsetLeft==target){ //假如滿足條件,清除定時器 clearInterval(timer); }else{ //否則進行進一步處理 parent.style.marginLeft=parent.offsetLeft+speed+"px"; } },30); } /*js代碼*/分享
這里可能像我這樣的新手對 parent.offsetLeft、marginLeft對這些屬性比較陌生,具體可以參考這篇文章 offsetLeft,有圖有真相。
透明度屬性的處理
#opcity {width: 200px; height: 200px; background-color: #f00; filter: alpha(opacity=30); /*兼容IE9 以下*/opacity: 0.3; } /*樣式*/ /*結構*/ window.onload=function(){ var opcity=document.getElementById("opcity"); opcity.onmousemove=function(){ move(100); } opcity.onmouseout=function(){ move(30); } } var timer=null; var op=30; function move(arg){ clearInterval(timer); var opcity=document.getElementById("opcity"); timer=setInterval(function(){ var speed=0; if(op這里的代碼基本和上面基本上是一樣的,主要是要對 opacity進行處理,這里在后面還有一種處理辦法,由于opacity 傳進來是0.3這樣的小數(shù),可以先用parseFloat()對opacity進行處理,然后在乘以100使其變成一個整數(shù),然后在進行后面的處理。
js動畫函數(shù)封裝--多物體運動div {width: 400px; height: 200px; background-color: yellow; border: 2px solid #666; margin-bottom: 20px;} /*樣式*/ /*結構*/ window.onload=function(){ var test= document.getElementById("test"); var test1= document.getElementById("test1"); test.timer=null; test1.timer=null; test.onmouseover=function(){ move(this,"width",200); } test.onmouseout=function(){ move(this,"width",400); } test1.onmouseover=function(){ move(this,"height",400); } test1.onmouseout=function(){ move(this,"height",200); } } function move(obj,attr,target){ clearInterval(obj.timer); obj.timer=setInterval(function(){ var pa= parseInt(getStyle(obj,attr)); var speed=(target-pa)/8; speed=(speed>0)?Math.ceil(speed):Math.floor(speed); obj.style[attr]=pa+speed+"px"; },30); } function getStyle(obj,attr){ if(obj.currentStyle){ return obj.currentStyle[attr]; /*IE 方法*/ }else { return getComputedStyle(obj,false)[attr]; /*chrome ,ff*/ } } /*js代碼*/這里新封裝一個函數(shù),getStyle()用來獲取DOM元素樣式,對currentStyle和 getComputedStyle有疑問的可以參考一下張鑫旭大神的這篇文章currentStyle getComputedStyle,到這一步開始有進一步對函數(shù)的封裝,記得開始的時候單物體運動的時候,只有一個屬性,只需要傳一個參數(shù),對 opacity的處理大致也差不多,只是要多一點轉化,對于多物體運動,屬性的值是在變化的,而且test test1一個改變寬,一個改變高,所以可以對函數(shù)可以進一步封裝,這里對于opacity處理是有問題的,需要在函數(shù)內部進行判斷,選擇不同的分支。這里還要注意的是定時器不能共用,要多帶帶設置自己的定時器。
js動畫函數(shù)封裝--緩沖運動基本結構和上面單物體結構相同