2016-05-30 8 views
0

ウェブサイトの異なる部分が重複している場合、固定ナビゲーションの色を変更しようとしています。 このウェブサイトのナビゲーションとよく似ています:http://andpizza.com/jqueryが複数のセクションを重複して検出する

私のHTMLはdivとセクションに存在します。

<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の場合、私はoverlaps libraryをgithubで見つけました。

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

最初のセクションでは完全に機能します。しかし、それは第2セクションを無視する。 の最初のセクションが選択されていますが、他のセクション()で動作させる方法を理解できません。

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

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

または

これはちょうど、すべてを壊した:

私はこのような個別のセクションに名前を付けてみました。

誰でも私にこれを手伝ってもらえますか?

+0

?私はそれを持っているので、1つのセクションに1つの李、それは魅力のように動作します。 https://jsfiddle.net/ofvug4nk/ –

+0

これは読みやすさの問題です。このウェブサイトは、大きな画像と白いセクションが交互に現れる1ページのウェブサイトです。画像を重ねるときは、すべてのメニュー項目が白でなければなりません。白い部分を重ねるときは、すべてのメニュー項目が黒くなります。例:http://andpizza.com/ –

+1

このオーバーラッププラグインでは、http://prntscr.com/ba7tx4で重複する複数のオブジェクトは考慮されません。今それは期待どおりに動作しますhttps://jsfiddle.net/ofvug4nk/1/ –

答えて

1

オーバーラップのプラグインは、ターゲットがオーバーラップする1つのオブジェクトのみを扱います。次のようにちょっと修正してください:

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

+0

あなたは私に大きな頭痛を救っただけで、何時間もコーディングすることを知っています。とても有難い! –

+0

@PaulvdDool喜んで助けてください –

関連する問題