JS运动集合,封装便捷的功能函数

动画的原理

匀速运动

        // 1. 匀速运动 s = vt  v不变
        let btn = document.querySelector("button");
        let div = document.querySelector(".box");
        btn.onclick = function () {
            starMove(div, 300)
        };
        // 运动的元素  运动到的位置 向后+  还是向前-
        function starMove(dom, target) {
            clearInterval(dom.timer);
            let speed = 7; // 匀速的关键  每次运动的距离一样
            dom.timer = setInterval(() => {
                 // 控制左右的方向 
                speed = (target - dom.offsetLeft) > 0 ? 7 : -7;
                // 判断停止的位置  
                // 目标位置 - 当前元素左侧的距离 <  指定速度 停止
                if (Math.abs(target - div.offsetLeft) < Math.abs(speed)) {
                    clearInterval(dom.timer);
                    dom.style.left = target + "px";
                } else {
                    dom.style.left = dom.offsetLeft + speed + "px";
                }
            }, 30);
        }

缓动运动

为了让每个元素拥有自己独立的定时器,把定时器名称挂在元素的属性上。
缓动运动:先加速后减速做变换。

        // 2. 缓冲运动 先加速 后减速  增加的步数越来越小
        let btn = document.querySelector("button");
        let div = document.querySelector(".box");

        btn.onclick = function () {
            startMove(div, 500)
        };
        
        function startMove(dom, target) {
            let speed = null;
            let step = 7;
            clearInterval(dom.timer);
            dom.timer = setInterval(() => {
                // 左右运动 控制数值大小 缓动趋势
                // 元素距离目标点 距离越小 运动速度(每次运动的距离)越小
                speed = (target - dom.offsetLeft) / step;  
                // 取个整数 负数时 向下取整  整数时 向上取整
                speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed); 
				// 当元素左侧距离 达到目标点时 清除定时器
                if (dom.offsetLeft == target) {
                    clearInterval(dom.timer);
                } else {
                	// 具有左右两个方向的功能 speed为+ 加距离  为 - 减距离
                    dom.style.left = dom.offsetLeft + speed + "px";
                }
            }, 30);
        };

属性的缓动运行

不同元素不同属性变化。
透明度的缓动:

        
        // 获取对象特定属性值  返回类型是字符串
        function getStyle(dom, attr) {
            if (window.getComputedStyle) {
                return window.getComputedStyle(dom, null)[attr];
            } else {
                return dom.currentStyle[attr];
            }
        }
        
        // 3.缓动透明度
        let btn = document.querySelector("button");
        let div = document.querySelector(".box");

        btn.onclick = function () {
            // 透明度扩大100倍
            startMove(div, "opacity", 20);
        };
        // 透明度缓冲
        function startMove(dom, target) {
            clearInterval(dom.timer);
            let speed = null,
                iCur = null;
            let step = 7;
            dom.timer = setInterval(function () {
                iCur = parseFloat(getStyle(dom, "opacity")) * 100;
                // speed为 缓动趋势 同时具有左右的功能。
                // 元素距离目标点 距离越小 运动速度(每次运动的距离)越小
                speed = (target - iCur) / step;
                // 取个整数 负数时 向下取整  整数时 向上取整
                speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed); 
                // 透明度到了
                if (iCur == target) {
                    clearInterval(dom.timer);
                } else {
                    dom.style.opacity = (iCur + speed) / 100;
                }
            }, 30);
        };

封装适合所有属性的缓动:

        // 4. 封装一个不同属性缓动
        function startMove(dom, attr, target) {
            let speed = null,
                iCur = null;
            let step = 7;
            clearInterval(dom.timer);
            dom.timer = setInterval(function () {
            	// 	判断传入的属性是否 为 opacity 需要特殊处理
                if (attr == "opacity") {
                    iCur = parseFloat(getStyle(dom, attr)) * 100;
                } else {
                    iCur = parseFloat(getStyle(dom, attr));
                }
                // 确定属性类型  继续向下运行
                speed = (target - iCur) / step; // 元素距离目标点距离越小速度越小
                // 取个整数 负数时 向下取整  整数时 向上取整
                speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed); 
                if (iCur == target) {
                    clearInterval(dom.timer);
                } else {
                    if (attr == "opacity") {
                        dom.style.opacity = (iCur + speed) / 100;
                    } else {
                    	// 具有左右两个方向的功能 speed为+ 加距离  为 - 减距离
                        dom.style[attr] = iCur + speed + "px";
                    }
                }
            }, 30);
        }

多个属性同时传入

不同元素多个属性发生改变。
回调机制:回调函数,动画完成后执行。

        // 5. 对象形式传入属性
        let btn = document.querySelector("button");
        let div = document.querySelector(".box");

        btn.onclick = function () {
            // 透明度扩大100倍
            startMove(div, {
                width: 400,
                height: 400,
                opacity: 50 // 串值时也需要扩大100
            });
        };

        // 属性对象:
        // 1.遍历此对象属性,
        // 2.判断属性中是否有透明度,有 值*100
        // 3.改变值时:判断属性是否含有opacity  有 /100
        // 4.设置标志 默认定时器可以清除  flag = true 循环外部设置
        // 5.判断是否有属性没有变换完毕   变换对象.属性值 是否等于 属性集合.属性值 不等于 flag = false
        // 6.属性遍历完毕,只要标志为真就说明所有属性完成变换 则清除定时器
        // 7.回调函数,动画做完调用,在清除定时器之后

        function startMove(dom, attrObj, callback) {
            clearInterval(dom.timer);
            let speed = null,
                iCur = null;
            const step = 7;
            dom.timer = setInterval(function () {
                let flag = true; // 标志
                // 遍历属性集合对象
                for (let attr in attrObj) {
                    // 判断属性 是否含有 opacity 取值
                    if (attr == "opacity") {
                        iCur = parseFloat(getStyle(dom, attr)) * 100;
                    } else {
                        iCur = parseFloat(getStyle(dom, attr));
                    }

                    // 缓动趋势
                    speed = (attrObj[attr] - iCur) / step;; // 元素距离目标点距离越小速度越小
                    // console.log(speed);

                    speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed); // 取个整数
                    // 判断属性 是否含有 opacity 赋值
                    if (attr == "opacity") {
                        dom.style.opacity = (iCur + speed) / 100;
                    } else {
                        dom.style[attr] = iCur + speed + "px";
                    }
                    // 说明有属性没有变换完毕 标志取反
                    if (iCur != attrObj[attr]) {
                        flag = false;
                    }
                }
                // 属性对象遍历完毕  标志符为true则说明所有属性变换完毕 清除定时器
                if (flag) {
                    clearInterval(dom.timer);
                    // 逻辑短路应用:callback不存在返回false不影响,callback存在之间返回callback()
                    callback && callback();
                }
            }, 30);
        }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,那我们可以用一个名为 "util" 的对象来封装这些函数,例如: ``` const util = { add: function(a, b) { return a + b; }, subtract: function(a, b) { return a - b; }, multiply: function(a, b) { return a * b; }, divide: function(a, b) { return a / b; } }; ``` 然后你就可以通过访问 "util.add(a, b)" 来使用加法函数了。你也可以继续往这个对象里添加其他常用的函数。 需要注意的是,以上代码假设你使用的是 ES6 语法,如果你使用的是 ES5 语法,你需要把 "function" 换成 "var"。 ### 回答2: 封装一个常用的JavaScript函数集合是为了提高开发效率和代码的重用性。这个函数集合可以包含各种常用的功能函数,例如: 1. 获取URL参数值:可以封装一个函数,通过传入参数名,返回对应的URL参数值。比如,可以使用window.location.search获取URL参数字符串,然后再使用正则表达式或其他方法找到对应的参数值。 2. 时间格式化:封装一个函数,将时间对象转换为指定格式的字符串。比如,可以使用Date对象的方法获取年月日、时分秒等信息,然后根据需要进行格式化输出。 3. 随机数生成:可以封装一个函数,生成指定范围内的随机整数或随机浮点数。比如,可以使用Math.random函数生成0到1之间的随机数,然后根据需要进行相应的运算转换。 4. 数组元素查找:可以封装一个函数,根据指定条件在数组中查找元素,并返回符合条件的元素或索引值。比如可以使用Array的filter方法根据判定函数找到满足条件的元素。 5. 数据类型判断:可以封装一个函数,判断变量的数据类型并返回相应的字符串表示。比如,可以使用typeof运算符判断基本数据类型,使用Array.isArray判断数组类型,使用Object.prototype.toString判断复杂数据类型。 6. 字符串截取:可以封装一个函数,对字符串进行截取操作,根据指定参数截取指定长度的字符串,同时提供省略号等处理方式。 7. 表单验证:可以封装一些常用的表单验证函数,例如验证邮箱、手机号码、用户名等。这些函数可以使用正则表达式或其他验证方式进行验证,以提高代码的可读性和可维护性。 以上只是一些常见的封装函数示例,实际的常用函数集合可以根据具体需求进行扩展和定制。 ### 回答3: 常用的JavaScript函数集合可以提供一组常见功能封装,以便在开发过程中更便捷地调用这些函数。下面是一个封装了一些常用功能的常用JavaScript函数集合例子: 1. 获取URL参数:这个函数可以从URL中获取指定参数的值并返回。可以通过传递参数名来获取不同的参数值。 2. 格式化日期:这个函数可以将日期对象或日期字符串格式化为指定的日期格式。可以通过参数来指定所需的日期格式。 3. 判断空值:这个函数可以判断一个变量是否为空(包括未定义、null、空字符串等),返回true或false。 4. 随机数生成:这个函数可以生成一定范围内的随机数,可以通过传递参数指定范围。 5. 数组去重:这个函数可以对数组进行去重操作,并返回去重后的数组。 6. 节流函数:这个函数可以控制函数的频率,在指定的时间间隔内只执行一次。 7. 深度拷贝对象:这个函数可以实现深度拷贝一个对象,返回一个拷贝后的新对象。 8. 字符串截取:这个函数可以截取指定长度的字符串,并在结尾添加省略号。 9. 图片预加载:这个函数可以实现图片的预加载,防止图片未加载完全时导致页面闪烁。 10. 防抖函数:这个函数可以控制函数的执行频率,在指定的时间间隔内,只有最后一次触发才执行。 这些是常用的JavaScript函数集合的一些例子,通过封装这些功能,可以使开发过程更高效、便捷。可以根据需要自定义封装适合自己的常用功能函数集合
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值