简易的运动框架可以用来控制长宽高、位置、透明度,结合定时器可以实现简单的动画。
其中最主要也是最基础的就是获得元素的属性,我们先来看一下给元素添加样式的三种方法:行内样式、嵌入式样式、外链样式表
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Document</title> 6 <!-- 外部样式表 --> 7 <link style="stylesheet" href="style.css" type="text/css" /> 8 <!-- 嵌入样式 --> 9 <style> 10 div{ 11 height: 200px; 12 } 13 </style> 14 </head> 15 <body> 16 <!-- 行内样式 --> 17 <div style="width:200px;"></div> 18 </body> 19 </html>
我们要获取元素的样式可以使用 obj.style.xx,但是这个方法只能获取行内样式。
1 <script> 2 var oBox = document.getElementById('box'); 3 console.log(oBox.style.width);//200px 4 5 console.log(oBox.style.height);//'' 6 </script>
所以我们要想获得元素的样式,style是不够的所以引用了currentStyle(IE)方法和getComputedStyle方法
定义一个获取元素样式的通用函数:
1 function getStyle(obj,attr){ 2 return obj.currentStyle ? obj.currentStyle[attr] : getComputedStyle(obj)[attr]; 3 };
开始写doMove函数
首先doMove接受的参数
1 doMove(obj,attr,dir,target,endFn)
obj是要进行操作的对象
attr是要操作的属性
dir是要改变元素属性的速度(在一段时间内改变多少)
target属性改变的目标值
endFn是回调函数
首先,我们先要判断dir的正负,如果元素现在的属性值要是小于目标值则attr为正,否则为负数
注意:用getStyle()函数返回的是字符串,所以要用parseInt转换为数字
1 dir = parseInt(getStyle(obj,attr)) < target ? dir : -dir;
然后定义主要的运动函数
1 obj.timer = setInterval(function (){ 2 //下一个位置的变化 3 var speed = parseInt(getStyle(obj,attr)) + dir; 4 //超过目标值时,speed改为目标值 5 if(speed > target && dir > 0 || speed < target && dir < 0){ 6 speed = target; 7 }; 8 obj.style[attr] = speed + 'px'; 9 if(speed == target){ 10 clearInterval(obj.timer); 11 endFn && endFn(); 12 }; 13 },20);
speed = 元素属性当前的值 + 要每段时间的变化,判断改变后的值speed是否大于或者小于目标值target,如果大于或者小于目标值,则speed等于目标值,否则继续执行。
如果speed等于目标值则停止对元素属性的更改,清楚定时器,如果有回调函数则执行。
最后定义对透明度改变的函数:
1 function chOpacity(obj,speed,target,endFn){ 2 //取得最初值,要用parseInt不然得到的opacity属性是字符串 3 var oropacity = parseInt(getStyle(obj,'opacity')); 4 5 //定时器 6 obj.chopacity = null; 7 //判断正负 8 speed = oropacity > target ? -speed : speed; 9 10 clearInterval(obj.chopacity); 11 12 obj.chopacity = setInterval(function(){ 13 14 obj.style.opacity = oropacity += speed; 15 16 if(obj.style.opacity < 0){ 17 obj.style.opacity = 0; 18 clearInterval(obj.chopacity); 19 endFn && endFn(); 20 21 } 22 if(obj.style.opacity > 1){ 23 obj.style.opacity = 1; 24 clearInterval(obj.chopacity); 25 endFn && endFn(); 26 } 27 },40); 28 29 }
基本思想和doMove()函数差不多。这里就不在讲了。
应用:
实现这个动画效果的代码:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <script src="doMove.js"></script> <style> #box{ width:800px; height: 60px; border: 1px solid black; position: absolute; top: 300px; left: 150px; opacity: 1; line-height: 60px; } #box2{ width: 800px; height: 60px; position: absolute; background: green; top: 0px; left: 0px; } span{ display: inline-block; width: 90px; position: absolute; top:10px; } </style> </head> <body> <div id="box"> </div> <script> window.onload = function(){ var timer = null; var oSpan = document.getElementsByTagName('span'); var oBox = document.getElementById('box'); var oBox2 = document.getElementsByTagName('div'); var num = 0; var len = 8; var str = ''; for(var i=0;i<len;i++){ str += '<span style="width:90px;position:absolute;top:0px;left:'+i*110+'px">+1</span>'; } str += '<div style="width: 0px;height: 60px;position: absolute;background: rgb(100,100,100);top: 0px;left: 0px; "></div>' oBox.innerHTML = str; oBox.onclick = function(){ clearInterval(timer); timer = setInterval(function(){ doMove(oSpan[num],'top',2,-150); doMove(oBox2[1],'width',23,800,function(){chOpacity(oBox2[1],0.08,0);}); chOpacity(oSpan[num],0.040,0); num++; if(num == oSpan.length){ clearInterval(timer); } },40); } } </script> </body> </html>
doMove函数
1 function doMove(obj,attr,dir,target,endFn){ 2 //判断数值的正负,如果目标值大于当前值则为正 3 dir = parseInt(getStyle(obj,attr)) < target ? dir : -dir; 4 5 clearInterval(obj.timer); 6 7 obj.timer = setInterval(function (){ 8 //下一个位置的变化 9 var speed = parseInt(getStyle(obj,attr)) + dir; 10 //超过目标值时,speed改为目标值 11 if(speed > target && dir > 0 || speed < target && dir < 0){ 12 speed = target; 13 }; 14 obj.style[attr] = speed + 'px'; 15 if(speed == target){ 16 clearInterval(obj.timer); 17 endFn && endFn(); 18 }; 19 },20); 20 }; 21 22 function chOpacity(obj,speed,target,endFn){ 23 //取得最初值,要用parseInt不然得到的opacity属性是字符串 24 var oropacity = parseInt(getStyle(obj,'opacity')); 25 26 //定时器 27 obj.chopacity = null; 28 //判断正负 29 speed = oropacity > target ? -speed : speed; 30 31 clearInterval(obj.chopacity); 32 33 obj.chopacity = setInterval(function(){ 34 35 obj.style.opacity = oropacity += speed; 36 37 if(obj.style.opacity < 0){ 38 obj.style.opacity = 0; 39 clearInterval(obj.chopacity); 40 endFn && endFn(); 41 42 } 43 if(obj.style.opacity > 1){ 44 obj.style.opacity = 1; 45 clearInterval(obj.chopacity); 46 endFn && endFn(); 47 } 48 },40); 49 50 } 51 52 function getStyle(obj,attr){ 53 return obj.currentStyle ? obj.currentStyle[attr] : getComputedStyle(obj)[attr]; 54 };