09/19
2018
CSS 的常用长度单位有 px、em、rem、pt 等。今天我遇到一个情况,有两个网站都使用了 rem 作为单位,但是根元素(html)的字号并不相同,需要进行转换。
移植页面的根元素字号是 20px,CSS 规则如: height: 4rem; 我的根元素字号是 100px,需要除以 5,改成: height: 0.8rem;
因为需要修改的地方很多,所以我写了个正则来处理。本文的代码并不是一个通用的工具,只是提供了解决思路。
这次的情况是同一种单位之间的转换,有时候我们可能需要进行不同单位之间的转换,思路都是一样的,根据需要修改代码即可。
示例代码:
let str=` .conta { margin-top: 0.5rem; margin-bottom: 1rem; } .bt01 { height: 4rem; line-height: 4rem; background: #b50d0a; color: #fff; text-align: center; font-size: 1.6rem; } .bt02 { height: 5rem; padding-top: 1rem; line-height: 2rem; background: #b50d0a; color: #fff; text-align: center; font-size: 1.6rem; } `; let reg1=/\d.*?(?=rem)/g; str.replace(reg1,(num)=>{ console.log(num); return num/5; });
流程说明:
1.把需要修改的 CSS 样式包裹在模板字符串里;
2.编写正则,如示例中的正则是匹配所有 rem 前面的数字;
3.用字符串的 replace 方法,对每个匹配的值进行处理和替换。
如何拓展使用呢,比如要转换的单位不是 rem,修改正则里的 rem 即可。
如果需要进行不同单位之间的转换,那么匹配时不止要匹配数字,还要匹配单位。需要把正则里的 ?= 去掉,replace 里的处理流程也要加上单位的变化。
注意事项:
使用时需要先把 CSS 代码格式化,像上面的代码那样,一个规则一行。否则可能导致正则的匹配结果出错,下面这个就会出错:
background: #b50d0a;font-size: 1.6rem;
也可能会有其他一些小概率情况导致出错,保险起见,转换后查找一下结果里是否含有“NaN”比较好。