用于网站导航的一组链接。
import React from 'react';import * as NavigationMenu from '@radix-ui/react-navigation-menu';import classNames from 'classnames';import { CaretDownIcon } from '@radix-ui/react-icons';import './styles.css';const NavigationMenuDemo = () => {return (<NavigationMenu.Root className="NavigationMenuRoot"><NavigationMenu.List className="NavigationMenuList"><NavigationMenu.Item><NavigationMenu.Trigger className="NavigationMenuTrigger">Learn <CaretDownIcon className="CaretDown" aria-hidden /></NavigationMenu.Trigger><NavigationMenu.Content className="NavigationMenuContent"><ul className="List one"><li style={{ gridRow: 'span 3' }}><NavigationMenu.Link asChild><a className="Callout" href="/"><svg aria-hidden width="38" height="38" viewBox="0 0 25 25" fill="white"><path d="M12 25C7.58173 25 4 21.4183 4 17C4 12.5817 7.58173 9 12 9V25Z"></path><path d="M12 0H4V8H12V0Z"></path><path d="M17 8C19.2091 8 21 6.20914 21 4C21 1.79086 19.2091 0 17 0C14.7909 0 13 1.79086 13 4C13 6.20914 14.7909 8 17 8Z"></path></svg><div className="CalloutHeading">Radix Primitives</div><p className="CalloutText">Unstyled, accessible components for React.</p></a></NavigationMenu.Link></li><ListItem href="https://stitches.dev/" title="Stitches">CSS-in-JS with best-in-class developer experience.</ListItem><ListItem href="/colors" title="Colors">Beautiful, thought-out palettes with auto dark mode.</ListItem><ListItem href="https://icons.radix-ui.com/" title="Icons">A crisp set of 15x15 icons, balanced and consistent.</ListItem></ul></NavigationMenu.Content></NavigationMenu.Item><NavigationMenu.Item><NavigationMenu.Trigger className="NavigationMenuTrigger">Overview <CaretDownIcon className="CaretDown" aria-hidden /></NavigationMenu.Trigger><NavigationMenu.Content className="NavigationMenuContent"><ul className="List two"><ListItem title="Introduction" href="/primitives/docs/overview/introduction">Build high-quality, accessible design systems and web apps.</ListItem><ListItem title="Getting started" href="/primitives/docs/overview/getting-started">A quick tutorial to get you up and running with Radix Primitives.</ListItem><ListItem title="Styling" href="/primitives/docs/guides/styling">Unstyled and compatible with any styling solution.</ListItem><ListItem title="Animation" href="/primitives/docs/guides/animation">Use CSS keyframes or any animation library of your choice.</ListItem><ListItem title="Accessibility" href="/primitives/docs/overview/accessibility">Tested in a range of browsers and assistive technologies.</ListItem><ListItem title="Releases" href="/primitives/docs/overview/releases">Radix Primitives releases and their changelogs.</ListItem></ul></NavigationMenu.Content></NavigationMenu.Item><NavigationMenu.Item><NavigationMenu.Link className="NavigationMenuLink" href="https://github.com/radix-ui">Github</NavigationMenu.Link></NavigationMenu.Item><NavigationMenu.Indicator className="NavigationMenuIndicator"><div className="Arrow" /></NavigationMenu.Indicator></NavigationMenu.List><div className="ViewportPosition"><NavigationMenu.Viewport className="NavigationMenuViewport" /></div></NavigationMenu.Root>);};const ListItem = React.forwardRef(({ className, children, title, ...props }, forwardedRef) => (<li><NavigationMenu.Link asChild><a className={classNames('ListItemLink', className)} {...props} ref={forwardedRef}><div className="ListItemHeading">{title}</div><p className="ListItemText">{children}</p></a></NavigationMenu.Link></li>));export default NavigationMenuDemo;
可以是受控或非受控的。
具有管理的选项卡焦点的灵活布局结构。
支持子菜单。
可选的活动项目指示器。
完整的键盘导航。
公开 CSS 变量以进行高级动画。
支持自定义计时。
从命令行安装组件。
导入所有部分并将它们组合在一起。
包含导航菜单的所有部分。
表示子菜单。嵌套时,将其替换为根部分以创建子菜单。
包含顶级菜单项。
顶级菜单项,包含链接或触发器与内容组合。
切换内容的按钮。
包含与每个触发器关联的内容。
导航链接。
一个可选的指示器元素,渲染在列表下方,用于突出显示当前活动的触发器。
一个可选的视口元素,用于在列表外部渲染活动内容。
您可以使用orientation
属性创建垂直菜单。
当您需要额外控制Content
的渲染位置时,请使用Viewport
部分。当您的设计需要调整的 DOM 结构或您需要灵活性来实现高级动画时,这很有帮助。选项卡焦点将自动维护。
您可以使用可选的 Indicator
部分来突出显示当前激活的 Trigger
,这在您想要提供动画视觉提示(例如箭头或高亮)来配合 Viewport
时非常有用。
通过嵌套您的 NavigationMenu
并使用 Sub
部分代替其 Root
来创建子菜单。子菜单的工作方式与 Root
导航菜单不同,并且类似于 Tabs
,因为始终应该有一个项目处于活动状态,因此请确保分配并设置 defaultValue
。
如果您需要使用路由包提供的 Link
组件,那么我们建议通过自定义组件与 NavigationMenu.Link
组合使用。这将确保保持可访问性和一致的键盘控制。以下是一个使用 Next.js 的示例
我们公开了 --radix-navigation-menu-viewport-[width|height]
和 data-motion['from-start'|'to-start'|'from-end'|'to-end']
属性,以便您可以基于进入/退出方向来动画化 Viewport
大小和 Content
位置。
将这些与 position: absolute;
结合使用,您可以在项目之间移动时创建平滑的重叠动画效果。
符合 navigation
角色要求。
NavigationMenu
不应与 menubar
混淆,尽管此基本组件在口语中共享名称 menu
来指代一组导航链接,但它不使用 WAI-ARIA menu
角色。这是因为 menu
和 menubars
的行为类似于最常在桌面应用程序窗口中找到的原生操作系统菜单,因此它们具有复杂的功能,例如复合焦点管理和首字母导航。
这些功能通常被认为 对于网站导航来说是不必要的,最坏的情况可能会让熟悉既定网站模式的用户感到困惑。
请参阅 W3C 的 Disclosure Navigation Menu示例以获取更多信息。
务必对菜单中的所有导航链接使用 NavigationMenu.Link
,这不仅适用于主列表,还适用于通过 NavigationMenu.Content
渲染的任何内容。这将确保一致的键盘交互和可访问性,同时还可以访问 active
属性以设置 aria-current
和活动样式。请参阅 此示例,以获取有关与第三方路由组件一起使用的更多信息。