H5-JavaScript(七) JavaScript动画特效 - DOM艺术2nd Chapter10
一、什么是动画
就是一个元素在时间纬度上发生了空间位置的变动,所以涉及两个方面:时间、空间
1、位置:在其他地方也已经讲过了 : position 属性
2、时间:同样提到过 setTimeout("function",interval);
二、Show U The Code
1、Basic
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>JavaScript 实现动画特效</title> 6 <!-- 静态设置 7 <style> 8 #message { 9 position: absolute; 10 left: 100px; 11 top: 50px; 12 } 13 </style> --> 14 </head> 15 <body> 16 <p id="message">Whee!</p> 17 <script src="js/addLoadEvent.js"></script> 18 <script> 19 addLoadEvent(positionMessage); 20 //addLoadEvent(moveMessage); 21 // postionMessage(); 动态设置#message 属性 22 function positionMessage() { 23 if (!document.getElementById) return false; 24 if (!document.getElementById("message")) return false; 25 var elem = document.getElementById("message"); 26 elem.style.position = "absolute"; 27 elem.style.left ="50px"; 28 elem.style.top ="100px"; 29 // moveMessage(); 30 moveElement("message",200,200,10); 31 } 32 //moveMessage(); 33 function moveMessage() { 34 35 var elem = document.getElementById("message"); 36 var xpos = parseInt(elem.style.left); 37 var ypos = parseInt(elem.style.top); 38 if(xpos==200 && ypos==200) { 39 return true; 40 } 41 if(xpos < 200) xpos++; 42 if(xpos > 200) xpos--; 43 if(ypos < 200) ypos++; 44 if(ypos > 200) ypos--; 45 elem.style.left = xpos + "px"; 46 elem.style.top = ypos + "px"; 47 movement = setTimeout('moveMessage()',5); 48 49 } 50 //moveElement() 这个更加具有扩展性 51 function moveElement(elementID,final_x,final_y,interval) { 52 var elem = document.getElementById(elementID); 53 var xpos = parseInt(elem.style.left); 54 var ypos = parseInt(elem.style.top); 55 if(xpos==final_x && final_y==200) { 56 return true; 57 } 58 if(xpos < final_x) xpos++; 59 if(xpos > final_x) xpos--; 60 if(ypos < final_y) ypos++; 61 if(ypos > final_y) ypos--; 62 elem.style.left = xpos + "px"; 63 elem.style.top = ypos + "px"; 64 var repeat = "moveElement('"+elementID+"'"+","+final_x+","+final_y+","+interval+")"; 65 movement = setTimeout(repeat,interval); 66 67 } 68 </script> 69 </body> 70 </html>
问题&思考:
1.1 style 标签中的东西叫静态的东西,和Js 中的style 属性没有一毛钱关系
1.2 parsInt,setTimeout 函数使用
1.3 编写代码的一般过程,先做出来,之后优化
2、实战
2.1 需求

点击哪个超链,显示什么图片
2.2 编码
【HTML】
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Web Design</title> 6 <link rel="stylesheet" href="css/layout.css"> 7 </head> 8 <body> 9 <h1>Web Design</h1> 10 <p>These are things you should know:</p> 11 <ol id="linklist"> 12 <li><a href="structure.html">Structure</a></li> 13 <li><a href="presentation.html">Presentation</a></li> 14 <li><a href="behavior.html">Behavior</a></li> 15 </ol> 16 <div id="slideshow"> 17 <img src="img/topics.gif" alt="building blocks of web desgin" id="preview"> 18 </div> 19 <script src="js/addLoadEvent.js"></script> 20 <script src="js/moveElement.js"></script> 21 <script src="js/prepareSlideShow.js"></script> 22 </body> 23 </html>
【CSS】
1 #slideshow { 2 width: 100px; 3 height: 100px; 4 position: relative; 5 overflow: hidden; 6 }
【JavaScript】
1 function prepareSlideShow() { 2 //兼容性 3 if(!document.getElementById || !document.getElementsByTagName) return false; 4 if(!document.getElementById("linklist")) return false; 5 if(!document.getElementById("preview")) return false; 6 var preview = document.getElementById("preview"); 7 //初始化图片格式 8 preview.style.position = "absolute"; 9 preview.style.left = "0px"; 10 preview.style.top = "0px"; 11 //获取有用信息 - a 标签 12 var linklist = document.getElementById("linklist"); 13 var links = linklist.getElementsByTagName("a"); 14 //移动图片 15 links[0].onmouseover = function() { 16 moveElement("preview",-100,0,10); 17 } 18 links[1].onmouseover = function() { 19 moveElement("preview",-200,0,10); 20 } 21 links[2].onmouseover = function() { 22 moveElement("preview",-300,0,10); 23 } 24 } 25 addLoadEvent(prepareSlideShow);
2.3 测试: 问题&分析
2.3.1 快速在连接之间切换,会乱。 原因 定时器 存储了很多事件,所以每次执行前清空一下
2.3.2 移动距离上需要优化,即离得远走的快,离的近走的慢点
2.3.3 img图标和Js 关系密切,即:没有js动态效果img 没有存在的意义,所以是动态添加的元素
修改后的代码:
【HTML】 这块内容和 js 关系密切,所有动态生成
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Web Design</title> 6 <link rel="stylesheet" href="css/layout.css"> 7 </head> 8 <body> 9 <h1>Web Design</h1> 10 <p>These are things you should know:</p> 11 <ol id="linklist"> 12 <li><a href="structure.html">Structure</a></li> 13 <li><a href="presentation.html">Presentation</a></li> 14 <li><a href="behavior.html">Behavior</a></li> 15 </ol> 16 <!-- <div id="slideshow"> 17 <img src="img/topics.gif" alt="building blocks of web desgin" id="preview"> 18 </div> --> 19 <script src="js/addLoadEvent.js"></script> 20 <script src="js/moveElement.js"></script> 21 <script src="js/insertAfter.js"></script> 22 <script src="js/prepareSlideShow.js"></script> 23 </body> 24 </html>
【CSS】 动态生成的标签,CSS 照样可以改变样式
1 #slideshow { 2 width: 100px; 3 height: 100px; 4 position: relative; 5 overflow: hidden; 6 } 7 #preview { 8 position: absolute; 9 }
【JS】
1 function prepareSlideShow() { 2 //兼容性 3 if(!document.getElementById || !document.getElementsByTagName) return false; 4 if(!document.createElement) return false; 5 if(!document.getElementById("linklist")) return false; 6 //创建div 标签 7 var slideshow = document.createElement("div"); 8 slideshow.setAttribute("id","slideshow"); 9 var preview = document.createElement("img"); 10 preview.setAttribute("id","preview"); 11 preview.setAttribute("src","img/topics.gif"); 12 preview.setAttribute("alt","building blocks of web desgin"); 13 slideshow.appendChild(preview); 14 var linklist = document.getElementById("linklist"); 15 insertAfter(slideshow,linklist); 16 //移动图片 17 var links = linklist.getElementsByTagName("a"); 18 links[0].onmouseover = function() { 19 moveElement("preview",-100,0,10); 20 } 21 links[1].onmouseover = function() { 22 moveElement("preview",-200,0,10); 23 } 24 links[2].onmouseover = function() { 25 moveElement("preview",-300,0,10); 26 } 27 } 28 addLoadEvent(prepareSlideShow);
1 function moveElement(elementID, final_x, final_y, interval) { 2 var elem = document.getElementById(elementID); 3 if (elem.movement) { 4 clearTimeout(elem.moveElement); 5 } 6 if (!elem.style.left) { 7 elem.style.left = "0px"; 8 } 9 if (!elem.style.top) { 10 elem.style.top = "0px"; 11 } 12 var xpos = parseInt(elem.style.left); 13 var ypos = parseInt(elem.style.top); 14 var dist; 15 if (xpos == final_x && ypos == final_y) { 16 return true; 17 } 18 if (xpos < final_x) { 19 dist = Math.ceil((final_x - xpos) / 10); 20 xpos += dist; 21 console.log(dist); 22 } 23 if (xpos > final_x) { 24 dist = Math.ceil((xpos - final_x) / 10); 25 xpos -= dist; 26 } 27 if (ypos < final_y) { 28 dist = Math.ceil((final_y - ypos) / 10); 29 ypos += dist; 30 } 31 if (ypos > final_y) { 32 dist = Math.ceil((ypos - final_y) / 10); 33 ypos -= dist; 34 } 35 elem.style.left = xpos + "px"; 36 elem.style.top = ypos + "px"; 37 var repeat = "moveElement('" + elementID + "'" + "," + final_x + "," + final_y + "," + interval + ")"; 38 elem.movement = setTimeout(repeat, interval); 39 }
1 function insertAfter(newElement,targetElement) { 2 var parent = targetElement.parentNode; 3 if (parent.lastChild == targetElement) { 4 parent.appendChild(newElement); 5 }else { 6 parent.insertBefore(newElement,targetElement.nextSibling); 7 } 8 }
 
                    
                     
                    
                 
                    
                 
 
         
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号