聊聊AntDesignV5的主题(上)CSSinJS动态主题的花活
Ant Design V5 已经发布也有一段时间了,作为 V5 设计研发小组成员,在这几个月中我们也第一时间升级了手上的业务应用到 antd v5,并针对实际的业务场景研究了 antd 动态主题的实践用法。截至目前近 3 个月的时间,我们总共完成了 6 个应用/组件/站点的 antd v5 升级改造, 且均已支持亮暗色主题切换 。并在一些对主题自定义有较强需求的场景下都有了不错的效果(如下):
亮色主题
暗色主题
Kitchen3 插件
@闻冰 / 业务应用
Kitchen Measure
@百音 @闻冰 / 业务应用
Kitchen 官网
@倏昱 / 业务应用
ProComponents
@期贤 / TechUI Pro系组件
ProEditor 编辑器
@兼续 / 业务组件
Ant Design Style 文档
@闻冰 / 文档应用
我个人感受的就是: 用了 CSSinJS 之后的 antd 太香了! 正是有了这么多案例的应用验证,我才有信心写下这篇文章,和大家聊聊用 antd v5 可以在主题方面做出什么样的行活与花活。在可以预见的未来,所有动态主题的需求,无论是行活还是花活,我们都能做的轻轻松松~
PS:所谓的行活用法,就是无论设计师还是前端同学都可直接体验和使用;而花活用法,就是目前只有用写代码的方式才能实现的方案。(不过其中有些方案可能会在未来给到设计师使用) 行活用法 —— V4 的延展与产品化
由于 antd v5 核心采用了 CssinJS 的方案,因此所有的动态主题配置也都变成了代码里的运行时配置,且从单一的动态主色变成了圆角、字体、阴影等几乎所有样式变量。针对前端同学来说,在 Ant Design 官网的文档( )里也详细展示了基础的用法,我在这里就不赘述了。主要和大家聊聊 V5 里的产品化用法。
通过 Ant Design 的主题编辑器,设计系统的创建者可以非常简单地配出来 antd 的整体风格,并进行实时预览。
然后设计师将主题导入到 Kitchen 之后,设计师便可以直接消费主题 Token,同时也可以拖拽获得自定义主题后的 antd 组件。
交付设计稿后,基于 C2D2C 的链路,前端同学就能看到设计师使用了哪个 antd 组件,并一键获得 antd 的前端代码。 那如果大家对这部分内容感兴趣,欢迎在这里查看详情: Kitchen v3.2.0 Ant Design V5 动态主题资产来啦~ · 语雀
接下来就全部都是 antd 的花活用法了,由于以下的花活部分目前暂时都只能通过代码实现(部分能力后续可能也会产品化),所以介绍里会涉及到一些代码,但相对来说也还简单。 花活用法 ❶:自定义主题算法
antd 的 token 体系和市面上大部分的 token 体系不同,我们有一个非常重要的因素,它就是——算法。虽然一听算法好像挺高大上的,但它的思想是非常容易理解的: 基于基础变量和派生规则来生成一组变量 。其中派生规则就是算法。antd 在v4及以前一直有这方面的沉淀,在 v5 中自然把这个能力继承了过来。
由于算法的存在,我们就可以传入不同的主题算法,进而获得不同的主题风格效果。例如 TechUI Studio 中,我们通过集成自定义暗色算法,就可以轻松获得独特的暗色风格的主题。 import { theme } from "antd"; import type { MappingAlgorithm } from "antd/es/config-provider/context"; // 定义 studio 暗色模式算法 export const studioDarkAlgorithm: MappingAlgorithm = (seedToken, mapToken) => { // 使用 antd 默认的暗色算法生成基础token,这样其他不需要定制的部分则保持原样 const baseToken = theme.darkAlgorithm(seedToken, mapToken); return { ...baseToken, colorBgLayout: "#20252b", // Layout 背景色 colorBgContainer: "#282c34", // 组件容器背景色 colorBgElevated: "#32363e", // 悬浮容器背景色 }; }; // 在应用中集成 const Container =()=>{ return ( ... ) } 复制代码
最终的效果如下图所示。可以看到我们通过集成主题算法,通过非常少的 token 自定义,就可以实现风格感受很不一样的主题,同时界面的视觉梯度仍然可以保持稳定,不会出现常见的暗色模式翻车的问题。
而且通过传入不同的主题算法,我们甚至可以控制组件在不同应用场景下的展示形态。例如在Kitchen中为了让 智能表格编辑器符合 kitchen 的视觉风格,我们通过传入 kitchen 风的 antd 自定义主题算法,就可以让 ProEditor 在 kitchen 中变成另外一个风格。
所以单纯一个 v5 的自定义算法,就可以玩出很多花活,而我们后续也会结合 Kitchen Color Studio 色彩生成工具,在 Ant Design 的主题编辑器中集成可供设计师使用的自定义算法功能,让不懂代码的设计师也能轻松生成业务定制的色彩算法。
花活用法 ❷:局部主题自定义
自定义主题算法是一个全局风格的调整,接来下再来介绍局部主题的使用。在 v4 及以前,想要 antd 的组件有多套主题同屏的实现难度是非常高的,而在 V5 中,得益于 CSSinJS 的动态主题,多套主题模式同屏展示就变得非常简单。 这在我们的 ProEditor 编辑器、TechUI Studio 平台、Ant Design 的主题预览器都有使用到这些效果。
以 Studio 平台的场景为例,这种局部主题设定的核心代码如下:import { ConfigProvider ,theme } from "antd"; export default () => { return ( {/* 暗色模式只需套一个 CP 并设定算法,里面的 Toolbar 就是暗色的了 */ } {/* 其余部分默认是亮色 */ } ); }; 复制代码
这样局部主题的定制可以极大程度地提升样式定制的灵活度。像暗色主题的一个泛化是『深色主题』,比较典型的就是类似海兔这样的深色背景头图场景。基于上面写的用法示例,理论上只需做一个「深色主题」算法,就可以实现在不魔改 antd 样式的情况下做到风格兼容。
花活用法 ❸:组件级风格自定义
当大家对主题能力切换有了基础的感知之后,我们再来看看组件级别的主题风格定制能力。在 antd v4 及以前,自定义一个 popup 的提示组件是非常难的。 下面则演示了一个需要自定义为主题色的 popup 提示说明(代码示例:codesandbox.io/s/popover-i…)为了达成较好的视觉效果,样式覆写可能会比组件的声明都要多,但仍然难以达到完美状态。 所以 antd v4 才会经常被诟病说很难做自定义。
那在 V5 中,使用 ConfigProvider 可以非常简单地完成样式的自定义,且非常符合直觉。import { theme, Popover, Checkbox, Button, ConfigProvider } from "antd"; export default function App() { const { token } = theme.useToken(); return ( ... 业务组件代码 ); } 复制代码
产出的效果如下(示例代码:codesandbox.io/s/v5-popove…):
基于 CSSinJS 这样的动态能力,我们可以实现在组件样式组合上非常高的灵活度,进而轻松实现一些原本在 V4 中很难达成的自定义样式。花活用法 ❹:组件的搭配组合
在 antd v4 中,之前被诟病的另一点就是组件的组合性不理想,比如一个典型场景是暗色模式下的弹窗与表格组合使用。可以看到由于暗色模式下 Modal 的底色与页面基础的 Layout 底色不同,最终呈现的感觉就是 table "陷"进去了一层,看起来就会很奇怪。
但这种场景在 antd 层面往往无能为力,因为组件本身并不限制业务应用如何使用组件。最后的结果就是应用中的体验细节有瑕疵。如果修正这些瑕疵,在 V4 中可能需要做很多 hack 才能实现,ROI 划不来。 而在 V5 中则可以非常轻松地达到预期的效果。 当然,也是通过 ConfigProvider 的嵌套特性达成。import React from "react"; import { Modal, ConfigProvider, theme } from "antd"; import Table from "./Table"; const App: React.FC = () => { const { token } = theme.useToken(); return (
); }; export default App; 复制代码
只需在 Modal 中的 table 外层嵌套一个 ConfigProvider 作为夹心层,然后将 token 的 colorBgContainer 参数设为 colorBgElevated ,我们就得到了响应 Modal 背景色的表格样式。
同时,利用一些颜色计算库,我们甚至可以非常轻松地调整出比 Modal 的背景色更加突出的效果。这样的操作,在 v4 中几乎是不敢想的。
而它的代码,只需简单地微调即可。import React from "react"; import { Modal, ConfigProvider, theme } from "antd"; import Table from "./Table"; import { lighten } from "polished"; const App: React.FC = () => { const { token } = theme.useToken(); return (
); }; export default App; 复制代码花活总结: v5 的起点将会是其他组件库的天花板
在这么几个月的探索使用中,我愈发感觉 V5 的 CSSinJS 动态能力,搭配我们独一无二的 Token 体系,放眼全球都是极其领先的存在。尝过这些能力的甜头之后,我甚至很笃定地认为未来就是 CSSinJS 的天下。
借用云谦老师的话:「选择很重要,有些方案的起点可能就是另一些方案的天花板」。而上文所提到的行活与花活,也只是 V5 的起点,灵活性课题在 CY23 还会进一步延展下去:语义化组件 DOM 类、组件级 Token、Stylish、主题编辑器 2.0 、antd 应用级 CSSinJS 方案等等…当然,整条产研消费链路中组件库只是其中一环,上下游的协同也非常重要,但在这里就不多展开了。
既然这篇文章的标题起的是(上),那么势必还会有个(下),那在下一篇中将会和大家聊聊在实际应用中,我们应该如何用"工程化"的方式接入 antd v5 的这些特性,并将上面提到的诸多花活统统收到囊中。
关于 V5 Token 体系的详细介绍,后续会作为独立的系列更新,并在完善后同步到官网,敬请期待~
上海市十五届人大常委会第44次会议举行,表决通过了这些法规市十五届人大常委会第四十四次会议9月22日表决通过上海市促进人工智能产业发展条例,自2022年10月1日起施行。市人大常委会主任蒋卓庆主持会议并讲话。会议表决通过上海市服务办好中国
付君以勤奋之志助力大国三农视频加载中中青报中青网记者王培莲晚睡早起是付君多年的作息习惯。今年39岁的他,是吉林大学生物与农业工程学院副院长,吉林大学领军教授博导。每天睡眠不到6个小时,是他的常态。学生说他像
打算做个富一代今天看了一篇推文,深有感触,和大家分享一下。1hr前一张截图是推文的主人公,后一张截图是读者评论。两张截图,两种生活态度。前者一直在奔跑的路上,临产也不肯停下脚步后者心态平和,觉得
江苏3大倒霉酒,辉煌时名扬四海难逢敌手,如今却在超市积灰提起古代名将,韩信当属佼佼者,身为汉初三杰,他无愧于国士无双的评价,其一生经历也堪称传奇,年轻时曾受胯下之辱,初入职场也是默默无闻,最后封王拜将,勋冠三杰。作为三军统帅,他定三秦破
南通早七点崇川疾控紧急寻人今天,我市多地开展区域核酸检测南通早七点早安!今天是2022年9月26日,星期一,农历壬寅年九月初一,今天白天到夜里多云到阴有分散性小雨,偏东风34级,今天最高气温24左右。希望今天的新闻早餐能为您开启美好的一
俄媒自由主义狂热病正撕裂欧盟今日俄罗斯电视台网站9月23日发表题为英国退出欧盟后,匈牙利向东转再次表明自由主义狂热病正在撕裂欧盟的文章,作者是挪威东南大学教授格伦戴森。全文摘编如下上海合作组织乌兹别克斯坦会议
2022年港姐五强选手听不懂粤语,亚军直接臭脸,冠军是星二代今年是香港小姐50周年,TVB对此非常重视,专门将总决赛会场设在香港红勘体育馆。数数日子,香港小姐竞选已经有12年没有在红馆举办过了。但好事多磨,先有监警会委员怒斥TVB香港小姐选
隐入烟尘和东八区的先生一样真实,一样刺激,感人肺腑头条创作挑战赛最近票房刚过亿的文艺苦情电影隐入烟尘突然被下架了而之前默默无闻的东八区的先生们由于太难看,太油腻,(观众们反映非常热烈,豆瓣评分2。1创造了最低分的记录)反而因祸得福
东八区的先生们已下架,对此你怎么看?张翰主演的东八区的先生们自开播以来,引众网友吐槽不断。有网友发现该剧已经在各个视频网站下架,目前只能搜到花絮,无法正常播放。据了解,自该部剧播出以来,争议不断,在某站,更是引得众多
油价调整国际油价大跌,成品油预计下调100元吨,第8跌要来了国内油价今日是新一轮油价调整的第3个工作日,目前预计下调油价100元吨,折合升计算为下跌油价0。08元升0。09元升,相比上个工作日预计跌幅增加15元吨,超过下调红线,油价呈下跌状
不合格率高达34,智能门锁再被央视点名近日,央视每周质量报告再次关注智能门锁品质问题。据报道,2021年国家市场监管总局组织开展了电子锁等12种网售产品质量的国家监督抽查。其中,抽查了12个省(市)148家企业生产的1