Web制作において、表示中のページに応じてナビゲーションメニューのリンクにactive
クラスを付け替えることがあります。
例えば、HOMEページにいる時はHOMEリンクにactive
クラスを付け、ABOUTページにいる時はABOUTリンクにactive
クラスを付けるといった処理です。
今回の記事では、Astroで上記のような実装をする方法を紹介していきます!
検証環境
当記事で紹介する方法は、以下のバージョンで動作確認を行っています。
検証環境のバージョン情報
バージョンの違いによっては、この記事の通りに動作しない可能性がありますので、ご理解いただけますと幸いです。
表示中のページによってactiveクラスを付け替える手順
以下の手順に分けて説明していきます。
- ナビゲーションコンポーネントを作成する
- activeクラス用のスタイルを追加する
- ページのパス名を取得する
- class:listでクラスを動的に付与する
1. ナビゲーションコンポーネントを作成する
まずは、ナビゲーションコンポーネントを作成します。
ヘッダーにナビゲーションを置くことが一般的なので、ここではHeader.astro
としています。
※デモなのでクラス名や構成は最小限にしています。
2. activeクラス用のスタイルを追加する
active
クラスがついた要素をハイライトするためのスタイルを用意します。
Astroではstyle
タグを直接埋め込めるので、Header.astro
内に以下を追記してください。
3. ページのパス名を取得する
次に、表示中のページのパス名を取得します。
AstroではAstro.url.pathname
で現在のページのパス名を取得できます。
Header.astro
内の一番上に、以下を追記してください。
4. class:listでクラスを動的に付与する
最後に、class:list
を使用して、表示中のページに応じてactive
クラスを付与します。
先ほど取得したpathname
を使用して、各リンクのクラスに条件分岐を追加します。
class:list
は、Astroに用意されているディレクティブの一つで、クラスを動的に付与することができます。
ここでは、デフォルトのクラスとしてlink
を指定し、pathname === '〇〇'
の条件に合致する場合にactive
クラスを付与しています。
これでほぼ完成なのですが、Astroの本番環境では、pathname
の最後に必ず/
が付きます。
それを考慮して、条件分岐を以下のように変更してください。
/^\/文字列\/?$/
とすることで、/文字列
でも/文字列/
でもactive
クラスを付与できるようになります。
開発環境と本番環境の挙動の違いで個人的に少し詰まったので、参考にしていただければと思います。
以上で、表示中のページによってactive
クラスを付け替える方法の解説は終わりです!
特定のパスの配下にあるページにもactiveクラスを付与する方法
例えば、/blog
というパス名のページと、その配下の記事のページ(例:/blog/hello-world
)にもactive
クラスを付与したい場合があるとします。
その場合は、pathname
の条件分岐を以下のように変更してください。
/^\/文字列(\/|$)/
とすることで、/文字列
と/文字列/
の両方に対応しつつ、/文字列
の配下にあるページにもactive
クラスを付与できます。
/blog
:○/blog/
:○/blog/hello-world
:○/blog/hello-world/
:○/blog-page
:×
これで、特定のパスを持つ配下のページにもactive
クラスを付与することができます!
【まとめ】Astroで表示中のページによってactiveクラスを付け替える方法
今回は、Astroで表示中のページによってactive
クラスを付け替える方法を解説しました。
Webサイト制作において、特によく見かける機能かと思います。
もしAstroでサイトを制作する際には、ぜひ参考にしてみてください!
また、当記事で使用したAstro.url
とclass:list
については別で解説記事を出しているので、詳しく知りたい方はぜひご覧ください。