Ant Design StyleAnt Design Style
快速上手
最佳实践
API
更新日志
⌘ K

Table of Contents

:where 选择器
组件覆写对比
开启 where 选择器
独立样式实例
创建独立的样式实例
最佳实践建议
基础知识
简介
CSS in JS 快速入门
CSS in JS 写法对比
设计理念与实施策略
快速上手
书写样式
切换主题
自定义主题
进阶使用
Babel 插件
SSR 集成
组件研发
集成 styled
🚧 stylish 复合样式
CSSinJS 样式库性能对比
从 Less 迁移
Less 应用自动化迁移
Less 应用手动迁移
Less 组件迁移
🚧 CSSinJS 与 Less 的编译差异
上一篇
SSR 集成
下一篇
集成 styled

相关资源

Ant Design
Ant Design Pro
Ant Design Pro Components
Umi-React 应用开发框架
Dumi-组件/文档研发工具
qiankun-微前端框架

社区

Medium
Twitter
yuqueAnt Design 语雀专栏
Ant Design 知乎专栏
体验科技专栏
seeconfSEE Conf-SEE Conf-蚂蚁体验科技大会

帮助

GitHub
更新日志
讨论

more products更多产品

yuque语雀-知识创作与分享工具
AntVAntV-数据可视化解决方案
EggEgg-企业级 Node.js 框架
kitchenKitchen-Sketch 工具集
xtech蚂蚁体验科技
Copyright © 2022-2024
Made with ❤️ by 蚂蚁集团 - AFX & 数字科技
‌
‌
‌
‌

组件级研发方案

antd-style 的一开始使用对象是业务应用,因此在默认的设计上主要面向应用消费场景。但这并不代表着组件应用的研发不能使用 antd-style。antd-style 为组件级研发提供了解决方案,这里将介绍如何使用 antd-style 来研发组件。

:where 选择器

结合 cssinjs 的 hash 选择器,我们可以让组件的样式始终处于在 hash 的范围之下,这可以保证组件样式不会对全局样式造成任何污染。

less
jsx

但是这样做也会带来一个问题 —— 组件的样式会被 hash 选择器抬升权重,此时用户要覆写样式就会变得很困难: 原本用户使用 .my-btn 就可以覆盖样式。但现在由于 .css-abcd .my-btn 的权重更高,因此用户如果只书写了 .my-btn { color:green } ,这个覆盖样式是无法生效的。

那怎么办?此时 :where() 选择器登场了,它可以说是未来组件级 cssinjs 的一个核心基石。

:where() 接受选择器列表作为它的参数,将会选择所有能被该选择器列表中任何一条规则选中的元素。 —— :where —— MDN

来看下代码:

less

局部选择器除了 where 以外, is 也是可以实现的。但 :where() 和 :is() 的不同之处,也是最重要的一点,在于 :where() 的权重总是为 0。 也就是说,利用 where 选择器,我们就可以实现 0 权重增加的情况下,为组件样式添加局部作用域,同时组件仍然保留和原本一致的覆写便捷度。

下述 demo 就是一组对比示例。上方一组是未使用 where 选择器的 demo,下方一组是使用 where 选择器的 demo,两组 demo 都在外部添加了同一组覆写样式。

css
组件覆写对比

使用 :where 选择器后,cssinjs 组件覆写组件样式将和传统组件覆写模式一致

开启 where 选择器

通过上述 demo 对比,大家就可以了解到 where 选择器对于组件级样式研发的重要性。而 antd-style 也为对组件研发提供了开启 where 选择器的能力。

在 createStyles 方法中,通过设置第二个入参 options 中的 hashPriority: "low" ,即可将这部分样式使用 where 选择器。

ts

当然如果你不希望给每个 createStyles 设置一遍 { hashPriority: 'low' },可以继续往下阅读,了解如何为组件库设定一个自己的样式实例方法。

独立样式实例

其实,除了 :where 以外,组件研发的场景和应用研发的场景还有一些不同之处。比如:

  • 需要在组件库层面定义一些自定义 token,并在组件中可以消费到默认值,而不是在每个组件内部手动包一层 Provider,或让用户在消费时包一层 Provider;
  • 可能会希望让组件库的前缀可以默认变成自定义前缀;
  • 同样希望组件库可以响应应用传入的主题配置;

这些场景,都可以通过 antd-style 提供的创建独立样式实例 createInstance 来实现。

ts

在下方示例显示了自定义样式实例和自定义 token 默认值,并应用在组件 demo 的方案。

创建独立的样式实例

createStyles 中将会注入默认的自定义 token,并可以实现主题切换

createInstance 方法详细的 API 请查阅: createInstance。

最佳实践建议

在组件研发的场景下,我们建议你使用 createInstance 方法来创建一个独立的样式实例,这样可以让你的组件库更加独立可控。自定义 token 的消费使用也更加便捷。

针对从 less 迁移的部分,我们建议开启 { hashPriority: 'low' } 配置,这样可以通过极小的迁移成本完成 cssinjs 的改造(详见:组件代码迁移)。

针对使用 cssinjs 完全新写的组件,我们建议仍然使用 { hashPriority: 'high' } 配置。并将所有样式实现放置在 css 中,有需要的部分再额外添加 className。这样有两点好处:

  1. 更灵活:应用到组件的改造成本小,只需添加相应的 className,即可将应用样式变成组件样式;
  2. 便于覆写:保证组件样式的扁平化,便于使用组件的开发者覆写组件样式;
  3. 研发心智模型统一:组件库与应用的书写心智可以保持一致;