代码之家  ›  专栏  ›  技术社区  ›  Harper Creek

转换时元素重叠的setInterval函数,

  •  1
  • Harper Creek  · 技术社区  · 7 年前

    我想优化。使用setinterval检查蓝色/绿色是否重叠,如果它们在绿色下方发送蓝色,直到它们不再相交。然而,很多时候它们并不是相互交叉的,相反,它们可能彼此离得更远或更近,但并不完全达到重叠。当绿色/蓝色将要重叠而不是不重叠时,检查重叠的方法有哪些?还有其他方法可以更简单些吗此外,我使用此方法时,不会使用与此示例相同的反向关联变量,因此类似(如果rand>50%)的解决方案不会有帮助谢谢!

    var green = document.getElementById('green');
    var blue = document.getElementById('blue');
            
    function myFunct1() {
        var array = ['10%','20%','30%','40%','50%','60%','70%','80%']  
        var rand = array[Math.floor(Math.random()*array.length)];
        green.style.left = rand;
        blue.style.right = rand;
        var inter = setInterval(overlay, 50);
        setTimeout(function( ) { clearInterval( inter ); }, 1500);
    }
    
    function overlay() {
        var greenRect = green.getBoundingClientRect();
        var blueRect = blue.getBoundingClientRect();
        var overlap = !(greenRect.right < blueRect.left || greenRect.left > blueRect.right)
                
        if (overlap == true) {
            blue.style.top = '20px';  
        }
        else {
            blue.style.top = 'auto';
        }
    }
    #container {
       position: relative;
       width: 90%;
       height: 40px;
       margin: auto;
       border: 1px solid black;
     }
    
    #green {
      position: absolute;
      width: 50px;
      height: 20px;
      left: 10px;
      background-color: green;
      transition: 1500ms;
     }
            
    #blue {
      position: absolute;
      width: 50px;
      height:20px;
      right: 10px;
      background-color: blue;
      transition: 1500ms;
    }
    <div id = 'container'>
        <div id = 'green'></div>
        <div id = 'blue'></div>
    </div>
            
    <button onclick = 'myFunct1()'>FUNCTION 1</button>
    1 回复  |  直到 7 年前
        1
  •  1
  •   Umair Abid    7 年前

    增加一些重叠公差怎么样,

    我只在两个框中添加了一个,但是当然,您可以分割重叠部分并将它们应用到两个框中

    function overlay() {
        var overlappingTolerance = 10
        var greenRect = green.getBoundingClientRect();
        var blueRect = blue.getBoundingClientRect();
        var overlap = !(
                           ( greenRect.right - overlappingTolerance)  < blueRect.left ||
                           ( greenRect.left - overlappingTolerance) > blueRect.right
                       );
    
        if (overlap == true) {
            blue.style.top = '20px';  
        }
        else {
            blue.style.top = 'auto';
        }
    }