1. 程式人生 > >JavaScript-運動基礎

JavaScript-運動基礎

運動基礎

1.讓div運動起來
2.速度——物體運動的快慢
3.運動中的bug
不會停止
速度取某些值會無法停止
到達位置後再點選還會運動
重複點選速度加快(clearInterval(timer))

勻速運動

速度不變

運動框架及應用

運動框架

1.在開始運動時,關閉已有的定時器
2.把運動和停止隔開(if/else)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title
>
<style> #div1{ height: 200px; width: 200px; background: red; position: absolute; top: 50px; left: 50px; } </style> <script> var timer=null; function startMove() { var
oDiv=document.getElementById('div1'); clearInterval(timer); timer=setInterval(function(){ var speed=1; if(oDiv.offsetLeft>=300) { clearInterval(timer); } else { oDiv.style.left=oDiv.offsetLeft+speed+'px'
; } },30); }
</script> </head> <body> <input id="btn1" type="button" value="開始運動" onclick="startMove()"/> <div id="div1"> </div> </body> </html>

運動框架例項

例子1:“分享到”側邊欄

通過目標點,計算速度值

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</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>
例子2:“淡入淡出的圖片”

用變數儲存透明度

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</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;
            }

        })
    }
    </script>
</head>
<body>
 <div id="div1">
 </div>   
</body>
</html>

緩衝運動

1.逐漸變慢,最後停止
2.距離越遠速度越大
速度由距離決定
速度=(目標值-當前值)/縮放係數

例子:緩衝選單

bug:速度取整
跟隨頁面滾動的緩衝側邊欄
潛在問題:目標值不是整數時

速度與距離成正比
(距離大速度大,距離小速度小)

    Math.ceil(num)//向上取整
    Math.floor(num)//向下取整
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
    #div1{
        width: 100px;
        height: 100px;
        background: red;
        left: 0;
        top: 50px;
    }
    </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';

        },30);
    }
    </script>
</head>
<body>
    <input type="button" value="開始運動" onclick="startMove()"/>
    <div id="div1">
    </div>
    <div id="div2"></div>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
    #div1{ 
        width: 100px;
        height: 150px;
        background: red;
        position: absolute;
        right: 0;
        bottom: 0;

    }
    </style>
    <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)/8;
            speed=speed>0?Math.ceil(speed):Math.floor(speed);

            if(oDiv.offsetTop==iTarget)
            {
                clearInterval(timer);
            }
            else
            {
                oDiv.style.top=oDiv.offsetTop+speed+'px';
            }
        },30);
    }
    </script>
</head>
<body style="height: 1500px;">
    <div id="div1"></div>
</body>
</html>

勻速運動的停止條件

運動終止條件

勻速運動:距離足夠近
緩衝運動:兩點重合

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
    #div1{
        width: 100px;
        height: 100px;
        background: red;
        left: 0;
        top: 50px;
        position: absolute;
    }
     #div2{
        width: 1px;
        height: 100px;
        background: black;
        left: 100px;
        top:0;
        position: absolute;
    }
     #div3{
        width: 1px;
        height: 100px;
        background: black;
        left: 300px;
        top: 0px;
        position: absolute;
    }
    </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>