对postcss-pxtorem的理解

插入一个题外bug

问题一:在vite + vue3 + postcss-pxtorem + vant 中,在本地运行时样式正常,提交代码到测试分支之后,样式错乱,vant组件的字体都大了一倍。

查阅了vant的官方文档,在浏览器自适应中看到vant推荐使用 postcss-px-to-viewport 进行转换。 vant的作者设计稿是按照375来的,我们公司的设计稿尺寸一般都是750,所以需要做一个配置

正题

当前移动端比较流行的适配方式有:
1、postcss-pxtorem + amfe-flexible

postcss-pxtorem用于将px转rem,amfe-flexible用来动态设置HTML的字体大小,去适配不同大小的屏幕。

第一步: 先安装postcss-pxtorem,然后在根目录建立一个文件名为postcss.config.js的文件,加入以下配置, rootVlue可以随意设置

搭配amfe-flexible插件来使用的话,rootValue是值就是设计稿的尺寸除以10,我们公司设设计稿一般是750,所以这里设置75

第二步:配置好之后上面的文件,在main.ts文件引入amfe-flexible这个插件就可以啦
第三步: 开始在less文件中编写样式

css 复制代码
@bg: black;
.text1{
    font-size: 36px;
    color:@bg
}

运行之后:

css 复制代码
@bg: black;
.text1{
    font-size: 0.48rem;
    color:@bg
}

这里展示一下amfe-flexible的源码,他是以10作为基数来计算

当设计稿为750的时候,把设计稿分成10份,那么根html的节点1rem = 75px, 这里html根字体大小不管怎么改变,都是初始值75的倍数

核心代码就是这段

假如设备窗口是393px,amfe-flexible的源码是 393/10 = 39.3,也可以这么计算, (393/750)* 75 = 39.3(不管怎么改变,都是初始值75的倍数)

举例 n = 16,设置rootValue 为16

假设n = 16

如果n设置为16,不是一个倍数关系,那么就不能使用amfe-flexible来动态改变html根节点的大小。

在postcss.fonfig.js中把rootValue设置为16

新建一个flexible.js文件,在main.ts中引入,这个文件的作用和amfe-flexible的作用想通,用来动态设置html字体大小。 其实核心原理就是比例相同,通过动态设置html的字体大小去达到自适应的效果

也可以这样写 更容易理解一些(就是去更改16倍数,不管html根字体大小怎么变,都是16的倍数):

按照750的设计稿尺寸,代码正常编写px,编译运行之后会自动转为rem

css 复制代码
@bg: black;
.text1{
    font-size: 36px;
    color:@bg
}

运行之后:

css 复制代码
@bg: black;
.text1{
    font-size: 2.25rem;
    color:@bg
}

不管视口宽度怎么变化,在运行之后,px转rem的数值都是一样的,变量是根html font-size的大小。

初始值设置的16,即1rem = 16px, 1rem = a px,随着视口的放大,缩小,a一定是16的倍数。

下面两个图展示了,视口宽度为375和750时,fong-size大小始终都是2.25rem

2、vw方案 postcss-px2vp
js 复制代码
npm i -D postcss-px2vp类似

根目录创建postcss.config.js 文件:

js 复制代码
module.exports = {
    plugins: {
        'postcss-px2vp': {
            viewportWidth(rule) { // 1. 如果设计稿宽度是750px + 使用Vant
                const file = rule.source?.input.file
                return file?.includes('vant') ? 375 : 750;
            },
            // viewportWidth: 750, // 2.如果设计稿宽度是 750px + 不适用Vant
            // viewportWidth: 375, // 3.如果设计稿宽度是 375px + 无论是否使用Vant
            propList: ['*','!font*','!line-height','!letter-spacing'],
        },
    },
};

修改postcss.config.js文件,需要重启

3、postcss-px-to-viewport插件,和postcss-px2vp类似

参考资料:

react项目适配postcss-pxtorem插件

了解postcss-pvtorem

移动端适配方案

相关推荐
Sailing3 分钟前
🚨别再滥用 useEffect 了!90% React Bug 的根源就在这
前端·javascript·面试
河马老师4 分钟前
写这需求快崩溃了,幸好我会装饰器模式
前端·javascript·面试
未来转换4 分钟前
Python-web开发之Flask框架入门
前端·python·flask
用户5757303346246 分钟前
🚀 拒绝“CSS 命名困难症”!手把手带你用 Tailwind CSS 搓一个“高颜值”登录页
前端
文静小土豆7 分钟前
标签和选择器(Label和 Selector)
linux·前端
wuhen_n13 分钟前
《Vue3+TS+Vite 高效编程与优化实践》专栏收尾
前端·javascript·vue.js
kevinten1017 分钟前
折腾三个月,我把摩旅路线和 AI 搞在一起了
前端
偷光18 分钟前
大模型核心技术概述:Token、Prompt、Tool与Agent的关系详解
前端·ai·prompt·ai编程
鹏程十八少21 分钟前
8. Android 深入插件化Shadow源码:揭秘插件Activity启动的完整链路(源码解析)
java·前端·面试
wuhen_n21 分钟前
Function Calling解剖:从请求到响应的完整数据流
前端·人工智能·ai编程