はじめに
今回は、アクセシビリティに対応したMega Menuの紹介です。
ラインセンスは、Apache License 2.0のようです。
こちらはAdobeが開発した、Mega MenujQueryプラグインです
ソースは下記から・・
https://github.com/adobe-accessibility/Accessible-Mega-Menu/
2022年に変更があるのである程度保守されていると思います
下記は機械語翻訳・・・
キーボードのアクセシビリティ
アクセシブルなメガメニューは、WAI-ARIA メニューまたはメニューバー (ウィジェット) デザインパターンで説明されている動作をモデルにしたキーボード操作をサポートしますが、
グローバルナビゲーションでのリンクの動作に対するユーザーの一般的な期待も尊重するように努めています。
この目的のために、アクセス可能なメガメニューの実装では、6つのトップレベルメニュー項目のそれぞれにタブフォーカスが許可されます。
メニュー項目の 1 つにフォーカスがある場合、Enter キー、Space キー、または下方向キーを押すとサブメニュー パネルが開き、左方向キーまたは右方向キーを押すと、フォーカスが隣接するメニュー項目に移動します。
サブメニューパネル内のリンクは、パネルが開いているときにタブオーダーに含まれます。また、矢印キーを使用するか、リンク名の最初の文字を入力してナビゲートすることもでき、キーボードナビゲーションが大幅に高速化されます。
Esc キーを押すと、サブメニューが閉じ、親メニュー項目にフォーカスが戻ります。
スクリーンリーダーのアクセシビリティ
アクセシブルなメガメニューは、WAI-ARIA のロール、状態、プロパティの使用を、いくつかの注目すべき例外を除いて、WAI-ARIAのメニューまたはメニューバー (ウィジェット) のデザインパターンで説明されているものの後にモデル化しているため、スクリーンリーダーのグローバルナビゲーションに対するユーザーの期待により適切に動作します。
メニュー コンテナーとその中の各リンクには使用しません。使用すると、支援技術がリンクをリンクとして解釈するのではなく、メニュー項目として解釈し、スクリーン リーダー ユーザーがショートカット コマンドを実行してページ内のリンクの一覧を表示すると、グローバル ナビゲーション内のリンクが表示されなくなるためです。
role="menu"role="menuitem"
また、メガメニューのサブメニューパネルのセマンティック構造を維持したいと考えています。
リンクはリストに整理され、見出しで区切られています。省略してグローバルナビゲーションを行う方が安全な方法のようです。
role="menu"role="menuitem"
使用方法
JavaScript
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script src="js/jquery-accessibleMegaMenu.js"></script
<script>
$("nav:first").accessibleMegaMenu({
/* prefix for generated unique id attributes, which are required
to indicate aria-owns, aria-controls and aria-labelledby */
uuidPrefix: "accessible-megamenu",
/* css class used to define the megamenu styling */
menuClass: "nav-menu",
/* css class for a top-level navigation item in the megamenu */
topNavItemClass: "nav-item",
/* css class for a megamenu panel */
panelClass: "sub-nav",
/* css class for a group of items within a megamenu panel */
panelGroupClass: "sub-nav-group",
/* css class for the hover state */
hoverClass: "hover",
/* css class for the focus state */
focusClass: "focus",
/* css class for the open state */
openClass: "open"
});
</script>
HTMLナビゲーション部分
WAI-ARIAの付加はJSの方でやってます。
<nav>
<ul class="nav-menu">
<li class="nav-item">
<a href="?movie">Movies</a>
<div class="sub-nav">
<ul class="sub-nav-group">
<li><a href="?movie&genre=0">Action & Adventure</a></li>
<li><a href="?movie&genre=2">Children & Family</a></li>
<li>…</li>
</ul>
<ul class="sub-nav-group">
<li><a href="?movie&genre=7">Dramas</a></li>
<li><a href="?movie&genre=9">Foreign</a></li>
<li>…</li>
</ul>
<ul class="sub-nav-group">
<li><a href="?movie&genre=14">Musicals</a></li>
<li><a href="?movie&genre=15">Romance</a></li>
<li>…</li>
</ul>
</div>
</li>
<li class="nav-item">
<a href="?tv">TV Shows</a>
<div class="sub-nav">
<ul class="sub-nav-group">
<li><a href="?tv&genre=20">Classic TV</a></li>
<li><a href="?tv&genre=21">Crime TV</a></li>
<li>…</li>
</ul>
<ul class="sub-nav-group">
<li><a href="?tv&genre=27">Reality TV</a></li>
<li><a href="?tv&genre=30">TV Action</a></li>
<li>…</li>
</ul>
<ul class="sub-nav-group">
<li><a href="?tv&genre=33">TV Dramas</a></li>
<li><a href="?tv&genre=34">TV Horror</a></li>
<li>…</li>
</ul>
</div>
</li>
</ul>
</nav>
HTMLすべて
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Simple Accessible Mega Menu Example</title>
<style>
/* Rudimentary mega menu CSS for demonstration */
/* mega menu list */
.nav-menu {
display: block;
position: relative;
list-style: none;
margin: 0;
padding: 0;
z-index: 15;
}
/* a top level navigation item in the mega menu */
.nav-item {
list-style: none;
display: inline-block;
padding: 0;
margin: 0;
}
/* first descendant link within a top level navigation item */
.nav-item > a {
position: relative;
display: inline-block;
padding: 0.5em 1em;
margin: 0 0 -1px 0;
border: 1px solid transparent;
}
/* focus/open states of first descendant link within a top level
navigation item */
.nav-item > a:focus,
.nav-item > a.open {
border: 1px solid #dedede;
}
/* open state of first descendant link within a top level
navigation item */
.nav-item > a.open {
background-color: #fff;
border-bottom: none;
z-index: 1;
}
/* sub-navigation panel */
.sub-nav {
position: absolute;
display: none;
top: 2.2em;
margin-top: -1px;
padding: 0.5em 1em;
border: 1px solid #dedede;
background-color: #fff;
}
/* sub-navigation panel open state */
.sub-nav.open {
display: block;
}
/* list of items within sub-navigation panel */
.sub-nav ul {
display: inline-block;
vertical-align: top;
margin: 0 1em 0 0;
padding: 0;
}
/* list item within sub-navigation panel */
.sub-nav li {
display: block;
list-style-type: none;
margin: 0;
padding: 0;
}
</style>
</head>
<body>
<nav>
<ul class="nav-menu">
<li class="nav-item">
<a href="?movie">Movies</a>
<div class="sub-nav">
<ul class="sub-nav-group">
<li><a href="?movie&genre=0">Action & Adventure</a></li>
<li><a href="?movie&genre=2">Children & Family</a></li>
<li>…</li>
</ul>
<ul class="sub-nav-group">
<li><a href="?movie&genre=7">Dramas</a></li>
<li><a href="?movie&genre=9">Foreign</a></li>
<li>…</li>
</ul>
<ul class="sub-nav-group">
<li><a href="?movie&genre=14">Musicals</a></li>
<li><a href="?movie&genre=15">Romance</a></li>
<li>…</li>
</ul>
</div>
</li>
<li class="nav-item">
<a href="?tv">TV Shows</a>
<div class="sub-nav">
<ul class="sub-nav-group">
<li><a href="?tv&genre=20">Classic TV</a></li>
<li><a href="?tv&genre=21">Crime TV</a></li>
<li>…</li>
</ul>
<ul class="sub-nav-group">
<li><a href="?tv&genre=27">Reality TV</a></li>
<li><a href="?tv&genre=30">TV Action</a></li>
<li>…</li>
</ul>
<ul class="sub-nav-group">
<li><a href="?tv&genre=33">TV Dramas</a></li>
<li><a href="?tv&genre=34">TV Horror</a></li>
<li>…</li>
</ul>
</div>
</li>
</ul>
</nav>
<!-- include jquery -->
<script src="//code.jquery.com/jquery-1.10.1.min.js"></script>
<!-- include the jquery-accessibleMegaMenu plugin script -->
<script src="js/jquery-accessibleMegaMenu.js"></script>
<!-- initialize a selector as an accessibleMegaMenu -->
<script>
$("nav:first").accessibleMegaMenu({
/* prefix for generated unique id attributes, which are required
to indicate aria-owns, aria-controls and aria-labelledby */
uuidPrefix: "accessible-megamenu",
/* css class used to define the megamenu styling */
menuClass: "nav-menu",
/* css class for a top-level navigation item in the megamenu */
topNavItemClass: "nav-item",
/* css class for a megamenu panel */
panelClass: "sub-nav",
/* css class for a group of items within a megamenu panel */
panelGroupClass: "sub-nav-group",
/* css class for the hover state */
hoverClass: "hover",
/* css class for the focus state */
focusClass: "focus",
/* css class for the open state */
openClass: "open"
});
</script>
</body>
</html>
サンプル
実際に、ここのページで使用されています。
http://adobe-accessibility.github.io/Accessible-Mega-Menu/
関連
WebアクセシビリティJIS X 8341-3
記事
https://www.omakase.net/blog/2023/04/webjis-x-8341-3.html
アクセシビリティに配慮したクロスブラウザHTML5メディアプレーヤー Able Player
記事
https://www.omakase.net/blog/2023/04/html5-able-player.html
ARIAに対応したjQuery input validation
記事
https://www.omakase.net/blog/2023/05/ariajquery-input-validation.html
アクセシビリティに対応jQueryプラグイン「Accessible Mega Menu」
記事
https://www.omakase.net/blog/2023/07/accessible-mega-menu.html
アクセシビリティに対応したSlickの紹介
記事
https://www.omakase.net/blog/2023/07/accessible-slick.html