实现动画效果核心方式的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 图片延迟加载并等比缩放插件
Nov 09 Javascript
Jquery和JS用外部变量获取Ajax返回的参数值的方法实例(超简单)
Jun 17 Javascript
node.js使用require()函数加载模块
Nov 26 Javascript
高性能JavaScript 重排与重绘(2)
Aug 11 Javascript
基于jQuery实现的无刷新表格分页实例
Feb 17 Javascript
js省市县三级联动效果实例
Apr 15 Javascript
jQuery flip插件实现的翻牌效果示例【附demo源码下载】
Sep 20 Javascript
vue.js指令v-for使用及索引获取
Nov 03 Javascript
Javascript Function.prototype.bind详细分析
Dec 29 Javascript
二维码图片生成器QRCode.js简单介绍
Aug 18 Javascript
vue结合element-ui使用示例
Jan 24 Javascript
JS实现单张或多张图片持续无缝滚动的示例代码
May 10 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之变量、常量学习笔记
2008/03/27 PHP
smarty基础之拼接字符串的详解
2013/06/18 PHP
Laravel中encrypt和decrypt的实现方法
2017/09/24 PHP
Laravel 默认邮箱登录改成用户名登录的实现方法
2019/08/12 PHP
javascript 关闭IE6、IE7
2009/06/01 Javascript
js querySelector和getElementById通过id获取元素的区别
2012/04/20 Javascript
javascript实现给定半径求出圆的面积
2015/06/26 Javascript
jQuery插件实现带圆点的焦点图片轮播切换
2016/01/18 Javascript
javascript检查某个元素在数组中的索引值
2016/03/30 Javascript
Bootstrap媒体对象的实现
2016/05/01 Javascript
jQuery实现可以编辑的表格实例详解【附demo源码下载】
2016/07/09 Javascript
Bootstrap和Angularjs配合自制弹框的实例代码
2016/08/24 Javascript
使用Ajax与服务器(JSON)通信实例
2016/11/04 Javascript
jQuery动态追加页面数据以及事件委托详解
2017/05/06 jQuery
帮你彻底搞懂JS中的prototype、__proto__与constructor(图解)
2019/08/23 Javascript
微信小程序页面滚动到指定位置代码实例
2019/09/07 Javascript
使用VUE实现在table中文字信息超过5个隐藏鼠标移到时弹窗显示全部
2019/09/16 Javascript
vue相同路由跳转强制刷新该路由组件操作
2020/08/05 Javascript
vue项目接口管理,所有接口都在apis文件夹中统一管理操作
2020/08/13 Javascript
[01:02]DOTA2辉夜杯决赛日 CDEC.Y对阵VG赛前花絮
2015/12/27 DOTA
深入解析Python中的urllib2模块
2015/11/13 Python
Python的Flask框架及Nginx实现静态文件访问限制功能
2016/06/27 Python
python 实现视频流下载保存MP4的方法
2019/01/09 Python
Python sys模块常用方法解析
2020/02/20 Python
详解Canvas 跨域脱坑实践
2018/11/07 HTML / CSS
预订全球最佳旅行体验:Viator
2018/03/30 全球购物
Does C# support multiple inheritance? (C#支持多重继承吗)
2012/01/04 面试题
学前教育学生自荐信范文
2013/12/31 职场文书
初中音乐教学反思
2014/01/12 职场文书
火锅店营销方案
2014/02/26 职场文书
充分就业社区汇报材料
2014/05/07 职场文书
三下乡活动心得体会
2016/01/23 职场文书
sqlserver2017共享功能目录路径不可改的解决方法
2021/04/16 SQL Server
Python还能这么玩之用Python做个小游戏的外挂
2021/06/04 Python
无线电通信名词解释
2022/02/18 无线电
ubuntu20.04虚拟机无法上网的问题及解决
2022/12/24 Servers