用于浏览网站的链接集合。
import * as React from "react";import { NavigationMenu } from "radix-ui";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 RadixPrimitives.</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
和活动样式。
有关与第三方路由组件一起使用的更多信息,请参见 此示例。