You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
随着 iOS 13 引入 Dark Mode(深色模式),各大应用和网站也都开始支持深色模式。相比传统的页面配色方案,深色模式具有较好的降噪性,也能让用户的眼睛看内容更舒适
PostCSS 原理和相关插件能力
简单来说, PostCSS 是一款编译 CSS 的工具。
PostCSS is a tool for transforming styles with JS plugins. These plugins can lint your CSS, support variables and mixins, transpile future CSS syntax, inline images, and more.
这里需要补充的是,为了将 dark 模式色值按照 html[data-theme='dark'] 方式写到 HTML 节点上,需要使用另外两个PostCSS插件完成:
PostCSS Nested
PostCSS Nesting
整体架构设计,总结为下图:
主题色架构实现
PostCSS 插件体系
PostCSS具有天生的插件化体系,开发者一般很容易上手插件开发
varpostcss=require('postcss');module.exports=postcss.plugin('pluginname',function(opts){opts=opts||{};// Work with options herereturnfunction(css,result){// Transform the CSS AST};})
在前端基础建设中,样式方案的处理也必不可少
设计一个主题切换工程架构
随着 iOS 13 引入 Dark Mode(深色模式),各大应用和网站也都开始支持深色模式。相比传统的页面配色方案,深色模式具有较好的降噪性,也能让用户的眼睛看内容更舒适
PostCSS 原理和相关插件能力
简单来说, PostCSS 是一款编译 CSS 的工具。
如上介绍,postCSS具有良好的插件性,其插件也是使用 javascript 编写的,非常有利于开发者拓展。PostCSS的工作原理:PostCSS接收一个CSS文件,并提供了插件机制,提供给开发者分析、修改CSS的规则,具体实现方式也是基于AST技术
架构思路总结
主题切换——社区上介绍的方案往往通过 CSS 变量(CSS 自定义属性)来实现
这无疑是一个很好的思路,但是作为架构来说,使用 CSS 自定义属性——只是其中一个环节。站在更高、更中台化的视觉思考,我们还需要设计:
基于以上考虑,以一个超链接样式为例,我们希望做到开发时,编写:
这样的代码,就能一劳永逸直接支持两套主题模式。也就是说,在应用编译上,上述代码预期被编译为下面这样的代码:
我们来看看在编译时,构建环节发生了什么:
cc(GBK05A)
这样的声明,被编译为#646464
cc
是一个CSS function,而GBK05A
是一组色值,分别包含了light和dark两种主题的颜色data-theme='dark'
,并添加a
标签color色值样式为#808080
我们设想,用户点击“切换主题”按钮时,首先通过 Javascript 将 HTML 根节点标签添加 data-theme 为dark的属性值,这时CSS选择器html[data-theme='dark'] a 将起作用,实现了样式的切换
结合下图理解:
如何在构建时完成 CSS 的样式编译转换呢?答案指向了 PostCSS
postcss-theme-colors需要:
cc()
方法cc()
方法求值,得到两种颜色,分别对应 dark 和 light 模式这里需要补充的是,为了将 dark 模式色值按照 html[data-theme='dark'] 方式写到 HTML 节点上,需要使用另外两个PostCSS插件完成:
整体架构设计,总结为下图:
主题色架构实现
PostCSS 插件体系
PostCSS具有天生的插件化体系,开发者一般很容易上手插件开发
上面代码是一个典型的PostCSS插件编写模版。一个PostCSS就是一个Node.js模块,开发者调用
postcss.plugin
工厂方法返回一个插件实体:在编写 PostCSS 插件时,我们可以直接使用postcss.plugin方法完成实际开发。接下来,开始动手实现 postcss-theme-colors。
动手实现postcss-theme-colors
具体实现逻辑,代码如下:
理解了这部分源码,使用方式也就呼之欲出了:
The text was updated successfully, but these errors were encountered: