zoukankan      html  css  js  c++  java
  • JS——缓动动画

    核心思想:

    (1)相对于匀速移动,盒子每次移动的步长都是变化的,公式:盒子位置=盒子本身位置+(目标位置-盒子本身位置)/10

    (2)在盒子位置与目标距离小于10px时,其步长必然是小数,又由于offsetLeft的变态的逢4进值,那么只要小数点的值小于4就会停滞不前

    (3)所以要么往上取整,要么往下取整

    1、Math.ceil

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            div {
                width: 100px;
                height: 100px;
                background-color: pink;
                position: absolute;
            }
        </style>
    </head>
    <body>
    <button>点击</button>
    <div></div>
    <script>
        var btn = document.getElementsByTagName("button")[0];
        var divEle = document.getElementsByTagName("div")[0];
        var timer = null;
        btn.onclick = function () {
            clearInterval(timer);
            timer = setInterval(function () {
                //当目标距离与实际距离小于10px时,会以1px的速度前进
                var step = (400 - divEle.offsetLeft) / 10;
                step = Math.ceil(step);
                divEle.style.left = divEle.offsetLeft + step + "px";
                if (Math.abs(400 - divEle.offsetLeft) <= Math.abs(step)) {
                    divEle.style.left = "400px";
                    clearInterval(timer);
                }
            }, 15)
        }
    </script>
    </body>
    </html>

    2、Math.floor

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            div {
                width: 100px;
                height: 100px;
                background-color: pink;
                position: absolute;
                left: 400px;
            }
        </style>
    </head>
    <body>
    <button>点击</button>
    <div></div>
    <script>
        var btn = document.getElementsByTagName("button")[0];
        var divEle = document.getElementsByTagName("div")[0];
        var timer = null;
        btn.onclick = function () {
            clearInterval(timer);
            timer = setInterval(function () {
                //当目标距离与实际距离小于10px时,会以1px的速度前进
                var step = (0 - divEle.offsetLeft) / 10;
                step = Math.floor(step);
                divEle.style.left = divEle.offsetLeft + step + "px";
                if (Math.abs(0 - divEle.offsetLeft) <= Math.abs(step)) {
                    divEle.style.left = 0;
                    clearInterval(timer);
                }
            }, 15)
        }
    </script>
    </body>
    </html>

    3、封装

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            div {
                width: 100px;
                height: 100px;
                background-color: pink;
                position: absolute;
                left: 0px;
            }
        </style>
    </head>
    <body>
    <button>回到起点</button>
    <button>回到200</button>
    <button>回到400</button>
    <div></div>
    <script>
        var btn1 = document.getElementsByTagName("button")[0];
        var btn2 = document.getElementsByTagName("button")[1];
        var btn3 = document.getElementsByTagName("button")[2];
        var divEle = document.getElementsByTagName("div")[0];
        btn1.onclick = function () {
            animate(divEle, 0);
        }
        btn2.onclick = function () {
            animate(divEle, 200);
        }
        btn3.onclick = function () {
            animate(divEle, 400);
        }
    
        function animate(ele, target) {
            clearInterval(ele.timer);
            ele.timer = setInterval(function () {
                var step = (target - ele.offsetLeft) / 10;
                step = step > 0 ? Math.ceil(step) : Math.floor(step);
                ele.style.left = ele.offsetLeft + step + "px";
                if (Math.abs(target - ele.offsetLeft) <= Math.abs(step)) {
                    ele.style.left = target + "px";
                    clearInterval(ele.timer);
                }
            }, 15);
        }
    </script>
    </body>
    </html>

  • 相关阅读:
    JS---DOM---点击操作---part1---20个案例
    JS---体验DOM操作
    JS---课程介绍 + JavaScript分三个部分
    JS---DOM/BOM---学习road map---7 parts
    JS基础语法---基本包装类型
    JS基础语法---Array对象的方法
    JS基础语法---String(字符串的案例)
    Python老司机告诉你,学习Python应该看哪些书比较好,看这基本就够了
    Python实现远程开关机【高薪必备技术】
    大四学长教你利用Python写一款超级玛丽,零基础也能学会,超级装逼
  • 原文地址:https://www.cnblogs.com/wuqiuxue/p/7934361.html
Copyright © 2011-2022 走看看