12,缓冲运动。匀速运动停止条件

缓冲运动:iSpeed=(iTarget-oDiv.offsetLeft)/7;速度离目标点越远,速度越大,离目标点越近速度越小;

只支持1px是最小单位,没有0.5px。所以当iSpeed为小数时如(0.7),oDiv.style.Left=oDiv.offsetLef+iSpeed+'px';会把小数部分去掉,Div的位置永远到不了目标点;所以用Math.ceil(iSpeed);向上取值;当速度为负,则用Math.floor(iSpeed);向下取值;

<body>
<input type="button" value="开始运动" onclick="startMove()" />
<div id="div1"></div>
<div id="div2"></div>
</body>

js:

<script>
function startMove()
{
    var oDiv=document.getElementById('div1');
    setInterval(function (){
        var speed=(300-oDiv.offsetLeft)/10;
        //speed=Math.floor(speed);
        speed=speed>0?Math.ceil(speed):Math.floor(speed);
        
        oDiv.style.left=oDiv.offsetLeft+speed+'px';
        
        document.title=oDiv.offsetLeft+','+speed;
    }, 30);
}
</script>

练习1:对联浮动

目标点:iTarget:var scrollTop=document.documentElement.scrollTop||document.body.scrollTop;

oDiv.style.top=(document.documentElement.clientHeight-oDiv.offsetHeight)/2+scrollTop+'px';

为防止目标点是小数造成div上下不停跳动,iTarget为parseInt((document.documentElement.clientHeight-oDiv.offsetHeight)/2+scrollTop);

html

<body style="height:2000px;">
<input type="text" id="txt1" style="position:fixed; right:0; top:0;" />
<div id="div1"></div>
</body>

CSS:

<style>
#div1 {width:100px; height:150px; background:red; position:absolute; right:0; bottom:0;}
</style>

JS:

<script>
window.onscroll=function ()
{
    var oDiv=document.getElementById('div1');
    var scrollTop=document.documentElement.scrollTop||document.body.scrollTop;
    
    //oDiv.style.top=(document.documentElement.clientHeight-oDiv.offsetHeight)/2+scrollTop+'px';
    startMove(parseInt((document.documentElement.clientHeight-oDiv.offsetHeight)/2+scrollTop));
};

var timer=null;

function startMove(iTarget)
{
    var oDiv=document.getElementById('div1');
    
    clearInterval(timer);
    timer=setInterval(function (){
        var speed=(iTarget-oDiv.offsetTop)/4;
        speed=speed>0?Math.ceil(speed):Math.floor(speed);
        
        if(oDiv.offsetTop==iTarget)
        {
            clearInterval(timer);
        }
        else
        {
            document.title=iTarget;
            document.getElementById('txt1').value=oDiv.offsetTop;
            oDiv.style.top=oDiv.offsetTop+speed+'px';
        }
    }, 30);
}
</script>

 匀速运动停止条件:

当Div的位置与目标值非常接近的时候,距离不足一步即一个速度iSpeed的时候,关闭定时器,并使div的位置等于目标值;

HTML:

<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>

CSS:

<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>

JS:

<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>

运动框架:1清楚定时器;clearInterval(timer);

      2.设置定时器;timer=setInterval(fun,30);

      3.判断速度条件;if else

      4,判断运动停止条件;if else

原文地址:https://www.cnblogs.com/maoduoduo/p/3146214.html