博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JS实现动画原理一(闭包方式)
阅读量:4553 次
发布时间:2019-06-08

本文共 3907 字,大约阅读时间需要 13 分钟。

前提:

     你必须了解js的闭包(否则你看不懂滴)

    我们就来做一个js实现jq animate的动画效果来简单探索一下,js动画实现的简单原理;

    html代码 <div id="man" style="background:gray; height:1px; width:100%;"> </div>

    原理:就是让它的高度逐渐从 1px ----100px

    jq 代码实现:$("#id").animate({height:"100px"})

    JS (too yong too simple) 代码实现方式:

function addHeight(){    var obj=document.getElementById("man");        for(var i=1;i<10;i++){    var len=i*10;    obj.style.height=len+"px";    }}    //为什么too young too simple 我不解释;

 

   JS(sometimes  naive)代码实现方式:

function addHeight2(){    var obj=document.getElementById("man");       for(var i=1;i<10;i++){    setTimeout(function(){     var len=i*10;     obj.style.height=len+"px";   },i*1000) }}

 

//为什么说 sometimes naive 呢? 因为你的 i 直接就等10 了 不信你 alert 一下,就是10;

     //这里还需要插播一点关于setTimeout 的使用方法;

      setTimeout 的使用方法

var g=100;

function Test(val){
   alert(val);
}
setTimeout(Test,3000); //三秒手执行
setTimeout(Test(),3000); //马上执行
setTimeout(Test(g),3000); //马上执行
//那么,我们如何传递参数呢;
//方式一(如果是静态参数的话)
setTimeout(function (){
Test("静态参数");
},3000)
//方式二(如果是动态参数)
setTimeout(function (g){
Test(g);
}(g),3000)
//方式三(通用) 这里的参数只能是字符串;
setTimeout("Test("+g+")");

 

    分析,问什么,i会变成10 呢?

    答案如下:

function addHeight3(){var obj=document.getElementById("man");    for(var i=1;i<10;i++){setTimeout(function(){         alert(i)                                  //什么变量i是10 呢                                                    //你可以借助异步的概念来理解;                                                   //第一次循环 i=1                                                   //seTimeout 中的 delay=1000                                                  //在着1000内 循环,早已结束,结果i=10                                               //现在的问题就是  将 i 传递进去呢;              },i*1000)         }}

 改进

function addHeight4(){var obj=document.getElementById("man");       for(var i=1;i<10;i++){     setTimeout(function(para){                                           //这样写的话 是可以将参数传递进去,不过函数会立即执行;没有时间间隔!       alert(para);                  //1 2 3 4 5 6 7 8 9 10      }(i),i*5000)                  //也就是说,这里的delay 时间设置无效果;  }}

   最总完整代码:(并不推荐这种方式来实现动画)

function addHeight(){   var obj=document.getElementById("man");         for(var i=1;i<10;i++){                                                 setTimeout((function(para){   // 第一个函数(也就是function(para))执行后 ,返回 返回函数引用(函数体)          return function (){            //立即执行之后 返回一个匿名函数;                                               var len=para*10;            //这个参数可以理解成 动画元素中帧的概念!           obj.style.height=len+"px";          }     })(i),i*20) //如果想让效果平滑一点,那么 就将时间参数设置小一点呀;   }}

//这样就实现jq animate的效果的;

实现不停地变化,我们用setInterval来实现(就是,在最外层嵌套一个seInterval函数;)

扩展

      我们可以使用opacity 来达到渐变的效果的呀;

       代码如下:

function addHeight(){   var obj=document.getElementById("man");         for(var i=1;i<10;i++){                                                 setTimeout((function(para){           return function (){                      obj.style.opacity=para;          }     })(i/10),i*1000)    }}

 

   总结:

         其实这种实现方式并不是最佳的,最佳实现方式

          情看我的JS-实现动画原理二(非闭包方式)

 

---------------------------------------------------------------------更新:有了新的方法LET 产生局部变量滴啊;

下边附带各种草稿;

   

 這裡還有一種情況:就是我們數組;

 

function showInfo(){    //现在还有我们想要的基本法则;     var arr=[];     for (var i=0;i<5;i++){        arr[i]=function (){           return i;         }     }     console.log(arr);     console.log(arr[0]());     console.log(arr[1]());    var arr=[];     for (var i=0;i<5;i++){            arr[i]=i; //这里已经进行了赋值操作操作呀;        }          console.log(arr);     console.log(arr[0]);     console.log(arr[1]);            //然后我们通过传递参数的形式     var arr=[];     for (var i=0;i<5;i++){            ///一个立即执行的函数里,返回一个函数;再加上我们的()就执行了的啊;            arr[i]=(function (index){                  return function (){                     return index;                  }            })(i)        }          console.log(arr);     console.log(arr[0]());     console.log(arr[1]());    //当然,最后,可以使用我们es5 中的 let关键之;  }

 

转载于:https://www.cnblogs.com/mc67/p/4801422.html

你可能感兴趣的文章
UILabel标签文字过长时的显示方式
查看>>
H5离线缓存机制-manifest
查看>>
比较:I/O成员函数getline() 与 get()(第二种用法)的用法异同
查看>>
201671010118 2016-2017-2《Java程序设计》 第十一周学习心得
查看>>
Get Sauce(状压DP)
查看>>
Office2007 升级到 office2010
查看>>
SpringBoot整合Hibernate
查看>>
PPT1 例2
查看>>
extern外部方法使用C#简单例子
查看>>
血液循环结构
查看>>
SQL Server统计数据库中表个数、视图个数、存储过程个数
查看>>
设计模式:观察者模式
查看>>
JVM体系结构之六:堆Heap之1
查看>>
TCP之二:TCP的三次握手与四次分手
查看>>
6.28 加法作业
查看>>
【bzoj2829】信用卡凸包 凸包
查看>>
oracle 游标
查看>>
jquery简单的表单验证充值数量
查看>>
大叔手记(1):使用Visual Studio的查找与替换替代默认的系统搜索
查看>>
Android手机监控软件设计实现
查看>>