小言_互联网的博客

自定义 CSS 单位的利器

422人阅读  评论(0)

前文

很多时候我们很想要一个能够自定义 CSS 单位的东西,比如下面这种情况

UI 妹子给的图总是 px 单位的,但是我们做移动端的时候很多时候是想要 rem 的,这时候我们会手动计算从 px 到 rem。
假如你计算的是 rem = px / 100,通常情况下,可能我们每次都需要从 UI 稿除以 100 写在代码里面。比如UI 稿给的是 1.5px 那我们需要在代码里写上0.015rem

现有的插件

这样十分的不优雅。但是现在到处都是一些单位换算工具,比如 vscode 就有一些单位换算工具,它能够在你编辑代码的时候约束你,帮你自动计算,它依赖于 VSCode 的 language service,缺点很明显了,一旦你脱离了 VSCode,啥也没了。

除此之外,现在还有很多类似 px 2 remrem 2 vw 等等这样的插件,这种插件存在的问题是,存在单位的限制,它只能从 xx 到 xx 的转换,第二个严重的问题是存在对原有单位的污染,如果使用了 px 2 rem ,那么你的整个应用中都不能使用 px 了,因为 px 都会被转成 rem,这样的问题是很大的,很多时候用户会使用 平板 来访问你的应用,如果整个应用都是 rem,那好了,多大的平板就有多大的字,这是不对的,用户用更大的移动设备是想看到更多的内容而不是更大的字,因此多单位共存是很重要的。

Postcss-Relaxed-Unit

这是今天的主角了。它的作用很单纯,就是自定义单位到目标单位的计算输出。

e.g.

postcss: {
      plugins: {
        'postcss-relaxed-unit': {
          rules: { px: 'div(100).unit(rem)' },
        },
      },
    },

上面这段配置表示整个项目中的 px 都等于当前值除以 100 过后的 rem,但是上面说过了不要做单位污染,因此,很多时候我们都是自己声明一个新的单位。
比如我们要一个新的单位名字叫 rx,我想让它等于 100px + 20px 的值,那么我们只需要这样配置

postcss: {
      plugins: {
        'postcss-relaxed-unit': {
          rules: { rx: 'div(100).add(20).unit(px)' },
        },
      },
    },

原 CSS

.hello {
	height: 100rx;
}

转换后

.hello {
	height: 21px; /** 100 / 100 + 20 */
}

divaddunit 都是 relaxed-unit 提供的操作符,除此之外还有其他的操作符,详细看 这里

div 表示除以,add 表示相加运算,unit是最终输出的方法,如果不使用 unit 那么它将按原单位输出。

多单位的配置

可能发现了 relaxed-unitrules 是个对象,因此可以传递多个单位映射关系

postcss: {
      plugins: {
        'postcss-relaxed-unit': {
          rules: { 
          	rx: 'div(100).add(20).unit(px)',
          	ex: 'add(10).sub(20).mul(30).unit(rem)'
          },
        },
      },
    },

原 CSS

.hello {
	height: 100rx;
	width: 20ex;
}

转换后

.hello {
	height: 21px;
	width: 300rem;
}

文档

更多的文档说明看 Github
https://github.com/youncccat/postcss-relaxed-unit


转载:https://blog.csdn.net/HaoDaWang/article/details/102480021
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场