vue3+ts 的rem适配

一、安装依赖

npm i postcss-pxtorem autoprefixer amfe-flexible --save-dev

postcss-pxtorem 是PostCSS的插件,用于将像素单元生成rem单位
autoprefixer 浏览器前缀处理插件
amfe-flexible 可伸缩布局方案 替代了原先的lib-flexible 选用了当前众多浏览器兼容的viewport

二、在项目的根目录创建 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-pxtorem": {
			rootValue: 192, // 设计稿宽度的1/ 10 例如设计稿按照 1920设计 此处就为192
			propList: ["*", "!border"], // 除 border 外所有px 转 rem
			selectorBlackList: [".el-"], // 过滤掉.el-开头的class,不进行rem转换
		},
	},
};
三、在mian.ts/js中导入依赖 

import "amfe-flexible/index.js";

四、重启项目

适用场景:不固定宽高比的Web应用,适用于绝大部分业务场景

一、新建utils文件夹   新建resize.ts/js文件

import { ref } from "vue";

export default function windowResize() {
	// * 指向最外层容器
	const screenRef = ref();
	// * 定时函数
	const timer = ref(0);
	// * 默认缩放值
	const scale = {
		width: "1",
		height: "1",
	};
    
	// * 设计稿尺寸(px)
	const baseWidth = 1920;
	const baseHeight = 1080;

	// * 需保持的比例(默认1.77778)
	const baseProportion = parseFloat((baseWidth / baseHeight).toFixed(5));
	const calcRate = () => {
		// 当前宽高比
		const currentRate = parseFloat(
			(window.innerWidth / window.innerHeight).toFixed(5)
		);
		if (screenRef.value) {
			if (currentRate > baseProportion) {
				// 表示更宽
				scale.width = (
					(window.innerHeight * baseProportion) /
					baseWidth
				).toFixed(5);
				scale.height = (window.innerHeight / baseHeight).toFixed(5);
				screenRef.value.style.transform = `scale(${scale.width}, ${scale.height})`;
			} else {
				// 表示更高
				scale.height = (
					window.innerWidth /
					baseProportion /
					baseHeight
				).toFixed(5);
				scale.width = (window.innerWidth / baseWidth).toFixed(5);
				screenRef.value.style.transform = `scale(${scale.width}, ${scale.height})`;
			}
		}
	};

	const resize = () => {
		clearTimeout(timer.value);
		timer.value = window.setTimeout(() => {
			calcRate();
		}, 200);
	};

	// 改变窗口大小重新绘制
	const windowDraw = () => {
		window.addEventListener("resize", resize);
	};

	// 改变窗口大小重新绘制
	const unWindowDraw = () => {
		window.removeEventListener("resize", resize);
	};

	return {
		screenRef,
		calcRate,
		windowDraw,
		unWindowDraw,
	};
}

二、在相关界面引入

<template>
    <div class="screen-container">
        <div class="screen-content" ref="screenRef">
            <span class="screen-title">基于scale的适配方案</span>
            <img class="screen-img" src="https://img2.baidu.com/it/u=1297807229,3828610143&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=281" alt="">
        </div>
    </div>
</template>

<script setup lang="ts">
import windowResize from '../../utils/resize';
import {onMounted, onUnmounted} from 'vue';

const { screenRef, calcRate, windowDraw, unWindowDraw } = windowResize()

onMounted(() => {
    // 监听浏览器窗口尺寸变化
    windowDraw()
    calcRate()
})

onUnmounted(() => {
    unWindowDraw();
})

</script>

<style lang="scss" scoped>
.screen-container {
    height: 100%;
    background-color: lightcyan;
    display: flex;
    justify-content: center;
    align-items: center;

    .screen-content {
        width: 1920px;
        height: 1080px;
        background-color: #fff;
        display: flex;
        justify-content: center;
        align-items: center;
        flex-direction: column;

        .screen-title {
            font-size: 32px;
        }

        .screen-img {
            margin-top: 20px;
        }
    }
}
</style>

  
  稀土掘金   潇潇夜雨丶

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用 `postcss-pxtorem` 插件来将 PX 值转换为 REM 值。首先,安装 `postcss-pxtorem` 和 `lib-flexible`: ``` npm install postcss-pxtorem lib-flexible --save-dev ``` 然后,在项目根目录下创建一个 `.postcssrc.js` 文件,添加以下置: ```js module.exports = { plugins: [ require('postcss-pxtorem')({ rootValue: 16, // 设计稿宽度的1/10,如果设计稿宽度为750px,则rootValue为75 unitPrecision: 5, // 保留5位小数 propList: ['*'], // 哪些属性需要转换,* 表示全部 selectorBlackList: [], // 忽略转换的选择器 replace: true, mediaQuery: false, minPixelValue: 0 }), require('postcss-flexible')({ remUnit: 16 // 设计稿宽度的1/10,如果设计稿宽度为750px,则remUnit为75 }) ] } ``` 最后,在 `vite.config.js` 中添加以下置: ```js import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' import postcss from 'rollup-plugin-postcss' export default defineConfig({ plugins: [ vue(), postcss({ extract: true, plugins: [ require('postcss-pxtorem')({ rootValue: 16, // 设计稿宽度的1/10,如果设计稿宽度为750px,则rootValue为75 unitPrecision: 5, // 保留5位小数 propList: ['*'], // 哪些属性需要转换,* 表示全部 selectorBlackList: [], // 忽略转换的选择器 replace: true, mediaQuery: false, minPixelValue: 0 }), require('postcss-flexible')({ remUnit: 16 // 设计稿宽度的1/10,如果设计稿宽度为750px,则remUnit为75 }) ] }) ] }) ``` 现在,你就可以在 Vue3 + TypeScript + Vite 项目中使用 PX 转 REM 了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值