学习资源来自慕课网《js动画效果》:http://www.imooc.com/learn/167。
多物体运动——给多个元素加上同一动画效果,比如下面两个例子:
1. 网页上有一ul, ul中有三个li元素,要求鼠标移到(onmouseover) li 元素上产生动画效果——宽度值增加到300px,鼠标移出(onmouseout) li 元素产生动画效果——宽度值复原到200px. 如下图-1示:
2. 同题 1 类似,只是要求改变li 的透明度值。如图-2时:
练习题1 代码实现:
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="utf-8">
- <style type="text/css">
- *{
- padding:0;
- margin:0;
- }
- ul li{
- list-style:none;
- width:200px;
- height:100px;
- background:green;
- margin:20px;
- }
- </style>
- <script type="text/javascript">
- /***
- 实现多物体运动的关键点:
- 1)获取到每个元素;
- 2)给每个元素绑定上事件;
- 3)注意使用this区分当前操作的元素;
- 4)定时器不能只设一个了,应该给每个元素分配一个定时器,避免多个元素抢同一个定时器造成bug
- 记住:多物体运动不能共用同一个东西(某一参数,比如定时器)
- ***/
- window.onload = function(){
- var liEles = document.getElementsByTagName("li");
- for(var i=0; i<liEles.length; i++){
- //给每一个li元素定义一个定时器,避免多个元素抢同一个定时器造成bug
- liEles[i].timer = null;
- liEles[i].onmouseover = function(){
- //传入this值,指定当前操作的是哪个li
- playFun(this, 300);
- };
- liEles[i].onmouseout = function(){
- playFun(this, 200);
- };
- }
- }
- //var timer = null;
- function playFun(obj,itarget){
- clearInterval(obj.timer);
- obj.timer = setInterval(function(){
- var speed = (itarget - obj.offsetWidth)/10;
- speed = speed>0?Math.ceil(speed):Math.floor(speed);
- if(obj.offsetWidth == itarget){
- clearInterval(obj.timer);
- }else{
- obj.style.width = obj.offsetWidth + speed + "px";
- }
- },50);
- }
- </script>
- </head>
- <body>
- <ul>
- <li></li>
- <li></li>
- <li></li>
- </ul>
- </body>
- </html>
练习题2代码实习:
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="utf-8">
- <style type="text/css">
- *{
- padding:0;
- margin:0;
- }
- ul li{
- list-style:none;
- width:200px;
- height:100px;
- background:green;
- margin:20px;
- filter:alpha(opacity:30);
- opacity:0.3;
- }
- </style>
- <script type="text/javascript">
- /***
- 实现多物体运动的关键点:
- 1)获取到每个元素;
- 2)给每个元素绑定上事件;
- 3)注意使用this区分当前操作的元素;
- 4)定时器不能只设一个了,应该给每个元素分配一个定时器,避免多个元素抢同一个定时器造成bug
- 5)//给每一个li元素定义参数透明值alpha,避免多个元素抢同一个alpha造成bug
- 记住:多物体运动不能共用同一个东西(某一参数,比如定时器)
- ***/
- window.onload = function(){
- var liEles = document.getElementsByTagName("li");
- for(var i=0; i<liEles.length; i++){
- //给每一个li元素定义一个定时器,避免多个元素抢同一个定时器造成bug
- liEles[i].timer = null;
- //给每一个li元素定义参数透明值alpha,避免多个元素抢同一个alpha造成bug
- liEles[i].alpha = 30;
- liEles[i].onmouseover = function(){
- //传入this值,指定当前操作的是哪个li
- playOpacity(this, 100);
- };
- liEles[i].onmouseout = function(){
- playOpacity(this, 30);
- };
- }
- }
- function playOpacity(obj,itarget){
- clearInterval(obj.timer);
- obj.timer = setInterval(function(){
- var speed = 0;
- if(obj.alpha > itarget){
- speed = -10;
- }else{
- speed = 10;
- }
- if(obj.alpha == itarget){
- clearInterval(obj.timer);
- }else{
- obj.alpha += speed;
- obj.style.filter = "alpha(opacity:"+ obj.alpha +")";
- //注意除以100
- obj.style.opacity = obj.alpha/100;
- }
- },50);
- }
- </script>
- </head>
- <body>
- <ul>
- <li></li>
- <li></li>
- <li></li>
- </ul>
- </body>
- </html>
小结:
实现多物体运动的关键点:
1)获取到每个元素;
2)给每个元素绑定上事件;
3)注意使用this区分当前操作的元素;
4)定时器不能只设一个了,应该给每个元素分配一个定时器,避免多个元素抢同一个定时器造成bug
5) 给每一个li元素定义参数透明值alpha,避免多个元素抢同一个alpha造成bug记住:多物体运动不能共用同一个东西(某一参数,比如定时器)