1. 程式人生 > >js運動基礎2 右側懸浮框 緩衝運動 勻速運動的停止條件

js運動基礎2 右側懸浮框 緩衝運動 勻速運動的停止條件

緩衝運動:

  • 逐漸變慢,最後停止
  • 距離越遠速度越大(速度由距離決定  速度=(目標值-當前值)/縮放係數)
  • 例子:緩衝選單 (Bug:速度取整)

緩衝運動:隨著距離減小,速度也越來越小。用除數控制速度。速度用整數。

oDiv.offsetTop  //滾動條滾動的距離+視窗距離-物體寬度
<style>
   #div1{
       width: 100px;
       height: 100px;
       background: red;
       position: absolute;
       left: 0;
       top: 50px;
   }
</style>
<script>
    function startMove(){

        var oBtn=document.getElementById('btn');
        var oDiv=document.getElementById('div1');
        setInterval(function(){
            //遵循逐漸變慢的原則,如果是300-oDiv.offsetLeft,那麼一開始的速度太大,一下子就跑到300px處了。
            //要控制緩衝的快慢,就直接控制除數。改為4變快
            var speed=(300-oDiv.offsetLeft)/10;
            oDiv.style.left=oDiv.offsetLeft+speed+"px";
        },30);
    }
</script>
<body>
<input type="button" id="btn" value="開始運動" onclick="startMove()"/>
<div id="div1"></div>
</body>

出現的問題:

<script>
    function startMove(){

        var oBtn=document.getElementById('btn');
        var oDiv=document.getElementById('div1');
        setInterval(function(){
            var speed=(300-oDiv.offsetLeft)/10;
            oDiv.style.left=oDiv.offsetLeft+speed+"px";
            document.title=oDiv.offsetLeft+" "+speed;
        },30);
    }
</script>

 

 距離到296  速度到0.4就停下了。

計算機所能接受到最小單位為px,290.5px計算機會預設為290px,並且不會四捨五入。

oDiv.style.left=oDiv.offsetLeft+speed+"px";   oDiv.offsetLeft為296px speed為0.4   oDiv.style.left為296.4---296

速度不能是小數。

我們給speed做一個向上取整。

<script>
    function startMove(){

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

但凡我們遇到緩衝運動,我們都要取整數。

緩衝選單 :右側懸浮框。

 <style>
        #div1{
            width: 100px;
            height: 200px;
            background: red;
            position: absolute;
            right: 0;
            bottom: 0;
        }
    </style>
    <script>
        window.onscroll=function(){
            var oDiv=document.getElementById('div1');
            //scrollTop 起始位置到末位置的滑動高度,獲取滾動條的位置。
            var scrollTop=document.documentElement.scrollTop||document.body.scrollTop;
            //documentElement.clientHeight 頁面可視區寬高
            oDiv.style.top=document.documentElement.clientHeight-oDiv.offsetHeight+scrollTop+'px'
        }
    </script>
</head>
<body style="height: 2000px;">

<div id="div1"></div>
</body>

但是div會在這兒抖一抖的。我們讓運動讓它緩緩地過去。

 <style>
        #div1{
            width: 100px;
            height: 200px;
            background: red;
            position: absolute;
            right: 0;
            bottom: 0;
        }
    </style>
    <script>
        window.onscroll=function(){
            var oDiv=document.getElementById('div1');
            //scrollTop 起始位置到末位置的滑動高度,獲取滾動條的位置。
            var scrollTop=document.documentElement.scrollTop||document.body.scrollTop;
            //documentElement.clientHeight 頁面可視區寬高
           // oDiv.style.top=document.documentElement.clientHeight-oDiv.offsetHeight+scrollTop+'px'
            startMove(document.documentElement.clientHeight-oDiv.offsetHeight+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{
                    oDiv.style.top = oDiv.offsetTop + speed + 'px';
                }
            },30);
        }
    </script>
</head>
<body style="height: 2000px;">

<div id="div1"></div>
</body>

對聯懸浮框:懸浮框在中間的位置。bug:速度取整。

潛在問題:目標值不是整數時。

  oDiv.style.top=(document.documentElement.clientHeight-oDiv.offsetHeight)/2+scrollTop+'px'
  startMove((document.documentElement.clientHeight-oDiv.offsetHeight)/2+scrollTop);
<style>
        #div1{
            width: 100px;
            height: 200px;
            background: red;
            position: absolute;
            right: 0;
            bottom: 0;
        }
    </style>
    <script>
        window.onscroll=function(){
            var oDiv=document.getElementById('div1');
            //scrollTop 起始位置到末位置的滑動高度,獲取滾動條的位置。
            var scrollTop=document.documentElement.scrollTop||document.body.scrollTop;
            //documentElement.clientHeight 頁面可視區寬高
           // oDiv.style.top=(document.documentElement.clientHeight-oDiv.offsetHeight)/2+scrollTop+'px'
            //(document.documentElement.clientHeight-oDiv.offsetHeight)/2 有可能出現小數,物體上下來回跳動,所以我們取整
            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.getElementById('txt1').value=oDiv.offsetTop;
                    oDiv.style.top = oDiv.offsetTop + speed + 'px';

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

勻速運動的停止條件:

  • 運動終止條件
  •           勻速運動:距離足夠近
  •           緩衝運動:兩點重合

Math.abs()取絕對值。

            if(Math.abs(iTarget-oDiv.offsetLeft)<=7){
                clearInterval(timer);
                oDiv.style.left=iTarget='px';
            }else{
                oDiv.style.left=oDiv.offsetLeft+speed+"px";
            }
<style>
   
   #div1{
       width: 100px;
       height: 100px;
       background: red;
       position: absolute;
       left: 600px;
       top: 50px;
   }
    #div2{
        width: 1px;
        height: 300px;
        background: black;
        position: absolute;
        left: 300px;
        top: 0;
    }
   #div3{
       width: 1px;
       height: 300px;
       background: black;
       position: absolute;
       left: 100px;
       top: 0;
   }
</style>
<script>
    var timer=null;
    function startMove(iTarget){
        /*到100和到300,speed為7每次加7到不了100或300,所以快到100或300會來回顫抖。*/

        var oDiv=document.getElementById('div1');
        clearInterval(timer);
        timer= setInterval(function(){
            var speed=0;
            //var iSpeed=iTarget-oDiv.offsetLeft>0?7:-7;
            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>
<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>