实现动画效果核心方式的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 相关文章推荐
jQuery实现跨域iframe接口方法调用
Mar 14 Javascript
分享javascript计算时间差的示例代码
Mar 19 Javascript
JS获取input file绝对路径的方法(推荐)
Aug 02 Javascript
原生JS实现图片轮播切换效果
Dec 15 Javascript
Angular组件化管理实现方法分析
Mar 17 Javascript
Vue组件之全局组件与局部组件的使用详解
Oct 09 Javascript
基于vue.js快速搭建图书管理平台
Oct 29 Javascript
angularjs的单选框+ng-repeat的实现方法
Sep 12 Javascript
js/jquery遍历对象和数组的方法分析【forEach,map与each方法】
Feb 27 jQuery
微信小程序修改数组长度的问题的解决
Dec 17 Javascript
VUE使用axios调用后台API接口的方法
Aug 03 Javascript
Vue+Element UI 树形控件整合下拉功能菜单(tree + dropdown +input)
Aug 28 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程序中的常见漏洞进行攻击
2006/10/09 PHP
中篇:安装及配置PHP
2006/12/13 PHP
Ext.data.PagingMemoryProxy分页一次性读取数据的实现代码
2010/04/07 PHP
浅析PHP中的字符串编码转换(自动识别原编码)
2013/07/02 PHP
Yii使用find findAll查找出指定字段的实现方法
2014/09/05 PHP
CodeIgniter与PHP5.6的兼容问题
2015/07/16 PHP
通过修改配置真正解决php文件上传大小限制问题(nginx+php)
2015/09/23 PHP
thinkPHP+ajax实现统计页面pv浏览量的方法
2017/03/15 PHP
各种效果的jquery ui(接口)介绍
2008/09/17 Javascript
解析JavaScript中点号“.”的多义性
2013/12/02 Javascript
做好七件事帮你提升jQuery的性能
2014/02/06 Javascript
jquery.cookie.js用法实例详解
2015/12/25 Javascript
莱鸟介绍javascript onclick事件
2016/01/06 Javascript
jquery实现页面常用的返回顶部效果
2016/03/04 Javascript
jquery实现ajax加载超时提示的方法
2016/07/23 Javascript
浅谈JavaScript中面向对象的的深拷贝和浅拷贝
2016/08/01 Javascript
使用JS轻松实现ionic调用键盘搜索功能(超实用)
2016/09/06 Javascript
扩展jquery easyui tree的搜索树节点方法(推荐)
2016/10/28 Javascript
JS打开摄像头并截图上传示例
2017/02/18 Javascript
浅谈Webpack多页应用HMR卡住问题
2019/04/24 Javascript
nodejs对项目下所有空文件夹创建gitkeep的方法
2019/08/02 NodeJs
vue element upload实现图片本地预览
2019/08/20 Javascript
[05:14]辉夜杯主赛事第二日 RECAP精彩回顾
2015/12/27 DOTA
python写xml文件的操作实例
2014/10/05 Python
如何用Python合并lmdb文件
2018/07/02 Python
浅谈Python中的bs4基础
2018/10/21 Python
pytorch快速搭建神经网络_Sequential操作
2020/06/17 Python
CSS书写规范、顺序和命名规则
2014/03/06 HTML / CSS
行政前台岗位职责
2013/12/04 职场文书
元旦晚会感言
2014/03/12 职场文书
经典婚礼主持开场白
2014/03/13 职场文书
小学教师寄语大全
2014/04/03 职场文书
优秀少先队员主要事迹材料
2014/05/28 职场文书
青年标兵事迹材料
2014/08/16 职场文书
电子商务专业求职信范文
2015/03/19 职场文书
写给医护人员的一封感谢信
2019/09/16 职场文书