这叫啥 UI?
← 返回组件目录

COMPONENT 86 · Actions & Menus

菜单栏

Menubar

也叫Menu Bar应用菜单栏文件编辑视图

把应用命令按类别放入持续可见的菜单入口。

Organize application commands into persistent top-level menus.

ANATOMY & USAGE

结构与使用建议

组成部分

  • 顶层菜单
  • 展开菜单
  • 命令反馈

适合使用

  • 文档编辑器、设计工具等有多组命令的应用。

不建议使用

  • 网站页面导航应使用普通导航链接。

键盘与无障碍

  • 左右方向键切换顶层菜单,上下键移动菜单项,Home/End 跳到首尾。
  • Escape 关闭并恢复焦点,Tab 退出菜单栏,顶层只保留一个 Tab 停靠点。

参考 WAI-ARIA · Menu and Menubar ↗核对于 2026-09-05

DESCRIBE IT TO AI

这样告诉编程助手

实现菜单栏(Menubar):把应用命令按类别放入持续可见的菜单入口。

MINIMAL RUNNABLE CODE

可复制代码

原生与 React 两套实现,不依赖第三方组件库。

READ ONLY · SAFE TO COPY
<!doctype html>
<html lang="zh-CN">
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <link rel="stylesheet" href="styles.css" />
  </head>
  <body>
    <section class="modern-demo">
      <div role="menubar" aria-label="编辑器菜单" class="modern-menubar">
        <div role="none">
          <button
            id="trigger-0"
            data-menu-trigger
            role="menuitem"
            aria-haspopup="menu"
            aria-expanded="false"
            aria-controls="popup-0"
            tabindex="0"
          >
            文件
          </button>
          <div
            id="popup-0"
            data-menu-popup
            role="menu"
            aria-labelledby="trigger-0"
            hidden
          >
            <button role="menuitem" tabindex="-1">新建画板</button
            ><button role="menuitem" tabindex="-1">保存副本</button>
          </div>
        </div>
        <div role="none">
          <button
            id="trigger-1"
            data-menu-trigger
            role="menuitem"
            aria-haspopup="menu"
            aria-expanded="false"
            aria-controls="popup-1"
            tabindex="-1"
          >
            编辑
          </button>
          <div
            id="popup-1"
            data-menu-popup
            role="menu"
            aria-labelledby="trigger-1"
            hidden
          >
            <button role="menuitem" tabindex="-1">撤销操作</button
            ><button role="menuitem" tabindex="-1">复制图层</button>
          </div>
        </div>
        <div role="none">
          <button
            id="trigger-2"
            data-menu-trigger
            role="menuitem"
            aria-haspopup="menu"
            aria-expanded="false"
            aria-controls="popup-2"
            tabindex="-1"
          >
            视图
          </button>
          <div
            id="popup-2"
            data-menu-popup
            role="menu"
            aria-labelledby="trigger-2"
            hidden
          >
            <button role="menuitem" tabindex="-1">显示网格</button
            ><button role="menuitem" tabindex="-1">适合窗口</button>
          </div>
        </div>
      </div>
      <p id="status" role="status">选择一个编辑命令</p>
    </section>
    <script src="script.js" defer></script>
  </body>
</html>