zoukankan      html  css  js  c++  java
  • 0194 动画函数封装:动画实现原理,给不同元素记录不同定时器,缓动效果原理,多个目标值之间移动,动函数添加回调函数,动画完整版代码,京东问题反馈元素左右移动案例

    1.6.1 动画实现原理

    核心原理:通过定时器 setInterval() 不断移动盒子位置。

    实现步骤:

    1. 获得盒子当前位置
    2. 让盒子在当前位置加上1个移动距离
    3. 利用定时器不断重复这个操作
    4. 加一个结束定时器的条件
    5. 注意此元素需要添加定位,才能使用element.style.left
    动画原理
    
    <!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>
            div {
                position: absolute;
                left: 0;
                 100px;
                height: 100px;
                background-color: pink;
            }
        </style>
    </head>
    
    <body>
        <div></div>
        <script>
            // 动画原理
            // 1. 获得盒子当前位置  
            // 2. 让盒子在当前位置加上1个移动距离
            // 3. 利用定时器不断重复这个操作
            // 4. 加一个结束定时器的条件
            // 5. 注意此元素需要添加定位, 才能使用element.style.left
            var div = document.querySelector('div');
            var timer = setInterval(function() {
                if (div.offsetLeft >= 400) {
                    // 停止动画 本质是停止定时器
                    clearInterval(timer);
                }
                div.style.left = div.offsetLeft + 1 + 'px';
            }, 30);
        </script>
    </body>
    
    </html>
    
    简单动画函数封装
    <!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>
            div {
                position: absolute;
                left: 0;
                 100px;
                height: 100px;
                background-color: pink;
            }
            
            span {
                position: absolute;
                left: 0;
                top: 200px;
                display: block;
                 150px;
                height: 150px;
                background-color: purple;
            }
        </style>
    </head>
    
    <body>
        <div></div>
        <span>夏雨荷</span>
        <script>
            // 简单动画函数封装obj目标对象 target 目标位置
            function animate(obj, target) {
                var timer = setInterval(function() {
                    if (obj.offsetLeft >= target) {
                        // 停止动画 本质是停止定时器
                        clearInterval(timer);
                    }
                    obj.style.left = obj.offsetLeft + 1 + 'px';
    
                }, 30);
            }
    
            var div = document.querySelector('div');
            var span = document.querySelector('span');
            // 调用函数
            animate(div, 300);
            animate(span, 200);
        </script>
    </body>
    
    </html>
    

    1.6.2 动画函数给不同元素记录不同定时器

    如果多个元素都使用这个动画函数,每次都要var 声明定时器。我们可以给不同的元素使用不同的定时器(自己专门用自己的定时器)。

    核心原理:利用 JS 是一门动态语言,可以很方便的给当前对象添加属性。

    <!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>
            div {
                position: absolute;
                left: 0;
                 100px;
                height: 100px;
                background-color: pink;
            }
            
            span {
                position: absolute;
                left: 0;
                top: 200px;
                display: block;
                 150px;
                height: 150px;
                background-color: purple;
            }
        </style>
    </head>
    
    <body>
        <button>点击夏雨荷才走</button>
        <div></div>
        <span>夏雨荷</span>
        <script>
            // var obj = {};
            // obj.name = 'andy';
            // 简单动画函数封装obj目标对象 target 目标位置
            // 给不同的元素指定了不同的定时器
            function animate(obj, target) {
                // 当我们不断的点击按钮,这个元素的速度会越来越快,因为开启了太多的定时器
                // 解决方案就是 让我们元素只有一个定时器执行
                // 先清除以前的定时器,只保留当前的一个定时器执行
                clearInterval(obj.timer);
                obj.timer = setInterval(function() {
                    if (obj.offsetLeft >= target) {
                        // 停止动画 本质是停止定时器
                        clearInterval(obj.timer);
                    }
                    obj.style.left = obj.offsetLeft + 1 + 'px';
                }, 30);
            }
    
            var div = document.querySelector('div');
            var span = document.querySelector('span');
            var btn = document.querySelector('button');
            // 调用函数
            animate(div, 300);
            btn.addEventListener('click', function() {
                animate(span, 200);
            })
        </script>
    </body>
    
    </html>
    

    1.1.1 缓动效果原理

    缓动动画就是让元素运动速度有所变化,最常见的是让速度慢慢停下来

    思路:

    1. 让盒子每次移动的距离慢慢变小,速度就会慢慢落下来
    2. 核心算法:** (目标值 - 现在的位置)   /  10    做为每次移动的距离步长**
    3. 停止的条件是: 让当前盒子位置等于目标位置就停止定时器
    4. 注意步长值需要取整
    <!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>
            div {
                position: absolute;
                left: 0;
                 100px;
                height: 100px;
                background-color: pink;
            }
            
            span {
                position: absolute;
                left: 0;
                top: 200px;
                display: block;
                 150px;
                height: 150px;
                background-color: purple;
            }
        </style>
    </head>
    
    <body>
        <button>点击夏雨荷才走</button>
        <span>夏雨荷</span>
        <script>
            // 缓动动画函数封装obj目标对象 target 目标位置
            // 思路:
            // 1. 让盒子每次移动的距离慢慢变小, 速度就会慢慢落下来。
            // 2. 核心算法:(目标值 - 现在的位置) / 10 做为每次移动的距离 步长
            // 3. 停止的条件是: 让当前盒子位置等于目标位置就停止定时器
            function animate(obj, target) {
                // 先清除以前的定时器,只保留当前的一个定时器执行
                clearInterval(obj.timer);
                obj.timer = setInterval(function() {
                    // 步长值写到定时器的里面
                    var step = (target - obj.offsetLeft) / 10;
                    if (obj.offsetLeft == target) {
                        // 停止动画 本质是停止定时器
                        clearInterval(obj.timer);
                    }
                    // 把每次加1 这个步长值改为一个慢慢变小的值  步长公式:(目标值 - 现在的位置) / 10
                    obj.style.left = obj.offsetLeft + step + 'px';
                }, 15);
            }
            var span = document.querySelector('span');
            var btn = document.querySelector('button');
    
            btn.addEventListener('click', function() {
                // 调用函数
                animate(span, 500);
            })
    
            // 匀速动画 就是 盒子是当前的位置 +  固定的值 10 
            // 缓动动画就是  盒子当前的位置 + 变化的值(目标值 - 现在的位置) / 10)
        </script>
    </body>
    
    </html>
    

    1.1.2 动画函数多个目标值之间移动

    可以让动画函数从 800 移动到 500。

    当我们点击按钮时候,判断步长是正值还是负值

    ​ 1.如果是正值,则步长往大了取整

    ​ 2.如果是负值,则步长 向小了取整

    <!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>
            div {
                position: absolute;
                left: 0;
                 100px;
                height: 100px;
                background-color: pink;
            }
            
            span {
                position: absolute;
                left: 0;
                top: 200px;
                display: block;
                 150px;
                height: 150px;
                background-color: purple;
            }
        </style>
    </head>
    
    <body>
        <button class="btn500">点击夏雨荷到500</button>
        <button class="btn800">点击夏雨荷到800</button>
        <span>夏雨荷</span>
        <script>
            // 缓动动画函数封装obj目标对象 target 目标位置
            // 思路:
            // 1. 让盒子每次移动的距离慢慢变小, 速度就会慢慢落下来。
            // 2. 核心算法:(目标值 - 现在的位置) / 10 做为每次移动的距离 步长
            // 3. 停止的条件是: 让当前盒子位置等于目标位置就停止定时器
            function animate(obj, target) {
                clearInterval(obj.timer); // 先清除以前的定时器,只保留当前的一个定时器执行
    
                obj.timer = setInterval(function() {
                    // 步长值写到定时器的里面
                    // 把我们步长值改为整数 不要出现小数的问题
                    // var step = Math.ceil((target - obj.offsetLeft) / 10);
                    var step = (target - obj.offsetLeft) / 10;
                    step = step > 0 ? Math.ceil(step) : Math.floor(step);
    
                    if (obj.offsetLeft == target) {
                        // 停止动画 本质是停止定时器
                        clearInterval(obj.timer);
                    }
                    // 把每次加1 这个步长值改为一个慢慢变小的值  步长公式:(目标值 - 现在的位置) / 10
                    obj.style.left = obj.offsetLeft + step + 'px';
                }, 15);
            }
            var span = document.querySelector('span');
            var btn500 = document.querySelector('.btn500');
            var btn800 = document.querySelector('.btn800');
    
            btn500.addEventListener('click', function() {
                animate(span, 500); // 调用函数
            })
            btn800.addEventListener('click', function() {
                animate(span, 800); // 调用函数
            })
    
            // 匀速动画 就是 盒子是当前的位置 +  固定的值 10 
            // 缓动动画就是  盒子当前的位置 + 变化的值(目标值 - 现在的位置) / 10)
        </script>
    </body>
    
    </html>
    

    1.1.3 动函数添加回调函数

    回调函数原理:函数可以作为一个参数。将这个函数作为参数传到另一个函数里面,当那个函数执行完之后,再执行传进去的这个函数,这个过程就叫做回调。

    回调函数写的位置:定时器结束的位置。

    <!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>
            div {
                position: absolute;
                left: 0;
                 100px;
                height: 100px;
                background-color: pink;
            }
            
            span {
                position: absolute;
                left: 0;
                top: 200px;
                display: block;
                 150px;
                height: 150px;
                background-color: orange;
            }
        </style>
    </head>
    
    <body>
        <button class="btn500">点击夏雨荷到500</button>
        <button class="btn800">点击夏雨荷到800</button>
        <span>夏雨荷</span>
        <script>
            // 缓动动画函数封装obj目标对象 target 目标位置
            // 思路:
            // 1. 让盒子每次移动的距离慢慢变小, 速度就会慢慢落下来。
            // 2. 核心算法:(目标值 - 现在的位置) / 10 做为每次移动的距离 步长
            // 3. 停止的条件是: 让当前盒子位置等于目标位置就停止定时器
            function animate(obj, target, callback) {
                // console.log(callback);  callback = function() {}  调用的时候 callback()
                clearInterval(obj.timer);  // 先清除以前的定时器,只保留当前的一个定时器执行
    
                obj.timer = setInterval(function() {
                    // 步长值写到定时器的里面
                    // 把我们步长值改为整数 不要出现小数的问题
                    // var step = Math.ceil((target - obj.offsetLeft) / 10);
                    var step = (target - obj.offsetLeft) / 10;
                    step = step > 0 ? Math.ceil(step) : Math.floor(step);
    
                    if (obj.offsetLeft == target) {
                        clearInterval(obj.timer); // 停止动画 本质是停止定时器
                        // 回调函数写到定时器结束里面
                        if (callback) {
                            callback();  // 调用函数
                        }
                    }
                    // 把每次加1 这个步长值改为一个慢慢变小的值  步长公式:(目标值 - 现在的位置) / 10
                    obj.style.left = obj.offsetLeft + step + 'px';
                }, 15);
            }
    
            var span = document.querySelector('span');
            var btn500 = document.querySelector('.btn500');
            var btn800 = document.querySelector('.btn800');
    
            btn500.addEventListener('click', function() {
                animate(span, 500);  // 调用函数
            })
    
            btn800.addEventListener('click', function() {
                // 调用函数
                animate(span, 800, function() {
                    span.style.backgroundColor = 'lightcyan';
                });
            })
    
            // 匀速动画 就是 盒子是当前的位置 +  固定的值 10 
            // 缓动动画就是  盒子当前的位置 + 变化的值(目标值 - 现在的位置) / 10)
        </script>
    </body>
    
    </html>
    

    1.1.4 动画完整版代码

    function animate(obj, target, callback) {
        // console.log(callback);  callback = function() {}  调用的时候 callback()
        clearInterval(obj.timer);  // 先清除以前的定时器,只保留当前的一个定时器执行
        
        obj.timer = setInterval(function() {
            // 步长值写到定时器的里面
            // 把我们步长值改为整数 不要出现小数的问题
            // var step = Math.ceil((target - obj.offsetLeft) / 10);
            var step = (target - obj.offsetLeft) / 10;
            step = step > 0 ? Math.ceil(step) : Math.floor(step);
            if (obj.offsetLeft == target) {
                clearInterval(obj.timer);  // 停止动画 本质是停止定时器
                // 回调函数写到定时器结束里面
                // if (callback) {
                //     // 调用函数
                //     callback();
                // }
                callback && callback();
            }
            // 把每次加1 这个步长值改为一个慢慢变小的值  步长公式:(目标值 - 现在的位置) / 10
            obj.style.left = obj.offsetLeft + step + 'px';
        }, 15);
    }
    

    1.1.5 案例:京东问题反馈元素左右移动

    <!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>
        <script src="animate.js"></script>
        <style>
            .sliderbar {
                position: fixed;
                right: 0;
                bottom: 180px;
                 40px;
                height: 40px;
                text-align: center;
                line-height: 40px;
                cursor: pointer;
                color: #fff;
            }
            
            .con {
                position: absolute;
                left: 0;
                top: 0;
                 200px;
                height: 40px;
                background-color: purple;
                z-index: -1;
            }
        </style>
    </head>
    
    <body>
        <div class="sliderbar">
            <span>←</span>
            <div class="con">问题反馈</div>
        </div>
    
        <script>
            // 1. 获取元素
            var sliderbar = document.querySelector('.sliderbar');
            var con = document.querySelector('.con');
            // 当我们鼠标经过 sliderbar 就会让 con这个盒子滑动到左侧
            // 当我们鼠标离开 sliderbar 就会让 con这个盒子滑动到右侧
            sliderbar.addEventListener('mouseenter', function() {
                // animate(obj, target, callback);
                animate(con, -160, function() {
                    // 当我们动画执行完毕,就把 ← 改为 →
                    sliderbar.children[0].innerHTML = '→';
                });
    
            })
            sliderbar.addEventListener('mouseleave', function() {
                // animate(obj, target, callback);
                animate(con, 0, function() {
                    sliderbar.children[0].innerHTML = '←';
                });
    
            })
        </script>
    </body>
    
    </html>
    
  • 相关阅读:
    1、应用设置之TAB页
    HDUOJ 水果
    Problem G 宝石合成 (内蒙古14年省赛)
    ORA-09925: Unable to create audit trail file汇总
    浅拷贝(在进行当中一个对象的运算时开辟新的空间)
    PHP图像操作类
    如何制作Jar包并在android中调用jar包
    android中正确导入第三方jar包
    Android 数据加密算法 Des,Base64详解
    Android Zip文件解压缩代码
  • 原文地址:https://www.cnblogs.com/jianjie/p/12189025.html
Copyright © 2011-2022 走看看