ページ内の現在地を教えてくれる、ワンページナビゲーション。
プラグイン無しで使いまわせるシンプルなものを作ってみた。
完成コード
こういうやつです。
解説
index.html
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>ワンページナビ</title> <script src="https://code.jquery.com/jquery-3.5.1.min.js"></script> <script src="script.js"></script> <link rel="stylesheet" type="text/css" href="style.css"> </head> <body> <nav> <ul> <li><a class="js-curnav-switch" href="#menu1">menu1</a></li> <li><a class="js-curnav-switch" href="#menu2">menu2</a></li> <li><a class="js-curnav-switch" href="#menu3">menu3</a></li> <li><a class="js-curnav-switch" href="#menu4">menu4</a></li> </ul> </nav> <main> <section id="menu1"> content1 </section> <section id="menu2"> content2 </section> <section id="menu3"> content3 </section> <section id="menu4"> content4 </section> </main> </body> </html>
ナビゲーションのaタグにそれぞれ「js-curnav-switch」のクラス名を付与し、idにリンク設定する。
idを付与されたHTMLタグの位置でメニューが切り替わるように設定します。
style.css(scss)
nav { width: 100%; position: fixed; top: 0; left: 0; width: 100%; height: 60px; background: rgba(0,0,0,.2); ul { display: flex; justify-content: center; a { display: block; margin: 0 10px; line-height: 60px; text-decoration: none; color: #000; font-weight: bold; &.is-current { color: #f00; } } } } main { padding-top: 60px; } section { min-height: 400px; padding: 20px; text-align: center; &:nth-child(1) { background: #fee; } &:nth-child(2) { background: #efe; } &:nth-child(3) { background: #eef; } &:nth-child(4) { background: #fef; } }
見た目上わかりやすくするために整えただけです。
script.js
function onePageNav( switchName ) { // 変数設定 const navSwitch = $(switchName); const deductHeight = 60;//ここに設定した数字を引いた位置にスクロールした時点で切り替わる let navArr = []; // ナビゲーションに設定したクラスのリンク先idを取得して、それぞれのid名とtop offsetの値を配列に追加します navSwitch.each(function(i){ let navSwitchHref = $(this).attr('href'); let tgtOff = $(navSwitchHref).offset().top - deductHeight; navArr.push([]); navArr[i].switch = $(this); navArr[i].tgtOff = tgtOff; }); // スクロールするたびに、どのナビゲーションのリンク先にいるか判別して、.is-currentクラスを切り替える $(window).scroll(function () { for( let i = 0; i < navArr.length; i++ ){ let scroll = $(window).scrollTop(); let tgtKey = navArr[i]; let tgtSwitch = tgtKey.switch; let tgtOff = tgtKey.tgtOff; if ( scroll > tgtOff ) { navSwitch.removeClass('is-current'); tgtSwitch.addClass('is-current'); } else { tgtSwitch.removeClass('is-current'); } } }); } $(window).on('load resize',function(){ // リサイズのたびにターゲットのtop offsetが変わるので、loadとresizeごとに実行する onePageNav('.js-curnav-switch');//ここでナビゲーションリンクのクラスを指定する。 });
ナビゲーションのクラス以外は、リンク先等変更してもJSを編集する必要のない書き方になっています。
もっとスマートな書き方がありましたらお教えくださいませ。
では、よいjQueryライフを。