封装动画函数

知识点:

  1. window.getComputedStyle(box)可以获取之前的样式

例如:

.box {
      position: absolute;
      top: 100px;
      left: 0;
      width: 100px;
      height: 100px;
      opacity: 0.5;
      background-color: #0f0;
    }
    var box = document.getElementById("box");
	
    // 补充 获取计算后样式的方法
    console.dir(window.getComputedStyle(box));
    console.log(window.getComputedStyle(box).width);
    console.log(window.getComputedStyle(box).height);
    console.log(window.getComputedStyle(box).backgroundColor);
    console.log(window.getComputedStyle(box)["opacity"]);

image

  1. 多属性运动的属性特点
  • 共同点:总时间、时间间隔是相同的,自定义
  • 不同的:起始位置(通过程序方法自动获取当前页面最终显示效果)和结束位置(自定义指定的)
  1. 函数的参数
  • 参数1:元素对象,它要进行运动
  • 参数2:结束位置,以对象数据方式传递
  • 参数3:总时间
  1. 每个属性的开始位置, 结束位置, 步长都不一样, 所以这三个需要用对象表示

易错点:

  1. 函数中元素属性不能用打点了, 需要用ele.syle[k]

  2. 函数中给元素属性赋值的时候要加单位, 除了不透明度opacity

  3. 对象的调用和遍历

var obj = { left: 400, width: 300 };

for(var k in obj){
	console.log(k);       // left,width
	console.log(obj[k])   // 400,300
}

<!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>
        * {
            margin: 0;
            padding: 0;
        }

        .box {
            position: absolute;
            top: 100px;
            left: 0;
            width: 100px;
            height: 100px;
            background-color: skyblue;
        }
    </style>
</head>

<body>
    <input type="button" value="开始" id="start">
    <input type="button" value="结束" id="end">
    <div class="box" id="box"></div>

    <script>
        // 获取元素
        var start = document.getElementById("start");
        var end = document.getElementById("end");
        var box = document.getElementById("box");

        // 共同点:总时间、时间间隔是相同的,自定义
        // 不同的:起始位置(通过程序方法自动获取当前页面最终显示效果)和结束位置(自定义指定的)


        // 函数参数
        // 参数1:元素对象,它要进行运动
        // 参数2:结束位置,以对象数据方式传递
        // 参数3:总时间
        // 自定义动画函数
        end = { left: 500, top: 500, width: 500, opacity: 0.3 };
        // 调用函数
        start.onclick = function () {
            animate(box, { left: 400, width: 300 }, 2000);
        };



        function animate(ele, end, time) {
            var now = {};
            //根据end中的属性获取需要的属性, 最开始的now也就是起始位置的值
            for (var k in end) {
                //parseFloat是为了获得去掉单位的纯数值
                now[k] = parseFloat(window.getComputedStyle(ele)[k]);

            }

            var interval = 50;

            //总次数
            maxcount = time / interval;

            //计数器
            count = 0;

            // 对象中的每个属性都有自己的步长,也可以放到一个步长对象中
            var step = {};
            for (var k in end) {
                step[k] = (end[k] - now[k]) / maxcount;
            }

            //定时器
            var timer;

            timer = setInterval(function () {
                for (var k in end) {
                    now[k] += step[k];
                }

                count++;

                if (count >= maxcount) {
                    //拉终停表
                    for (var k in end) {
                        now[k] = end[k];
                    }
                    clearInterval(timer);
                }

                // 赋值给对应元素对象属性
                for (var k in end) {
                    if (k == 'opacity') {
                        ele.style[k] = now[k];
                    }
                    else {
                        ele.style[k] = now[k] + "px";
                    }

                }
            }, interval)

        };


    </script>
</body>

</html>
posted @ 2021-08-16 16:43  charonmomo  阅读(26)  评论(0编辑  收藏  举报