【问题标题】:jquery detect overlap multiple sectionsjquery检测重叠多个部分
【发布时间】:2016-05-30 14:28:22
【问题描述】:

我试图让我的固定导航在与我网站的不同部分重叠时改变颜色。 很像这个网站上的导航:http://andpizza.com/

我的 html 存在 div 和 section。

<nav>
  <ul>
    <li class="work">Work</li>
    <li class="about">About</li>
    <li class="contact">Contact</li>
</nav>

<div id="red">
</div>

<section id="green">
</section>

<div id="blue">
</div>

<section id="yellow">
</section>

对于 JS,我使用在 github 上找到的 overlaps library

这个jquery是我自己加的:

$(document).scroll(function() {

    var contactColl = $('ul li.contact').overlaps('section');
    $('ul li.contact')[contactColl.hits.length? 'addClass' : 'removeClass']('white');

    var aboutColl = $('ul li.about').overlaps('section');
    $('ul li.about')[aboutColl.hits.length? 'addClass' : 'removeClass']('white');

    var workColl = $('ul li.work').overlaps('section');
    $('ul li.work')[workColl.hits.length? 'addClass' : 'removeClass']('white');

});

或查看here on Codepen

它非常适合第一部分。但它忽略了第二部分。我知道它会选择它遇到的第一部分,但我不知道如何使它适用于其他部分

我尝试像这样分别命名这些部分:

var contactColl = $('ul li.contact').overlaps('#green, #yellow');

var contactColl = $('ul li.contact').overlaps('#green');
$('ul li.contact')[contactColl.hits.length? 'addClass' : 'removeClass']('white');

var contactColl2 = $('ul li.contact').overlaps('#yellow');
$('ul li.contact')[contactColl2.hits.length? 'addClass' : 'removeClass']('white');

这只是破坏了一切。

谁能帮我解决这个问题?

【问题讨论】:

  • 为什么你为两个部分选择相同的菜单 li - 同时为黄色和绿色?据我所知,每节一里,然后它就像一个魅力。 jsfiddle.net/ofvug4nk
  • 这是一个可读性问题。该网站是一个单页网站,具有交替的大图像和白色部分。重叠图像时,所有菜单项应为白色,重叠白色部分时,所有菜单项应为黑色。示例:andpizza.com
  • 这个 Overlaps 插件不考虑多个对象重叠在 prntscr.com/ba7tx4 上。现在它按预期工作jsfiddle.net/ofvug4nk/1
  • @GL.awog 它有效!惊人的!如果您将此作为答案,我会接受。

标签: jquery html css overlap


【解决方案1】:

Overlaps 插件只处理一个对象,您的目标会在该对象上重叠。只是这样的小修复:

$.fn.overlaps = function(objs) {
    var elems = {targets: [], hits:[]};
    this.each(function() {
        var bounds = $(this).offset();
        bounds.right = bounds.left + $(this).outerWidth();
        bounds.bottom = bounds.top + $(this).outerHeight();

        $(objs).each(function(){
          var obj = this;
          var compare = $(obj).offset();             
          compare.right = compare.left + $(obj).outerWidth();
          compare.bottom = compare.top + $(obj).outerHeight();

          if (!(compare.right < bounds.left ||
                compare.left > bounds.right ||
                compare.bottom < bounds.top ||
                compare.top > bounds.bottom)
             ) {
              elems.targets.push(this);
              elems.hits.push(obj);
          }
        });
    });

    return elems;
};

}(jQuery));

遍历一个对象集合 $(objs).each 而不是只获取其中的第一个 - 将解决这个问题。

Working demo

【讨论】:

  • 你让我头疼不已,谁知道编码了多少小时。非常感谢!
  • @PaulvdDool 很高兴为您提供帮助
猜你喜欢
  • 2018-03-07
  • 2013-01-01
  • 1970-01-01
  • 2013-07-22
  • 1970-01-01
  • 2018-06-04
  • 2012-12-10
  • 2016-04-30
  • 2015-02-08
相关资源
最近更新 更多