Astroで表示中のページによってactiveクラスを付け替える方法

Astroで表示中のページによってactiveクラスを付け替える方法

Web制作において、表示中のページに応じてナビゲーションメニューのリンクにactiveクラスを付け替えることがあります。

例えば、HOMEページにいる時はHOMEリンクにactiveクラスを付け、ABOUTページにいる時はABOUTリンクにactiveクラスを付けるといった処理です。

表示中のページによってactiveクラスを付け替える例

例)ABOUTページを開いている場合に、ABOUTにactiveクラスを付与する

今回の記事では、Astroで上記のような実装をする方法を紹介していきます!

検証環境

当記事で紹介する方法は、以下のバージョンで動作確認を行っています。

検証環境のバージョン情報

Astro
Astro 5.1.9

バージョンの違いによっては、この記事の通りに動作しない可能性がありますので、ご理解いただけますと幸いです。

表示中のページによってactiveクラスを付け替える手順

以下の手順に分けて説明していきます。

  1. ナビゲーションコンポーネントを作成する
  2. activeクラス用のスタイルを追加する
  3. ページのパス名を取得する
  4. class:listでクラスを動的に付与する

1. ナビゲーションコンポーネントを作成する

まずは、ナビゲーションコンポーネントを作成します。

ヘッダーにナビゲーションを置くことが一般的なので、ここではHeader.astroとしています。

src/components/Header.astro
Astro
    <header class="header">
  <nav>
    <ul>
      <li><a class="link" href="/">HOME</a></li>
      <li><a class="link" href="/about">ABOUT</a></li>
      <li><a class="link" href="/contact">CONTACT</a></li>
    </ul>
  </nav>
</header>
  

※デモなのでクラス名や構成は最小限にしています。

2. activeクラス用のスタイルを追加する

activeクラスがついた要素をハイライトするためのスタイルを用意します。

Astroではstyleタグを直接埋め込めるので、Header.astro内に以下を追記してください。

src/components/Header.astro
Astro
    <style>
  /* デフォルトのスタイルを記述 */
  .link {
    color: black;
  }
 
  /* activeクラスがついた時のスタイルを記述 */
  .link.active {
    color: red;
  }
</style>
  

3. ページのパス名を取得する

次に、表示中のページのパス名を取得します。

AstroではAstro.url.pathnameで現在のページのパス名を取得できます。

Header.astro内の一番上に、以下を追記してください。

src/components/Header.astro
Astro
    ---
const pathname = Astro.url.pathname;
---
  
Astroで現在のページのパスやURLを取得する方法 | WebTech Media
Astroで現在のページのパスやURLを取得する方法を詳しく解説します。Astro.urlやAstro.requestなどのランタイムAPIを活用した具体例と実装コードも合わせて紹介します。
Astroで現在のページのパスやURLを取得する方法 | WebTech Media favicon https://webtech-media.jp/article/astro-get-url
Astroで現在のページのパスやURLを取得する方法 | WebTech Media

4. class:listでクラスを動的に付与する

最後に、class:listを使用して、表示中のページに応じてactiveクラスを付与します。

先ほど取得したpathnameを使用して、各リンクのクラスに条件分岐を追加します。

src/components/Header.astro
Astro
    ---
const pathname = Astro.url.pathname;
---
 
<header class="header">
  <nav>
    <ul>
      <li><a class:list={['link', {active: pathname === '/'}]} href="/">HOME</a></li>
      <li><a class:list={['link', {active: pathname === '/about'}]} href="/about">ABOUT</a></li>
      <li><a class:list={['link', {active: pathname === '/contact'}]} href="/contact">CONTACT</a></li>
    </ul>
  </nav>
</header>
  

class:listは、Astroに用意されているディレクティブの一つで、クラスを動的に付与することができます。

ここでは、デフォルトのクラスとしてlinkを指定し、pathname === '〇〇'の条件に合致する場合にactiveクラスを付与しています。

Astroでクラスを動的に付け替える方法【class:list】 | WebTech Media
Astroでクラスを動的に付け替えることができるclass:listディレクティブについて解説します。実際に使用するコード例も合わせて紹介します。
Astroでクラスを動的に付け替える方法【class:list】 | WebTech Media favicon https://webtech-media.jp/article/astro-conditional-class-list
Astroでクラスを動的に付け替える方法【class:list】 | WebTech Media

これでほぼ完成なのですが、Astroの本番環境では、pathnameの最後に必ず/が付きます。

それを考慮して、条件分岐を以下のように変更してください。

src/components/Header.astro
Astro
    ---
const pathname = Astro.url.pathname;
---
 
<header class="header">
  <nav>
    <ul>
      <li><a class:list={['link', {active: pathname === '/'}]} href="/">HOME</a></li>
      <li><a class:list={['link', {active: /^\/about\/?$/.test(pathname)}]} href="/about">ABOUT</a></li>
      <li><a class:list={['link', {active: /^\/contact\/?$/.test(pathname)}]} href="/contact">CONTACT</a></li>
    </ul>
  </nav>
</header>
  

/^\/文字列\/?$/とすることで、/文字列でも/文字列/でもactiveクラスを付与できるようになります。

開発環境と本番環境の挙動の違いで個人的に少し詰まったので、参考にしていただければと思います。

以上で、表示中のページによってactiveクラスを付け替える方法の解説は終わりです!

特定のパスの配下にあるページにもactiveクラスを付与する方法

例えば、/blogというパス名のページと、その配下の記事のページ(例:/blog/hello-world)にもactiveクラスを付与したい場合があるとします。

その場合は、pathnameの条件分岐を以下のように変更してください。

src/components/Header.astro
Astro
    ---
const pathname = Astro.url.pathname;
---
 
<header class="header">
  <nav>
    <ul>
      <li><a class:list={['link', {active: /^\/blog(\/|$)/}]} href="/blog">BLOG</a></li>
    </ul>
  </nav>
</header>
  

/^\/文字列(\/|$)/とすることで、/文字列/文字列/の両方に対応しつつ、/文字列の配下にあるページにもactiveクラスを付与できます。

  • /blog:○
  • /blog/:○
  • /blog/hello-world:○
  • /blog/hello-world/:○
  • /blog-page:×

これで、特定のパスを持つ配下のページにもactiveクラスを付与することができます!

【まとめ】Astroで表示中のページによってactiveクラスを付け替える方法

今回は、Astroで表示中のページによってactiveクラスを付け替える方法を解説しました。

Webサイト制作において、特によく見かける機能かと思います。

もしAstroでサイトを制作する際には、ぜひ参考にしてみてください!

また、当記事で使用したAstro.urlclass:listについては別で解説記事を出しているので、詳しく知りたい方はぜひご覧ください。