• 封装缓动动画1


    在前面有多次用到了定时器来生成动画,通常的做法是已知其实值和结束值,给出了运动步长即可,如下所示:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style>
            *{
                margin: 0;
                padding: 0;
            }
    
            #box{
                width: 100px;
                height: 100px;
                background-color: red;
                position: absolute;
            }
        </style>
    </head>
    <body>
       <button id="btn">往右走</button>
       <div id="box"></div>
    
    <script>
        function $(id) {
        return typeof id === "string" ? document.getElementById(id) : null;
    }
        window.onload = function () {
            // 0. 变量
            var target = 400, timer = null;
            var box = $("box");
    
            // 1. 监听按钮的点击
            $("btn").onclick = function () {
                 // 1.1 清除定时器
                 clearInterval(timer);
    
                 // 1.2 设置定时器
                timer = setInterval(function () {
                    // 1.3 求出步长
                    var speed = (target - box.offsetLeft) * 0.2;
                    console.log(speed);
                    // 向上取整
                    speed = Math.ceil(speed);
                    // 1.4 动起来
                    box.style.left = box.offsetLeft + speed + "px";
                    box.innerText = box.offsetLeft;
    
                    // 1.5 判断
                    if(box.offsetLeft === target){
                        clearInterval(timer);
                    }
                }, 20);
            };
        }
    </script>
    </body>
    </html>

    在上面的例子中,目标值是右移动400px,我们给出步长后,通过定时器为元素赋值,让其运动起来,但在实际运动中,我们通常的运动除了上面的向右移动,还有向左,向上或者其他的运动,这时,我们需要将上面的代码稍作修改。

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style>
            *{
                margin: 0;
                padding: 0;
            }
    
            #box{
                width: 100px;
                height: 100px;
                background-color: red;
                position: absolute;
            }
        </style>
    </head>
    <body>
       <button id="btn">往右走</button>
       <button id="btn1">往左走</button>
       <div id="box"></div>
    <script>
        function $(id) {
        return typeof id === "string" ? document.getElementById(id) : null;
    }
        window.onload = function () {
            var box = $("box");
            $("btn").onclick = function () {
                buffer(box, 800);
            };
    
            $("btn1").onclick = function () {
                buffer(box, 200);
            };
        };
    
        function buffer(obj, target) {
            clearInterval(obj.timer);
            obj.timer = setInterval(function () {
                // 求出步长
                var speed = (target - obj.offsetLeft) * 0.2;
                // 判断是否向上取整
                speed = (target > obj.offsetLeft) ? Math.ceil(speed) : Math.floor(speed);
               
                obj.style.left = obj.offsetLeft + speed + "px";
                obj.innerText = obj.offsetLeft;
                
                if(obj.offsetLeft === target){
                    clearInterval(obj.timer);
                }
            }, 20);
        }
    </script>
    </body>
    </html>

    这个例子与上面不同的是既有向左走的,又有向右走的,但是不管向左还是向右运动,改变的都是元素距离左边的距离。所以我们可以将共用的部分单独提取出来,再针对不同的方向传入不同的目标值即可了。

  • 相关阅读:
    angular流程引擎集成
    angular打印功能实现方式
    文件hash、上传,实现文件上传重复验证
    HDU 6096 String(AC自动机+树状数组)
    HDU 5069 Harry And Biological Teacher(AC自动机+线段树)
    BZOJ 3172 单词(AC自动机)
    LightOJ 1268 Unlucky Strings(KMP+矩阵乘法+DP)
    Codeforces 808G Anthem of Berland(KMP+DP)
    LightOJ 1258 Making Huge Palindromes(KMP)
    UVA 11019 Matrix Matcher(哈希)
  • 原文地址:https://www.cnblogs.com/yuyujuan/p/9683238.html
Copyright © 2020-2023  润新知