构建无障碍组件之Menu and Menubar Pattern
æå»ºæ éç¢ç»ä»¶ä¹Menu and Menubar Pattern
anOnion 2026-08-18 0 é 读13åéMenu and Menubar Pattern è¯¦è§£ï¼æä¹ åèåæ çæ éç¢å®ç°
Menuï¼èåï¼ä¸ Menubarï¼èåæ ï¼æ¯æ¡é¢åºç¨ä¸æç»å ¸ç交äºç»ä»¶ä¹ä¸ãæ¬æåºäº W3C WAI-ARIA Menu and Menubar Pattern è§èï¼è¯¦è§£ Menu/Menubar çè¯ä¹ç»æã夿çé®çäº¤äºæ¨¡å䏿 éç¢å®ç°è¦ç¹ã
ä¸ãMenu ä¸ Menubar çå®ä¹ä¸æ ¸å¿æ¦å¿µ
1.1 ä»ä¹æ¯ Menu å Menubar
Menu æ¯ä¸ç§åç¨æ·æä¾ä¸ç»é项ï¼å¦æä½æåè½ï¼çç»ä»¶ï¼è¡ä¸ºç±»ä¼¼æä½ç³»ç»åçèåãMenubar æ¯è§è§ä¸æä¹ åå¨ç Menuï¼é常水平æåï¼ç±»ä¼¼æ¡é¢åºç¨çªå£é¡¶é¨çèåæ ã
两è çå ³é®åºå«ï¼
| æ¦å¿µ | å¯è§æ§ | å ¸åæå | è§¦åæ¹å¼ |
|---|---|---|---|
| Menu | ä¸´æ¶æ¾ç¤º | åç´ | Menu Buttonãåèåãå¿«æ·é® |
| Menubar | æä¹ å¯è§ | æ°´å¹³ | Tab é®è¿å ¥ |
è§è约å®ï¼å¦æèå项伿å¼å¯¹è¯æ¡ï¼é叏卿 ç¾åéå "â¦â¦"ï¼çç¥å·ï¼ï¼ä¾å¦
Save Asâ¦ã
1.2 æ ¸å¿æ¯è¯
| æ¯è¯ | 说æ |
|---|---|
| Menubar | æä¹ å¯è§çèå容å¨ï¼é常水平æå |
| Menu | ä¸´æ¶æ¾ç¤ºçèå容å¨ï¼é常åç´æå |
| Menu Item | èåä¸çä¸ä¸ªå¯é项 |
| Parent Menu Item | æ¥æåèåçèå项 |
| Submenu | ä»ç¶èå项å±å¼çåèåï¼role 为 menuï¼ |
| Separator | èåä¸çåé线ï¼ä¸å¯èç¦ï¼ä¸å¯äº¤äº |
1.3 ä¸ Menu Button çå ³ç³»
Menu Button Pattern æè¿°çæ¯"æé®è§¦åèå"çåºæ¯ï¼è Menu and Menubar Pattern æè¿°çæ¯èåæ¬èº«çç»æå交äºã两è
å
±äº«ç¸åçè§è²ï¼menuãmenuitemï¼ååèå交äºé»è¾ï¼åºå«å¨äºå
¥å£æ¹å¼ï¼
- Menu Button â æå¼ä¸ä¸ª
menuï¼ä¸´æ¶æ¾ç¤ºï¼ - Menubar â æ¬èº«å°±æ¯æä¹ å¯è§çèå容å¨
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â Menubar (persistent) â
â â
â ââââââââââ¬âââââââââ¬âââââââââ¬âââââââââ â
â â File â Edit â View â Help â â
â ââââââââââ´âââââââââ´âââââââââ´âââââââââ â
â | â
â v Down Arrow â
â â
â âââââââââââââââââââââââââââââââââââ â
â â New â â
â â Open â â
â â Save â â
â â Save As... â â
â â âââââââââââââââââââââââââââââ â â
â â Print â â
â â Exit â â
â âââââââââââââââââââââââââââââââââââ â
â â
â Menu (temporary, opened from menubar) â
â â
â Left/Right: Navigate Menubar â
â Down/Enter: Open Submenu â
â Up/Down: Navigate Menu Items â
â Esc: Close Menu â
â â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
1.4 å ¸ååºç¨åºæ¯
- ç¼è¾å¨èåæ ï¼ææ¡£ç¼è¾å¨é¡¶é¨ç File / Edit / View / Help èå
- ç½ç«å¯¼èªèåæ ï¼ç½ç«çæä¹ å导èªï¼æ¯ä¸ªèå项å¯å±å¼åèå
- ä¸ä¸æèåï¼éè¿
Shift + F10ï¼Windowsï¼çå¿«æ·é®è§¦åçå³é®èå - 坿æ¬ç¼è¾å¨æ ¼å¼èåï¼å å«å¤éæ¡ï¼å¦ Boldï¼ååé项ï¼å¦ Align Left/Center/Rightï¼çåèå
äºãARIA è§è²ä¸å±æ§
2.1 è§è²ç»æ
| è§è² | 说æ |
|---|---|
role="menubar" | æä¹ å¯è§çèåæ å®¹å¨ |
role="menu" | ä¸´æ¶æ¾ç¤ºçèå容å¨ï¼å«åèåï¼ |
role="menuitem" | æ®éèå项 |
role="menuitemcheckbox" | å¯å¾éçèå项 |
role="menuitemradio" | åéèå项 |
role="separator" | èååé线ï¼ä¸å¯èç¦ï¼ |
2.2 容å¨å±æ§
| 屿§ | åå¼ | 说æ |
|---|---|---|
aria-labelledby | ID å¼ç¨ | Menubar çå¯è®¿é®åç§°ï¼å¼ç¨å¯è§æ ç¾ï¼ |
aria-label | å符串 | Menubar çå¯è®¿é®åç§°ï¼æ å¯è§æ ç¾æ¶ä½¿ç¨ï¼ |
aria-orientation | horizontal / vertical | Menubar é»è®¤ horizontalï¼Menu é»è®¤ vertical |
注æï¼
menubarçaria-orientationé»è®¤æ¯horizontalï¼èmenuçé»è®¤æ¯verticalã妿æåæ¹åä¸é»è®¤ä¸åï¼å¿ é¡»æ¾å¼å£°æã
2.3 èå项屿§
ç¶èåé¡¹ï¼æ¥æåèåï¼ï¼
| 屿§ | å¼ | 说æ |
|---|---|---|
aria-haspopup | menu æ true | å£°ææ¤é¡¹å¯æå¼åèå |
aria-expanded | true / false | åèåçå±å¼ç¶æ |
å¤éæ¡ä¸åéèå项ï¼
| 屿§ | å¼ | 说æ |
|---|---|---|
aria-checked | true / false | éä¸ç¶æ |
ç¦ç¨èå项ï¼
| 屿§ | å¼ | 说æ |
|---|---|---|
aria-disabled | true | ç¦ç¨ç¶æï¼ä»å¯èç¦ï¼ä½ä¸å¯æ¿æ´»ï¼ |
2.4 åç»ä¸åé
menuitemradio åç»å
åªè½æä¸é¡¹éä¸ãè§èè¦æ±ç¨ separator åéä¸åç»ï¼
<li
role="menuitemradio"
aria-checked="true">
Left
</li>
<li
role="menuitemradio"
aria-checked="false">
Center
</li>
<li
role="menuitemradio"
aria-checked="false">
Right
</li>
<li role="separator"></li>
<li role="menuitem">Customizeâ¦</li>
Separator ç aria-orientation åºä¸å
¶è§è§æ¹åä¸è´ï¼æ°´å¹³åé线设 horizontalï¼åç´è®¾ verticalï¼ã
2.5 é DOM åå ç´
å¦æä½¿ç¨ aria-owns å°é DOM åå
ç´ çº³å
¥èåï¼è¿äºå
ç´ ä¼æå¼ç¨é¡ºåºæåå¨ DOM åå
ç´ ä¹åãç¦ç¹ç®¡çèæ¬éç¡®ä¿è§è§ç¦ç¹é¡ºåºä¸è¾
婿æ¯çé
读顺åºä¸è´ã
ä¸ãé®ç交äºè§è
Menu/Menubar çé®çäº¤äºæ¯ææ ARIA Pattern 䏿夿çä¹ä¸ï¼å 为æ¶å水平导èªï¼Menubar å ï¼ååç´å¯¼èªï¼Menu å ï¼ä¸¤ä¸ªç»´åº¦ï¼ä»¥ååèåçå±å¼/æ¶èµ·ã
3.1 ç¦ç¹è¿å ¥è¡ä¸º
Tab / Shift + Tab è¿å ¥ Menubarï¼
- 馿¬¡è¿å
¥ï¼ç¦ç¹è½å¨ç¬¬ä¸ä¸ª
menuitem - 忬¡è¿å
¥ï¼ç¦ç¹å¯éå°è½å¨ä¸æ¬¡è·å¾ç¦ç¹ç
menuitemï¼å¦åè½å¨ç¬¬ä¸ä¸ªæªç¦ç¨çmenuitem
注æï¼Tab/Shift+Tab ä¸ä¼è¿å ¥
menuï¼ä¸´æ¶èåï¼ãmenuæå¼æ¶ï¼ä½è éç¡®ä¿ç¦ç¹èªå¨ç§»å°èåå 第ä¸ä¸ªé¡¹ã
Tab / Shift + Tab 离å¼ï¼
- ç¦ç¹å¨
menuæmenubarå æ¶ï¼Tab/Shift+Tab ç§»åºæ´ä¸ªèåï¼å¹¶å ³éææå·²æå¼çèåååèåã
3.2 Menubar å é¨å¯¼èªï¼æ°´å¹³ï¼
| æé® | è¡ä¸º |
|---|---|
| â | ç¦ç¹ç§»å°ä¸ä¸ä¸ªèå项ï¼å¯é循ç¯ï¼ |
| â | ç¦ç¹ç§»å°ä¸ä¸ä¸ªèå项ï¼å¯é循ç¯ï¼ |
| Home | ç¦ç¹ç§»å°ç¬¬ä¸ä¸ªèå项ï¼ä¸æ¯æå¾ªç¯æ¶ï¼ |
| End | ç¦ç¹ç§»å°æåä¸ä¸ªèå项ï¼ä¸æ¯æå¾ªç¯æ¶ï¼ |
3.3 åèåæä½
| æé® | ç¦ç¹ä½ç½® | è¡ä¸º |
|---|---|---|
| â | Menubar èå项 | æå¼åèåï¼ç¦ç¹ç§»å°ç¬¬ä¸ä¸ªåèå项 |
| â | Menu å | ç¦ç¹ç§»å°ä¸ä¸é¡¹ï¼å¯é循ç¯ï¼ |
| â | Menu å | ç¦ç¹ç§»å°ä¸ä¸é¡¹ï¼å¯é循ç¯ï¼ |
| â | Menubar èå项 | ï¼å¯éï¼æå¼åèåï¼ç¦ç¹ç§»å°æåä¸ä¸ªåèå项 |
| â | Menu å æåèå | æå¼åèåï¼ç¦ç¹ç§»å°ç¬¬ä¸ä¸ªåèå项 |
| â | Menu å æ åèå | å ³éå½ååèååç¶èåï¼ç¦ç¹ç§»å° Menubar ä¸ä¸é¡¹ |
| â | åèåå | å ³éåèåï¼ç¦ç¹åå°ç¶èå项 |
| â | Menubar å | ç¦ç¹ç§»å°ä¸ä¸ä¸ªèå项 |
| Enter | æåèåç项 | æå¼åèåï¼ç¦ç¹ç§»å°ç¬¬ä¸ä¸ªåèå项 |
| Enter | æ åèåç项 | æ¿æ´»è¯¥é¡¹ï¼å ³éèå |
| Space | menuitemcheckbox | ï¼å¯éï¼åæ¢éä¸ç¶æï¼ä¸å ³éèå |
| Space | menuitemradio | ï¼å¯éï¼éä¸è¯¥é¡¹ï¼ä¸å ³éèå |
| Esc | èåå | å ³éå½åèåï¼ç¦ç¹åå°è§¦åæºï¼æé®æç¶èåé¡¹ï¼ |
3.4 â é®çæ åèå忝ï¼å ³é®ç»èï¼
å½ç¦ç¹å¨åèåä¸ä¸ä¸ªæ åèåç项䏿 â æ¶ï¼æ§è¡ä¸æ¥æä½ï¼
- å ³éå½ååèååææç¶èå
- ç¦ç¹ç§»å° Menubar çä¸ä¸ä¸ªèå项
- 妿æ°çç¦ç¹é¡¹æåèåï¼ï¼æ¨èï¼ æå¼å ¶åèåä½ç¦ç¹ä¿æå¨ Menubar 项ä¸ï¼ææå¼åèåå¹¶å°ç¦ç¹ç§»å°ç¬¬ä¸ä¸ªåèå项
å¦ææ²¡æ Menubarï¼å¦ä» Menu Button æå¼çèåï¼ï¼
â卿 åèå项ä¸ä¸å任使ä½ã
3.5 â é®çåèå忝ï¼å ³é®ç»èï¼
å½ç¦ç¹å¨ Menubar æé¡¹çåèåå
æ â æ¶ï¼æ§è¡ä¸æ¥æä½ï¼
- å ³éåèå
- ç¦ç¹ç§»å° Menubar çä¸ä¸ä¸ªèå项
- 妿æ°çç¦ç¹é¡¹æåèåï¼ï¼æ¨èï¼ æå¼å ¶åèåä½ç¦ç¹ä¿æå¨ Menubar 项ä¸ï¼ææå¼åèåå¹¶å°ç¦ç¹ç§»å°ç¬¬ä¸ä¸ªåèå项
3.6 å ¶ä»æé®
| æé® | è¡ä¸º |
|---|---|
| åæ¯é® | ï¼å¯éï¼ç¦ç¹ç§»å°ä¸ä¸ä¸ªä»¥è¯¥å符å¼å¤´çèå项 |
| Esc | å ³éèåï¼ç¦ç¹åå°è§¦åæº |
3.7 åç´æåçæ¹å交æ¢
妿 Menubar æ¯åç´æåï¼æ Menu æ¯æ°´å¹³æåï¼æ¹åé®è¯ä¹äºæ¢ï¼
âæ§è¡âçé»è¾ï¼åä¹äº¦ç¶âæ§è¡âçé»è¾ï¼åä¹äº¦ç¶
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â Vertical Menubar â
â â
â ââââââââââ â
â â File â â
â âââââââââ⤠â
â â Edit â <- Up/Down navigates menubar â
â âââââââââ⤠<- Left/Right opens/closes submenu â
â â View â â
â âââââââââ⤠â
â â Help â â
â ââââââââââ â
â â
â aria-orientation: "vertical" â
â â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
åãå®ç°æ¹å¼
4.1 åºç¡ Menubar ç»æ
<span
id="app-label"
class="sr-only"
>Editor Menu</span
>
<ul
role="menubar"
aria-labelledby="app-label">
<li
role="menuitem"
tabindex="0">
File
</li>
<li
role="menuitem"
tabindex="-1">
Edit
</li>
<li
role="menuitem"
tabindex="-1">
View
</li>
<li
role="menuitem"
tabindex="-1">
Help
</li>
</ul>
漫游ç¦ç¹æ¹æ¡ï¼Menubar 第ä¸é¡¹
tabindex="0"ï¼å ¶ä½é¡¹tabindex="-1"ãå¯¼èªæ¶å¨ææ´æ° tabindex æç´æ¥è°ç¨element.focus()ã
4.2 带åèåç Menubar ç»æ
<ul
role="menubar"
aria-label="Editor">
<!-- File èå -->
<li
role="menuitem"
tabindex="0"
aria-haspopup="true"
aria-expanded="false">
File
<!-- åèåå¿
é¡»å¨ DOM ä¸ç´§è·ç¶èå项ï¼ä½ä¸ºå
¶å
å¼å
ç´ -->
<ul
role="menu"
aria-label="File">
<li
role="menuitem"
tabindex="-1">
New
</li>
<li
role="menuitem"
tabindex="-1">
Openâ¦
</li>
<li
role="menuitem"
tabindex="-1">
Save
</li>
<li
role="menuitem"
tabindex="-1"
aria-haspopup="true"
aria-expanded="false">
Save As
<!-- åµå¥åèå -->
<ul
role="menu"
aria-label="Save As">
<li
role="menuitem"
tabindex="-1">
Projectâ¦
</li>
<li
role="menuitem"
tabindex="-1">
Fileâ¦
</li>
</ul>
</li>
<li role="separator"></li>
<li
role="menuitem"
tabindex="-1">
Exit
</li>
</ul>
</li>
<!-- Edit èå -->
<li
role="menuitem"
tabindex="-1"
aria-haspopup="true"
aria-expanded="false">
Edit
<ul
role="menu"
aria-label="Edit">
<li
role="menuitem"
tabindex="-1">
Undo
</li>
<li
role="menuitem"
tabindex="-1">
Redo
</li>
</ul>
</li>
</ul>
åèå DOM ç»æç强å¶è¦æ±ï¼
- åèåç
menuå ç´ å¿ é¡»å å«å¨ç¶menuå ç´ å - åèå
menuå¿ é¡»æ¯å ¶ç¶menuitemçç´§éçå å¼å ç´ ï¼DOM 顺åºï¼ - ç¶
menuitemå¿ é¡»è®¾ç½®aria-haspopup="menu"æaria-haspopup="true"
4.3 å¤éæ¡ä¸åéèå项
<!-- View èåï¼å¤éæ¡èå项 -->
<li
role="menuitem"
tabindex="-1"
aria-haspopup="true"
aria-expanded="false">
View
<ul
role="menu"
aria-label="View">
<li
role="menuitemcheckbox"
tabindex="-1"
aria-checked="true">
Show Ruler
</li>
<li
role="menuitemcheckbox"
tabindex="-1"
aria-checked="false">
Show Grid
</li>
<li role="separator"></li>
<!-- åéç» -->
<li
role="menuitemradio"
tabindex="-1"
aria-checked="true">
Left
</li>
<li
role="menuitemradio"
tabindex="-1"
aria-checked="false">
Center
</li>
<li
role="menuitemradio"
tabindex="-1"
aria-checked="false">
Right
</li>
</ul>
</li>
4.4 ç¦ç¹ç®¡çï¼ä¸¤ç§æ¹æ¡
| æ¹æ¡ | å®ç° | ä¼ç¹ | ç¼ºç¹ |
|---|---|---|---|
| 漫游 DOM ç¦ç¹ | æ¯æ¬¡å¯¼èªæ focus() ç§»å°ç®æ èå项 | å®ç°ç´è§ï¼å ¼å®¹æ§æå¥½ | ç¦ç¹é¢ç¹ç§»å¨å¯è½è§¦åé¢å¤æ»å¨ |
aria-activedescendant | 容卿æ DOM ç¦ç¹ï¼éè¿å±æ§æåå½å"æ´»å¨èå项" | é¿å ç¦ç¹ç§»å¨å¼éï¼éåå¤æå®¹å¨ | éä¿è¯å®¹å¨æ tabindex ä¸ id å¼ç¨æ£ç¡® |
4.5 纯 HTML å®ç°ï¼Popover API çè¾¹ç
HTML Popover APIï¼popover 屿§ + popovertargetï¼æ¯ 2023 å¹´æ°å¢çåçè½åï¼è®¸å¤ UI åºï¼å¦ daisyUI Megamenuï¼å·²éç¨ï¼
<button popovertarget="file-menu">File</button>
<div
id="file-menu"
popover>
<ul>
<li><a href="/new">New</a></li>
<li><a href="/open">Open</a></li>
</ul>
</div>
Popover API æä¾çè½åï¼
| è½å | æ¯æ | Menu Pattern è¦æ± |
|---|---|---|
| 触å/æ¾é | â 声æå¼ | æ è¦æ± |
| Esc å ³é | â å ç½® | â å¿ é¡» |
| ç¹å»å¤é¨å ³é | â light dismiss | æªæç¡®è¦æ± |
role="menubar" / role="menu" | â 缺失 | â å¿ é¡» |
role="menuitem" | â ç¨ <button>/<a> | â å¿ é¡» |
| æ¹åé®å¯¼èª | â 䏿¯æ | â å¿ é¡» |
aria-haspopup / aria-expanded | â æªè®¾ç½® | â ç¶é¡¹å¿ é¡» |
ç»è®ºï¼Popover API æ¹æ¡é¨åç¬¦åæ åãæ¯å¦å¯æ¥ååå³äºç¨éï¼
- 导èªåèåï¼å¦ç½ç« Megamenuï¼å
容æ¯é¾æ¥ï¼ï¼Popover API 坿¥åãW3C ä¸å¼ºå¶å¯¼èªèåä½¿ç¨ Menu Patternï¼ç¨
<nav>+<ul>+<a>ä¹è½å®ç°å¯è®¿é®çå¯¼èª - åºç¨åèåï¼å¦ç¼è¾å¨ File/Edit/Viewï¼å 容æ¯å½ä»¤+å¿«æ·é®ï¼ï¼ä¸ç¬¦åæ åãç¼ºå°æ¹åé®å¯¼èªå ARIA èåè¯ä¹ï¼å±å¹é 读å¨ç¨æ·æ æ³è·å¾"èå"çå¿æºæ¨¡å
äºãæä½³å®è·µä¸å¸¸è§é误
5.1 åèå DOM ç»æé误
<!-- â é误ï¼åèå䏿¯ç¶ menuitem çå
å¼å
ç´ -->
<li
role="menuitem"
aria-haspopup="true">
File
</li>
<ul role="menu">
<!-- ç ´åäºå
å¼å
³ç³» -->
<li role="menuitem">New</li>
</ul>
<!-- â
æ£ç¡®ï¼åèåç´§è·ç¶ menuitemï¼ä½ä¸ºå
¶å
å¼å
ç´ -->
<li
role="menuitem"
aria-haspopup="true"
aria-expanded="false">
File
<ul role="menu">
<li role="menuitem">New</li>
</ul>
</li>
5.2 Tab é®å¨èå项é´ç§»å¨
<!-- â éè¯¯ï¼ææèå项é½è®¾ tabindex="0" -->
<li
role="menuitem"
tabindex="0">
File
</li>
<li
role="menuitem"
tabindex="0">
Edit
</li>
<!-- Tab ä¼åå¨è¿é -->
<!-- â
æ£ç¡®ï¼ä»
Menubar é¦é¡¹ tabindex="0" -->
<li
role="menuitem"
tabindex="0">
File
</li>
<li
role="menuitem"
tabindex="-1">
Edit
</li>
<!-- Tab ç´æ¥è·³è¿ -->
Menu/Menubar æ¯å¤åç»ä»¶ï¼Composite Widgetï¼ï¼Tab é®åªç¨äºè¿å ¥/ç¦»å¼æ´ä¸ªç»ä»¶ï¼å é¨å¯¼èªä½¿ç¨æ¹åé®ã
5.3 ç¼ºå° aria-expanded 忥
ç¶èå项å¿
é¡»å§ç»ç»´æ¤åç¡®ç aria-expanded å¼ãåèåå±å¼æ¶è®¾ä¸º trueï¼æ¶èµ·æ¶è®¾ä¸º falseã妿ä»
é CSS æ§å¶æ¾éèä¸åæ¥ ARIA ç¶æï¼å±å¹é
读å¨ç¨æ·æ æ³æç¥åè忝å¦å·²æå¼ã
5.4 ç¦ç¨é¡¹ä¸å¯èç¦
<!-- â é误ï¼ä½¿ç¨ disabled 屿§å¯¼è´ä¸å¯èç¦ -->
<li
role="menuitem"
disabled>
Save
</li>
<!-- â
æ£ç¡®ï¼ä½¿ç¨ aria-disabledï¼ä¿æå¯èç¦ -->
<li
role="menuitem"
aria-disabled="true">
Save
</li>
è§èæç¡®è¦æ±ï¼ç¦ç¨èå项åºå¯èç¦ä½ä¸å¯æ¿æ´»ãä½¿ç¨ aria-disabled="true" èé HTML disabled 屿§ï¼åè
ä¼å°å
ç´ ä» Tab åºåä¸å®å
¨ç§»é¤ã
5.5 Separator ä¸å¯èç¦
separator è§è²çå
ç´ ä¸å¯èç¦ï¼ä¸å¯äº¤äºãä¸è¦ç» separator 设置 tabindexï¼ä¹ä¸è¦ç»å®äºä»¶ãå®çå¯ä¸ä½ç¨æ¯è§è§åéåè¯ä¹åç»ã
5.6 æ¹å鮿ª preventDefault
æ¹åé®å¨èåå
å¿
é¡»è°ç¨ e.preventDefault()ï¼å¦åä¼è§¦å页颿»å¨ãè¿å¨æ°´å¹³ Menubar ä¸å°¤ä¸ºå
³é®âââ/â 卿µè§å¨ä¸å¯è½æåå²å¯¼èªçé»è®¤è¡ä¸ºã
5.7 Esc ç¦ç¹æ¢å¤
æ Esc å
³éèåæ¶ï¼ç¦ç¹å¿
é¡»åå°è§¦åæºï¼
- ä» Menubar æå¼çåèå â ç¦ç¹åå° Menubar ä¸çç¶èå项
- ä» Menu Button æå¼çèå â ç¦ç¹åå°è§¦åæé®
- éè¿å¿«æ·é®ï¼å¦
Shift + F10ï¼æå¼çä¸ä¸æèå â ç¦ç¹åå°è°ç¨ä¸ä¸æï¼å¦ç¼è¾å¨ï¼
5.8 导èªèåæ çç¹æ®çº¦å®
è§èæåºï¼å¯¼èªå Menubar å¯è½åå¨ä¸ç§ç¹æ®è®¾è®¡ï¼menuitem æ¢æ§è¡å¯¼èªåæå¼åèåãå¨è¿ç§å®ç°ä¸ï¼
Enter/Spaceï¼æ§è¡å¯¼èªåè½ï¼å¦å è½½æ°å 容ï¼âï¼æ°´å¹³ Menubarï¼ï¼æå¼è¯¥é¡¹çåèå
è§è建议尽éé¿å è¿ç§è®¾è®¡ï¼å ä¸ºå®æç ´äºèå项ç常è§äº¤äºé¢æãä½å¦æç¡®å®éè¦ï¼å¡å¿ å¨å¯è§è¯´æä¸åç¥ç¨æ·"æåä¸ç®å¤´æ¥çæ´å¤é项"ã
å ãAgentic æ¶ä»£ Menubar çå®ä½
æè¶£çæ¯ï¼å½å AI åçåºç¨ï¼å¦ ChatGPTãClaudeï¼å ä¹ä¸ä½¿ç¨ Menubarãåå æä¸ï¼
- åè½ä¸å¯æä¸¾ââAI è½åçäºæ¯å¼æ¾çï¼æ æ³ç©·ä¸¾ä¸ºéæèå项
- ç¨æ·æå¾ä¼å ââç¨æ·ç´æ¥æè¿°éæ±ï¼èé"æ¾å°åè½ â ç¹å»"
- åè½å¨å¯¹è¯æµä¸å¨æçæââè忝éæçï¼ä½ AI è¾åºæ¯å¨æç
é£ä¸ºä»ä¹è¿è¦å¦è¿ä¸ª Patternï¼å 为 AI åºç¨æ£å¨ä»"è天æ¡"æ¼å为"坿ä½çåºç¨"ãå½ Agentic å端éè¦æ¸²æ AI çæç夿 UIï¼å¦ DSL æµçæç Dashboardã表åãå·¥å ·æ ï¼æ¶ï¼Menubar ä¼éæ°è·å¾ä»·å¼ââ宿ä¾åè½å¯åç°æ§ï¼discoverabilityï¼ï¼å¸®ç¨æ·ç¥é"è¿ä¸ª AI åºç¨å°åºè½åä»ä¹"ã
æä»¥è¿ç¯å客çå®ä½æ¯åºç¡è®¾æ½ï¼ä¸æ¯"AI åºç¨ç°å¨å¸¸ç¨ Menubar"ï¼èæ¯"AI åºç¨å¤æååä¼éè¦ Menubar"ãAgentic æ¶ä»£ç Menubar ä¼ä»¥å¨æçæçå½¢å¼åºç°ââLLM æ ¹æ®å½åä¸ä¸æçæèå项ï¼èéå¼åè å¨ä»£ç éåæ»ã
ä¸ãæ»ç»
æå»ºæ éç¢ç Menu/Menubar ç»ä»¶éè¦å ³æ³¨ï¼
- è§è²æ¸
æ°ï¼
menubarï¼æä¹ ï¼ vsmenuï¼ä¸´æ¶ï¼ï¼èåé¡¹æ ¹æ®è¯ä¹éæ©menuitem/menuitemcheckbox/menuitemradioã - åèåç»æï¼åèå
menuå¿ é¡»æ¯ç¶menuitemçç´§éå å¼å ç´ ï¼ç¶é¡¹è®¾ç½®aria-haspopupåaria-expandedã - é®ç交äºï¼Menubar ç¨
â/âæ°´å¹³å¯¼èªï¼Menu ç¨â/âåç´å¯¼èªï¼Enter/âæå¼åèåï¼â/Escæ¶èµ·åèåã - Tab ä¸è¿ Menuï¼Tab/Shift+Tab åªè¿å ¥/ç¦»å¼ Menubarï¼Menu æå¼æ¶ç¦ç¹èªå¨ç§»å°å é¨ç¬¬ä¸é¡¹ã
- ç¦ç¹ç®¡çï¼æ¼«æ¸¸ç¦ç¹æ
aria-activedescendantäºéä¸ï¼Menubar é¦é¡¹tabindex="0"ï¼å ¶ä½-1ã - ç¦ç¨é¡¹å¯èç¦ï¼ç¨
aria-disabledèédisabledï¼ä¿æå¯èç¦ä½ä¸å¯æ¿æ´»ã - æ¹å交æ¢ï¼åç´ Menubar ææ°´å¹³ Menu éäº¤æ¢æ¹åé®è¯ä¹ï¼å¹¶è®¾ç½®å¯¹åºç
aria-orientationã
éµå¾ª W3C Menu and Menubar Pattern è§èï¼æä»¬è½å¤å建æ¢ç¬¦åæ¡é¢ç¨æ·ç´è§å满足æ éç¢æ åçèåç»ä»¶ã
æç« åæ¥äº an-Onion ç Githubãç åä¸æï¼æ¬¢è¿ç¹èµã
Aitishiku.com