缓动动画框架封装

一:基础动画框架封装

目标:让一个盒子速度递减移动到目标位置

思想:(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 }             
View Code

 

 

 

二:动画框架封装(回调函数)

目标:实现了简单的缓动效果,但是参数只有两个 如何实现多参呢?

思想:(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         }    
View Code

[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         }
View Code

[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         }
View Code

四:动画框架封装【层级】

目标:实现了前面的效果 但是层级属性也是和上文中实现的属性有不同的

思想:(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         }
View Code

[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         }
View Code

 

效果展示:

 

 

 

 

  

posted @ 2017-11-20 13:53  Lay-Buddhist  阅读(217)  评论(0)    收藏  举报