实现动画效果核心方式的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+css3实现网页背景花瓣随机飘落特效
Aug 17 Javascript
日常收集整理的JavaScript常用函数方法
Dec 10 Javascript
jqGrid 学习笔记整理——进阶篇(一 )
Apr 17 Javascript
浅析JS动态创建元素【两种方法】
Apr 20 Javascript
jQuery多个版本和其他js库冲突的解决方法
Aug 11 Javascript
原生js编写基于面向对象的分页组件
Dec 05 Javascript
基于jQuery实现弹幕APP
Feb 10 Javascript
H5实现仿flash效果的实现代码
Sep 29 Javascript
Node.js中sequelize时区的配置方法
Dec 10 Javascript
AngularJS使用ui-route实现多层嵌套路由的示例
Jan 10 Javascript
js获取 gif 的帧数的代码实例
Sep 10 Javascript
如何用JS模拟实现数组的map方法
Jul 30 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 skymvc 一款轻量、简单的php
2011/06/28 PHP
PHP分页效率终结版(推荐)
2013/07/01 PHP
php微信公众开发之获取周边酒店信息的方法
2014/12/22 PHP
PHP多维数组转一维数组的简单实现方法
2015/12/23 PHP
Yii2下session跨域名共存的解决方案
2017/02/04 PHP
laravel 实现关闭CSRF(全部关闭、部分关闭)
2019/10/21 PHP
深入认识javascript中的eval函数
2009/11/02 Javascript
JQuery 插件模板 制作jquery插件的朋友可以参考下
2010/03/17 Javascript
6款新颖的jQuery和CSS3进度条插件推荐
2013/03/05 Javascript
JS简单实现文件上传实例代码(无需插件)
2013/11/15 Javascript
javascript获取四位数字或者字母的随机数
2015/01/09 Javascript
jQuery实现带延迟效果的滑动菜单代码
2015/09/02 Javascript
实例讲解js验证表单项是否为空的方法
2016/01/09 Javascript
创建一般js对象的几种方式
2017/01/19 Javascript
js常用的继承--组合式继承
2017/03/06 Javascript
JavaScript 中调用 Kotlin 方法实例详解
2017/06/09 Javascript
JavaScript图片处理与合成总结
2018/03/04 Javascript
在vue项目中,使用axios跨域处理
2018/03/07 Javascript
vue中mint-ui的使用方法
2018/04/04 Javascript
vuex中store存储store.commit和store.dispatch的用法
2020/07/24 Javascript
linux系统使用python监测网络接口获取网络的输入输出
2014/01/15 Python
举例讲解Python的Tornado框架实现数据可视化的教程
2015/05/02 Python
详解Python3操作Mongodb简明易懂教程
2017/05/25 Python
python assert的用处示例详解
2019/04/01 Python
快速解决docker-py api版本不兼容的问题
2019/08/30 Python
从多个tfrecord文件中无限读取文件的例子
2020/02/17 Python
浅谈Django中的QueryDict元素为数组的坑
2020/03/31 Python
Python基于mediainfo批量重命名图片文件
2020/12/29 Python
CSS3之2D与3D变换的实现方法
2019/01/28 HTML / CSS
信电学院毕业生自荐书
2014/05/24 职场文书
新郎父亲婚礼致辞
2015/07/27 职场文书
防震减灾主题班会
2015/08/14 职场文书
党组织关系的介绍信模板
2019/06/21 职场文书
普希金的诗歌赏析(3首)
2019/08/20 职场文书
left join、inner join、right join的区别
2021/04/05 MySQL
JS中forEach()、map()、every()、some()和filter()的用法
2022/05/11 Javascript