实现动画效果核心方式的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的仿照flash放大图片效果代码
Mar 16 Javascript
关于js内存泄露的一个好例子
Dec 09 Javascript
Json实现异步请求提交评论无需跳转其他页面
Oct 11 Javascript
JavaScript函数模式详解
Nov 07 Javascript
JS实现在线统计一个页面内鼠标点击次数的方法
Feb 28 Javascript
Node.js实现兼容IE789的文件上传进度条
Sep 02 Javascript
详解springmvc 接收json对象的两种方式
Dec 06 Javascript
react-router browserHistory刷新页面404问题解决方法
Dec 29 Javascript
layui表格分页 记录勾选的实例
Sep 02 Javascript
javascript使用链接跨域下载图片
Nov 01 Javascript
简单了解Vue computed属性及watch区别
Jul 10 Javascript
react antd实现动态增减表单
Jun 03 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中替换字符串中的空格为逗号','的方法
2014/06/09 PHP
php给每个段落添加空格的方法
2015/03/20 PHP
Smarty实现页面静态化(生成HTML)的方法
2016/05/23 PHP
PHP实现动态创建XML文档的方法
2018/03/30 PHP
用JavaScript页面不刷新时全选择,全删除(GridView)
2009/04/14 Javascript
ExtJS下 Ext.Direct加载和提交过程排错小结
2013/04/02 Javascript
图片动画横条广告带上下滚动的JS代码
2013/10/25 Javascript
jQuery防止click双击多次提交及传递动态函数或多参数
2014/04/02 Javascript
JavaScript编程的10个实用小技巧
2014/04/18 Javascript
扒一扒JavaScript 预解释
2015/01/28 Javascript
JS获取文件大小方法小结
2015/12/08 Javascript
JS简单设置下拉选择框默认值的方法
2016/08/20 Javascript
详解网站中图片日常使用以及优化手法
2017/01/09 Javascript
微信小程序实战之自定义模态弹窗(8)
2017/04/18 Javascript
为vue-router懒加载时下载js的过程中添加loading提示避免无响应问题
2018/04/03 Javascript
VUE预渲染及遇到的坑
2018/09/03 Javascript
基于axios 解决跨域cookie丢失的问题
2018/09/26 Javascript
IE9 elementUI文件上传的问题解决
2018/10/17 Javascript
ES6 Iterator遍历器原理,应用场景及相关常用知识拓展详解
2020/02/15 Javascript
初步理解Python进程的信号通讯
2015/04/09 Python
详解Python使用tensorflow入门指南
2018/02/09 Python
使用 Python 实现简单的 switch/case 语句的方法
2018/09/17 Python
python解压TAR文件至指定文件夹的实例
2019/06/10 Python
在python中计算ssim的方法(与Matlab结果一致)
2019/12/19 Python
pytorch masked_fill报错的解决
2020/02/18 Python
python 的topk算法实例
2020/04/02 Python
django queryset相加和筛选教程
2020/05/18 Python
如何清空python的变量
2020/07/05 Python
详解python定时简单爬取网页新闻存入数据库并发送邮件
2020/11/27 Python
HTML5+CSS3实现无插件拖拽上传图片(支持预览与批量)
2017/01/05 HTML / CSS
美体小铺波兰官方网站:The Body Shop波兰
2019/09/03 全球购物
三爱活动实施方案
2014/03/19 职场文书
房屋租赁意向书
2014/04/01 职场文书
企业演讲稿范文大全
2014/05/20 职场文书
个人批评与自我批评材料
2014/10/17 职场文书
golang 生成对应的数据表struct定义操作
2021/04/28 Golang