Vue3 + ts + Vite 不同屏适配:px 转 vw

1. 下载插件

npm i postcss-px-to-viewport autoprefixer amfe-flexible --save-dev

2. 配置

    (1)在 main.ts 导入依赖

import 'amfe-flexible/index.js'

    (2)在项目根目录下编写配置文件 postcss.config.cjs

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 // 横屏时使用的视窗宽度
        }
    }
}

3. 重启项目

【注】上述方案对行内样式不生效,行内样式中 px 转 vw 可使用自定义方法实现

1. 编写函数 utils/pxToVw.ts

/* 行内样式 px 转 vw */
export function pxToVw(px: number): string {
    const vw = (px / 1920) * 100; // 假设设计稿宽度为 1920 px
    return `${vw}vw`;
}

export function pxToVwFromString(pxString: string): string {
    const pxValue = parseFloat(pxString); // 提取数字部分
    return pxToVw(pxValue); // 调用 pxToVw 函数
}

2. 使用

    对于方法1 pxToVw:

<div :style="{width: pxToVw(30)}"> test </div>

    对于方法2 pxToVwFromString:

<template>

    <div :style="{width: widthVal}"> test </div>

</template>

<script setup lang="ts">

const widthVal = computed(() => {
  let width: string = ''
  // width = 'calc(100vw - 427px)'
  width = '740px'
  width = width.replace(/\d+px/, match => pxToVwFromString(match)); // 替换 px 为 vw
  return width
})

</script>

参考文章:vue3+vite项目屏幕适配的两种方案,超详细!_vue3 vite rem-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值