编程 使用 rem 适配 PC 与移动端——原理与实战指南

2025-07-02 09:02:48 +0800 CST views 446

🎯 使用 rem 适配 PC 与移动端——原理与实战指南

一、核心原理

  • rem 单位基于根元素(<html>)的 font-size
  • 修改 htmlfont-size,页面上所有以 rem 为单位的样式都会动态调整。
  • 示例:若 html { font-size:16px; },则 1rem = 16px;若设为 32px,则 1rem = 32px

二、方案概览:flexible.js + postcss-pxtorem

方案特点

  1. 开发阶段使用 px 编写,贴合设计稿;
  2. 构建阶段自动转换,PostCSS 插件将 px => rem;
  3. 运行阶段动态赋值,根据窗口宽度设置 htmlfont-size,实现视觉适配。

三、实现细节

1. flexible.js:动态设定根字体

(function(window, document) {
  const docEl = document.documentElement;
  const breakpoints = [
    { min: 0,    max: 480 },
    { min: 481,  max: 767 },
    { min: 768,  max: 1023 },
    { min: 1024, max: 1279 },
    { min: 1280, max: 1919 },
    { min: 1920, max: Infinity }
  ];
  const remBase = 100;

  function setRemUnit() {
    const w = docEl.clientWidth;
    let rem;

    for (const bp of breakpoints) {
      if (w >= bp.min && w <= bp.max) {
        rem = bp.max === Infinity
          ? remBase
          : remBase + remBase * (w - bp.min) / (bp.max - bp.min);
        break;
      }
    }
    if (rem == null) {
      const bp0 = breakpoints[0];
      rem = remBase * (w - bp0.min) / (bp0.max - bp0.min);
    }

    docEl.style.fontSize = rem + 'px';
  }

  setRemUnit();
  window.addEventListener('resize', setRemUnit);
  window.addEventListener('pageshow', e => e.persisted && setRemUnit());
})(window, document);
  • 根据视口宽度分段设置根字体;
  • 常与 main.js 配合加载;
  • 实现不同屏幕下 1rem 的像素值平滑变化。

2. postcss-pxtorem 插件:构建阶段自动转换

安装(建议锁定版本)

npm uninstall postcss-pxtorem
npm install postcss-pxtorem@5.1.1 --save-dev

配置示例(以 Vite 为例)

import postCssPxToRem from 'postcss-pxtorem';

export default defineConfig({
  css: {
    postcss: {
      plugins: [
        postCssPxToRem({
          rootValue: 192,   // 1920 设计稿下,1rem = 192px
          propList: ['*'],  // 所有 px 属性均转换
        })
      ]
    }
  }
});
  • rootValue:用于计算 1rem = rootValue px
  • propList:控制需转换的属性,['*'] 表示全部;
  • 行内样式中的 px 默认不转换;
  • 可通过写 1Px2PX 忽略单个样式转换。

四、完整流程

阶段工具作用说明
开发阶段px 编写样式保持设计稿一致,易于计算
构建阶段postcss-pxtorem 插件自动将 CSS 中所有 px 转为 rem
运行时flexible.js实时调整根字体,驱动响应式布局

这样就实现了“一套代码,适配多端”设计理念。


五、最佳实践与注意事项

  1. rem 是相对单位,不是响应式手段。它可根据根字体变化进行缩放,但不替代流式布局或百分比响应。
  2. 62.5% 方式谨慎使用:将 html 的字体设为 62.5%(即 10px),虽然简化了 rem 换算,但可能干扰用户预设习惯,不推荐。
  3. 合理设置断点与基准尺寸flexible.js 的分段与 postcss-pxtoremrootValue 应匹配规划,以维护视觉一致性。
  4. 避免在边框、阴影等视觉细节上使用 rem:推荐使用 px,以保证元素样式的一致性和细腻度。
  5. 行内样式需额外处理:PostCSS 插件不作用于行内样式或 JS 动态样式,需手动替换或通过 JS 方式计算转换。

六、小结 ✨

通过 flexible.js + postcss-pxtorem,你可以:

  • 按设计稿书写 px,保持开发体验;
  • 自动转换为 rem,提升可维护性与兼容性;
  • 动态调整根字体,实现对多屏幕尺寸的适配。

联合使用后,能够快速构建一套兼容 PC + 移动端的自适应布局体系,既贴合设计,也高效开发。

复制全文 生成海报 前端开发 响应式设计 CSS

推荐文章

Vue3中如何处理组件间的动画?
2024-11-17 04:54:49 +0800 CST
Nginx rewrite 的用法
2024-11-18 22:59:02 +0800 CST
阿里云免sdk发送短信代码
2025-01-01 12:22:14 +0800 CST
支付页面html收银台
2025-03-06 14:59:20 +0800 CST
JavaScript设计模式:组合模式
2024-11-18 11:14:46 +0800 CST
网站日志分析脚本
2024-11-19 03:48:35 +0800 CST
PyMySQL - Python中非常有用的库
2024-11-18 14:43:28 +0800 CST
乐观锁和悲观锁,如何区分?
2024-11-19 09:36:53 +0800 CST
前端项目中图片的使用规范
2024-11-19 09:30:04 +0800 CST
免费常用API接口分享
2024-11-19 09:25:07 +0800 CST
Vue3中如何处理状态管理?
2024-11-17 07:13:45 +0800 CST
Go语言中的mysql数据库操作指南
2024-11-19 03:00:22 +0800 CST
12个非常有用的JavaScript技巧
2024-11-19 05:36:14 +0800 CST
如何在 Vue 3 中使用 TypeScript?
2024-11-18 22:30:18 +0800 CST
JavaScript设计模式:观察者模式
2024-11-19 05:37:50 +0800 CST
Nginx 状态监控与日志分析
2024-11-19 09:36:18 +0800 CST
Rust async/await 异步运行时
2024-11-18 19:04:17 +0800 CST
markdowns滚动事件
2024-11-19 10:07:32 +0800 CST
Go 单元测试
2024-11-18 19:21:56 +0800 CST
JavaScript 的模板字符串
2024-11-18 22:44:09 +0800 CST
thinkphp swoole websocket 结合的demo
2024-11-18 10:18:17 +0800 CST
浅谈CSRF攻击
2024-11-18 09:45:14 +0800 CST
程序员茄子在线接单