Javascript 多物体运动的实现


Posted in Javascript onDecember 24, 2014

我们先来看下之前的运动的代码,是否支持多物体运动,会出现怎么样的问题。

<style type="text/css">

            div {

                width: 100px;

                height: 50px;

                background: red;

                margin: 10px;

            }

        </style>
<body>

        <div></div>

        <div></div>

        <div></div>

    </body>

以下是Javascript 代码:

<script type="text/javascript">

            window.onload = function() {

                var aDiv = document.getElementsByTagName('div');

                for (var i = 0; i < aDiv.length; i++) {

                    aDiv[i].onmouseover = function() {

                        startMove(this, 400);

                    };

                    aDiv[i].onmouseout = function() {

                        startMove(this, 100);

                    };

                }

            }

            var timer = null;

            function startMove(obj, iTarget) {

                clearInterval(timer);

                timer = setInterval(function() {

                    var speed = (iTarget - obj.offsetWidth) / 6;

                    speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);

                    if (obj.offsetWidth == iTarget) {

                        clearInterval(timer);

                    } else {

                        obj.style.width = obj.offsetWidth + speed + 'px';

                    }

                }, 30);

            }

        </script>

此时当鼠标移入到第一个div 时,他是正常运行的。但是如果现在又移动到第二个或者第三个div时候就会出现bug。

image 这个是什么原因呢? 看图可以看出并没有运动完成。实际上是这样的,

整个程序就一个定时器, 比如第一个div开始动了,第二个div 鼠标移入了 前一个定时器就被干掉了,那么自然就卡在那里了。

所以最大的问题就是整个程序就只有一个定时器。那么怎么解决这个问题呢?

解决方案:

其实很简单,把定时器作为一个物体的属性加上,那么每个物体都有一个定时器在,当关闭定时器的时候是关闭物体上的定时器,开也是物体上的定时器

那么他们之间就可以完全互不干扰的运行。

看下修改后的Javascript代码:

<script type="text/javascript">

            window.onload = function() {

                var aDiv = document.getElementsByTagName('div');

                for (var i = 0; i < aDiv.length; i++) {

                    aDiv[i].timer=null; // 把定时器作为一个物体的属性存起来

                    aDiv[i].onmouseover = function() {

                        startMove(this, 400);

                    };

                    aDiv[i].onmouseout = function() {

                        startMove(this, 100);

                    };

                }

            }

            function startMove(obj, iTarget) {

                clearInterval(obj.timer);

                obj.timer = setInterval(function() {

                    var speed = (iTarget - obj.offsetWidth) / 6;

                    speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);

                    if (obj.offsetWidth == iTarget) {

                        clearInterval(obj.timer);

                    } else {

                        obj.style.width = obj.offsetWidth + speed + 'px';

                    }

                }, 30);

            }

        </script>

这样程序就没有问题了,能够支持多物体的运动。

Javascript 相关文章推荐
js类中获取外部函数名的方法
Aug 19 Javascript
jquery动态更换设置背景图的方法
Mar 25 Javascript
使用jquery菜单插件HoverTree仿京东无限级菜单
Dec 18 Javascript
7个jQuery最佳实践
Jan 12 Javascript
20分钟打造属于你的Bootstrap站点
Jul 27 Javascript
AngularJS基础 ng-options 指令详解
Aug 02 Javascript
gulp安装以及打包合并的方法教程
Nov 19 Javascript
vue2.x+webpack快速搭建前端项目框架详解
Nov 30 Javascript
vue axios登录请求拦截器
Apr 02 Javascript
详解elementui之el-image-viewer(图片查看器)
Aug 30 Javascript
关于JS模块化的知识点分享
Oct 16 Javascript
js获取本日、本周、本月的时间代码
Feb 01 Javascript
Javascript 运动中Offset的bug解决方案
Dec 24 #Javascript
jQuery中height()方法用法实例
Dec 24 #Javascript
jQuery中width()方法用法实例
Dec 24 #Javascript
jQuery中animate()方法用法实例
Dec 24 #Javascript
jQuery中fadeOut()方法用法实例
Dec 24 #Javascript
创建js对象和js类的方法汇总
Dec 24 #Javascript
javascript使用prototype完成单继承
Dec 24 #Javascript
You might like
提升PHP执行速度全攻略(下)
2006/10/09 PHP
php数组函数序列 之array_count_values() 统计数组中所有值出现的次数函数
2011/10/29 PHP
php变量范围介绍
2012/10/15 PHP
简单的php+mysql聊天室实现方法(附源码)
2016/01/05 PHP
JS 强制设为首页的代码
2009/01/31 Javascript
JS高级调试技巧:捕获和分析 JavaScript Error详解
2014/03/16 Javascript
jQuery实现带滚动导航效果的全屏滚动相册实例
2015/06/19 Javascript
js实现黑色简易的滑动门网页tab选项卡效果
2015/08/31 Javascript
基于javascript制作微信聊天面板
2020/08/09 Javascript
JavaScript弹窗基础篇
2016/04/27 Javascript
js获取页面引用的css样式表中的属性值方法(推荐)
2016/08/19 Javascript
javascript使用 concat 方法对数组进行合并的方法
2016/09/08 Javascript
讲解vue-router之什么是嵌套路由
2018/05/28 Javascript
Vue 莹石摄像头直播视频实例代码
2018/08/31 Javascript
分享5个小技巧让你写出更好的 JavaScript 条件语句
2018/10/20 Javascript
为什么要使用Vuex的介绍
2019/01/19 Javascript
vue项目创建并引入饿了么elementUI组件的步骤
2019/04/11 Javascript
layui添加动态菜单与选项卡
2019/07/26 Javascript
countUp.js实现数字滚动效果
2019/10/18 Javascript
ES6中Promise的使用方法实例总结
2020/02/18 Javascript
[40:55]Liquid vs LGD 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
解决win64 Python下安装PIL出错问题(图解)
2018/09/03 Python
Python并发:多线程与多进程的详解
2019/01/24 Python
Python中print和return的作用及区别解析
2019/05/05 Python
python 实现list或string按指定分段
2019/12/25 Python
使用 Python 遍历目录树的方法
2020/02/29 Python
django model object序列化实例
2020/03/13 Python
python中添加模块导入路径的方法
2021/02/03 Python
CSS伪类与CSS伪元素的区别及由来具体说明
2012/12/07 HTML / CSS
利用css3-animation实现逐帧动画效果
2016/03/10 HTML / CSS
使用CSS3滤镜的filter:blur属性制作毛玻璃模糊效果的方法
2016/07/08 HTML / CSS
KIKO MILANO西班牙官网:意大利领先的化妆品和护肤品品牌
2019/05/03 全球购物
汽车检测与维修应届毕业生求职信
2013/10/19 职场文书
PyCharm配置KBEngine快速处理代码提示冲突、配置命令问题
2021/04/03 Python
python库Tsmoothie模块数据平滑化异常点抓取
2022/06/10 Python
Win11如何查看显卡型号 Win11查看显卡型号的方法
2022/08/14 数码科技