问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

快速入门postcss插件:自动转换px到rem

发布网友 发布时间:2024-09-17 09:21

我来回答

1个回答

热心网友 时间:2024-09-28 04:59

PostCSS是css的transpiler(转换编译器,简称转译器),它对于css就像babel对于js一样,能够做css代码的分析和转换。同时,它也提供了插件机制来做自定义的转换。

这一节,我们通过一个px自动转rem的功能来入门一下postcss的插件。

postcss的原理

postcss是css到css的转译器,它也和babel一样,分为parse、transform、generate3个阶段。各种转换插件都是工作在transform阶段,基于AST做分析和转换。

css的AST比js的简单多了,主要有这么几种:

atrule:以@开头的规则,比如:

@mediascreenand(min-width:480px){body{background-color:lightgreen;}}

rule:选择器开头的规则,比如:

ulli{padding:5px;}

decl:具体的样式,比如:

padding:5px;

比起jsparser的那几十种AST是不是简单的多?

这些可以通过astexplorer.net来可视化的查看

postcss插件的写法

postcss插件是工作在transform阶段,处理ast节点,插件的形式是这样的:

constplugin=(options={})=>{return{postcssPlugin:'插件名字',Rule(node){},Declaration(node){},AtRule(node){}}}

外层函数接受options,返回一个插件的对象,声明对什么节点做处理的listener,然后在对应的listener里写处理逻辑就行。

还可以这样写:

module.exports=(opts={})=>{return{postcssPlugin:'插件名字',prepare(result){//这里可以放一些公共的逻辑return{Declaration(node){},Rule(node){},AtRule(node){}}}}}

在prepare里返回各种listener,这样比起第一种来,好处是可以存放一些公共的逻辑。

然后可以这样来运行插件:

constpostcss=require('postcss');postcss([plugin({//options})]).process('a{font-size:20px;}').then(result=>{console.log(result.css);})

下面我们来写一个简易的px自动转rem的插件来练练手。

实战案例需求描述

px是一个固定的长度单位,而设备视口的尺寸是各种各样的,我们想通过一套样式来适配各种设备的显示,就需要相对的单位,常用的是rem。

rem的本质就是等比缩放,相对于html元素的font-size。

比如html的font-size设置为100px,那1rem就等于100px,之后的样式如果是200px就写为2rem。

这样我们只需要修改html的font-size就可以适配各种屏幕宽度的显示,具体的单位会做等比缩放。

我们要根据html的font-size值来把所有的px转换为rem,一般都是手动来做这件事情的,但比较繁琐,知道了计算方式之后,完全可以用postcss插件来自动做。

接下来我们就实现下这个postcss插件

代码实现

我们搭一下插件的基本结构,只需要声明对Declaration处理的listener:

constplugin=(options)=>{return{postcssPlugin:'postcss-simple-px2rem',Declaration(decl){}}}

然后要做的就是把decl的样式值中的px转换为rem,简单的正则替换就行:

constplugin=(options)=>{constpxReg=/(\d+)px/ig;return{postcssPlugin:'postcss-simple-px2rem',Declaration(decl){decl.value=decl.value.replace(pxReg,(matchStr,num)=>{returnnum/options.base+'rem';});}}}

通过字符串的replace方法来做替换,第一个参数是匹配的字符串,后面的参数是分组,第一个分组就是px的值。

计算px对应的rem需要1rem对应的px值,可以支持通过options来传入。

然后我们测试下:

postcss([plugin({base:100})]).process('a{font-size:20px;}').then(result=>{console.log(result.css);})

可以看到,已经正确的做了转换:

当然,我们这个插件只是案例,还不够完善,要做的完善的话需要更复杂的正则。

总结

postcss是css的transpiler,就像babel是js的transpiler一样,而且postcss的AST只有几种节点,比较简单,也可以通过astexplorer.net来可视化的查看。

postcss也提供了插件功能,可以做一些自定义的分析和转换。

我们实现了简单的px自动转rem的插件:

rem是通过等比缩放的方式来达到一套样式适配不同设备宽度的显示的方案,需要做px到rem的转换,这件事可以用postcss插件来自动来做。

其实postcss插件的分析和转换功能还有很多的应用,比如切换主题色,从白到黑,完全就可以用postcss自动分析颜色的值,然后做转换。

postcss分析和转换css的能力还是很强大很有用的,有很多在业务中的应用场景等你去发掘。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
巴西龟最长活多久,家养!!! 养胃的药最好的是什么啊 婴儿积食发烧不愿吃药怎么办 板门穴位在哪个部位 手机设置放偷看的方法? 凝结水回收器生产厂家? 个人账户养老金预测公式:现有5万元,缴费20年,能领多少钱? 临沂比较有名的男装品牌 呼伦贝尔市悦动网络科技有限公司怎么样? 呼伦贝尔中汇实业有限公司怎么样? 沧玄是好人吗 异熟果是什么意思 异熟果是什么意思? 八种异熟因果简介 什么是雌雄异熟? 有犯罪前科醉驾可以缓刑吗 什么是USB-IF认证? 为什么微信没有支出记录啊? 开封离南阳多远 非户口所在地领结婚证=结婚登记必须在户口所在地吗 领结婚证必须在户口所在地吗补结婚证要到户籍所在地吗 左转弯时红灯不亮,闯了过去,后面收到了处罚信息,怎么办 左转红灯不亮,直行灯亮时我左转了,算不算闯红灯 红灯不亮左转绿灯亮没看清闯了红灯 开展事故警示教育活动心得体会怎么写 包红包用什么数字比较好? 情侣红包数字怎么写比较好? 红包数字怎么表达? 中标麒麟Linux系统怎么安装软件? 如何安装中标麒麟linux系统? 快速入门 postcss 插件:自动转换 px 到 rem 战国秦长城规模简介 黄石溪毛峰是绿茶吗 黄石溪毛峰简介 黄石溪毛峰是什么茶 黄石溪毛峰有哪些品质特点 黄石溪毛峰有什么独特的口感与香味? 黄石溪毛峰如何饮用口感绝佳? 九华佛茶是什么茶 黄石溪名茶品质特征 律诗平仄七律平仄 菜鸟驿站的快递可以放几天菜鸟驿站一天1000件挣钱吗 别人欠我钱可以在网上起诉吗 大学转学申请书格式范文模板 梦见车被烧成空架子了还人盗空架子啥意思? 梦见鹤架车是什么意思 ...然后吴医生扇了朴勋一耳光是第几集?2,朴勋背后拥抱秀贤模_百度知 ... 在谁谁谁的左边 用哪个介词 英语中的左边怎么说? 快递在菜鸟驿站能放多久 快递在菜鸟驿站能放多少天 茎组词组