logoAnt Design

⌘ K
  • 设计
  • 研发
  • 组件
  • 博客
  • 资源
  • 国内镜像
6.0.0
  • 语义化发现组件精致的美
  • v6 的一些 CSS 琐事
  • 👀 视觉回归测试
  • 为什么禁用日期这么难?
  • 封装 Form.Item 实现数组转对象
  • 行省略计算
  • 📢 v4 维护周期截止
  • antd 里常用的 TypeScript 工具方法
  • 一个构建的幽灵
  • 当 Ant Design 遇上 CSS 变量
  • API 的历史债务
  • 灵动的 Notification
  • 色彩模型与颜色选择器
  • 主题拓展
  • 虚拟表格来了!
  • 快乐工作主题(一)
  • 动态样式去哪儿了?
  • Suspense 引发的样式丢失问题
  • 打包体积优化
  • 你好,GitHub Actions
  • 所见即所得
  • 静态方法之痛
  • SSR 静态样式导出
  • 依赖排查
  • 贡献者开发维护指南
  • 转载-如何提交无法解答的问题
  • 新的 Tooltip 对齐方式
  • 非必要的渲染
  • 如何成长为 Collaborator
  • Modal hook 的有趣 BUG
  • antd 测试库迁移的那些事儿
  • Tree 的勾选传导
  • getContainer 的一些变化
  • 组件级别的 CSS-in-JS
v6 之前
方式一 (props)
方式二 (ConfigProvider)
方式三 (CSS)
v6 现在
与 Tailwind CSS 结合
发现组件精致的美
Design Token 和语义化的关系

语义化发现组件精致的美

2025-11-22
@meet-student
@thinkasany
文档贡献者
v6 的一些 CSS 琐事

相关资源

Ant Design X
Ant Design Charts
Ant Design Pro
Pro Components
Ant Design Mobile
Ant Design Mini
Ant Design Web3
Ant Design Landing-首页模板集
Scaffolds-脚手架市场
Umi-React 应用开发框架
dumi-组件/文档研发工具
qiankun-微前端框架
Ant Motion-设计动效
国内镜像站点 🇨🇳

社区

Awesome Ant Design
Medium
X
yuque logoAnt Design 语雀专栏
Ant Design 知乎专栏
体验科技专栏
seeconf logoSEE Conf-蚂蚁体验科技大会
加入我们

帮助

GitHub
更新日志
常见问题
报告 Bug
议题
讨论区
StackOverflow
SegmentFault

Ant XTech logo更多产品

yuque logo语雀-构建你的数字花园
AntV logoAntV-数据可视化解决方案
Egg logoEgg-企业级 Node.js 框架
Kitchen logoKitchen-Sketch 工具集
Galacean logoGalacean-互动图形解决方案
WeaveFox logoWeaveFox-前端智能研发
xtech logo蚂蚁体验科技
主题编辑器
Made with ❤ by
蚂蚁集团和 Ant Design 开源社区
loading

在 Ant Design v6 之前,基于开放的 Design Token 进行样式定制已经带来了非常好的开发体验,但依然存在一些难以解决的痛点。Ant Design v6 为此做了诸多改变和优化。今天,我们来聊聊语义化是如何帮助你发现组件的精致之美。


v6 之前

在过去,我们通常是怎么调整组件样式的呢?

方式一 (props)

  • 在 className 和 style 属性上编写大量的拼接组合和逻辑判断
  • 在修改组件不同区域的样式时,需要使用大量类似 wrapClassName 这样的 props

代码可能是这样的:

tsx
<Button className={variant === 'filled' ? 'btn-filled' : 'btn-outline'}>
Submit
</Button>
<Modal wrapClassName="wrap-class" style={{ backgroundColor: '#fff' }}>
Modal
</Modal>
<Menu style={{ backgroundColor: mode === 'horizontal' ? '#fff' : '#000' }}>
<Menu.SubMenu popupClassName="popup-class">
<Menu.Item >
MenuItem
</Menu.Item>
</Menu.SubMenu>
</Menu>

方式二 (ConfigProvider)

采用 Ant Design v5 的主题 Design Token 设计:

tsx
<ConfigProvider
theme={{
components: {
Notification: {
colorTextHeading: token.blue,
colorText: token.colorTextSecondary,
},
},
}}
>
{children}
</ConfigProvider>

方式三 (CSS)

除了这两种方式,你可能还写过更不推荐的 CSS 样式覆盖:

css
.wrapper-class .ant-table {
border-radius: 4px;
overflow: hidden;
}
.wrapper-class .ant-table .ant-table-thead {
background-color: #f9fafc;
color: #8b97b6;
}

以上方式都存在诸多痛点:

  • 可用的 props 参数有限,导致部分区域的样式无法更改,逻辑也不够聚合
  • Design Token 的配置能力有限,无法根据不同的类型/变体做差异化的样式修改
  • 样式覆盖的方式存在较高的心智负担和维护成本,可维护性和语义化都很差

v6 现在

为了避免 Design Token 泛滥和添加大量的 API props(这会导致维护成本升高),我们将这些能力聚合成了语义化设计。

  • DOM 结构得到了显著地简化和优化
  • 可以根据不同的 props 更灵活、更易维护地定制样式和主题
  • 可以为特定的语义区域定义样式和类名,更友好地实现局部样式和主题的定制
tsx
const classNamesFn: ButtonProps['classNames'] = (info) => {
if (info.props.type === 'primary') {
return {
root: 'demo-btn-root--primary',
} satisfies ButtonProps['classNames'];
}
return {
root: 'demo-btn-root--default',
} satisfies ButtonProps['classNames'];
};
const styles: ButtonProps['styles'] = {
root: { borderWidth: 2, borderStyle: 'dashed' },
content: { fontStyle: 'italic' },
icon: { opacity: 0.85 },
};
return (
<Button styles={styles} classNames={classNamesFn}>
Button
</Button>
);

与 Tailwind CSS 结合

更令人兴奋的是,classNames 属性可以与 Tailwind CSS 这类原子化 CSS 框架完美结合。这为开发者带来了前所未有的自由度:你可以在享受 antd 组件预设行为和语义化结构的同时,利用 Tailwind 的功能类快速构建出任何想要的视觉风格。语义化 + Tailwind CSS,让组件定制变得极其自由。

tsx
return (
<Button
classNames={{
root: 'bg-black text-white border-none hover:bg-[#2e2e2e]',
icon: 'text-white/90',
}}
icon={<GiftOutlined />}
>
Ant Design
</Button>
);

发现组件精致的美

用户可以根据自己喜爱的配色为组件的不同状态赋予精致的设计,发挥你的想象力,让页面更加丰富多彩吧!如果你在使用过程中遇到任何问题或有更好的想法,欢迎提交反馈,让我们一起让 Ant Design 变得更好。


Design Token 和语义化的关系

在 Ant Design 的设计体系中,Design Token 定位为设计变量(Design Tokens),可以理解为设计能力中的原子原料。而语义化样式定义了样式的使用方式,它通过组合 Design Token 和组件级的私有定制,实现更自由的定制场景。由于语义化是在组件维度上进行的,因此可以更好地控制样式的作用范围。如果你想设计一套覆盖场景全面的 Ant Design 主题,Design Token 和语义化能力将是你的利器,两者搭配使用,能够自由定制更精致的主题。