移动端适配 之 postcss-px-to-viewport
移动端自适应方案 postcss-px-to-viewport px 转 vw
前言
在移动端开发中,设计稿只有一份,而手机却有不同像素值,因此我们经常需要将 px 值转换为 vw、rem 等值,以便实现自适应布局。本文将介绍 px 转 vw 的原理和实现方法。
px vw 简单介绍
px
px 是 pixel 的缩写,意为像素。它是计算机图像的基本单位,是屏幕显示的最小单位。
vw
vw 是 viewport width 的缩写,意为视窗宽度。它是相对于视窗宽度的单位,1vw 等于视窗宽度的 1%。
px 转 vw
原理
px 转 vw 的原理是将 px 值除以视窗宽度,得到一个百分比,然后将这个百分比乘以 100,得到一个 vw 值。
vite中使用 postcss-px-to-viewport
安装 相关插件
npm i postcss-px-to-viewport autoprefixer --save-dev
配置 postcss.config.js
- 在项目根目录下创建 postcss.config.js 文件,并添加以下内容:
module.exports = {
plugins: {
autoprefixer: {
overrideBrowserslist: [
"Android 4.1",
"iOS 7.1",
"Chrome > 31",
"ff > 31",
"ie >= 8",
"last 10 versions", // 所有主流浏览器最近10版本用
],
grid: true,
},
'postcss-px-to-viewport': {
unitToConvert: 'px', // 需要转换的单位,默认为"px"
viewportWidth: 1920, // 设计稿的视窗宽度
unitPrecision: 6, // 单位转换后保留的精度
propList: ['*'], // 能转化为 vw 的属性列表
viewportUnit: 'vw', // 希望使用的视窗单位
fontViewportUnit: 'vw', // 字体使用的视窗单位
selectorBlackList: ['ignore-'], // 需要忽略的 CSS 选择器,不会转为视窗单位,使用原有的 px 等单位
minPixelValue: 1, // 设置最小的转换数值,如果为 1 的话,只有大于 1 的值会被转换
mediaQuery: false, // 媒体查询里的单位是否需要转换单位
replace: true, // 是否直接更换属性值,而不添加备用属性
exclude: [], // 忽略某些文件夹下的文件或特定文件,例如 'node_modules' 下的文件
include: /\/src\//, // 如果设置了include,那将只有匹配到的文件才会被转换
landscape: false, // 是否添加根据 landscapeWidth 生成的媒体查询条件
landscapeUnit: 'vw', // 横屏时使用的单位
landscapeWidth: 1920 // 横屏时使用的视窗宽度
}
}
}
重启项目
【注】上述方案对行内样式不生效,行内样式中 px 转 vw 可使用自定义方法实现
- 编写函数 utils/pxToVw.ts
import { isNumber } from 'lodash'
export function pxToVw(px: number | string, width = 1920) {
if (!isNumber(px)) {
return px
}
return `${(Number(px) / width) * 100}vw`
}
- 在需要使用 px 转 vw 的地方调用该函数
<template>
<div :style="{ width: pxToVw(100) }">Hello World</div>
</template>
<script setup lang="ts">
import { pxToVw } from '@/utils/pxToVw'
</script>
参考:https://www.npmjs.com/package/postcss-px-to-viewport-8-plugin?activeTab=readme
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)