缓动动画框架封装
一:基础动画框架封装
目标:让一个盒子速度递减移动到目标位置
思想:(1): 通过(target - ele.offset)/10实现步长递减效果;
代码:
首先先获取事件源:
1 var btn = document.getElementsByTagName("button")[0];
2 var div = document.getElementsByTagName("div")[0];
1 function animate(ele,target){ 2 clearInterval(ele.timer); 3 ele.timer = setInterval(function(){ 4 var step = (target - ele.offsetLeft)/10; 5 step = step>0Math.ceil(step):Math.floor(step);//step去除bug 6 ele.style.left = ele.offsetLeft + step + "px"; 7 if(Math.abs(target - ele.offsetLeft)<=Math.abs(step)){//判断步长去除bug 8 ele.style.left = target + "px"; 9 clearInterval(ele.timer); 10 } 11 },10); 12 }
二:动画框架封装(回调函数)
目标:实现了简单的缓动效果,但是参数只有两个 如何实现多参呢?
思想:(1):利用回调函数的思想
(2):利用json数组的遍历
(3):需要获取元素的样式【这里获取元素样式的方法使用了兼容ie 6,7,8的写法 】
代码:
[1]样式和获取事件源
1 //css代码 2 <style> 3 div { 4 position: absolute; 5 top: 40px; 6 left: 10px; 7 width: 100px; 8 height: 100px; 9 background-color: pink; 10 } 11 </style> 12 //html代码 13 <button>运动到400然后回来</button> 14 <div></div> 15 //js代码 16 var btnArr = document.getElementsByTagName("button"); 17 var div = document.getElementsByTagName("div")[0];
[2]:兼容性获取元素样式
1 function getStyle(ele,attr){ 2 if(window.getComputedStyle){ 3 return window.getComputedStyle(ele,null)[attr]; 4 } 5 return ele.currentStyle[attr]; 6 }
[3]:封装缓动动画
1 function animate(ele,json,fn){ 2 //先清定时器 3 clearInterval(ele.timer); 4 ele.timer = setInterval(function () { 5 //开闭原则 6 var bool = true; 7 8 9 //遍历属性和值,分别单独处理json 10 //attr == k(键) target == json[k](值) 11 for(var k in json){ 12 //四部 13 var leader = parseInt(getStyle(ele,k)) || 0; 14 //1.获取步长 15 var step = (json[k] - leader)/10; 16 //2.二次加工步长 17 step = step>0?Math.ceil(step):Math.floor(step); 18 leader = leader + step; 19 //3.赋值 20 ele.style[k] = leader + "px"; 21 //4.清除定时器 22 //判断: 目标值和当前值的差大于步长,就不能跳出循环 23 //不考虑小数的情况:目标位置和当前位置不相等,就不能清除清除定时器。 24 if(json[k] !== leader){ 25 bool = false; 26 } 27 } 28 29 console.log(1); 30 //只有所有的属性都到了指定位置,bool值才不会变成false; 31 if(bool){ 32 clearInterval(ele.timer); 33 //所有程序执行完毕了,现在可以执行回调函数了 34 //只有传递了回调函数,才能执行 35 if(fn){ 36 fn(); 37 } 38 } 39 },25); 40 }
[4]:调用函数
1 btnArr[0].onclick = function () { 2 var json1 = {"left":300,"top":200,"width":300,"height":200,"border-radius": 100}; 3 var json2 = {"left":10,"top":30,"width":100,"height":100}; 4 animate(div,json1, function () { 5 animate(div,json2, function () { 6 animate(div,json1);//这里博主用两个回调可以实现双层效果 7 }); 8 }); 9 10 }
三:动画框架封装【透明度】
目标:前边我们利用遍历json实现多参封装,添加透明度属性
思想:(1)opacity: 0.5 //取值范围 0 - 1 ; filter:alpha(opacity = 50); IE[6,7,8] //取值范围 0 - 100
(2)添加判断条件 如果判断属性为 opacity 特殊对待
代码:
*getStyle等上文含有的方法下面不再书写
[1]获取事件源
1 btnArr[0].onclick = function () { 2 var json1 = {"left":300,"top":200,"width":300,"height":200,"opacity": 30}; 3 animate(div,json1); 4 }
[2]事件
1 function animate(ele,json,fn){ 2 //先清定时器 3 clearInterval(ele.timer); 4 ele.timer = setInterval(function () { 5 //开闭原则 6 var bool = true; 7 8 9 //遍历属性和值,分别单独处理json 10 //attr == k(键) target == json[k](值) 11 for(var k in json){ 12 //四部 13 var leader; 14 //判断如果属性为opacity的时候特殊获取值 15 if(k === "opacity"){ 16 leader = getStyle(ele,k)*100 || 1; 17 }else{ 18 leader = parseInt(getStyle(ele,k)) || 0; 19 } 20 21 //1.获取步长 22 var step = (json[k] - leader)/10; 23 //2.二次加工步长 24 step = step>0?Math.ceil(step):Math.floor(step); 25 leader = leader + step; 26 //3.赋值 27 //特殊情况特殊赋值 28 if(k === "opacity"){ 29 ele.style[k] = leader/100; 30 //兼容IE678 31 ele.style.filter = "alpha(opacity="+leader+")"; 32 }else{ 33 ele.style[k] = leader + "px"; 34 } 35 //4.清除定时器 36 //判断: 目标值和当前值的差大于步长,就不能跳出循环 37 //不考虑小数的情况:目标位置和当前位置不相等,就不能清除清除定时器。 38 if(json[k] !== leader){ 39 bool = false; 40 } 41 } 42 43 console.log(1); 44 //只有所有的属性都到了指定位置,bool值才不会变成false; 45 if(bool){ 46 clearInterval(ele.timer); 47 //所有程序执行完毕了,现在可以执行回调函数了 48 //只有传递了回调函数,才能执行 49 if(fn){ 50 fn(); 51 } 52 } 53 },25); 54 }
四:动画框架封装【层级】
目标:实现了前面的效果 但是层级属性也是和上文中实现的属性有不同的
思想:(1):因为个人需求,所以判断是层级属性那么直接赋值
代码:
[1]事件源:
1 var btnArr = document.getElementsByTagName("button"); 2 var div = document.getElementsByTagName("div")[0]; 3 4 btnArr[0].onclick = function () { 5 var json1 = {"left":300,"top":200,"width":300,"height":200,"opacity": 30,"zIndex": 1}; 6 animate(div,json1); 7 }
[2]书写方法:
1 function animate(ele,json,fn){ 2 //先清定时器 3 clearInterval(ele.timer); 4 ele.timer = setInterval(function () { 5 //开闭原则 6 var bool = true; 7 8 9 //遍历属性和值,分别单独处理json 10 //attr == k(键) target == json[k](值) 11 for(var k in json){ 12 //四部 13 var leader; 14 //判断如果属性为opacity的时候特殊获取值 15 if(k === "opacity"){ 16 leader = getStyle(ele,k)*100 || 1; 17 }else{ 18 leader = parseInt(getStyle(ele,k)) || 0; 19 } 20 21 //1.获取步长 22 var step = (json[k] - leader)/10; 23 //2.二次加工步长 24 step = step>0?Math.ceil(step):Math.floor(step); 25 leader = leader + step; 26 //3.赋值 27 //特殊情况特殊赋值 28 if(k === "opacity"){ 29 ele.style[k] = leader/100; 30 //兼容IE678 31 ele.style.filter = "alpha(opacity="+leader+")"; 32 //如果是层级,一次行赋值成功,不需要缓动赋值 33 //为什么?需求! 34 }else if(k === "zIndex"){ 35 ele.style.zIndex = json[k]; 36 }else{ 37 ele.style[k] = leader + "px"; 38 } 39 //4.清除定时器 40 //判断: 目标值和当前值的差大于步长,就不能跳出循环 41 //不考虑小数的情况:目标位置和当前位置不相等,就不能清除清除定时器。 42 if(json[k] !== leader){ 43 bool = false; 44 } 45 } 46 47 48 //只有所有的属性都到了指定位置,bool值才不会变成false; 49 if(bool){ 50 clearInterval(ele.timer); 51 //所有程序执行完毕了,现在可以执行回调函数了 52 //只有传递了回调函数,才能执行 53 if(fn){ 54 fn(); 55 } 56 } 57 },25); 58 }
效果展示:


浙公网安备 33010602011771号