• 动画效果


    <!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>
            body,
            html,
            div,
            * {
                margin: 0;
                padding: 0;
            }
            
            div {
                height: 150px;
                width: 150px;
                background: plum;
                position: absolute;
                top: 0;
                left: 0;
            }
            
            span {
                display: block;
                width: 100px;
                height: 100px;
                background: powderblue;
                position: absolute;
                top: 200px;
                left: 0;
            }
        </style>
    </head>
    
    <body>
        <button>点击移动盒子</button>
        <div>会动的盒子</div>
        <span>小盒子</span>
        <script>
            var div = document.querySelector('div');
            var span = document.querySelector('span');
            var start = setInterval(function() {
                if (div.offsetLeft >= 300) {
                    clearInterval(start);
                }
                div.style.left = div.offsetLeft + 2 + 'px';
            }, 10);
            // 页面中不止有一个动画,所以可以给动画封装一个函数
            // 简单动画函数封装 有两个参数 obj目标对象 target目标位置  callback回调函数
            function animate(obj, target, callback) {
                /* 
                 1.占用内存资源(var)会在内存中开辟新的空间
                 2.定时器名字重复,容易引起歧义
                 3.可以使用给对象添加属性的方式,给定时器取名字
                    对象本身是存在内存中的,这样做是给对象添加属性,并不占用内存
                    避免了val声明变量,不再去内存中开辟新的空间
                  */
                /* 
                1.不断点击按钮,元素的速度会越来越快,因为开启了太多定时器
                2.解决方案:让元素只有一个定时器执行
                3.先清除以前的定时器,只保留当前一个定时器执行
                 */
                clearInterval(obj.start);
                obj.start = setInterval(function() {
                    // 缓慢动画效果  每加1秒 步长值就慢慢变小
                    // 步长公式:(目标位置 - 现在位置) / 10  其中 10 是可变值
                    // 步长公式得到的值有可能是小数,这时就需要我们取整
                    // 如果是正值往大了取整,如果是负值往小了取整
                    var step = (target - obj.offsetLeft) / 10;
                    step = step > 0 ? Math.ceil(step) : Math.floor(step);
                    if (obj.offsetLeft >= target) {
                        clearInterval(obj.start);
                        // 等定时器完成之后,判断代码中是否有回调函数,有则调用回调函数
                        if (callback) {
                            callback();
                        }
                    }
                    obj.style.left = obj.offsetLeft + step + 'px';
                }, 50);
    
            }
            // 调用函数
            var btn = document.querySelector('button');
            btn.addEventListener('click', function() {
                animate(span, 500, function() { //function(){}回调函数
                    span.style.backgroundColor = 'pink';
                });
            })
        </script>
    </body>
    
    </html>
  • 相关阅读:
    什么是BFC?
    获取JavaScript对象的键值对两种方法的不同之处
    浏览器什么时候会引起reflow,应该怎样避免reflow的开销呢?
    用js实现跳转页面的方法
    停止animate动画和判断是否处于动画状态
    解决slideDown(),slideUp()鼠标来回进入的问题
    IE7浏览器绝对定位被下边元素遮挡问题解决办法
    前端开发面试要点及对策
    inline-block元素之间空白间距的解决办法
    web前端开发和移动前端开发的本质区别在哪里?
  • 原文地址:https://www.cnblogs.com/qtbb/p/11707462.html
Copyright © 2020-2023  润新知