本文实例讲述了JS运动特效之运动框架。分享给大家供大家参考,具体如下:
在前面一篇的《js运动特效之同时运动》中说过,我们的运动框架还存在一个问题,那究竟是什么问题那?把上一篇的程序做一下调整
oDiv。onmouseover=function () {//startMove (oDiv{宽度:300,身高:300,不透明度:30}); startMove (oDiv{宽度:204,身高:300,不透明度:30}); } >之前在鼠标移入的时候,我们不让宽度变成300年,而是变成204,看看会有什么变化那? ?
从图可以看的出,当鼠标移入的时候,<强> >强,而高度和透明度都没有达到目标值(目标值是300和0.3),这是为什么那? ?是下面的问题引起的
如果(objAttr==json (attr]) { clearInterval (obj.timer); 如果(fn) { fn (); } } >之前如果语句里只是判断当objAttr等于目标值的时候就清除定时器(也就是说,清除定时器),并不是判断”所有的运动”都达到了目标值;宽度从200变204年成很快就达到目标值了,而此时高度和不透明度还在半路上;但是由于宽度已经达到了目标值,所以就进入如果语句清除了定时器,宽度,高度,不透明度它们用的是一个定时器,所以此时高度和不透明度就定格在半道上永远无法达到目标值了。
那怎么解决那? ? ?
1。在,设置一个标志位var国旗,用它来检测是否所有的运动都到达目标值
函数startMove (obj、json、fn) { clearInterval (obj.timer); obj。计时器=setInterval(函数(){ var国旗=true;//一进入定时器设置标志位 }, 30); } var国旗=true;//表示所有的运动都到达目标值 var国旗=false;//表示有的运动没有到达目标值 >之前2。接着在检测运动是否停止的语句中
如果(objAttr !=json (attr]){//判断是否所有的运动都达到目标值//进入如果语句,说明至少有一个运动未到达目标值 国旗=false; } >之前的…。循环里面每一个属性做变化(widht、身高、不透明度…),只要有一个属性变化没有到达目标值,国旗标志的值就是假,然后在外判断标记的值,如果依然为真正的就标志”所有的运动”都到达了目标值,此时就可以清除定时器了
(attr以json) { } 如果(国旗){//再次判断标志的值 clearInterval (obj.timer); 如果(fn) { fn (); } } >之前定时器每隔30毫秒执行一次,每次进入首先设置<代码> var国旗=true> 代码,然后向下执行,每一回都要判断
<代码>如果(objAttr !=json [attr)) {…}> 代码只要有一个运动没有达到目标值,都会进入执行如果语句,把标志设为false,当定时器最后一次执行的时候,发现所有的属性都到达了目标值,此时如果语句就不成立了,就没机会把标志设为误了,所以最后一次进入定时器标记的始终是真的,接着就满足了<代码>如果(国旗){,……,}> 代码的条件,接着进入<代码>如果(国旗){,……,}代码>执行。
到这里就完美了,看下效果
Hhtm部分和css部分和上一篇完全一样js代码如下
& lt; script> 窗口。onload=function () { var oDiv=. getelementbyid (“div1”); oDiv。onmouseover=function () {//startMove (oDiv{宽度:300,身高:300,不透明度:30}); startMove (oDiv{宽度:204,身高:300,不透明度:30}); } oDiv。onmouseout=function () { startMove (oDiv{宽度:200,身高:200,不透明度:100}); } } 函数getStyle (obj, attr) { 返回getComputedStyle & # 63;getComputedStyle (obj, false) [attr]: obj.currentStyle [attr); } 函数startMove (obj、json、fn) { clearInterval (obj.timer); obj。计时器=setInterval(函数(){ var bStop=true; (attr以json) {//1。取得当前的值(可以是widht,身高、透明度等的值) var objAttr=0; 如果(attr==安煌该鞫取?{ objAttr=Math.round (parseFloat (getStyle (obj, attr)) * 100); 其他}{ objAttr=方法(getStyle (obj, attr)); }//2 .计算运动速度 var哲学=(json (attr] -objAttr)/10; 哲学=iSpeed> 0 & # 63; Math.ceil(哲学):Math.floor(哲学);//3。检测所有运动是否到达目标 如果(objAttr !=json (attr]) { bStop=false; } 如果(attr==安煌该鞫取?{ obj.style。过滤器='α(不透明度:' + (objAttr +哲学)+ ')'; obj.style。不透明度=(objAttr +哲学)/100; 其他}{ obj。风格(attr]=objAttr +哲学+“px”;//需要又。属性名的形式改成[] } } 如果(bStop){//表示所有运动都到达目标值 clearInterval (obj.timer); 如果(fn) { fn (); } } }, 30); } & lt;/script>JS运动特效之完美运动框架实例分析