【CSS】:has() + aria-currentで現在地ナビをハイライト

どうも、くまだです。

:has() + aria-current で現在地ナビをハイライトメモ。

aria-current=”page” を1行追加するだけで、スクリーンリーダーはそのリンクを「現在のページ」として認識して読み上げてくれます。

JSでハイライトする場合

コードは以下になります。

<nav>
  <ul>
    <li><a href="/">ホーム</a></li>
    <li><a href="/about/">会社概要</a></li>
    <li><a href="/service/">サービス</a></li>
    <li><a href="/contact/">お問い合わせ</a></li>
  </ul>
</nav>
// JS:現在のURLと href を照合して active を付ける
const currentPath = location.pathname;
document.querySelectorAll('nav a').forEach(link => {
  if (link.getAttribute('href') === currentPath) {
    link.classList.add('active');
    link.closest('li').classList.add('active');
  }
});
nav a.active {
  color: #e44;
  font-weight: bold;
  border-bottom: 2px solid #e44;
}

細かいスタイルは省きますが、こんなイメージ。見た目は出ますが、スクリーンリーダーには「現在のページ」として伝わらない。

CSS で [aria-current=”page”] をハイライトする場合

コードは以下になります。

<nav>
  <ul>
    <li><a href="/">ホーム</a></li>
    <li><a href="/about/" aria-current="page">会社概要</a></li>
    <li><a href="/service/">サービス</a></li>
    <li><a href="/contact/">お問い合わせ</a></li>
  </ul>
</nav>
nav a[aria-current="page"] {
  color: #c0392b;
  font-weight: bold;
  border-bottom: 2px solid #c0392b;
}

 スクリーンリーダーも「現在のページ」として読みます。

:has() で親 li にハイライトを伝播

コードは以下になります。

<nav>
  <ul>
    <li><a href="/">ホーム</a></li>
    <li><a href="/about/" aria-current="page">会社概要</a></li>
    <li><a href="/service/">サービス</a></li>
    <li><a href="/contact/">お問い合わせ</a></li>
  </ul>
</nav>
/* CSS:aria-current="page" のリンクを持つ li を装飾 */
nav li:has(> a[aria-current="page"]) {
  background-color: #fdf0ef;
  border-radius: 4px;
}

/* a タグ自体のスタイルも合わせて指定 */
nav a[aria-current="page"] {
  color: #c0392b;
  font-weight: bold;
}

CSS の :has() セレクタは「中に特定の要素を含む親要素」を指定できます。

入れ子ナビのようなものも親メニューを強調できます。

    <nav class="nav-nested">
      <ul>
        <li><a href="/">ホーム</a></li>
        <li>
          <a href="/service/">サービス</a>
          <ul>
            <li><a href="/web-design/">Webデザイン</a></li>
            <li><a href="/coding/" aria-current="page">コーディング</a></li>
            <li><a href="/seo/">SEO対策</a></li>
          </ul>
        </li>
        <li><a href="/contact/">お問い合わせ</a></li>
      </ul>
    </nav>
/* 子に aria-current があるとき、親 li の > a も強調する */
.nav-nested > ul > li:has(a[aria-current="page"]) > a {
  color: #c0392b;
  font-weight: bold;
}
/* 現在地リンク自身の強調 */
.nav-nested a[aria-current="page"] {
  color: #c0392b;
  font-weight: bold;
  background-color: #fdf0ef;
}

ここまで読んでくださりありがとうございました。

この記事を書いた人