实现动画效果核心方式的js代码


Posted in Javascript onSeptember 27, 2013

下边我就简单说一下过程和原理。
第一步:实现一个匿名函数并能自己执行。

(function(){ })()

 这个函数在一样编的好的JS代码中经常会见到,起到闭包,自动执行的效果,在函数后加一对()表示自动执行,前边的匿名函数需要用()包起来,这样才能为宿主(我们的BOM环境)理解,里面的function(){}这就是个匿名函数。
第二步:实现动画,以改变一个box的秀明度来说明。
id为animation的div
<div id="animation"></div>

 要实现animation的透明渐变,需要不断改变其透明度opacity,我们这样实现
for(var i=0;i<10;i++){ 
    setTimeout((function(pos){ 
        return function(){ 
            someAnimation(pos); 
        } 
    })(i/10),i*100) 
}

下面我们来解释一下这段代码,这段代码比较复杂和难于理解,所以刚开始不明白也没事,慢慢就懂了,首先解释一下setTimeout在此处的用法
setTimeout((function(){})(i/10),i*100)

 setTimeout第一个参数为要执行的函数,第二个参数为时间参数,意为多久后开始执行
而js没有块的概念,作用域范围是以函数为准的,所以我们这里使用的闭包,实现原理如下:
(function(){ 
return function(){} 
})()

 这校才可以执行for循环,达到我们想要的结果,如果我们不使用闭包,代码会如下:
for(var i=0;i<10;i++){ 
setTimeout(function(pos){ 


someAnimation(pos); 

}(i/10),i*100) 
}

这样的for循环只会执行一次,即i=9时,感兴趣的同学可以自己试试
到目前为止,整个代码是这个样子滴
(function(){ 
            function someAnimation(args){ 
                document.getElementById("animation").style.opacity=args; 
            } 
            for(var i=0;i<10;i++){ 
                    setTimeout((function(pos){ 
                        return function(){ 
                            someAnimation(pos); 
                        } 
                    })(i/10),i*100) 
            } 
})()

 这样实现了id为animation的box透明度从0到1的一次变化。
第三步,实现不停地变化,我们用setInterval来实现
setInterval也是两个参数,第一个是要执行的函数,第二个是执行间隔时间
至此代码如下:
(function(){ 
            function someAnimation(args){ 
                document.getElementById("animation").style.opacity=args; 
            } 
            setInterval(function(){ 
                for(var i=0;i<10;i++){ 
                    setTimeout((function(pos){ 
                        return function(){ 
                            someAnimation(pos); 
                        } 
                    })(i/10),i*100) 
                } 
            },2000); 
        })()

下次我会实现这个代码的面向对象化设计和出一些具体的实现方案,方便学习使用。
全部代码如下
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
    <title></title>
    <style type="text/css">
        #animation{width:500px;height:350px;background-color:red;}
    </style>
</head>
<body>
    <div id="animation">
    </div>
    <script type="text/javascript">
        (function(){
            function someAnimation(args){
                document.getElementById("animation").style.opacity=args;
            }
            setInterval(function(){
                for(var i=0;i<10;i++){
                    setTimeout((function(pos){
                        return function(){
                            someAnimation(pos);
                        }
                    })(i/10),i*100)
                }
            },2000);
        })()
    </script>
</body>
</html>
Javascript 相关文章推荐
js可突破windows弹退效果代码
Aug 09 Javascript
jQuery代码优化 选择符篇
Nov 01 Javascript
js判断一个元素是否为另一个元素的子元素的代码
Mar 21 Javascript
拉动滚动条加载数据的jquery代码
May 03 Javascript
根据IP的地址,区分不同的地区,查看不同的网站页面的js代码
Feb 26 Javascript
js限制文本框只能输入数字方法小结
Jun 16 Javascript
jquery实现邮箱自动填充提示功能
Nov 17 Javascript
js轮播图的插件化封装详解
Jul 17 Javascript
JS判断微信扫码的方法
Aug 07 Javascript
Webpack 服务器端代码打包的示例代码
Sep 19 Javascript
微信小程序MUI导航栏透明渐变功能示例(通过改变opacity实现)
Jan 24 Javascript
解决layui调用自定义方法提示未定义的问题
Sep 14 Javascript
javascript中call和apply方法浅谈
Sep 27 #Javascript
文本框回车提交与禁止提交示例
Sep 27 #Javascript
JQuery事件e参数的方法preventDefault()取消默认行为
Sep 26 #Javascript
原生js实现改变随意改变div属性style的名称和值的结果
Sep 26 #Javascript
js克隆对象、数组的常用方法介绍
Sep 26 #Javascript
js将当前时间格式转换成时间搓(自写)
Sep 26 #Javascript
使用jquery获取网页中图片高度的两种方法
Sep 26 #Javascript
You might like
Laravel框架中Blade模板的用法示例
2017/08/30 PHP
一个css与js结合的下拉菜单支持主流浏览器
2014/10/08 Javascript
Node.js开发者必须了解的4个JS要点
2016/02/21 Javascript
js实现StringBuffer的简单实例
2016/09/02 Javascript
JS实现页面数据无限加载
2016/09/13 Javascript
JS调用打印机功能简单示例
2016/11/28 Javascript
Webpack执行命令参数详解
2017/06/17 Javascript
详解vue父子组件间传值(props)
2017/06/29 Javascript
React native ListView 增加顶部下拉刷新和底下点击刷新示例
2018/04/27 Javascript
详解如何构建一个Angular6的第三方npm包
2018/09/07 Javascript
LayUI数据接口返回实体封装的例子
2019/09/12 Javascript
微信小程序实现电影App导航和轮播
2020/11/30 Javascript
JavaScript实现通讯录功能
2020/12/27 Javascript
[01:21]DOTA2 新英雄 森海飞霞
2020/12/18 DOTA
Python解决抛小球问题 求小球下落经历的距离之和示例
2018/02/01 Python
Pycharm 创建 Django admin 用户名和密码的实例
2018/05/30 Python
python实现下载pop3邮件保存到本地
2018/06/19 Python
Python Matplotlib库安装与基本作图示例
2019/01/09 Python
python实现多层感知器MLP(基于双月数据集)
2019/01/18 Python
解决Django连接db遇到的问题
2019/08/29 Python
python实现高斯判别分析算法的例子
2019/12/09 Python
Python数据存储之 h5py详解
2019/12/26 Python
Python库skimage绘制二值图像代码实例
2020/04/10 Python
Python绘图之二维图与三维图详解
2020/08/04 Python
python制作抽奖程序代码详解
2021/01/15 Python
英国羊绒服装购物网站:Pure Collection
2018/10/22 全球购物
预备党员思想汇报范文
2013/12/29 职场文书
社会学专业求职信
2014/02/24 职场文书
土木工程师职业规划范文
2014/03/07 职场文书
2014年领班工作总结
2014/11/25 职场文书
商务宴请邀请函范文
2015/02/02 职场文书
2015年班级工作总结范文
2015/04/03 职场文书
学生会自荐信
2019/05/16 职场文书
2019年预备党员的思想汇报:加深对党的认知
2019/09/25 职场文书
MyBatis 动态SQL全面详解
2021/10/05 MySQL
Pygame Draw绘图函数的具体使用
2021/11/17 Python