メガメニューの実装をした際、フォーカス移動に対応しようとして詰まった点をメモ。
サンプルコード
例として、簡易的なメガメニューを実装してみます。
<header> <nav class="gnav"> <ul class="gnav__list"> <li class="gnav__item"> <a href="#" class="gnav__link">ナビA</a> <ul class="subnav"> <li class="subnav__item"> <a href="#" class="subnav__link">下層ナビA1</a> </li> <li class="subnav__item"> <a href="#" class="subnav__link">下層ナビA2</a> </li> <li class="subnav__item"> <a href="#" class="subnav__link">下層ナビA3</a> </li> <li class="subnav__item"> <a href="#" class="subnav__link">下層ナビA4</a> </li> <li class="subnav__item"> <a href="#" class="subnav__link">下層ナビA5</a> </li> </ul> </li> ~ 略 ~ </ul> </nav> </header>
ホバーで下層ナビが開くようにします。
.gnav { position: relative; } .gnav__list { display: grid; grid-template-columns: repeat(5, 1fr); background: gray; } .gnav__item { border-left: 1px solid lightgray; } .gnav__link { display: block; padding: 10px; text-align: center; color: white; } .subnav { display: none; flex-wrap: wrap; gap: 10px; position: absolute; top: 100%; left: 0; width: 100%; background: pink; } .gnav__item:hover .subnav { display: flex; } .subnav__item {} .subnav__link { display: block; padding: 5px; }
これで簡易的なメガメニューが実装できました。
メガメニューのデモページ
次にフォーカス移動で下層ナビが開くようにしてみます。
最初にうまくいかなかった例です。
~ 略 ~ .gnav__item:hover .subnav, .gnav__link:focus + .subnav, .subnav:has(:focus) { display: flex; }
.gnav__itemにフォーカスが当たったときと下層ナビ内にフォーカスがある場合に開くように設定したのですが、フォーカス移動時に閉じてしまいます。
フォーカス移動対応のうまくいかなかった場合のデモページ
原因としてはフォーカス移動のためにフォーカスが外れた時点で下層ナビが非表示になってしまい、下層ナビ内にフォーカスが移動できないためのようです。
対策として:focus-withinを使う形にすると、下層ナビにもフォーカスが移動できるようになりました。
.gnav__item:hover .subnav, .gnav__item:focus-within .subnav { display: flex; }
コメントが承認されるまで時間がかかります。