移动端适配 之 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 可使用自定义方法实现

  1. 编写函数 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`
}
  1. 在需要使用 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

posted @   影的记忆  阅读(240)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示