logoAnt Design

⌘ K
  • 设计
  • 研发
  • 组件
  • 博客
  • 资源
  • 国内镜像
6.3.3
  • 语义化发现组件精致的美
  • 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 和语义化能力将是你的利器,两者搭配使用,能够自由定制更精致的主题。