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

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.xdnf.cn/news/864181.html

相关文章:

  • 论文阅读笔记——Large Language Models Are Zero-Shot Fuzzers
  • 如何安全高效的文件管理?文件管理方法
  • MySQL补充知识点学习
  • 【触想智能】工业一体机在工厂智能化升级改造中的作用和应用分析
  • AI数字人在说话时怎样模拟呼吸?
  • Appium+python自动化(九)- 定位元素工具
  • cocos3.X的oops框架oops-plugin-excel-to-json改进兼容多表单导出功能
  • [特殊字符] 在 React Native 项目中封装 App Icon 一键设置命令(支持参数与默认路径)
  • git stash命令用法
  • Docker 部署 Python 的 Flask项目
  • STM32----IAP远程升级
  • Go语言学习-->项目中引用第三方库方式
  • 《短线追涨与低吸技术》速读笔记
  • sqli-labs靶场38-45关(堆叠注入)
  • MCP协议重构AI Agent生态:万能插槽如何终结工具孤岛?
  • 在 Android 框架中,接口的可见性规则
  • 考研系列—操作系统:冲刺笔记(1-3章)
  • 互斥锁与消息队列的架构哲学
  • 如何用AI高效运营1000+Tiktok矩阵账号
  • 图片压缩工具 | 图片生成PDF文档
  • 将word文件转为kindle可识别的azw3文件的方法
  • AWS DocumentDB vs MongoDB:数据库的技术抉择
  • 在CSDN发布AWS Proton解决方案:实现云原生应用的标准化部署
  • Edge Databases:赋能分布式计算环境
  • PPTAGENT:让PPT生成更智能
  • sqli-labs通关_SQL注入_SQL注入靶场
  • 《树数据结构解析:核心概念、类型特性、应用场景及选择策略》
  • 【WPF】WPF 项目实战:构建一个可增删、排序的光源类型管理界面(含源码)
  • 服务器部署--Flask项目
  • AWS 成本异常检测IAM策略