CSS Anchor 下拉菜单

使用 CSS Anchor Positioning 实现精准定位的下拉菜单,支持子菜单与自动翻转。

预览
dropdown.demo.tsx
基础下拉菜单
嵌套子菜单

悬停在菜单项上可以看到子菜单。子菜单使用 CSS Anchor 定位到父级菜单项的右侧。

核心特性

1. 精确定位

下拉菜单使用 anchor() 函数精确定位到触发按钮的下方:

style={{
  positionAnchor: anchorName,
  top: 'anchor(bottom)',
  left: 'anchor(left)',
  translate: '0 8px',
  positionTryFallbacks: 'flip-block',
}}

2. 自动翻转

使用 position-try-fallbacks: flip-block 实现自动翻转。当菜单在视口底部溢出时,会自动翻转到按钮上方显示。

3. 嵌套子菜单

子菜单定位到父菜单项的右侧:

style={{
  positionAnchor: `--anchor-submenu-${item.id}`,
  top: 'anchor(top)',
  left: 'anchor(right)',
  translate: '4px 0',
  positionTryFallbacks: 'flip-inline',
}}

4. 点击外部关闭

使用 useEffect 监听点击事件,点击菜单外部时自动关闭。

实现要点

  • 为每个下拉菜单生成唯一的锚点名称
  • 使用 useRef 管理 DOM 引用
  • 通过 transition-all 实现平滑的显示/隐藏动画
  • 支持键盘快捷键显示(可选)
  • 支持危险操作样式(如删除)