原生JS实现动画函数的封装

封装了一个JS方法,支持元素的基本动画:宽、高、透明度...等,也支持链式动画和同时运动。

获取元素的属性的函数并进行了兼容性处理:

1     function getStyle(obj, attr) {
2         if(obj.currentStyle){   //IE浏览器
3             return obj.currentStyle[attr];
4         }else{    //chrome、firefox等浏览器
5             return getComputedStyle(obj,null)[attr];
6         }
7     }

动画函数:

 1 var timer = null;  // 声明一个timer来存储定时器
 2 function animate(obj, Obj, callback) {
 3     clearInterval(obj.timer);
 4     obj.timer = setInterval(function() {
 5         /*
 6          * 当我们改变多个属性时,如果其中一个属性已经达到目标值,就会清除定时器,就会导致其他没有达到目标值的属性也会停止
 7          * 为了解决这个问题,我们声明一个节流阀flag,让它为true
 8          * 判断是否还有没达到目标值的属性,如果还有,就让flag为false(关闭节流阀),让定时器继续执行
 9          * 当所有属性都达到了目标值时,才执行清除定时器那一步
10          */
11         var flag = true;
12         for(var attr in Obj) {  // for...in...遍历对象
13             var icur = 0;  // 存储获取过来的属性值
14             if(attr == ‘opacity‘) {  // 判断获取过来的属性是否为opacity
15                 icur = Math.round(parseFloat(getStyle(obj, attr)) * 100); // float会有小误差,所以需要四舍五入一下
16             } else {
17                 icur = parseInt(getStyle(obj, attr));  // 获取过来的值可能带单位,所以需要用到parseInt()
18             }
19             var speed = (Obj[attr] - icur) / 10;  // 速度 逐渐变慢(也可以设为固定值实现匀速运动)
20             speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed); // speed并不总是整数,会导致和目标值不相等,所以需要对speed进行取整,大于0向上取整,小于0向下取整
21             if(icur != Obj[attr]) {  // 判断是否还有属性没有达到目标值
22                 flag = false;
23             }
24             if(attr == ‘opacity‘) {  // opacity是没有单位的,所以在这里需要判断一下
25                 obj.style.filter = ‘alpha(opacity = ‘+ (icur + speed) +‘)‘;
26                 obj.style.opacity = (icur + speed) / 100;  // opacity别忘了除以100
27             } else {
28                 obj.style[attr] = icur + speed + ‘px‘;  // 原来的值加上速度赋值给属性
29             }
30         }
31         if(flag) { // 当所有属性都达到目标值,即flag为true时,再停止定时器
32             clearInterval(obj.timer);
33             callback && callback();  // 判断是否有回调函数,有的话就执行
34         }
35     }, 25)
36 }

接下来我们来调用一下:

1     var box = document.querySelector(‘.box‘);
2     box.addEventListener("mouseover", function() {
3         animate(this, {width: 300, height: 200, opacity: 100}, function() {
4             animate(box, {width: 200, height: 100, opacity: 30});
5         });
6     });

结果如下:

原文地址:https://www.cnblogs.com/sunyan-blog/p/12073937.html

时间: 2024-08-03 16:48:18

原生JS实现动画函数的封装的相关文章

JavaScript——WEBAPIS_深入动画函数的封装,常见网页特效

深入动画函数的封装 1.动画函数的封装 1.1 缓动效果的实现 这里有一些核心的算法,(目标值 - 现在的位置) ??/??10 = 每一次移动的步长 拿一个具体的效果举例子,比如让一个元素慢下来, 实现想法:让元素的移动距离变下,每一次的步长都变小,核心的算法:** (目标值 - 现在的位置) ??/??10??? 做为每次移动的距离步长**,其停止的条件就是当盒子到达目标位置就停止定时器 实现的代码: <body> <button>点击之后老李才飞!</button>

js-特效部分学习-offsetParent、scrollHeight 、动画函数的封装

1. offsetParent  获取的最近的定位的父元素   offsetLeft/offsetTop  是相对于offsetParent的距离 offsetHeight/offsetWidth 获取盒子的大小   border + height + padding <style> #box { width: 200px; height: 200px; background-color: #ff0000; } #child { width: 100px; height: 100px; mar

移动端 动画函数 的 封装

移动端 单页有时候 制作只用到简单的css3动画即可,我们简单封装一下,没必要引入zepto框架. 上面图片对应的 js var leftsbox=document.getElementById("leftsbox"); var boxdiv=leftsbox.getElementsByTagName("div"); leftsbox.onclick=function(){ for(var i=0;i<boxdiv.length;i++){ var that=

js 变速动画函数

//获取任意一个元素的任意一个属性的当前的值---当前属性的位置值 function getStyle(element, attr) { return window.getComputedStyle ? window.getComputedStyle(element, null)[attr] : element.currentStyle[attr] || 0; } //变速动画函数封装增加任意多个属性和回调函数及层级还有透明度 //element元素 json对象 存储属性与值 fn为回调函数

Node.js用ES6原生Promise对异步函数进行封装

版权声明:本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可.转载请注明来源http://blog.csdn.net/azureternite 目录(?)[+] Promise的概念 Promise 对象用于异步(asynchronous)计算..一个Promise对象代表着一个还未完成,但预期将来会完成的操作. Promise的几种状态: pending:初始状态,即等待操作的执行 fulfilled:成功的操作 rejected:失败的操作 pending的状态

移动端滑屏全应用【四】移动端动画贞动画函数mTween封装

首先此函数是基于大家都知道的Tween动画算法的,在此基础上使用了三中讲到的兼容版动画贞,可以使动画变得更流畅. 1. 首先要记得引入Tween.js 2. 引入mTween.js 3. 调用 * mTwee.js文件如下: (这里的m意为mobile) (function(){ window.requestAnimationFrame = window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRe

兼容IE9以下和非IE浏览器的原生js事件绑定函数

事件绑定函数的demo如下: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta charset="UTF-8"/> <title>测试事件绑定函数</title> <scrip

基础 - 动画函数的封装

小数的取整 WHY? JS对于小数的处理能力有限 Math.round() 四舍五入取整 Math.ceil() 向上取整 Math.floor() 向下取整 属性的访问 点语法 [""]法 得到内嵌和外链的CSS 兼容写法

关于原生js中bind函数的实现

今天继续研究了bind函数的实现,也知道了shim和polyfill的说法,现在总结一下, 1 if (!Function.prototype.bind) { 2 Function.prototype.bind = function (oThis) { 3 if (typeof this !== "function") { 4 // closest thing possible to the ECMAScript 5 internal IsCallable function 5 thr