《js动画效果》之多物体动画


js

学习资源来自慕课网《js动画效果》:http://www.imooc.com/learn/167。

多物体运动——给多个元素加上同一动画效果,比如下面两个例子:

1. 网页上有一ul, ul中有三个li元素,要求鼠标移到(onmouseover) li 元素上产生动画效果——宽度值增加到300px,鼠标移出(onmouseout) li 元素产生动画效果——宽度值复原到200px. 如下图-1示:

2. 同题 1 类似,只是要求改变li 的透明度值。如图-2时:

                               


练习题1 代码实现:

  1. <!DOCTYPE html>  
  2. <html>  
  3.     <head>  
  4.         <meta charset="utf-8">  
  5.         <style type="text/css">  
  6.         *{  
  7.             padding:0;  
  8.             margin:0;  
  9.         }  
  10.         ul li{  
  11.             list-style:none;  
  12.             width:200px;  
  13.             height:100px;  
  14.             background:green;  
  15.             margin:20px;  
  16.         }  
  17.         </style>  
  18.         <script type="text/javascript">  
  19.         /***  
  20.             实现多物体运动的关键点:  
  21.             1)获取到每个元素;  
  22.             2)给每个元素绑定上事件;  
  23.             3)注意使用this区分当前操作的元素;  
  24.             4)定时器不能只设一个了,应该给每个元素分配一个定时器,避免多个元素抢同一个定时器造成bug  
  25.   
  26.             记住:多物体运动不能共用同一个东西(某一参数,比如定时器)  
  27.         ***/  
  28.             window.onload = function(){  
  29.                 var liEles = document.getElementsByTagName("li");  
  30.   
  31.                 for(var i=0; i<liEles.length; i++){  
  32.   
  33.                     //给每一个li元素定义一个定时器,避免多个元素抢同一个定时器造成bug  
  34.                     liEles[i].timer = null;  
  35.                     liEles[i].onmouseover = function(){  
  36.   
  37.                         //传入this值,指定当前操作的是哪个li  
  38.                         playFun(this, 300);  
  39.                     };  
  40.                     liEles[i].onmouseout = function(){  
  41.                         playFun(this, 200);  
  42.                     };  
  43.                 }  
  44.             }  
  45.   
  46.             //var timer = null;  
  47.             function playFun(obj,itarget){  
  48.                 clearInterval(obj.timer);  
  49.                 obj.timer = setInterval(function(){  
  50.                     var speed = (itarget - obj.offsetWidth)/10;  
  51.                     speed = speed>0?Math.ceil(speed):Math.floor(speed);  
  52.                       
  53.                     if(obj.offsetWidth == itarget){  
  54.                         clearInterval(obj.timer);  
  55.                     }else{  
  56.                         obj.style.width = obj.offsetWidth + speed + "px";  
  57.                     }  
  58.                 },50);  
  59.             }  
  60.         </script>  
  61.     </head>  
  62.     <body>  
  63.         <ul>  
  64.             <li></li>  
  65.             <li></li>  
  66.             <li></li>  
  67.         </ul>  
  68.     </body>  
  69. </html>  


练习题2代码实习:

  1. <!DOCTYPE html>  
  2. <html>  
  3.     <head>  
  4.         <meta charset="utf-8">  
  5.         <style type="text/css">  
  6.         *{  
  7.             padding:0;  
  8.             margin:0;  
  9.         }  
  10.         ul li{  
  11.             list-style:none;  
  12.             width:200px;  
  13.             height:100px;  
  14.             background:green;  
  15.             margin:20px;  
  16.             filter:alpha(opacity:30);  
  17.             opacity:0.3;  
  18.         }  
  19.         </style>  
  20.         <script type="text/javascript">  
  21.         /***  
  22.             实现多物体运动的关键点:  
  23.             1)获取到每个元素;  
  24.             2)给每个元素绑定上事件;  
  25.             3)注意使用this区分当前操作的元素;  
  26.             4)定时器不能只设一个了,应该给每个元素分配一个定时器,避免多个元素抢同一个定时器造成bug  
  27.             5)//给每一个li元素定义参数透明值alpha,避免多个元素抢同一个alpha造成bug  
  28.   
  29.             记住:多物体运动不能共用同一个东西(某一参数,比如定时器)  
  30.         ***/  
  31.             window.onload = function(){  
  32.                 var liEles = document.getElementsByTagName("li");  
  33.   
  34.                 for(var i=0; i<liEles.length; i++){  
  35.   
  36.                     //给每一个li元素定义一个定时器,避免多个元素抢同一个定时器造成bug  
  37.                     liEles[i].timer = null;  
  38.   
  39.                     //给每一个li元素定义参数透明值alpha,避免多个元素抢同一个alpha造成bug  
  40.                     liEles[i].alpha = 30;  
  41.                     liEles[i].onmouseover = function(){  
  42.   
  43.                         //传入this值,指定当前操作的是哪个li  
  44.                         playOpacity(this, 100);  
  45.                     };  
  46.                     liEles[i].onmouseout = function(){  
  47.                         playOpacity(this, 30);  
  48.                     };  
  49.                 }  
  50.             }  
  51.   
  52.             function playOpacity(obj,itarget){  
  53.                 clearInterval(obj.timer);  
  54.                 obj.timer = setInterval(function(){  
  55.                     var speed = 0;  
  56.                     if(obj.alpha > itarget){  
  57.                         speed = -10;  
  58.                     }else{  
  59.                         speed = 10;  
  60.                     }  
  61.                       
  62.                     if(obj.alpha == itarget){  
  63.                         clearInterval(obj.timer);  
  64.                     }else{  
  65.                         obj.alpha += speed;  
  66.                         obj.style.filter = "alpha(opacity:"+ obj.alpha +")";  
  67.                         //注意除以100  
  68.                         obj.style.opacity = obj.alpha/100;  
  69.                     }  
  70.                 },50);  
  71.             }  
  72.         </script>  
  73.     </head>  
  74.     <body>  
  75.         <ul>  
  76.             <li></li>  
  77.             <li></li>  
  78.             <li></li>  
  79.         </ul>  
  80.     </body>  
  81. </html>  


小结:

实现多物体运动的关键点:

 1)获取到每个元素;

 2)给每个元素绑定上事件;

 3)注意使用this区分当前操作的元素;

 4)定时器不能只设一个了,应该给每个元素分配一个定时器,避免多个元素抢同一个定时器造成bug

 5)  给每一个li元素定义参数透明值alpha,避免多个元素抢同一个alpha造成bug


 记住:多物体运动不能共用同一个东西(某一参数,比如定时器)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值