Tailwind CSSTailwind CSS
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
  • 第四章:高级组件

第四章:高级组件

4.3 下拉菜单

概述

下拉菜单(Dropdown)是Web应用中常见的交互组件,用于在有限空间内展示多个操作选项。Shadcn的下拉菜单组件基于Radix UI构建,提供无障碍支持、键盘导航和高度可定制性。

核心特性

  1. 无障碍设计
    • 符合WAI-ARIA标准
    • 支持键盘操作(↑/↓键导航,Enter键确认)
  2. 动画效果
    • 内置平滑展开/收起动画
    • 支持自定义过渡效果
  3. 灵活定位
    • 自动检测视窗边界
    • 支持top/bottom/left/right等12种定位方式

基础用法

import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem } from "@/components/ui/dropdown-menu";

export function BasicDropdown() {
  return (
    <DropdownMenu>
      <DropdownMenuTrigger asChild>
        <button className="p-2 border rounded-md">Actions</button>
      </DropdownMenuTrigger>
      <DropdownMenuContent>
        <DropdownMenuItem>Edit</DropdownMenuItem>
        <DropdownMenuItem>Delete</DropdownMenuItem>
        <DropdownMenuItem disabled>Share</DropdownMenuItem>
      </DropdownMenuContent>
    </DropdownMenu>
  );
}

进阶功能

1. 带图标的菜单项

<DropdownMenuItem>
  <FileEdit className="mr-2 h-4 w-4" />
  <span>Edit Document</span>
</DropdownMenuItem>

2. 分组菜单

<DropdownMenuGroup>
  <DropdownMenuLabel>Actions</DropdownMenuLabel>
  <DropdownMenuItem>Save</DropdownMenuItem>
  <DropdownMenuSeparator />
  <DropdownMenuLabel>Danger Zone</DropdownMenuLabel>
  <DropdownMenuItem className="text-red-600">Delete</DropdownMenuItem>
</DropdownMenuGroup>

3. 受控状态管理

const [open, setOpen] = useState(false);

<DropdownMenu open={open} onOpenChange={setOpen}>
  {/* ... */}
</DropdownMenu>

样式定制

通过Tailwind CSS或CSS变量自定义样式:

<DropdownMenuContent className="min-w-[200px] bg-popover shadow-lg rounded-lg">
  <DropdownMenuItem className="hover:bg-accent/50">
    {/* ... */}
  </DropdownMenuItem>
</DropdownMenuContent>

最佳实践

  1. 移动端适配
    • 添加触摸事件支持
    • 确保点击区域不小于48×48px
  2. 性能优化
    • 动态加载菜单内容(对于大型菜单)
    • 使用React.memo优化子组件
  3. 可访问性
    • 始终提供文本标签
    • 支持ESC键关闭菜单

常见问题解决

Q: 菜单在滚动容器中定位不准?
A: 使用DropdownMenuPortal包裹Content组件:

<DropdownMenu>
  <DropdownMenuTrigger>Open</DropdownMenuTrigger>
  <DropdownMenuPortal>
    <DropdownMenuContent>
      {/* ... */}
    </DropdownMenuContent>
  </DropdownMenuPortal>
</DropdownMenu>

Q: 如何实现多级嵌套菜单?
A: 组合使用DropdownMenuSub相关组件:

<DropdownMenuSub>
  <DropdownMenuSubTrigger>More Options</DropdownMenuSubTrigger>
  <DropdownMenuPortal>
    <DropdownMenuSubContent>
      <DropdownMenuItem>Sub Item 1</DropdownMenuItem>
    </DropdownMenuSubContent>
  </DropdownMenuPortal>
</DropdownMenuSub>

扩展阅读

  • Radix Dropdown Menu文档
  • WAI-ARIA Menu Button设计模式
  • 移动端下拉菜单交互设计指南
Last Updated:: 7/26/25, 10:02 PM