rem实战:老旧大项目从px迁移到rem

背景

有个项目原来是设计给小程序横屏webview体验的,到目前只考虑按812*375的设计宽高,用px单位去写css,在一般手机尺寸上显示正常;

最近有个需求需要在电脑/大屏上使用,当设定分辨率为3840x2160(设计师给的)时,或者直接用桌面浏览器打开时,上面的UI变成了下面的样子

问题

用px单位的弊端就出现了,px是抽象单位,大小一般跟设备像素比(dpr)有关,例如:dpr为2时1px表示两个物理像素点长度,dpr为3时1px表示3个物理像素点长度,所以元素用px做单位的话,只要dpr没变,元素在屏幕上的尺寸就是固定的,屏幕拉伸元素尺寸不变,如下,观察'丹华公馆'logo图片:

解决方法

经过搜索,决定把px单位切换到rem单位(rem请自行搜索),简单来说,rem是相对单位,1rem大小等于html元素上的font-size大小,比如html上font-size: 16px;那1rem=16px;

那可以把html的font-size大小和屏幕尺寸关联起来,屏幕放大,html.font-size跟着变大,屏幕缩小,html.font-size跟着变小,那用rem做单位的元素也会跟着屏幕缩放而缩放了;

因为项目里几乎所有css单位都是px,要怎么设置html的font-size才能让改动最小且简单呢?

我的方案

在812*375分辨率下,如果让1rem=1px,那代码里只需全局把'px' 改为 'rem'即可,这时html.font-szie 是 1px,或者说 812/812 px,即windowWidth / 812 px,那html.font-szie定为 windowWidth / 812 px,js增加如下代码即可:

js 复制代码
// 设置rem
const handleResize = () => {
  const hw = document.documentElement.clientWidth || document.body.clientWidth;
  let htmlDom = document.getElementsByTagName("html")[0];
  htmlDom.style.fontSize = hw / 812 + "px"; // 在 812x375 设计尺寸下,1rem=1px
};
handleResize();
window.onresize = handleResize;

其他

  • 把用到的UI库的组件单位也改成rem单位
  • 更改一些元素的相对定位

表现如下,搞定🎉:

该项目以后的需求开发时,css可以按以前的规则取数值,单位把px改为rem即可!

最后

使用rem单位的话,关键是html.font-szie值怎么设,按1rem=1px的话,没有多余的换算,无论新旧项目,都可以按这个规则应用。

相关推荐
weixin_382395231 小时前
为小工厂量身打造:本地部署的物料管理系统带缺料计算
前端·制造
__zRainy__1 小时前
解决pnpm v10+不自动构建
前端·pnpm·工程化
猫猫不是喵喵.2 小时前
Vue3 Props 属性
前端·javascript·vue.js
醉城夜风~3 小时前
CSS元素显示模式(display)
前端·css
AI大模型-小华3 小时前
Codex 三方充值快速入门指南
java·前端·数据库·chatgpt·ai编程·codex·chatgpt pro
做前端的娜娜子6 小时前
同一链接实现 PC Web 与移动 H5 自适应
前端·掘金·金石计划
小帅不太帅6 小时前
架构没变、规模没变,DeepSeek V4 Flash 正式版凭什么暴涨 47 分?
前端·aigc·deepseek
jarvisuni6 小时前
DeepSeekFlash前端依旧拉垮,而且变慢了很多!
前端·javascript·算法
卷福同学7 小时前
AI编程出海第二步:验证关键词能否做站
前端·人工智能·后端