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>

posted @ 2017-12-11 11:12  var_obj  阅读(262)  评论(0编辑  收藏  举报