会員ログイン
DOM・イベント

コピペでOK!スクロールに追従するメニューの実装

コピペでOK!スクロールに追従するメニューの実装のアイキャッチ画像
はじめに
概要
今回は、当ページで実装済みのスクロールに応じてメニューの表示・非表示を切り替える実装を行います。具体的には、javascriptとCSSを使用してこの機能を実現します。スクロールイベントを監視し、メニューの表示状態を切り替えるためのコードを書いていきます。CSSを使用して、メニューのデザインや配置を調整することもできます。この実装により、ユーザーがページをスクロールするたびに、メニューが自動的に表示または非表示になるようになります。ユーザビリティの向上や、見た目の統一感を実現するために、このような機能を追加することは非常に重要です。是非、この実装方法を試してみてください。
※本記事の情報は執筆時点のものであり、閲覧時点では変更されている可能性があります。また、ご利用の環境によっては、本記事の内容が正常に動作しないことがあります。最新の情報については、公式サイトなどでご確認ください。
疑問を持つ読者のイラスト読者

コピペでOK!スクロールに追従するメニューの実装は、最初にどこを理解するとよいですか?

著者・木村のプロフィール写真木村

対象要素を取得する処理、動作を始める条件、見た目を変える処理の三つに分けると、コードの流れを追いやすくなります。

話を聞く読者のイラスト読者

実際に試すときは、手順だけでなく確認方法も知っておいた方がよいでしょうか?

著者・木村のプロフィール写真木村

はい。この記事では、作業の目的から実装後の確認までを順番に整理します。自分の環境と照らし合わせながら読み進めてください。

実装内容

実装内容では、コピペでOK!スクロールに追従するメニューの実装を理解・実装するために必要な考え方と、作業時に確認したい点を整理します。最初に役割を把握してから、記事内の手順へ進みましょう。

スクロールに応じて、メニューが表示されたり非表示になるように実装します。これは、このページのヘッダーメニューが行っている動作と同様です。

コード

javascript
function fixedHeader() {
  let fixedElm=document.querySelector(".header");
  let scrollPoint=0;
  let lastPoint=0;

  window.addEventListener("scroll", function() {
      scrollPoint=this.window.scrollY;

      if (scrollPoint > lastPoint) {
        fixedElm.classList.add("fixed-hide");
      }

      else {
        fixedElm.classList.remove("fixed-hide");
      }

      lastPoint=scrollPoint;
    });
}

fixedHeader()
以下に、関数の各部分の詳細な説明を提供します: -let fixedElm = document.querySelector(“.header”);:この行では、ヘッダー要素を選択し、fixedElmという変数に保存しています。 -let scrollPoint = 0; と let lastPoint = 0;:この行では、現在のスクロール位置(scrollPoint)と最後のスクロール位置(lastPoint)を追跡するための変数を初期化しています。 -window.addEventListener(“scroll”, function() {…});:この行では、スクロールイベントリスナーをウィンドウオブジェクトに追加しています。これにより、ユーザーがページをスクロールするたびに指定した関数が実行されます。 -scrollPoint = this.window.scrollY;:この行では、現在のスクロール位置を取得しています。 -if (scrollPoint > lastPoint) {…} else {…}:この条件分岐では、現在のスクロール位置が最後のスクロール位置よりも大きい場合(つまり、ユーザーが下にスクロールしている場合)、ヘッダーを非表示にするクラス(fixed-hide)を追加します。それ以外の場合(つまり、ユーザーが上にスクロールしている場合)、ヘッダーを非表示にするクラスを削除します。 -lastPoint = scrollPoint;:この行では、最後のスクロール位置を現在のスクロール位置に更新しています。これにより、次回のスクロールイベントが発生したときに、スクロールの方向を正しく判断できます。この行は必須ではありませんが、イベントが適切なタイミングで正しく発火するために記述されています。 -fixedHeader();:この行では、ページが読み込まれたときにfixedHeader関数を実行しています。これにより、スクロールイベントリスナーがすぐに有効になります。 this.window.scrollY this.window.scrollYは、ウェブページが垂直方向にどれだけスクロールされたかをピクセル単位で返すプロパティです。windowはブラウザのウィンドウを表し、scrollYは現在のスクロール位置の垂直座標です。この値は、ウィンドウの最上部がページの最上部にある場合は0になります。ユーザーがページを下にスクロールすると、この値は増加します。 CSS if文で条件が満たされた際に以下のクラスがヘッダーに付与されます。
.fixed-hide {
    transform: translateY(-100px);
}
.fixed-hide クラスには transform プロパティが適用されており、Y軸に沿って上方向に100ピクセル分移動する効果があります。つまりスクロールした際に、このクラスがヘッダーに付与されることになり、ヘッダーが上方向に非表示になり、逆に下方向にスクロールした際にはクラスが削除されメニューが表示されます。 また、アニメーションを滑らかに実行するために以下のCSSを追加します。 CSS
.header {
  transition: 0.5s;
}
以上です。コードをコピペして実装を試してみてください。

実装内容で押さえたいポイント

実装内容は、コードや設定だけを切り離して覚えるより、何を変えるための処理なのかを確認してから試すと理解しやすくなります。変更前の状態を控え、作業を一つずつ反映すると、問題が起きた場所も特定しやすくなります。

実装前に確認しておきたいこと

ここでは、コピペでOK!スクロールに追従するメニューの実装を実際の制作へ取り入れる前に、準備しておきたい内容を整理します。先に作業範囲と確認方法を決めておくと、既存ページへの影響を抑えながら進められます。

作業の目的と変更範囲を決める

対象要素を取得する処理、動作を始める条件、見た目を変える処理の三つに分けると、コードの流れを追いやすくなります。 サンプルをそのまま貼り付ける前に、どのページ、どの要素、どの利用者へ影響するのかを書き出してください。目的が明確であれば、必要以上にコードや設定を増やさずに済みます。

元の状態へ戻せるようにする

テーマや設定を変更するときは、対象ファイルや設定値のコピーを残します。複数の変更を一度に行わず、一つ反映するたびに表示と動作を確認すると、問題が起きても原因を切り分けやすくなります。

よくあるつまずきと確認方法

コピペでOK!スクロールに追従するメニューの実装が期待どおりに動かない場合は、コードを追加し続ける前に、読み込み順、対象要素、設定値、キャッシュの順で確認します。小さな入力ミスや確認条件の違いが原因になることも少なくありません。

変更が反映されない場合

保存したファイルと表示中のページが対応しているかを確認し、キャッシュを消して再読み込みします。ブラウザーの開発者ツールやWordPressのエラーログを確認すると、読み込み失敗や記述ミスを見つけやすくなります。

公開前の最終確認

ブラウザーのコンソールにエラーがないかを確認し、クリックやスクロールを繰り返してもイベントが重複しないかを試します。スマートフォン幅とキーボード操作も確認してください。

まとめ

  • 実装にはthis.window.scrollYを理解する
  • if文で条件分岐を作成し、スクロール量及び方向によってイベントを発火させる
  • 条件を満たしたときにクラスが付与され、条件が元に戻ったときにはそのクラスが解除される。

MEMBER COMMENTS

コメント(0件)

会員ログイン後にコメントできます

記事への質問や感想をコメントで共有できます。無料会員登録後もこの記事へ戻れます。