zoukankan      html  css  js  c++  java
  • JS——缓动框架的问题

    1、opacity问题:IE678支持filter: alpha(opacity=50)取值1-100;小数位容易精度丢失,所i有统一json字符串设置为百进制,赋值时除以100

    2、zIndex问题:层级不需要徐徐渐进值的递增或者递减,而是一下赋值到目标值

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            * {
                padding: 0;
                margin: 0;
            }
    
            div {
                position: absolute;
                top: 40px;
                left: 0px;
                width: 100px;
                height: 100px;
                background-color: pink;
            }
        </style>
    </head>
    <body>
    <button>运动到400</button>
    <div></div>
    <script>
        //原来的缓动框架在个别属性的获取上是有问题的
        //opacity:最好是百分制
        //zIndex:
        var btnArr = document.getElementsByTagName("button");
        var div = document.getElementsByTagName("div")[0];
        console.log(getStyle(div, "opacity") || 100);
        btnArr[0].onclick = function () {
            var json1 = {"left": 300, "top": 200, "width": 300, "height": 200, "opacity": 30, "zIndex": 1};
            var json2 = {"left": 0, "top": 40, "width": 100, "height": 100, "opacity": 100, "zIndex": 2};
            animate(div, json1, function () {
                animate(div, json2);
            });
        }
    
    
        //参数变为2个,将属性atrr和值都存储到json中
        function animate(ele, json, fn) {
            //先清定时器
            clearInterval(ele.timer);
            ele.timer = setInterval(function () {
                //开闭原则
                var bool = true;
                //遍历属性和值,分别单独处理json
                //attr == k(键)    target == json[k](值)
                for (var k in json) {
                    //四部
                    var leader;
                    //判断如果属性为opacity的时候特殊获取值
                    if (k === "opacity") {
                        leader = getStyle(ele, k) * 100 || 100;
                    } else {
                        leader = parseInt(getStyle(ele, k)) || 0;
                    }
                    //1.获取步长
                    var step = (json[k] - leader) / 10;
                    //2.二次加工步长
                    step = step > 0 ? Math.ceil(step) : Math.floor(step);
                    leader = leader + step;
                    //3.赋值
                    //ele.style[k] = leader + "px";
                    //特殊情况特殊赋值
                    if (k === "opacity") {
                        ele.style[k] = leader / 100;
                        //兼容IE678
                        ele.style.filter = "alpha(opacity=" + leader + ")";
                        //如果是层级,一次行赋值成功,不需要缓动赋值
                        //为什么?需求!
                    } else if (k === "zIndex") {
                        ele.style.zIndex = json[k];
                    } else {
                        ele.style[k] = leader + "px";
                    }
    
                    //4.清除定时器
                    //判断: 目标值和当前值的差大于步长,就不能跳出循环
                    //不考虑小数的情况:目标位置和当前位置不相等,就不能清除清除定时器。
                    // if (json[k] !== leader) {
                    //     bool = false;
                    // }
                    if (Math.abs(json[k] - leader) > Math.abs(step)) {
                        bool = false;
                    }
                }
                console.log(1);
                //只有所有的属性都到了指定位置,bool值才不会变成false;
                if (bool) {
                    for (k in json) {
                        if (k === "opacity") {
                            ele.style[k] = json[k] / 100;
                            ele.style.filter = "alpha(opacity=" + leader + ")";//兼容IE678
                        } else if (k === "zIndex") {
                            ele.style.zIndex = json[k];
                        } else {
                            ele.style[k] = json[k] + "px";
                        }
    
                    }
                    clearInterval(ele.timer);
                    //所有程序执行完毕之后执行回调函数
                    //现在只有传递了回调函数,才能执行
                    if (fn) {
                        fn();
                    }
                }
            }, 25);
        }
    
        //兼容方法获取元素样式
        function getStyle(ele, attr) {
            if (window.getComputedStyle) {
                return window.getComputedStyle(ele, null)[attr];
            }
            return ele.currentStyle[attr];
        }
    </script>
    </body>
    </html>

  • 相关阅读:
    标准输入输出
    UNIX基础概念
    phpstrom设置php环境
    nginx+php+swoole安装记录
    MySQL索引
    生成器来解决大文件读取,大数据下载
    PHP调优
    PHP-FPM详解
    远程登录服务器配置
    HTTPS配置
  • 原文地址:https://www.cnblogs.com/wuqiuxue/p/8022114.html
Copyright © 2011-2022 走看看