你设计系统的核心构建块

无样式、无障碍、开源的 React 基础组件,用于高质量的 Web 应用和设计系统。

开始使用

对话框

具有模态和非模态模式,精细的焦点控制,对屏幕阅读器无障碍。

下拉菜单

具有子菜单、可勾选项目、碰撞处理、箭头键导航和类型ahead支持。

弹出框

具有精细的焦点控制、碰撞处理、源感知和碰撞感知动画。

滑块

支持键盘和触摸输入、步进间隔、多滑块用于值范围和 RTL 方向。

滚动区域

支持自定义跨浏览器样式,同时保持浏览器的原生滚动行为。

标签页

支持箭头键导航、水平/垂直方向、受控或非受控。

手风琴

支持同时打开一个或多个项目、键盘导航、折叠和展开动画。

单选按钮组

具有箭头键导航、水平/垂直方向支持、受控或非受控。

切换按钮组

一组可以开启或关闭的双态按钮。支持单个和多个按下的按钮。

开关

允许用户在选中和未选中之间切换。

在文档中查看更多组件查看文档
为什么选择 Radix 基础组件

减少时间花费在
无差异化工作上

节省时间。更快交付。

开发和维护一套强大的 UI 组件 需要花费 大量 时间,而且这大多是无差异化的工作。在 Radix 组件 的基础上构建将为您节省时间和金钱,因此您可以更快地交付更好的产品。

专注于您的产品

众所周知,强大的 UI 组件 很难构建。处理无障碍细节和复杂逻辑会占用产品功能开发的时间。使用 Radix,您可以专注于您独特的工程挑战。

1.3亿+
每月下载量
5500+
Discord 成员
1.3万+
GitHub 星星
案例说明

那么,你认为你可以 构建一个下拉菜单吗?

我们在 API 设计、性能和无障碍方面精益求精,让您无需为此烦恼。

A dropdown menu example with a checked item and a submenu

完整的键盘导航

使用箭头键、Escape 和 Enter 快捷键,甚至通过 typeahead 导航菜单。

模态和非模态模式

配置下拉菜单是否允许或阻止外部交互。

支持子菜单

在下拉菜单内嵌套另一层功能齐全的子菜单。

支持辅助技术

实现正确的语义和行为,使其对使用辅助技术的人员无障碍。

碰撞和源感知动画

创建打开和关闭动画,这些动画会考虑下拉菜单的实际位置。

控制对齐和碰撞

将菜单定位在相对于触发器的任何位置,同时考虑与屏幕的碰撞。

完全管理的焦点

当用户关闭下拉菜单或聚焦外部元素时,精细地控制焦点行为。

支持可勾选项目

项目可以用于执行操作,以及充当复选框或单选按钮控件。

支持辅助技术

开箱即用的无障碍功能

符合 WAI-ARIA 标准

Radix 基础组件 遵循 WAI-ARIA 指南,为我们的组件实现正确的语义和行为。

键盘导航

基础组件 为用户期望使用键盘或其他输入设备的组件提供完整的键盘支持。

焦点管理

基础组件 开箱即用地提供合理的焦点管理默认值,这些默认值可以在您的代码中进一步自定义。

屏幕阅读器测试

我们使用常见的辅助技术测试 基础组件,以找出人们可能遇到的实际问题。

令人喜爱的开发者体验

使用开放、经过深思熟虑的 API 进行开发

我们的主要目标之一是提供尽可能最佳的开发者体验。Radix 基础组件 提供完全类型化的 API。所有组件都共享类似的 API,从而创建一致且可预测的体验。

// Add styles with your preferred CSS technology
const TooltipContent = styled(Tooltip.Content, {
backgroundColor: "black",
borderRadius: "3px",
padding: "5px"
});
const PopoverContent = styled(Popover.Content, {
backgroundColor: "white",
boxShadow: "0 2px 10px -3px rgb(0 0 0 / 20%)",
borderRadius: "3px",
});
const DialogContent = styled(Dialog.Content, {
backgroundColor: "white",
boxShadow: "0 3px 15px -4px rgb(0 0 0 / 30%)",
borderRadius: "5px",
});

无样式

无需覆盖样式,没有特异性冲突。

// Compose a custom Tooltip component
export const StatusTooltip = ({ state, label }) => {
return (
<Tooltip.Root>
<Tooltip.Trigger asChild>
<Text>
<Status variant={state} />
</Text>
</Tooltip.Trigger>
<Tooltip.Portal>
<TooltipContent>
<Tooltip.Arrow />
{label}
</TooltipContent>
</Tooltip.Portal>
</Tooltip.Root>
);
};

可组合

对每个组件部分进行精细访问。

// Compose a Popover with custom focus and positioning
export const StatusPopover = ({ children }) => {
const popoverCloseButton = React.useRef(null);
return (
<Popover.Root>
<Popover.Trigger>View status</Popover.Trigger>
<Popover.Portal>
<PopoverContent align="start" collisionPadding={10} onOpenAutoFocus={(event) => { // Focus the close button when popover opens popoverCloseButton.current?.focus(); event.preventDefault(); }} >
{children}
<Popover.Close ref={popoverCloseButton}>
Close
</Popover.Close>
</PopoverContent>
</Popover.Portal>
</Popover.Root>
);
};

可自定义

配置行为、控制焦点、添加事件监听器。

// Compose a Dialog with custom focus management
export const InfoDialog = ({ children }) => {
const dialogCloseButton = React.useRef(null);
return (
<Dialog.Root>
<Dialog.Trigger>View details</Dialog.Trigger>
<Dialog.Overlay />
<Dialog.Portal>
<DialogContent onOpenAutoFocus={(event) => { // Focus the close button when dialog opens dialogCloseButton.current?.focus(); event.preventDefault(); }} >
{children}
<Dialog.Close ref={dialogCloseButton}>
Close
</Dialog.Close>
</DialogContent>
</Dialog.Portal>
</Dialog.Root>
);
};

一致性

具有相似功能的组件共享类似的 API。

MyComponent.jsx
// Add styles with your preferred CSS technology
const TooltipContent = styled(Tooltip.Content, {
backgroundColor: "black",
borderRadius: "3px",
padding: "5px"
});
const PopoverContent = styled(Popover.Content, {
backgroundColor: "white",
boxShadow: "0 2px 10px -3px rgb(0 0 0 / 20%)",
borderRadius: "3px",
});
const DialogContent = styled(Dialog.Content, {
backgroundColor: "white",
boxShadow: "0 3px 15px -4px rgb(0 0 0 / 30%)",
borderRadius: "5px",
});
// Compose a custom Tooltip component
export const StatusTooltip = ({ state, label }) => {
return (
<Tooltip.Root>
<Tooltip.Trigger asChild>
<Text>
<Status variant={state} />
</Text>
</Tooltip.Trigger>
<Tooltip.Portal>
<TooltipContent>
<Tooltip.Arrow />
{label}
</TooltipContent>
</Tooltip.Portal>
</Tooltip.Root>
);
}; // Compose a Popover with custom focus and positioning
export const StatusPopover = ({ children }) => {
const popoverCloseButton = React.useRef(null);
return (
<Popover.Root>
<Popover.Trigger>View status</Popover.Trigger>
<Popover.Portal>
<PopoverContent align="start" collisionPadding={10} onOpenAutoFocus={(event) => { // Focus the close button when popover opens popoverCloseButton.current?.focus(); event.preventDefault(); }} >
{children}
<Popover.Close ref={popoverCloseButton}>
Close
</Popover.Close>
</PopoverContent>
</Popover.Portal>
</Popover.Root>
);
}; // Compose a Dialog with custom focus management
export const InfoDialog = ({ children }) => {
const dialogCloseButton = React.useRef(null);
return (
<Dialog.Root>
<Dialog.Trigger>View details</Dialog.Trigger>
<Dialog.Overlay />
<Dialog.Portal>
<DialogContent onOpenAutoFocus={(event) => { // Focus the close button when dialog opens dialogCloseButton.current?.focus(); event.preventDefault(); }} >
{children}
<Dialog.Close ref={dialogCloseButton}>
Close
</Dialog.Close>
</DialogContent>
</Dialog.Portal>
</Dialog.Root>
);
};
迁移到 Radix 基础组件

轻松采用

查看文档

增量采用

每个组件都是其自身独立版本化的软件包,因此可以在现有代码旁边添加新组件。无需通过大规模重写来中断功能工作—您可以从小处着手,并逐个添加更多组件。

详细文档和 TypeScript 支持

Radix 文档包含真实世界的示例、广泛的 API 参考、无障碍详细信息和完整的 TypeScript 支持。所有组件都共享类似的 API,从而创建一致的开发者体验。您会喜欢使用 Radix 基础组件。