スクロールすると消え、上に戻すと再表示されるナビゲーションの簡単な実装方法
本記事では、一定距離スクロールするとヘッダーが消え、上に少しスクロールを戻すとヘッダーが再表示されるグローバルナビゲーションを簡単に設置する方法を紹介します。この実装はjQueryとJavaScriptを使用し、スマホ画面ではトグルボタンでナビゲーションの表示/非表示を切り替えます。
Webデザインにおけるナビゲーションの最適化やスクロールに応じたダイナミックなヘッダーの実装に役立つ情報が提供されています。ブログのカスタマイズに挑戦したい方にとって有益な情報となれば幸いです。
デモページ
ライブラリのCDN
以下のscriptタグをheadなどに配置することによってそれぞれのライブラリが利用可能になります。先ずはこれらのコードを、この後に紹介するスクリプトコードより手前に設置します。
jQuery
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
外部ライブラリのCDN(Content Delivery Network)を配置する場所は、通常、<head>
セクション内の<script>
要素の直前に配置することが一般的です。これは、ページが読み込まれる前にライブラリが利用可能であることを確保するためです。
ソースコード
HTML -> CSS -> JavaScriptの順に紹介します。
HTMLの構造
大きく2つのコンテナに分かれます。
- 「div.openbtn1」: ナビの表示/非表示を切り替えるボタン部分(スマホのみ)
- 「section.main-navi」: ナビゲーション部分のコンテナ
<!-- トグルボタン部分(スマホ画面のみ) --> <div class="openbtn1"> <span></span><span></span><span></span> </div> <!-- ナビゲーション部分 --> <section class="main-navi"> <header id="header" class="DownMove">タイトル、ロゴ <nav> <ul id="g-navi"> <li><a href="#">見出し1</a></li> <li><a href="#">見出し2</a></li> <li><a href="#">見出し3</a></li> <li><a href="#">見出し4</a></li> </ul> </nav> </header> </section>
<li><a href="#">
~</a></li>
の部分に見出しタイトルとページ内リンクを記述します。
ナビと見出しをリンクさせる方法
<!-- ナビ側 --> <li> <a href="#見出し1">ここは何でもいい</a> </li> <!-- 見出し側 --> <h2 id="見出し1">同じでなくてもいい</i></h2>
というように、
- ナビ側で指定する
href=""
の"
から"
内の文字と - 見出し側の
id=""
の"
から"
内の文字
を一致させ、「href=""」の方には文頭に「#」を付けます。
CSSスタイル
コードの解説
このCSSコードは
でデスクトップとスマートフォン画面のスタイリング・アニメーションを区分けしています。メディアクエリに関しては、SEOタイムズさんの記事で詳しく説明されているので、参考にして下さい。以下にコードの主な構成要素を解説します。
デスクトップ用スタイル
(min-width: 768px以下)
解説が開きます
#header
(ナビゲーション)の位置を上端に固定 #header {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 0px;
z-index: 999;
display: flex;
justify-content: space-between;
align-items: center;
background: rgb(9, 25, 53, .9);
color: #fff;
text-align: center;
padding: 20px
}
#g-navi a {
color: greenyellow;
/* ... 他のスタイルプロパティ ... */
}
nav ul#g-navi {
/* ... 他のスタイルプロパティ ... */
}
#g-navi li a:hover {
color: #fff
}
スマートフォン用スタイル
(max-width: 768px以下)
解説が開きます
#g-navi
が表示されるようになります。 .openbtn1 {
/* ... 他のスタイルプロパティ ... */
}
.openbtn1.active+#g-navi {
display: block
}
#g-navi
はデフォルトでは非表示で、トグルボタンがアクティブな場合に表示されます。 #g-navi {
display: none;
/* ... 他のスタイルプロパティ ... */
}
#g-navi>li>a {
/* ... 他のスタイルプロパティ ... */
}
#g-navi ul {
/* ... 他のスタイルプロパティ ... */
}
.UpMove
クラスが適用された#header
要素に対してアップアニメーションが実行されます。 @keyframes UpAnime {
/* ... アップアニメーションのスタイル ... */
}
@keyframes DownAnime {
/* ... ダウンアニメーションのスタイル ... */
}
#header.UpMove {
animation: UpAnime .5s forwards
}
JavaScript
このJavaScriptコードは、「jQueryライブラリ」を利用して、ウェブページ上でのトグルボタンによるメニューの表示/非表示およびスクロールに応じたヘッダーのアニメーションを制御しています。
コードの解説
このコードは、トグルボタンによるメニューの表示/非表示とスクロールに応じたヘッダーのアニメーションを実現しています。また、スマートフォン画面かどうかを確認し、それに応じてスクリプトの実行を切り替えています。
以下にコードの概要と主な機能を解説します。
メニューの表示/非表示の制御
コードの以下の部分は、 また、
解説が開きます
.openbtn1
クラスを持つ要素がクリックされたときに実行される関数です。#g-navi
(メニュー)の表示/非表示をトグル(切り替え)して、メニュー表示時には高さを45pxに設定し、スライドダウンで表示します。非表示時には高さを0に設定し、スライドアップで非表示にします。active
クラスをトグルして、ボタンの状態を示します。$(".openbtn1").click(function() {
if ($("#g-navi").is(":hidden")) {
// メニューが非表示の場合
$("#g-navi").css("height", "45px");
$("#g-navi").slideDown();
$("#g-navi").css("display", "flex");
$(this).toggleClass("active");
} else {
// メニューが表示されている場合
$("#g-navi").slideUp("slow");
$(".openbtn1").removeClass("active");
$("#g-navi").css("height", 0);
}
});
スクロールに応じたヘッダーのアニメーション
コードの以下の部分は、スクロールの向きに応じて します。
解説が開きます
UpMove
またはDownMove
クラスを#header
に追加・削除し、
UpMove
クラスが適用された場合には、ヘッダーが上方向にアニメーションし、DownMove
クラスが適用された場合は、ヘッダーが下方向にアニメーションvar beforePos = 0;
function ScrollAnime() {
var scroll = $(window).scrollTop();
if ($(window).width() > 767) {
if (scroll == beforePos || (1000 > scroll || 0 > scroll - beforePos)) {
$("#header").removeClass("UpMove");
$("#header").addClass("DownMove");
} else {
$("#header").removeClass("DownMove");
$("#header").addClass("UpMove");
}
beforePos = scroll;
}
}
$(window).scroll(function() {
ScrollAnime();
});
$(window).on("load", function() {
ScrollAnime();
});
カスタマイズのポイント
ScrollAnime
関数」
if ($(window).width() > 767)
の部分でスマートフォン画面(画面幅767px以下)の場合のみスクリプトが実行するように制御しています。この数値を変更することでレスポンシブの調整ができます。if (scroll == beforePos || (1000 > scroll || 0 > scroll - beforePos))
」
beforePos
変数は前回のスクロール位置を保持します。スクロールが発生しており、かつ、現在のスクロール位置が1000pxより大きいか、スクロール位置の差が0より小さい場合に上方向のアニメーション(ナビゲーションを非表示にする)が適用されます。ここの数値(1000 > scroll
)を変更することで、ページの上端からナビゲーションをどこまで表示させるかの調整ができます。
このコードでは、トグルボタンのクリックによるメニューの表示・非表示と、スクロールに応じたヘッダーのアニメーションが実装されています。関数やメソッドの名称や引数はjQueryにおける慣習に従っています。また、クラスの追加・削除、スタイルの変更などを用いて、要素の状態やスタイルを制御しています。
おさらい
コードのまとめ
jQuery CDN:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
HTML:
コードはこちら(GitHubサイトへ)
CSS:
コードはこちら(GitHubサイトへ)
JavaScript:
コードはこちら(GitHubサイトへ)
おわりに
今回の記事では、スクロールに応じてヘッダーが動的に表示されるグローバルナビゲーションの設置方法について紹介しました。デモページとライブラリのCDNも提供していますので、ぜひ実際に試してみてください。
記事の構成はHTML、CSS、JavaScriptの順に進み、それぞれのコードやスタイルの解説しました。デスクトップ用とスマートフォン用のスタイリングやアニメーションはメディアクエリを使用して区別し、ユーザーエクスペリエンスを向上させる工夫が施されています。
これを参考に、ブログのカスタマイズに活用いただければ幸いです♬