物体运动原理:通过改变物体的位置,而发生移动变化。方法: 1.运动的物体使用绝对定位 2.通过改变定位物体的属性(left、right、top、bottom)值来使物体移动。例如向右或左移动可以使用offsetLeft(offsetRight)来控制左右移动。步骤: 1、开始运动前,先清除已有定时器 (因为:是连续点击按钮,物体会运动越来越快,造成运动混乱) 2、开启定时器,计算速度 3、把运动和停止隔开(if/else),判断停止条件,执行运动
在javascritp中,有两个关于定时器的专用函数,它们是: 1.倒计定时器:timename=setTimeout("function();",delaytime);2.循环定时器:timename=setInterval("function();",delaytime); function()是定时器触发时要执行的是事件的函数,可以是一个函数,也可以是几个函数,或者javascript的语句也可以,单要用;隔开;delaytime则是间隔的时间,以毫秒为单位。 倒计时定时器就是在指定时间后触发事件,而循环定时器就是在间隔时间到来时反复触发事件,其区别在于:前者只是作用一次,而后者则不停地作用。 倒计时定时器一般用于页面上只需要触发一次的的情况,比如点击某按钮后页面在一定时间后跳转到相应的站点,也可以用于判断一个浏览者是不是你的站点上的“老客”,如果不是,你就可以在5秒或者10秒后跳转到相应的站点,然后告诉他以后再来可以在某个地方按某一个按钮就可以快速进入。 循环定时器一般用于站点上需要从复执行的效果,比如一个Javascript的滚动条或者状态栏,也可以用于将页面的背景用飞雪的图片来表示。这些事件需要隔一段时间运行一次。 有时候我们也想去掉一些加上的定时器,此时可以用clearTimeout(timename) 来关闭倒计时定时器,而用clearInterval(timename)来关闭循环定时器。
对定时器的使用给DIV加绝对定位offsetLeft
问题:到达某个特定位罝停符解决:做判断,符合条件时关掉定时器(存定时器timer)速度变慢(一般不动时间,而是改数字-速度)用变量存速度
问题:取7时,offsetLeft没有等于300的时候,div停不下来 解决:>=300 //停在 301
问题:到300后点击按钮还继续走原因:点击按钮,执行函数,开定时器(执行当前函数一至少执行一次) 解决:加else (没有到达目标之前才执行)
问题:连续点击,速度变快原因:每点击一次就开一个定时器,点击几次就有几个定时器同时工作 解决:保证每次只有一个定时器工作,先cearlnterval ()
<!DOCTYPE HTML><html><head><meta charset="utf-8"><title>分享到</title><style>#div1 {width:150px; height:200px; background:green; position:absolute; left:-150px;}#div1 span {position:absolute; width:20px; height:60px; line-height:20px; background:blue; right:-20px; top:70px;}</style><script>window.onload=function (){ var oDiv=document.getElementById('div1'); oDiv.onmouSEOver=function () { startMove(0); }; oDiv.onmouseout=function () { startMove(-150); };};var timer=null;function startMove(iTarget){ var oDiv=document.getElementById('div1'); clearInterval(timer); timer=setInterval(function (){ var speed=0; if(oDiv.offsetLeft>iTarget) { speed=-10; } else { speed=10; } if(oDiv.offsetLeft==iTarget) { clearInterval(timer); } else { oDiv.style.left=oDiv.offsetLeft+speed+'px'; } }, 30);}</script></head><body><div id="div1"> <span>分享到</span></div></body></html>
效果如下:
<!DOCTYPE HTML><html><head><meta charset="utf-8"><title>淡入淡出</title><style>#div1 {width:200px; height:200px; background:red; filter:alpha(opacity:30); opacity:0.3;}</style><script>window.onload=function (){ var oDiv=document.getElementById('div1'); oDiv.onmouseover=function () { startMove(100); }; oDiv.onmouseout=function () { startMove(30); };};var alpha=30;var timer=null;function startMove(iTarget){ var oDiv=document.getElementById('div1'); clearInterval(timer); timer=setInterval(function (){ var speed=0; if(alpha<iTarget) { speed=10; } else { speed=-10; } if(alpha==iTarget) { clearInterval(timer); } else { alpha+=speed; oDiv.style.filter='alpha(opacity:'+alpha+')'; oDiv.style.opacity=alpha/100; } }, 30);}</script></head><body><div id="div1"></div></body></html>
效果如下:
距离足够近
<!DOCTYPE HTML><html><head><meta charset="utf-8"><title>匀速运动的停止条件</title><style>#div1 {width:100px; height:100px; background:red; position:absolute; left:600px; top:50px;}#div2 {width:1px; height:300px; position:absolute; left:300px; top:0; background:black;}#div3 {width:1px; height:300px; position:absolute; left:100px; top:0; background:black;}</style><script>var timer=null;function startMove(iTarget){ var oDiv=document.getElementById('div1'); clearInterval(timer); timer=setInterval(function (){ var speed=0; if(oDiv.offsetLeft<iTarget) { speed=7; } else { speed=-7; } if(Math.abs(iTarget-oDiv.offsetLeft)<=7) { clearInterval(timer); oDiv.style.left=iTarget+'px'; } else { oDiv.style.left=oDiv.offsetLeft+speed+'px'; } }, 30);}</script></head><body><input type="button" value="到100" onclick="startMove(100)" /><input type="button" value="到300" onclick="startMove(300)" /><div id="div1"></div><div id="div2"></div><div id="div3"></div></body></html>
逐渐变慢,最后停止 距离越远速度越大 速度有距离决定 速度=(目标值-当前值)/缩放系数 如果没有缩放系数t速度太大,瞬间到达终点.没有过程
问题:并没有真正到达300原因:速度只剩0.9 //像素是屏幕能够显示的最/J库位,并不会四舍五入掉Math.ceil ()向上取整Math.floor ()向下取整
问题:向左走,又差一块--Math.floor ()判断:三目 speed=speed>0 ? Math.ceil ( speed ): Math.floor ( speed )
<!DOCTYPE HTML><html><head><meta charset="utf-8"><title>缓冲运动</title><style>#div1 {width:100px; height:100px; background:red; position:absolute; left:600px; top:50px;}#div2 {width:1px; height:300px; position:absolute; left:300px; top:0; background:black;}</style><script>function startMove(){ var oDiv=document.getElementById('div1'); setInterval(function (){ var speed=(300-oDiv.offsetLeft)/10; speed=speed>0?Math.ceil(speed):Math.floor(speed); oDiv.style.left=oDiv.offsetLeft+speed+'px'; document.title=oDiv.offsetLeft+','+speed; }, 30);}</script></head><body><input type="button" value="开始运动" onclick="startMove()" /><div id="div1"></div><div id="div2"></div></body></html>
效果如下:
多个div ,鼠标移入变宽 运动框架传参obj,知道让哪个物体动起来 用到缓冲一定要取整
问题:div没运动回去 //清除前一个定时器原因:只有一个定时器解决:加物体上的定时器,使每个物体都有一个定时器。定时器作为物体属性
多个div淡入淡出首先关闭物体上的定时器经验:多物体运动框架所有东西都不能共用
问题:不是因为定时器,而是因为alpha解决:作为属性附加到物体上 /不以变量形式存在
offset 的 bug
加border变宽
offsetWith并不是真正的width ,它获取的是盒模型尺寸 解决:躲着 宽度扔到行间,parselnt ( oDiv.style.width )
进一步解决: getStyle ( obj, name ) currentStyle , getComputedStyle 加border ,只要offset就有问题 去掉offset
<!DOCTYPE HTML><html><head><meta charset="utf-8"><title>无标题文档</title><style>div {width:100px; height:50px; background:red; margin:10px; border:10px solid black;}</style><script>window.onload=function (){ var aDiv=document.getElementsByTagName('div'); for(var i=0;i<aDiv.length;i++) { aDiv[i].timer=null; aDiv[i].onmouseover=function () { startMove(this, 400); }; aDiv[i].onmouseout=function () { startMove(this, 100); }; }};function startMove(obj, iTarget){ clearInterval(obj.timer); obj.timer=setInterval(function (){ var speed=(iTarget-obj.offsetWidth)/6; speed=speed>0?Math.ceil(speed):Math.floor(speed); if(obj.offsetWidth==iTarget) { clearInterval(obj.timer); } else {
新闻热点
疑难解答