2016-05-30 6 views
0

Ich versuche, meine feste Navigation Farbe ändern, wenn es verschiedene Teile meiner Website überlappt. Ähnlich wie die Navigation auf dieser Website: http://andpizza.com/jquery erkennen Überlappung mehrere Abschnitte

Mein HTML besteht aus Divs und Abschnitte.

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

Für die JS verwende ich ein overlaps library ich auf Github gefunden.

Dieses jquery ich mich hinzugefügt:

$(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'); 

}); 

Oder Ansicht here on Codepen.

Es funktioniert perfekt für den ersten Abschnitt. Aber es ignoriert den zweiten Abschnitt. Ich bekomme, dass es den ersten Abschnitt wählt, der es kommt, , aber ich kann nicht herausfinden, wie man es für den anderen Abschnitt (en) arbeiten lässt.

Ich habe versucht, die Abschnitte separat wie folgt zu benennen:

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

oder

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'); 

Dies alles nur brach.

Kann mir jemand dabei helfen?

+0

warum tun Sie das gleiche Menü li für zwei Abschnitte wählen - für Gelb und Grün zugleich? wie ich es bekommen habe, ein li pro Abschnitt und dann funktioniert es wie ein Charme. https://jsfiddle.net/ofvug4nk/ –

+0

Es ist eine Frage der Lesbarkeit. Die Website ist eine einseitige Website mit abwechselnd großen Bildern und weißen Abschnitten. Wenn Sie das Bild überlappen, sollten alle Menüpunkte weiß sein. Wenn Sie den weißen Bereich überlappen, sollten alle Menüpunkte schwarz sein. Beispiel: http://andpizza.com/ –

+1

Dieses Overlaps-Plugin berücksichtigt nicht mehrere Objekte, die sich über http://printscr.com/ba7tx4 überschneiden. Jetzt funktioniert es wie erwartet https://jsfiddle.net/ofvug4nk/1/ –

Antwort

1

Das Overlaps-Plugin behandelt nur ein Objekt, über das sich Ihr Ziel überlappt. nur ein kleiner Fix wie folgt:

$.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));

Iterating durch eine Sammlung von Objekten $ (Objs) .Each statt nur die erste von ihnen zu nehmen - wird das beheben.

Working demo

+0

Sie haben mir gerade große Kopfschmerzen erspart und wer weiß, wie viele Stunden der Programmierung. Sehr geschätzt! –

+0

@PaulvdDool Gut zu helfen –