zoukankan      html  css  js  c++  java
  • Javascript 多物体运动——逐行分析代码,让你轻松了解运动的原理

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

    <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>

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

    下期预告:

    下一次会更新 任意值的运动,使他能够支持同时改变 宽度,高度,透明度等,已现在的框架是不行的。 其实我们已经开始逐步完善了运动框架。热烈的笑脸

    敬请期待 ~

  • 相关阅读:
    Trapping Rain Water
    Construct Binary Tree from Preorder and Inorder Traversal
    Flatten Binary Tree to Linked List
    Permutations II
    Unique Paths II
    Path Sum II
    Unique Binary Search Trees II
    evdev module-----uinput.py
    evdev module-----events.py
    evdev module-----device.py
  • 原文地址:https://www.cnblogs.com/IcemanZB/p/4178218.html
Copyright © 2011-2022 走看看