当前位置: 首页 > article >正文

vue 多端适配之pxtorem

在 Vue 3 + Vite 项目中使用 postcss-pxtorem 自动将 px 单位转换为 rem 单位,可以按照以下步骤配置:

一、基础版本

1. 安装依赖

首先安装必要的插件:

npm install postcss postcss-pxtorem autoprefixer -D
# 或
yarn add postcss postcss-pxtorem autoprefixer -D

2. 在vite.config.ts中引入并配置

  css: {preprocessorOptions: {
//less配置,不需要注释掉less: {math: "always", // 括号内才使用数学计算globalVars: {// 全局变量mainColor: "red",},},},postcss: {plugins: [postcssPxtorem({rootValue: 37.5, // UI设计稿的宽度/10unitPrecision: 3, // 转rem精确到小数点多少位propList: ["*"], // 需要转换的属性 *表示所有selectorBlackList: ["ignore"], // 不进行px转换的选择器replace: true, // 是否直接更换属性值,而不添加备用属性mediaQuery: false, // 是否在媒体查询的css代码中也进行转换minPixelValue: 0, // 设置要替换的最小像素值exclude: /node_modules/i, // 排除node_modules文件夹下的文件}),autoprefixer,],},},

3. 创建一个rem.js文件 内容如下,再在入口文件中去引入该文件

// 判断是否是PC端
const isPc = !/Android|iPhone|SymbianOS|Windows Phone|iPad|iPod/i.test(navigator.userAgent
);
// 设置基础根文件大小
let baseSize = 37.5;
// rem 函数
function setRem() {const clientWidth = document.documentElement.clientWidth;// 设计稿一般都是以375的宽度let scale = clientWidth / (baseSize * 10);// 设置页面根节点字体大小(“Math.min(scale, 2)” 指最高放大比例为2,可根据实际业务需求调整)let enlarge = 1.5;if (isPc) {enlarge = 1;scale = clientWidth / 980; // 980 是PC端设计稿的宽度}document.documentElement.style.fontSize =baseSize * Math.min(scale, enlarge) + "px";
}
// 调用方法
setRem();// 监听窗口在变化时重新设置跟文件大小
window.onresize = function () {setRem();
};export default {};

4. 在main.js中引入

import { createApp } from "vue";
import "./style.css";
import App from "./App.vue";
import ElementPlus from "element-plus";
import "element-plus/dist/index.css";
import router from "./router/index";
import "mapbox-gl/dist/mapbox-gl.css";
import "./utils/rem";
const app = createApp(App);app.use(ElementPlus);
app.use(router);
app.mount("#app");

二、详细版本

1. 安装依赖

首先安装必要的插件:

npm install postcss postcss-pxtorem autoprefixer -D
# 或
yarn add postcss postcss-pxtorem autoprefixer -D

2. 配置 postcss.config.js

在项目根目录创建或修改 postcss.config.js 文件:

module.exports = {plugins: {'postcss-pxtorem': {rootValue: 16, // 基准值(1rem = 16px)propList: ['*'], // 需要转换的属性,*表示所有selectorBlackList: ['.el-'], // 忽略包含.el-的class(不转换Element Plus样式)minPixelValue: 2 // 小于2px不转换},autoprefixer: {} // 自动添加浏览器前缀}
}

3. 修改 vite.config.ts

确保 Vite 已启用 PostCSS:

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'export default defineConfig({plugins: [vue()],css: {postcss: {// 自动读取postcss.config.js}}
})

4. 动态设置基准值(可选)

main.ts 中设置 HTML 根字体大小(通常基于设计稿宽度):

// 根据设计稿调整(设计稿宽度/10)
function setRemUnit() {const docEl = document.documentElementconst ratio = docEl.clientWidth / 1920 // 1920是设计稿宽度docEl.style.fontSize = 16 * Math.min(ratio, 2) + 'px' // 限制最大缩放
}setRemUnit()
window.addEventListener('resize', setRemUnit)

5. 注意事项

  1. Element Plus 适配

    • 通过 selectorBlackList 忽略 Element 组件样式
    • 或单独配置 Element 的 rem 比例
  2. 样式写法

    /* 转换前 */
    .dialog-wrapper {width: 240px;padding: 12px;
    }/* 转换后(假设rootValue=16) */
    .dialog-wrapper {width: 15rem;padding: 0.75rem;
    }
    
  3. 开发环境检查

    • 确认转换生效:检查浏览器开发者工具中的最终样式
    • 可以通过 /* px-to-viewport-ignore-next */ 注释跳过特定行的转换

完整配置示例

// postcss.config.js
module.exports = {plugins: {'postcss-pxtorem': {rootValue: 16,propList: ['*', '!border*'], // 不转换border相关属性exclude: /node_modules\/element-plus/ // 忽略element-plus},autoprefixer: {overrideBrowserslist: ['last 2 versions']}}
}

这样配置后,项目中的 px 单位会自动转换为 rem,实现响应式布局。设计稿测量值可以直接写 px,编译时会自动计算 rem 值。


注意事项

  1. 热更新问题
    修改PostCSS配置后需重启dev server

  2. 单位混合警告
    避免出现 calc(100px + 2rem) 这种混合单位写法

  3. 第三方库兼容
    对使用固定px的库(如地图组件),需通过 selectorBlackList 排除

  4. VS Code提示
    安装 PostCSS Language Support 插件获得代码提示


通过以上配置,您的项目将实现:

  • 精准的px到rem转换
  • 完美的Element Plus组件兼容
  • 响应式的布局适配
  • 高效的开发调试体验
http://www.lryc.cn/news/2400650.html

相关文章:

  • 图片压缩工具 | 图片属性详解及读取解析元数据
  • React---day8
  • C# Onnx 动漫人物人脸检测
  • C++内存列传之RAII宇宙:智能指针
  • PVE 虚拟机安装 Ubuntu Server V24 系统 —— 一步一步安装配置基于 Ubuntu Server 的 NodeJS 服务器详细实录1
  • GitHub 趋势日报 (2025年06月03日)
  • 出现dev/nvmeOnip2 contains a file system with errors, check forced 解决方法
  • Vue3.5 企业级管理系统实战(二十二):动态菜单
  • 磨皮功能 C++/C的OpenCV 实现
  • 蓝牙防丢器应用方案
  • TDengine 开发指南——高效写入
  • Linux kill 暂停命令
  • Unity与Excel表格交互热更方案
  • LVS、NGINX、HAPROXY的调度算法
  • C++ 使用 ffmpeg 解码本地视频并获取每帧的YUV数据
  • 分布式微服务系统架构第143集:pom文件
  • 2.0 阅读方法论与知识总结
  • 5. Qt中.pro文件(1)
  • 第八部分:第三节 - 事件处理:响应顾客的操作
  • 共识机制全景图:PoW、PoS 与 DAG 的技术对比
  • 学习笔记085——Spring Data JPA笔记
  • 可视化大屏工具对比:GoView、DataRoom、积木JimuBI、Metabase、DataEase、Apache Superset 与 Grafana
  • 内网穿透:打破网络限制的利器!深入探索和简单实现方案
  • 如何选择合适的哈希算法以确保数据安全?
  • 简数采集技巧之快速获取特殊链接网址URL方法
  • React 性能监控与错误上报
  • AI 如何改变软件文档生产方式?
  • 激光干涉仪:解锁协作机器人DD马达的精度密码
  • Windows如何定制键盘按键
  • go语言学习 第1章:走进Golang