div盒子的缓动函数封装

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了div盒子的缓动函数封装相关的知识,希望对你有一定的参考价值。

1.2.  缓动动画

1.2.1.       原理公式

动画公式

leader = leader + step

匀速动画公式

step = 定值

leader = leader + step

缓动动画公式

step = ( target - leader ) / 10

leader = leader + step

缓动动画的好处

他的移动是有尽头的。不像基础匀速运动那样无限移动。

有非常逼真的缓动效果,实现的动画效果更细腻

如果不清除定时器,物体永远跟着目标leader在移动。

@体验缓动动画

1.2.2.       函数封装

@缓动动画改进

多次点击按钮重复开启定时器

永远无法真正到达目标

到达目标后清理定时器

@缓动函数封装

需求:能够让任意对象移动到指定位置

1.2.3.       案例

@筋斗云案例

 

1.3.  封装缓动框架

1.3.1.        封装缓动框架(任意数值属性)

@获取计算后样式的方法

工作中我们经常需要获取一个盒子的最终样式

比如 就要获取未加定位的盒子的left属性值

那么如何到计算后的样式属性值呢:

w3c

window.getComputedStyle(元素,伪元素)["left"]

IE

div.currentStyle.left或 div.current["left"]

 

第二个参数是伪元素,我们传入null即可

@封装获取样式属性值的兼容方法

需求:获取任意对象的计算后的任意属性

@封装缓动框架(任意数值属性)

1.3.2.        封装缓动框架(多个数值属性)

1.3.3.        封装缓动框架(升级版定时器)

@手风琴特效

1.3.4.        封装缓动框架(添加回调函数)

@开机动画

1.3.5.        封装缓动框架(透明度和层级)

w3c

opacity:x;

x为0-1

IE 8

filter:alpha(opacity=x);

x为0-100

代码如下:

  1 <!DOCTYPE html>
  2 <html>
  3 <head lang="en">
  4     <meta charset="UTF-8">
  5     <title></title>
  6     <style>
  7         #demo {
  8             width: 100px;
  9             height: 100px;
 10             padding: 50px;
 11             background-color: red;
 12             position:absolute;
 13         }
 14         #demo2 {
 15             width: 200px;
 16             height: 200px;
 17             background-color: blue;
 18             position: absolute;
 19         }
 20     </style>
 21 </head>
 22 <body>
 23 <button id="btn">按钮300</button>
 24 <div id="demo" ></div>
 25 <div id="demo2"></div>
 26 <script>
 27     var btn = document.getElementById("btn");
 28     var demo = document.getElementById("demo");
 29     btn.onclick = function(){
 30 //        animate(demo,‘width‘,300);
 31 //        animate(demo,‘width‘,500);
 32 //        animate(demo,‘height‘,500);
 33 //        animate(demo,‘left‘,500);
 34 //        animate(demo,{"width":500,"height":400});
 35 //        animate(demo,{"width":500,"height":400,"left":300});
 36         animate(demo,{"width":500,"height":400,"zIndex":1});
 37     }
 38     var o = {
 39         name: "123",
 40         age :123,
 41         sex :""
 42     }
 43     var json = {
 44         "width":500,
 45         "height":500
 46     }
 47 
 48     //想让当前的函数,改变元素的任意多个属性     width: 500  height 500
 49     function animate(obj,json,fn){
 50         clearInterval(obj.timerId);
 51         obj.timerId =  setInterval(function(){
 52 //            var leader = obj.offsetLeft;//先要获得原来的对象的位置
 53             var flag = true;// 假设所有的属性都达到了目标值
 54             for(var key in json){
 55                 if(key =="opacity"){  // 判断透明度的
 56                     // key就是相当于是obj的attr  json[key]就相当于之前的target
 57                     var leader = parseInt(getStyle(obj,key)*100) ||0; // 先要获得原来对象的原属性的值
 58                     // 将当前取到的透明度的值扩大100倍,方便我们的运算  0.2   0.3   0.25
 59                     var target = json[key]*100; // 将目标值也要扩大100倍
 60                     var step = (target - leader )/10;
 61                     step =step>0?Math.ceil(step):Math.floor(step);
 62                     // 原因:
 63                     // 1.offsetLeft只会获得整数,不会获得小数,所以设置步长 的时候,让步长 也变成 整数
 64                     // 2. 步长有正数,也有负数,这个时候取一个中间点进行判断,是向上取整,还是向下取整数
 65 //            console.log(step);
 66                     leader = leader + step;
 67                     obj.style[key] = leader/100; // 改成对应的属性
 68 
 69                 }else if(key == "zIndex"){
 70                     var target = json[key];
 71                     obj.style[key] = target; // 改成对应的属性
 72                 }else {
 73                     // key就是相当于是obj的attr  json[key]就相当于之前的target
 74                     var leader = parseInt(getStyle(obj,key)) ||0; // 先要获得原来对象的原属性的值
 75                     var target = json[key];
 76                     console.log(leader); // offsetLeft只会获取整数
 77                     var step = (target - leader )/10;
 78                     step =step>0?Math.ceil(step):Math.floor(step);
 79                     // 原因:
 80                     // 1.offsetLeft只会获得整数,不会获得小数,所以设置步长 的时候,让步长 也变成 整数
 81                     // 2. 步长有正数,也有负数,这个时候取一个中间点进行判断,是向上取整,还是向下取整数
 82 //            console.log(step);
 83                     leader = leader + step;
 84                     obj.style[key] = leader + px; // 改成对应的属性
 85                 }
 86                 if(leader != target){ //所有的属性都到达了指定的目标值的时候,才能清除定时器
 87                    flag = false;//有一个不满足条件,就让当前的标识变为false
 88                 }
 89             }
 90                 if(flag){ //所有的都满足条件的情况下,才清除定时器
 91                     clearInterval(obj.timerId);
 92                     if(fn){ // 判断参数中是否有回调函数,如果有,则执行
 93                         fn();
 94                     }
 95                 }
 96         },15)
 97     }
 98 
 99     // 此函数可以获得对象的任意属性
100     function getStyle(obj,attr){
101         // 能力检测
102         if(obj&&obj.currentStyle){ // 当前传进来的是一个真实的对象,而且此对象支持currentStyle
103             return obj.currentStyle[attr];
104         }else {
105             return getComputedStyle(obj,null)[attr];
106         }
107     }
108 </script>
109 </body>
110 </html>

 

以上是关于div盒子的缓动函数封装的主要内容,如果未能解决你的问题,请参考以下文章

JS-特效 ~ 05. 缓动框架兼容封装/回掉函数/兼容透明度/层级旋转轮播图正则表达式验证表单注册账号

06webApis

关于缓动动画函数的封装

Javascript缓动动画原理

第59天:缓动动画封装函数

封装缓动动画函数