显示位于指针处的菜单,由右键点击或长按触发。
import React from 'react';import * as ContextMenu from '@radix-ui/react-context-menu';import { DotFilledIcon, CheckIcon, ChevronRightIcon } from '@radix-ui/react-icons';import './styles.css';const ContextMenuDemo = () => {const [bookmarksChecked, setBookmarksChecked] = React.useState(true);const [urlsChecked, setUrlsChecked] = React.useState(false);const [person, setPerson] = React.useState('pedro');return (<ContextMenu.Root><ContextMenu.Trigger className="ContextMenuTrigger">Right-click here.</ContextMenu.Trigger><ContextMenu.Portal><ContextMenu.Content className="ContextMenuContent" sideOffset={5} align="end"><ContextMenu.Item className="ContextMenuItem">Back <div className="RightSlot">⌘+[</div></ContextMenu.Item><ContextMenu.Item className="ContextMenuItem" disabled>Forward <div className="RightSlot">⌘+]</div></ContextMenu.Item><ContextMenu.Item className="ContextMenuItem">Reload <div className="RightSlot">⌘+R</div></ContextMenu.Item><ContextMenu.Sub><ContextMenu.SubTrigger className="ContextMenuSubTrigger">More Tools<div className="RightSlot"><ChevronRightIcon /></div></ContextMenu.SubTrigger><ContextMenu.Portal><ContextMenu.SubContent className="ContextMenuSubContent" sideOffset={2} alignOffset={-5} ><ContextMenu.Item className="ContextMenuItem">Save Page As… <div className="RightSlot">⌘+S</div></ContextMenu.Item><ContextMenu.Item className="ContextMenuItem">Create Shortcut…</ContextMenu.Item><ContextMenu.Item className="ContextMenuItem">Name Window…</ContextMenu.Item><ContextMenu.Separator className="ContextMenuSeparator" /><ContextMenu.Item className="ContextMenuItem">Developer Tools</ContextMenu.Item></ContextMenu.SubContent></ContextMenu.Portal></ContextMenu.Sub><ContextMenu.Separator className="ContextMenuSeparator" /><ContextMenu.CheckboxItem className="ContextMenuCheckboxItem" checked={bookmarksChecked} onCheckedChange={setBookmarksChecked} ><ContextMenu.ItemIndicator className="ContextMenuItemIndicator"><CheckIcon /></ContextMenu.ItemIndicator>Show Bookmarks <div className="RightSlot">⌘+B</div></ContextMenu.CheckboxItem><ContextMenu.CheckboxItem className="ContextMenuCheckboxItem" checked={urlsChecked} onCheckedChange={setUrlsChecked} ><ContextMenu.ItemIndicator className="ContextMenuItemIndicator"><CheckIcon /></ContextMenu.ItemIndicator>Show Full URLs</ContextMenu.CheckboxItem><ContextMenu.Separator className="ContextMenuSeparator" /><ContextMenu.Label className="ContextMenuLabel">People</ContextMenu.Label><ContextMenu.RadioGroup value={person} onValueChange={setPerson}><ContextMenu.RadioItem className="ContextMenuRadioItem" value="pedro"><ContextMenu.ItemIndicator className="ContextMenuItemIndicator"><DotFilledIcon /></ContextMenu.ItemIndicator>Pedro Duarte</ContextMenu.RadioItem><ContextMenu.RadioItem className="ContextMenuRadioItem" value="colm"><ContextMenu.ItemIndicator className="ContextMenuItemIndicator"><DotFilledIcon /></ContextMenu.ItemIndicator>Colm Tuite</ContextMenu.RadioItem></ContextMenu.RadioGroup></ContextMenu.Content></ContextMenu.Portal></ContextMenu.Root>);};export default ContextMenuDemo;
支持具有可配置阅读方向的子菜单。
支持项目、标签和项目组。
支持可选中项目(单个或多个),并具有可选的不确定状态。
支持模态和非模态模式。
自定义侧边、对齐方式、偏移量、碰撞处理。
焦点得到完全管理。
完整的键盘导航。
支持类型输入。
关闭和分层行为高度可定制。
在触摸设备上通过长按触发
从命令行安装组件。
导入所有部分并将其组合在一起。
遵循菜单 WAI-ARIA 设计模式 并使用循环 Tab 键 来管理菜单项之间的焦点移动。
包含上下文菜单的所有部分。
打开上下文菜单的区域。将其包裹在您希望右键点击(或使用相关键盘快捷键)时打开上下文菜单的目标周围。
使用时,将内容部分传送至body
。
在打开的上下文菜单中弹出的组件。
一个可选的箭头元素,用于渲染在子菜单旁边。这可以用来帮助视觉上将触发项与ContextMenu.Content
关联。必须渲染在ContextMenu.Content
内部。
包含上下文菜单项目的组件。
用于对多个ContextMenu.Item
进行分组。
用于渲染标签。它将无法使用方向键聚焦。
可以像复选框一样控制和渲染的项目。
用于对多个ContextMenu.RadioItem
进行分组。
可以像单选按钮一样控制和渲染的项目。
当父ContextMenu.CheckboxItem
或ContextMenu.RadioItem
被选中时渲染。您可以直接设置此元素的样式,也可以将其用作包装器以放入图标,或者两者兼而有之。
用于在上下文菜单中视觉上分隔项目。
包含子菜单的所有部分。
打开子菜单的项目。必须渲染在ContextMenu.Sub
内部。
子菜单打开时弹出的组件。必须渲染在ContextMenu.Sub
内部。
您可以通过结合使用ContextMenu.Sub
及其各个部分来创建子菜单。
您可以通过data-disabled
属性为禁用项添加特殊样式。
使用Separator
部分在项目之间添加分隔符。
使用Label
部分帮助标记某个部分。
使用CheckboxItem
部分添加可以勾选的项目。
使用RadioGroup
和RadioItem
部分添加可以在其他项目中勾选的项目。
您可以在Item
部分中添加额外的装饰元素,例如图像。
您可能希望约束内容(或子内容)的宽度,使其与触发器(或子触发器)的宽度匹配。您可能还想约束其高度,使其不超过视口。
我们公开了几个 CSS 自定义属性,例如--radix-context-menu-trigger-width
和--radix-context-menu-content-available-height
来支持这一点。使用它们来约束内容尺寸。
我们公开了一个 CSS 自定义属性--radix-context-menu-content-transform-origin
。使用它根据side
、sideOffset
、align
、alignOffset
和任何碰撞从其计算出的原点为内容设置动画。
我们公开了data-side
和data-align
属性。它们的值将在运行时更改以反映碰撞。使用它们创建碰撞和方向感知动画。
使用漫游 tabindex来管理菜单项之间的焦点移动。