实现动画效果核心方式的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 相关文章推荐
escape、encodeURI 和 encodeURIComponent 的区别
Mar 02 Javascript
JS setCapture 区域外事件捕捉
Mar 18 Javascript
js输出列表实现代码
Sep 12 Javascript
JS+css 图片自动缩放自适应大小
Aug 08 Javascript
jQuery实现密保互斥问题解决方案
Aug 16 Javascript
js 判断图片是否加载完以及实现图片的预下载
Aug 14 Javascript
AngularJS中run方法的巧妙运用
Jan 04 Javascript
微信小程序 自动登陆PHP源码实例(源码下载)
May 08 Javascript
详解webpack模块加载器兼打包工具
Sep 11 Javascript
JS实现将对象转化为数组的方法分析
Jan 21 Javascript
NProgress显示顶部进度条效果及使用详解
Sep 21 Javascript
javascript设计模式 ? 命令模式原理与用法实例分析
Apr 20 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
聊天室php&amp;mysql(三)
2006/10/09 PHP
Windows下部署Apache+PHP+MySQL运行环境实战
2012/08/31 PHP
JavaScript和ActionScript的交互实现代码
2010/08/01 Javascript
基于Jquery实现的一个图片滚动切换
2012/06/21 Javascript
Jquery写一个鼠标拖动效果实现原理与代码
2012/12/24 Javascript
js 程序执行与顺序实现详解
2013/05/13 Javascript
JS逆序遍历实现代码
2014/12/02 Javascript
如何编写高质量JS代码(续)
2015/02/25 Javascript
移除AngularJS下URL中的#字符的方法
2015/06/19 Javascript
jquery 重写 ajax提交并判断权限后 使用load方法报错解决方法
2016/01/19 Javascript
Vue2.0基于vue-cli+webpack同级组件之间的通信教程(推荐)
2017/09/14 Javascript
原生JS+CSS实现炫酷重力模拟弹跳系统的登录页面
2017/11/01 Javascript
animate.css在vue项目中的使用教程
2018/08/05 Javascript
JS实现放烟花效果
2020/03/10 Javascript
js仿京东放大镜效果
2020/08/09 Javascript
JavaScript 生成唯一ID的几种方式
2021/02/19 Javascript
动感网页相册 python编写简单文件夹内图片浏览工具
2016/08/17 Python
Python中模块与包有相同名字的处理方法
2017/05/05 Python
Python解析并读取PDF文件内容的方法
2018/05/08 Python
Pycharm 设置自定义背景颜色的图文教程
2018/05/23 Python
python3个性签名设计实现代码
2018/06/19 Python
使用Template格式化Python字符串的方法
2019/01/22 Python
Python3 串口接收与发送16进制数据包的实例
2019/06/12 Python
python在新的图片窗口显示图片(图像)的方法
2019/07/11 Python
python super的使用方法及实例详解
2019/09/25 Python
python爬虫看看虎牙女主播中谁最“顶”步骤详解
2020/12/01 Python
Photobook澳大利亚:制作相片书,婚礼卡,旅行相簿
2017/01/12 全球购物
Sandro Paris美国官网:典雅别致的法国时尚服饰品牌
2017/12/26 全球购物
Doyoueven官网:澳大利亚健身服饰和配饰品牌
2019/03/24 全球购物
MAC Cosmetics官方网站:魅可专业艺术彩妆
2019/04/10 全球购物
全球烹饪课程的领先预订平台:Cookly
2020/01/28 全球购物
研发工程师岗位职责
2014/04/28 职场文书
2014党支部对照检查材料思想汇报
2014/10/05 职场文书
文明单位创建材料
2014/12/24 职场文书
住房公积金贷款工资证明
2015/06/12 职场文书
html中相对位置与绝对位置的具体使用
2022/05/15 HTML / CSS