@(JavaScript)[学习笔记]javascript
[toc]css
动画是让元素的位置随时间的变化不断变化html
假定有个id为message的元素,能够用javascript来设置这个属性的位置positionMessage()
也能够用javascript来改变元素的位置"moveMessage()"
页面加载时,两个函数几乎同时运行,肉眼看不到变化,位置就改变了,没法实现动画效果java
能够用setTimeout("function", interbal)
函数 第一个参数是函数名 第二个参数是延时时间,单位毫秒 取消函数clearTimeout(variable)
web
function positionMessage() { if (!document.getElementById) return false; if (!document.getElementById("message")) return false; var elem = document.getElementById("message"); elem.style.position = "absolute"; elem.style.left = "50px"; elem.style.top = "100px"; movement = setTimeout("moveMessage()" , 5000) }
movement是一个全局变量。能够在该函数之外任意位置取消跳跃编程
更新moveMessage函数,让元素以渐变方式移动浏览器
JavaScript函数parseInt
能够把字符串数值提取出来 用parseFloaat
函数能够提取浮点数安全
编写moveElement函数app
function moveElement(elementID,final_x,final_y,interval) { if (!document.getElementById) return false; if (!document.getElementById(elementID)) return false; var elem = document.getElementById(elementID); var xpos = parseInt(elem.style.left); var ypos = parseInt(elem.style.top); if (xpos == final_x && ypos == final_y) { return true; } if (xpos < final_x) { xpos++; } if (xpos > final_x) { xpos--; } if (ypos < final_y) { ypos++; } if (ypos > final_y) { ypos--; } elem.style.left = xpos + "px"; elem.style.top = ypos + "px"; var repeat = "moveElement('"+elementID+"',"+final_x+","+final_y+","+interval+")"; movement = setTimeout(repeat,interval); }
moveElement("mwssage", 200, 100, 10);
动画元素易引发用户反感,除非浏览器容许用户“冻结”移动的内容,不然就应该避免内容在页面中移动dom
有一个包含一些列连接的网页,用户鼠标悬停某个连接,用先睹为快的方式告诉用户连接去往何处,能够展现一张预览图片 标记语言以下
<!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <title>Web Design</title> <style type="text/css" media="screen"> @import url(styles/layout.css); </style> <script type="text/javascript" src="scripts/addLoadEvent.js"> </script> <script type="text/javascript" src="scripts/moveElement.js"> </script> <script type="text/javascript" src="scripts/prepareSlideshow.js"> </script> </head> <body> <h1>Web Design</h1> <p>These are the things you should know.</p> <ol id="linklist"> <li> <a href="structure.html">Structure</a> </li> <li> <a href="presentation.html">Presentation</a> </li> <li> <a href="behavior.html">Behavior</a> </li> </ol> <div id="slideshow"> <img src="topics.gif" alt="building blocks of web design" id="preview" /> </div> </body>
overflow属性处理元素尺寸超过容器的状况。 overflow可取属性有四种:visible,hidden,scroll,auto
function prepareSlideshow() { // Make sure the browser understands the DOM methods if (!document.getElementsByTagName) return false; if (!document.getElementById) return false; // Make sure the elements exist if (!document.getElementById("linklist")) return false; var slideshow = document.createElement("div"); slideshow.setAttribute("id","slideshow"); var preview = document.createElement("img"); preview.setAttribute("src","topics.gif"); preview.setAttribute("alt","building blocks of web design"); preview.setAttribute("id","preview"); slideshow.appendChild(preview); var list = document.getElementById("linklist"); insertAfter(slideshow,list); // Get all the links in the list var links = list.getElementsByTagName("a"); // Attach the animation behavior to the mouseover event links[0].onmouseover = function() { moveElement("preview",-100,0,10); } links[1].onmouseover = function() { moveElement("preview",-200,0,10); } links[2].onmouseover = function() { moveElement("preview",-300,0,10); } } addLoadEvent(prepareSlideshow);
若是把鼠标在连接间快速移动,动画效果会变得很混乱 这是由全局变量引发的,在抽象化过程,未对变量movement作任何修改 存在与特定元素有关的变量,就是属性
function moveElement(elementID,final_x,final_y,interval) { if (!document.getElementById) return false; if (!document.getElementById(elementID)) return false; var elem = document.getElementById(elementID); if (elem.movement){ clearTimeout(elem.movement); } var xpos = parseInt(elem.style.left); var ypos = parseInt(elem.style.top); if (xpos == final_x && ypos == final_y) { return true; } if (xpos < final_x) { xpos++; } if (xpos > final_x) { xpos--; } if (ypos < final_y) { ypos++; } if (ypos > final_y) { ypos--; } elem.style.left = xpos + "px"; elem.style.top = ypos + "px"; var repeat = "moveElement('"+elementID+"',"+final_x+","+final_y+","+interval+")"; elem.movement = setTimeout(repeat,interval); }
若是函数执行时已经有movement属性,就用clearTimeout对其复位,这样就只执行一条函数调用语句
让过分更平滑一些,每次移动十分之一
dist = (final_x - dlist)/10; xpos = xpos + dlist;
Math对象的ceil方法:返回不小于结果值的一个整数 Math对象的floor方法:返回大于结果值的一个整数 Math对象的round方法:返回与之最接近的一个整数
var xpos = parseInt(elem.style.left); var ypos = parseInt(elem.style.top);
这里有一个假设,必须有left和top属性 方法一:
if (!elem.stytle.left || !elem.stytle.top) return false;
方法二:
if (!elem.stytle.left){ elem.stytle.left = "0px"; } if (!elem.stytle.top){ elem.stytle.top = "0px"; }