2017-07-29 9 views
1

スクロールの上に位置するようにナビゲーションを設定するには、いくつかのjsのヘルプが必要です。 マイナビマークアップは次のとおりです。スクロールでナビの位置を上に設定

<nav class="flex-nav" id="nav"> 
     <ul> 
     <li><a href="#">Item 01</a></li>... 

私のナビゲーションの現在位置です:私はこれは私がスクロールダウンしたときにトップに設定され、私はの先頭にスクロールしたときに引き離すことにしたい

.flex-nav ul{ 
position: fixed; 
top: 6em; 
width: 100%; 
} 

もう一度ページを開き、6emに戻します。

私はこれを処理するためにjsが必要になると思いますし、またjsでnavを使用するにはidをnavに設定しますか?

-Thanks

答えて

2
onload = _ => { 
    let nav = document.getElementById("nav"); 
    let basePos = nav.offsetTop; 
    setInterval(_ => { 
     nav.style.top = Math.max(0, basePos - scrollY) + "px"; 
    }, 20); 
}; 

これは20ミリ秒毎(approxiametly)を実行し、ここでは要素の位置

2

を更新し、純粋なJavaScriptで書かれた作業抜粋です:

var body = document.getElementsByTagName('body')[0], 
 
    nav = document.getElementById('nav'); 
 

 
window.addEventListener('scroll', function() { 
 
    if (body.scrollTop > 0) { 
 
    nav.className += " no-indent" 
 
    } else { 
 
    nav.classList.remove("no-indent"); 
 
    } 
 
}, true)
.flex-nav { 
 
    position: fixed; 
 
    top: 6em; 
 
    width: 100%; 
 
    height: 50px; 
 
    background-color: green; 
 
    transition: all .5s ease-in-out; 
 
} 
 

 
#content { 
 
    width: 100%; 
 
    height: 1000px; 
 
    background-color: gray; 
 
} 
 

 
.no-indent { 
 
    top: 0 !important; 
 
}
<nav class="flex-nav" id="nav"> 
 
</nav> 
 
<div id="content"> 
 
</div>

+0

ありがとう:)私はそれが.no-identだと思います位置をtopに設定します:scrollが0より大きい場合は0、そうでない場合は0を使用します。しかし、私はマークアップでマークが見えないのですか?だから、それは必要ではない? – user2371684

+1

@ user2371684、はい、そうです。このクラスはHTMLコードではありません。この行はJavascriptを介して適用されるためです: 'document.getElementById( 'nav')。className + =" no-indent "'そして、スクロールしたピクセルに基づいて上からスクロールしたピクセルに基づいて適用したり削除したりしています: "scrollTop> 0の場合 - クラスを追加する、" scrollTop === 0 " - クラスを削除する –

+1

MDNは"スクロールイベントが高速に発生するため、 DOMの変更などの計算上高価な操作を実行すべきではありません。少なくとも、要素を変数に保存する必要があります。 –

関連する問題