JavaScript课程——Day13(3、运动框架)

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        #box {
            width: 100px;
            height: 100px;
            background-color: red;
            position: absolute;
            left: 0;
            top: 0;
        }
    </style>
</head>

<body>
    <div id="box"></div>

    <script src="js/move.js"></script>
    <script>
        // 点击box,让它的宽和高同时到500
        var box = document.getElementById('box');
        box.onclick = function () {
            move(box, {
                 500,
                height: 300,
                opacity: 30,
                left: 500,
                top: 200
            }, function () {
                console.log('我到了');
            })
        }
    </script>
</body>

</html>
function getStyle(ele, attr) {
    if (window.getComputedStyle) {
        // 标准浏览器
        return getComputedStyle(ele)[attr];
    } else {
        // IE8及以下
        return ele.currentStyle[attr];
    }
}

// 元素 属性 目标 回调
function move(ele, json, callback) {
    clearInterval(ele.timer); // 先清
    // 再开
    ele.timer = setInterval(function () {
        var onOff = true; // 建一个开关

        // 在for-in的里面,如果某一个属性没有到,则把开关变为假
        for (var attr in json) { // 删掉的attr和target又回来了
            var target = json[attr];

            // 当前位置
            if (attr === 'opacity') {
                var now = getStyle(ele, 'opacity') * 100;
            } else {
                var now = parseInt(getStyle(ele, attr));
            }

            var dir = (target - now) / 10; // 方向 缓冲运动
            // 如果大于0,向上取整,否则向下取整
            dir = dir > 0 ? Math.ceil(dir) : Math.floor(dir);
            now += dir; // 下次应该运动到的位置

            if ((now >= target && dir > 0) || (now <= target) && dir < 0) {
                now = target;
            }

            // 设置值
            if (attr === 'opacity') {
                ele.style.opacity = now / 100;
                ele.style.filter = 'alpha(opacity=' + now + ')';
            } else {
                ele.style[attr] = now + 'px';
            }

            if (now !== target) {
                onOff = false;
            }
        }

        if (onOff) { // 如果开关是真的,则清定时器并执行回调
            clearInterval(ele.timer);
            callback && callback();
        }
    }, 30);
}
原文地址:https://www.cnblogs.com/miaochaofan/p/14742745.html