zoukankan      html  css  js  c++  java
  • js多个物体运动问题2

    问题1

    http://www.cnblogs.com/huaci/p/3854216.html

    在上一讲问题1,我们可以整理出2点:

    1,定时器作为运动物体的属性

    2,startMove方法,参数要传递2个:物体,目标值

    那么,如果运动物体的属性值改变,是通过一个变量值来改变的话,这时候会有什么问题呢?

    示例:多个Div淡入淡出

    现象:onmouseover时,透明度降低;onmouseout时,透明度增加

    看看它会有什么问题,请看下面代码

    html部分: 

    <div id="div1"></div>
    <div id="div2"></div>
    <div id="div3"></div>
    <div id="div4"></div>
    
    <style>
    	div { float:left; 150px; height:200px; margin:20px; filter:alpha(opacity:30); opacity:0.3; background:green;}
    </style>
    

      

    js部分:

    <script>
    
    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,100);
    		}
    		aDiv[i].onmouseout = function(){
    			startMove(this,30);
    		}		
    	}
    }
    
    var vAlpha = 30;
    function startMove(obj, iTarget){
    	clearInterval(obj.timer);
    	obj.timer = setInterval(function(){
    		var speed = (iTarget - vAlpha)/6;
    		speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
    		
    		if(vAlpha == iTarget){
    			clearInterval(obj.timer);
    		} else {
    			vAlpha +=speed;
    			obj.style.filter = "alpha(opacity:" + vAlpha + ")";
    			obj.style.opacity = vAlpha;
    			
    			document.title = vAlpha;	//检测问题现象
    		}
    		
    	},30);	
    }
    
    
    </script>
    

      

     运行上面代码,发现

    问题现象:快速的在几个div之间移动,然后在其中一个div上停止。

    会发现每个div的透明度色彩不一样。

    检测:document.title = vAlpha;

    原因:vAlpha作为全局变量引起的。当从A中移出时,它减小。再迅速移入B中,它增加。一个要减小,一个要增加,这两个就这样绷着。

    解决:

    将vAlpha作为物体的属性

    aDiv[i].vAlpha = 30;

    启示:对于多物体运动来说,所有东西都不能共用

    修改后的代码如下

    完整示例:

    <script>
    
    window.onload = function(){
        var aDiv = document.getElementsByTagName("div");
        
        for(var i=0; i<aDiv.length; i++){
            aDiv[i].timer = null;
            aDiv[i].vAlpha = 30;        
            aDiv[i].onmouseover = function(){
                startMove(this,100);
            }
            aDiv[i].onmouseout = function(){
                startMove(this,30);
            }        
        }
    }
    
    //var vAlpha = 30;
    function startMove(obj, iTarget){
        clearInterval(obj.timer);
        obj.timer = setInterval(function(){
            var speed = (iTarget - obj.vAlpha)/6;
            speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
            
            if(obj.vAlpha == iTarget){
                clearInterval(obj.timer);
            } else {
                obj.vAlpha +=speed;
                obj.style.filter = "alpha(opacity:" + obj.vAlpha + ")";
                obj.style.opacity = obj.vAlpha;
                
                document.title = obj.vAlpha;    //检测问题现象
            }
            
        },30);    
    }
    
    
    </script>

    综上,发现:

    可以整理以下几条:

    多物体运动框架:

    1,定时器作为物体的属性

    2,参数的传递:物体,目标值

    例子:多个Div淡入淡出

    1,所有东西都不能共用

    2,属性与运动对象绑定:速度,其它属性值(如透明度等)

  • 相关阅读:
    Ubuntu16.04 + CUDA 8.0 (GTX 1050ti)
    关于MapD的集群建立
    2-7 单位和坐标系
    2-6 光线投射
    2-5 事件系统(Event System)
    2-4 Rect Transform(矩形)组件的属性
    2-3 RectangleTransform矩形组件
    2-2 Graphic Raycasrer组件(光线投射)
    2-1 Ui元素-画布
    1-5 事件方法的执行顺序
  • 原文地址:https://www.cnblogs.com/huaci/p/3854304.html
Copyright © 2011-2022 走看看