less中直接写font-size: 1.6rem不准,因rem依赖运行时html的font-size,而less编译时无法获知该值;须用全局变量@base-font-size统一基准,并配合unit()安全转换px为rem。

Less里直接写 font-size: 1.6rem 为什么总是不准
因为 rem 的计算结果完全取决于 html 元素当前的 font-size 值,而 Less 编译时根本不知道运行时这个值是多少。硬编码 1.6rem 等于把换算逻辑锁死——设计稿是 750px 宽、基准 100px,你却按 16px 写,最终字体在 iPhone 上可能小一半。
常见错误现象:开发环境看着正常,真机上文字忽大忽小;改了设计稿尺寸,全项目手动搜替换 rem 值;媒体查询里反复写 html { font-size: ... },但样式里还是用固定 rem,两者对不上。
- 所有
rem值必须基于同一个可配置的基准变量,比如@base-font-size: 100px;(适合移动端)或@base-font-size: 16px;(兼容 PC) - 这个变量必须定义在全局入口文件(如
variables.less)顶部,避免被局部作用域覆盖 - 不能只靠 Less 算,
html { font-size: @base-font-size; }这行 CSS 必须显式写出,否则浏览器就用默认 16px
用 unit() 做 px 到 rem 的安全除法
Less 的除法不是数学意义上的“纯数字除”,而是带单位运算:32px / 16px 结果是 2px,不是 2。直接 2px * 1rem 会报错 Operation on an invalid type。
正确做法是用 unit() 先剥离单位,再参与计算:
.px2rem(@px) {
font-size: unit(@px / @base-font-size, rem);
}
这个写法能同时处理 .px2rem(24px) 和 .px2rem(24)(后者会被 Less 当作无单位数字,unit() 仍可安全处理)。
- 别写
@px / @base-font-size * 1rem—— 单位残留会导致编译失败 - 旧版 Less(unit(),需退化为字符串替换,但精度差、易出错,建议升级
- 如果项目已用
postcss-pxtorem,就别在 Less 层再转 rem,二者叠加会让字号翻倍
多端适配时,@root-font-size 为什么不能是常量
静态写死 @root-font-size: 37.5px; 只适用于固定宽度调试,真机适配必须动态——iPhone SE 屏宽 375px,iPad Pro 是 1024px,同样 1rem 在两边物理尺寸差近三倍。
PigX UI Pro 前端开发指南 - Vue 3 + TypeScript + Element Plus。当用户提到 PigX UI、PigX 前端、lgb-mgui 项目、Vue 3 企业级后台开发、Element Plus 后台开发时使用此技能。
Less 本身无法读取 window.innerWidth,所以得拆成两层:
- Less 里留个占位变量:
@root-font-size: 16px;(仅作编译 fallback) - 运行时用 JS 注入真实值:
document.documentElement.style.fontSize = (window.innerWidth / 375 * 100) + 'px'; - 媒体查询只是辅助手段,不能替代 JS 动态计算——横竖屏切换、DPR 变化、系统缩放都会让媒体查询失效
构建时可通过 Webpack DefinePlugin 把 @root-font-size 替换为环境变量,区分 H5、小程序等不同端。
混入(mixin)比函数更适合日常写样式
Less 函数返回值只能当属性值用,比如 font-size: px2rem(14px);,但你没法用它一次性设 padding 和 line-height。混入则可以直接展开为多条声明,更贴近真实开发流。
.rem-font(@size) {
font-size: unit(@size / @base-font-size, rem);
}
.rem-all(@font: false, @padding: false) when (@font) {
font-size: unit(@font / @base-font-size, rem);
}
.rem-all(@font: false, @padding: false) when (@padding) {
padding: unit(@padding / @base-font-size, rem);
}
调用:.rem-all(@font: 14px, @padding: 8px);
- 伪元素、
border-width、line-height这些容易漏掉的属性,要单独封装混入,不能只盯着font-size - 混入名别叫
px2rem,容易让人误以为它只处理像素——实际应支持em、无单位数字等输入 - Google Chrome 强制最小字体为 12px,所以
html的font-size不宜低于 12px,否则小字号会被截断
实际项目中最容易被忽略的,是 html { font-size: @base-font-size; } 这行 CSS 的同步设置——它和 Less 变量是两回事,漏掉就等于没做任何 rem 适配。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










