javascript - 迭代元素重叠/碰撞函数

标签 javascript jquery

我有一个工作函数,可以检测方形指示器是否与具有深色背景的行重叠。如果重叠,指示器应变为白色,如果不重叠,指示器应为黑色。

我陷入困境的部分是我有很多带有深色背景的行,并且它目前仅适用于第一个深色背景,因为我没有迭代所有深色背景,而只是迭代第一个。

我尝试将每个函数放置在多个位置,但似乎无法使其工作。

jsfiddle here

function isColliding() {
    // Div 1 data
    var indicator_offset = $('.indicator').offset();
    var indicator_height = $('.indicator').outerHeight(true);
    var indicator_width = $('.indicator').outerWidth(true);
    var indicator_distance_from_top = indicator_offset.top + indicator_height;
    var indicator_distance_from_left = indicator_offset.left + indicator_width;

    // Div 2 data
    var dark_row_offset = $('.dark').offset();
    var dark_row_height = $('.dark').outerHeight(true);
    var dark_row_width = $('.dark').outerWidth(true);
    var dark_row_distance_from_top = dark_row_offset.top + dark_row_height;
    var dark_row_distance_from_left = dark_row_offset.left + dark_row_width;

    var not_colliding = (indicator_distance_from_top < dark_row_offset.top || indicator_offset.top > dark_row_distance_from_top || indicator_distance_from_left < dark_row_offset.left || indicator_offset.left > dark_row_distance_from_left);

    return !not_colliding;
};

$(window).on('scroll', function() {
	if (isColliding()) {
  	$('.indicator').removeClass('on-light').addClass('on-dark');
  } else {
    	$('.indicator').removeClass('on-dark').addClass('on-light');
  }
})
.row {
  height: 200px;
  width: 100%;
}
.row.light {
  background-color: #eeeeee;
}
.row.dark {
  background-color: black;
}

.indicator {
  width: 30px;
  height: 30px;
  position: fixed;
  top: 0px;
  left: 50%;
  transfrom: translateX(-50%);
}
.indicator.on-light {
  background-color: black;
}
.indicator.on-dark {
  background-color: white;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="indicator on-light">

</div>

<div class="row light">

</div>
<div class="row dark">

</div>
<div class="row light">

</div>
<div class="row dark">

</div>
<div class="row light">

</div>
<div class="row dark">

</div>
<div class="row light">

</div>
<div class="row dark">

</div>
<div class="row light">

</div>
<div class="row dark">

</div>
<div class="row light">

</div>
<div class="row dark">

</div>
<div class="row light">

</div>
<div class="row dark">

</div>
<div class="row light">

</div>
<div class="row dark">

</div>
<div class="row light">

</div>
<div class="row dark">

</div>
<div class="row light">

</div>
<div class="row dark">

</div>
<div class="row light">

</div>
<div class="row dark">

</div>
<div class="row light">

</div>
<div class="row dark">

</div>
<div class="row light">

</div>
<div class="row dark">

</div>
<div class="row light">

</div>
<div class="row dark">

</div>
<div class="row light">

</div>
<div class="row dark">

</div>
<div class="row light">

</div>
<div class="row dark">

</div>

最佳答案

您的代码仅检查第一个“暗”元素,而不是循环遍历所有暗元素。因此,请按如下方式更改您的方法以使其正常工作 https://jsfiddle.net/x5fw2z3s/ 。 我相信您可以进一步优化它。

 function isColliding() {
 // Div 1 data
 var indicator_offset = $('.indicator').offset();
 var indicator_height = $('.indicator').outerHeight(true);
 var indicator_width = $('.indicator').outerWidth(true);
 var indicator_distance_from_top = indicator_offset.top + indicator_height;
 var indicator_distance_from_left = indicator_offset.left + indicator_width;

 var isCollidingAtLeastOneDark = false;

 $( '.dark' ).each(function( index ) {       
   var dark_row_offset = $(this).offset();
   var dark_row_height = $(this).outerHeight(true);
   var dark_row_width = $(this).outerWidth(true);
   var dark_row_distance_from_top = dark_row_offset.top + dark_row_height;
   var dark_row_distance_from_left = dark_row_offset.left + dark_row_width;

   var not_colliding = (indicator_distance_from_top < dark_row_offset.top || indicator_offset.top > dark_row_distance_from_top || indicator_distance_from_left < dark_row_offset.left || indicator_offset.left > dark_row_distance_from_left);

    if( !not_colliding) {
       isCollidingAtLeastOneDark = true;
       return false; //breakout from loop
    }
 });
  console.log(isCollidingAtLeastOneDark);
  return isCollidingAtLeastOneDark;    
 };

关于javascript - 迭代元素重叠/碰撞函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58106969/

相关文章:

jquery - 谷歌浏览器 : How can I keep an element's z-index after its position is dynamically set to 'fixed' ?

javascript - 为每个 id 创建一个独特的 jquery 对话框样式

javascript - 直接从上下文使用提供程序与从函数返回它

javascript - js canvas drawImage 不使用循环变量

javascript - 需要一些关于滚动条和侧边菜单的想法吗?

javascript - 代码不在函数内部运行

javascript - 如何将 d3.svg.axis 限制为整数标签?

javascript - 如何修复此错误 : Grunt build not found, 使用 --force 继续

javascript - 除非唯一,否则默认表单字段值将被清除

jquery - 如何将下面的JS转换为JQuery?