实现动画效果核心方式的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 相关文章推荐
如何用javascript判断录入的日期是否合法
Jan 08 Javascript
jquery实用代码片段集合
Aug 12 Javascript
JS读取cookies信息(记录用户名)
Jan 10 Javascript
两种方法实现文本框输入内容提示消失
Mar 17 Javascript
jquery删除数据记录时的弹出提示效果
May 06 Javascript
jQuery给多个不同元素添加class样式的方法
Mar 26 Javascript
JS实现动态生成表格并提交表格数据向后端
Nov 25 Javascript
jquery判断input值不为空的方法
Jun 05 Javascript
微信小程序 详解下拉加载与上拉刷新实现方法
Jan 13 Javascript
ajax 提交数据到后台jsp页面及页面跳转问题
Jan 19 Javascript
JavaScript cookie原理及使用实例
May 08 Javascript
小程序实现侧滑删除功能
Jun 25 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 项目的方法
2007/01/02 PHP
PHP 实现多服务器共享 SESSION 数据
2009/08/15 PHP
使用Curl进行抓取远程内容时url中文编码问题示例探讨
2013/10/29 PHP
php自定义函数截取汉字长度
2014/05/15 PHP
PHP反射机制用法实例
2014/08/28 PHP
JavaScript Konami Code 实现代码
2009/07/29 Javascript
最佳JS代码编写的14条技巧
2011/01/09 Javascript
jQuery前台数据获取实现代码
2011/03/16 Javascript
js 调用本地exe的例子(支持IE内核的浏览器)
2012/12/26 Javascript
jQuery隔行变色与普通JS写法的对比
2013/04/21 Javascript
动态创建script标签实现跨域资源访问的方法介绍
2014/02/28 Javascript
JavaScript框架是什么?怎样才能叫做框架?
2015/07/01 Javascript
JS实现超简洁网页title标题跑动闪烁提示效果代码
2015/10/23 Javascript
实例讲解jQuery EasyUI tree中state属性慎用
2016/04/01 Javascript
jQuery焦点图轮播效果实现方法
2016/12/19 Javascript
详解如何使用Vue2做服务端渲染
2017/03/29 Javascript
vue里input根据value改变背景色的实例
2018/09/29 Javascript
基于Vue+ElementUI的省市区地址选择通用组件
2019/11/20 Javascript
如何在node环境实现“get数据解析”代码实例
2020/07/03 Javascript
基于Vant UI框架实现时间段选择器
2020/12/24 Javascript
[02:14]完美“圣”典2016风云人物:xiao8专访
2016/12/01 DOTA
Python enumerate遍历数组示例应用
2008/09/06 Python
python实现扫描局域网指定网段ip的方法
2019/04/16 Python
python 控制Asterisk AMI接口外呼电话的例子
2019/08/08 Python
Python 余弦相似度与皮尔逊相关系数 计算实例
2019/12/23 Python
tensorflow保持每次训练结果一致的简单实现
2020/02/17 Python
Nike德国官网:Nike.com (DE)
2018/11/13 全球购物
哈利波特商店:Harry Potter Shop
2018/11/30 全球购物
巴西购物网站:Estrela10
2018/12/13 全球购物
Haggar官网:美国男装品牌
2020/02/16 全球购物
小学老师寄语大全
2014/04/04 职场文书
2014党支部对照检查材料思想汇报
2014/10/05 职场文书
2014年学校后勤工作总结
2014/12/06 职场文书
python用字节处理文件实例讲解
2021/04/13 Python
Axios取消重复请求的方法实例详解
2021/06/15 Javascript
浅谈MySQL之select优化方案
2021/08/07 MySQL