アニメーションの原則を緩和し、コールバック関数を追加する

いわゆるイージングアニメーションは、アニメーション(減速または加速)に基づいて要素の速度をゆっくりと増減するプロセスです。非常に簡単です。タイマーが実行されるたびに、現在の距離+変更のステップサイズが実行されることが理解できます。最初に、次の式が必要です。

この式は、現在の距離ごとに追加される変更ステップサイズであり、ステップサイズ式と呼ばれます:(目標値-現在の位置)/ 10  (この10は変更可能)


ステップサイズの式の理解:

ステップサイズの最初の増分:

800pxに達したときにターゲット値が停止するとします


 ステップサイズの2番目の増分: 


 3番目の増加のステップサイズ:

 


 以下の手順は類似しており、ステップサイズを小さくして減速効果を出すことができます。左からの距離が目標距離と同じになると、タイマーをクリアして停止することができます。


1つ:コードケース:

図に示すように、ボックスを目標位置800pxまで継続的に減速させます。




 JSの実装:

 <script>
        document.addEventListener('DOMContentLoaded',function(){
            var box=document.querySelector('div');
            var btn=document.querySelector('button');
            function run(obj,long){
                clearInterval(obj.timer)
                obj.timer=setInterval(function(){
                    if(obj.offsetLeft==long){  //左边距离与目标距离一样时就停止(清除定时器)
                        window.clearInterval(obj.timer);
                    }else{
                        step=(long-box.offsetLeft)/10  //步长公式
                        obj.style.left=obj.offsetLeft+step+'px';
                    }
                },20)
            }

            btn.addEventListener('click',function(){
                 run(box,800)
            })
        })
    </script>

しかし、これにはまだ欠点があります。つまり、目標は800pxで停止することですが、795.5pxで停止することがわかります。これは、要求時にすべての小数を除算できないという問題があるためです。ステップサイズなので、この問題を解決する必要があります。私たちが取らなければならない問題:上向きの変換(Math.ceil)


改善されたコード:

<script>
        document.addEventListener('DOMContentLoaded',function(){
            var box=document.querySelector('div');
            var btn=document.querySelector('button');
            function run(obj,long){
                clearInterval(obj.timer)
                obj.timer=setInterval(function(){
                    if(obj.offsetLeft==long){
                        window.clearInterval(obj.timer);
                    }else{
                        step=Math.ceil((long-box.offsetLeft)/10)
                        obj.style.left=obj.offsetLeft+step+'px';
                    }
                },20)
            }

            btn.addEventListener('click',function(){
                 run(box,800)
            })
        })
    </script>

このようにして、目標値と同じ移動距離を得ることができます!


追加のケースの説明:

次に、この場合、ステップサイズの式を使用して、逆方向に進む効果を完成させることができます。原理は、負のステップ値を取得することです。これにより、現在の距離+ステップサイズは実際には減算になり、逆方向に進むことができます。10進変換の問題に注意してください。正のステップの追加は上向きの変換です。次に、下向きの変換を使用して負のステップを減らす必要があります。ここで、三項演算子を追加して、ステップが正か負かを判断し、上変換と下変換のどちらを使用するかを選択できます 。step = step> 0?Math.ceil(step):Math.floor(step)

<body>
    <script>
        document.addEventListener('DOMContentLoaded',function(){
            var box=document.querySelector('div');
            var btn800=document.querySelector('.go800');
            var btn500=document.querySelector('.go500');
            function run(obj,long){
                clearInterval(obj.timer)
                obj.timer=setInterval(function(){
                    if(obj.offsetLeft==long){
                        window.clearInterval(obj.timer);
                    }else{
                        step=(long-box.offsetLeft)/10
                        step=step>0?Math.ceil(step):Math.floor(step)  //判断步长正负来选择使用哪个转型
                        obj.style.left=obj.offsetLeft+step+'px';
                    }
                },20)
            }
            btn500.addEventListener('click',function(){
                run(box,500)
            })
            btn800.addEventListener('click',function(){
                 run(box,800)
            })
        })
    </script>
     <div></div>
     <button class="go800">到800</button>
     <button class="go500">到500</button>
</body>

上記の問題は完全に解決できます!


 

2:次の問題は、イージングアニメーションにコールバック関数を追加することです。単純なターゲット効果は、タイマーが停止したとき、つまりボックスがターゲット位置に到達した後、ボックスの色やその他の効果を変更することです。コールバック関数を追加します。

アニメーション関数を呼び出すパラメーターに、実際のパラメーターとして色を変更するコールバック関数を追加する必要があります(最初のアニメーション関数の呼び出しを例として取り上げます)。

 //第一个动画函数的调用
btn500.addEventListener('click',function(){
                run(box,500,function(){
                    box.style.backgroundColor='red';
                })
            })

次に、アニメーション関数のパラメーターに受け取る値が必要です。パラメーターにcallbackという名前を付けます。受け取った後、関数が呼び出されると、1つのステップを実行するのと同じになります:callback = function(){}。私たちの目標は色の変更後に停止することなので、この関数の呼び出しはタイマー終了判定条件の後に行う必要があります

 if(callback){     //如果有回调函数实参传入,就执行回调函数,没有就不执行
       callback();
 }

完全なコードは次のとおりです。

<body>
    <script>
        document.addEventListener('DOMContentLoaded',function(){
            var box=document.querySelector('div');
            var btn800=document.querySelector('.go800');
            var btn500=document.querySelector('.go500');
            var btn0=document.querySelector('.go0')
            function run(obj,long,callback){
                clearInterval(obj.timer)
                obj.timer=setInterval(function(){
                    if(obj.offsetLeft==long){
                        window.clearInterval(obj.timer);
                        if(callback){
                        callback();
                    }
                    }else{
                        step=(long-box.offsetLeft)/10
                        step=step>0?Math.ceil(step):Math.floor(step)
                        obj.style.left=obj.offsetLeft+step+'px';
                    }
                },20)
            }
            btn500.addEventListener('click',function(){
                run(box,500,function(){
                    box.style.backgroundColor='red';
                })
            })
            btn800.addEventListener('click',function(){
                 run(box,800)
            })
            btn0.addEventListener('click',function(){
                run(box,0)
            })
        })
    </script>
     <div></div>
     <button class="go800">到800</button>
     <button class="go500">到500</button>
     <button class="go0">到原位</button>
</body>

おすすめ

転載: blog.csdn.net/weixin_52212950/article/details/123741675