zoukankan      html  css  js  c++  java
  • 动画函数优化,为任意元素添加任意多个属性

    注释:

      本篇文章封装了两个函数,

      ① getStyle 方法:获取任意元素任意一个属性的值,兼容谷歌,火狐,IE浏览器

      ② variableSpeedAnimate 方法:为任意元素添加任意多个属性,引入了回调函数,可在动画结束后,执行新的操作。

      注意:

       parseInt("128px") = 128

       如果设置的属性是 “opacity”,为了取得整数值,避免计算机的精度问题,可以采用“放大缩小”策略,即当前值和目标值放大相同倍数,设置属性值时,缩小相同倍数

       如果设置的属性是“zIndex”,不用直接渐变,直接将zIndex值设置成目标值即可

       属性值是“zIndex”而不是“z-index”是因为浏览器计算后的样式是“zIndex”,驼峰式命名法

    一、代码

    /**
     * 封装缓动动画,变速,为任意元素添加任意多个属性
     * @param {*} element   元素
     * @param {*} json      css属性键值对,例如{"width":200,"height":100,"zIndex":100,"opacity":0.3}
     * @param {*} fn        回调函数,动画结束,调用回调函数
     */
    function variableSpeedAnimate(element, json, fn) {
        clearInterval(element.timeId);
        element.timeId = setInterval(function () {
            var reachTarget = true;
            for (const attr in json) {
                if (attr == "zIndex") {
                    element.style[attr] = json[attr];
                } else if (attr == "opacity") {
                    var current = getStyle(element, attr) * 100;
                    var target = json[attr] * 100;
                    var step = (target - current) / 10;
                    step = step > 0 ? Math.ceil(step) : Math.floor(step);
                    current += step;
                    element.style[attr] = current / 100;
                    if (current != target) {
                        reachTarget = false;
                    }
                } else {
                    var current = parseInt(getStyle(element, attr));
                    var target = json[attr];
                    var step = (target - current) / 10;
                    step = step > 0 ? Math.ceil(step) : Math.floor(step);
                    current += step;
                    element.style[attr] = current + "px";
                    if (current != target) {
                        reachTarget = false;
                    }
                }
    
            }
            if (reachTarget) {
                clearInterval(element.timeId);
                if (fn) {
                    fn();
                }
            }
        }, 20)
    }
    

    二、测试deno

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
        <style>
            div {
                 200px;
                height: 100px;
                position: absolute;
                left: 0px;
                top: 0;
                border: 1px solid yellow;
                background-color: pink;
                z-index: 0;
    
            }
    
            input {
                position: relative;
                z-index: 99;
            }
        </style>
    </head>
    
    <body>
    
        <input type="button" value="400px" id="btn" />
        <input type="button" value="800px" id="btn1" />
        <div id="dv"></div>
    
        <script src="./js/common.js"></script>
        <script>
            // 400按钮点击事件
            my$("btn").onclick = function () {
                var json = {"width":400,"left":200,"top":150,"opacity":0.6};
                animate(my$("dv"), json,function(){
                    var json1 = { "width":400,"left":500,"top":250,"opacity":0.3};
                    animate(my$("dv"), json1,function(){
                        var json2 = {"width":200,"left":0,"top":0,"opacity":1,"zIndex":100};
                        animate(my$("dv"), json2);
                    })
                });
            };
    
            // 800按钮点击事件
            my$("btn1").onclick = function () {
                animate(my$("dv"), {'left':800});
            };
    
    
            // 封装动画缓冲函数,变速
            function animate(element, json, fn) {
                clearInterval(element.timeId);
                element.timeId = setInterval(function () {
                    var reachTarget = true;
                    for (const attr in json) {
                        if (attr == "zIndex") {
                            element.style[attr] = json[attr];
                        } else if (attr == "opacity") {
                            var current = getStyle(element, attr) * 100;
                            var target = json[attr] * 100;
                            var step = (target - current) / 10;
                            step = step > 0 ? Math.ceil(step) : Math.floor(step);
                            current += step;
                            element.style[attr] = current / 100;
                            if (current != target) {
                                reachTarget = false;
                            }
                        } else {
                            var current = parseInt(getStyle(element, attr));
                            var target = json[attr];
                            var step = (target - current) / 10;
                            step = step > 0 ? Math.ceil(step) : Math.floor(step);
                            current += step;
                            element.style[attr] = current + "px";
                            if (current != target) {
                                reachTarget = false;
                            }
                        }
    
                    }
                    if (reachTarget) {
                        clearInterval(element.timeId);
                        if (fn) {
                            fn();
                        }
                    }
                }, 20)
            }
        </script>
    </body>
    
    </html>
    

    三、common.js

    /*根据id获取元素对象*/
    function my$(id) {
        return document.getElementById(id);
    }
    
    /**
     * 获取任意一个元素的任意一个属性值
     * @param {*} element   元素
     * @param {*} attr      属性值,字符串格式,例如'width'...
     */
    function getStyle(element, attr) {
        return window.getComputedStyle ? window.getComputedStyle(element, null)[attr] : element.currentStyle[attr];
    }

    四、效果图

      初始图:

        

      点击400px按钮:

        

        

      

      点击800px按钮:

      

      

  • 相关阅读:
    Django Ajax
    Django模板层
    Django session源码剖析
    CBV源码剖析
    Django视图层
    Django版本区别
    Django路由层
    Django高级
    Django ORM
    Django入门
  • 原文地址:https://www.cnblogs.com/mycnblogs-guoguo/p/11250685.html
Copyright © 2011-2022 走看看