Vue屏幕自適應三種實現方法詳解

使用 scale-box 組件




屬性:

width寬度 默認1920

height高度 默認1080

bgc背景顏色 默認"transparent"

delay自適應縮放防抖延遲時間(ms) 默認100

vue2版本:vue2大屏適配縮放組件(vue2-scale-box - npm)

npm install vue2-scale-box ?或者?yarn add vue2-scale-box

使用方法:

<template>

? ? <div>

? ? ? ? <scale-box :width="1920" :height="1080" bgc="transparent" :delay="100">

? ? ? ? ? ? <router-view />

? ? ? ? </scale-box>

? ? </div>

</template>

<script>

import ScaleBox from "vue2-scale-box";

export default {

? ? components: { ScaleBox },

};

</script>

<style lang="scss">

body {

? ? margin: 0;

? ? padding: 0;

? ? background: url("@/assets/bg.jpg");

}

</style>



vue3版本:vue3大屏適配縮放組件(vue3-scale-box - npm)

npm install vue3-scale-box 或者. yarn add vue3-scale-box

使用方法:

<template>

? ? <ScaleBox :width="1920" :height="1080" bgc="transparent" :delay="100">

? ? ? ? <router-view />

? ? </ScaleBox>

</template>

<script>

import ScaleBox from "vue3-scale-box";

</script>

<style lang="scss">

body {

? ? margin: 0;

? ? padding: 0;

? ? background: url("@/assets/bg.jpg");

}

</style>

設置設備像素比例(設備像素比)

在項目的 utils 下新建 devicePixelRatio.js 文件

class devicePixelRatio {

? /* 獲取系統(tǒng)類型 */

? getSystem() {

? ? const agent = navigator.userAgent.toLowerCase();

? ? const isMac = /macintosh|mac os x/i.test(navigator.userAgent);

? ? if (isMac) return false;

? ? // 目前只針對 win 處理,其它系統(tǒng)暫無該情況,需要則繼續(xù)在此添加即可

? ? if (agent.indexOf("windows") >= 0) return true;

? }

? /* 監(jiān)聽方法兼容寫法 */

? addHandler(element, type, handler) {

? ? if (element.addEventListener) {

? ? ? element.addEventListener(type, handler, false);

? ? } else if (element.attachEvent) {

? ? ? element.attachEvent("on" + type, handler);

? ? } else {

? ? ? element["on" + type] = handler;

? ? }

? }

? /* 校正瀏覽器縮放比例 */

? correct() {

? ? // 頁面devicePixelRatio(設備像素比例)變化后,計算頁面body標簽zoom修改其大小,來抵消devicePixelRatio帶來的變化

? ? document.getElementsByTagName("body")[0].style.zoom =

? ? ? 1 / window.devicePixelRatio;

? }

? /* 監(jiān)聽頁面縮放 */

? watch() {

? ? const that = this;

? ? // 注意: 這個方法是解決全局有兩個window.resize

? ? that.addHandler(window, "resize", function () {

? ? ? that.correct(); // 重新校正瀏覽器縮放比例

? ? });

? }

? /* 初始化頁面比例 */

? init() {

? ? const that = this;

? ? // 判斷設備,只在 win 系統(tǒng)下校正瀏覽器縮放比例

? ? if (that.getSystem()) {

? ? ? that.correct(); // 校正瀏覽器縮放比例

? ? ? that.watch(); // 監(jiān)聽頁面縮放

? ? }

? }

}

export default devicePixelRatio;

在App.vue 中引入并使用即可

<template>

? <div>

? ? <router-view />

? </div>

</template>

<script>

import devPixelRatio from "@/utils/devicePixelRatio.js";

export default {

? created() {

? ? new devPixelRatio().init(); // 初始化頁面比例

? },

};

</script>

<style lang="scss">

body {

? margin: 0;

? padding: 0;

}

</style>


通過JS設置zoom屬性調整縮放比例

在項目的 utils 下新建 monitorZoom.js 文件

export const monitorZoom = () => {

? let ratio = 0,

? ? screen = window.screen,

? ? ua = navigator.userAgent.toLowerCase();

? if (window.devicePixelRatio !== undefined) {

? ? ratio = window.devicePixelRatio;

? } else if (~ua.indexOf("msie")) {

? ? if (screen.deviceXDPI && screen.logicalXDPI) {

? ? ? ratio = screen.deviceXDPI / screen.logicalXDPI;

? ? }

? } else if (

? ? window.outerWidth !== undefined &&

? ? window.innerWidth !== undefined

? ) {

? ? ratio = window.outerWidth / window.innerWidth;

? }

? if (ratio) {

? ? ratio = Math.round(ratio * 100);

? }

? return ratio;

};

在main.js 中引入并使用即可

import { monitorZoom } from "@/utils/monitorZoom.js";

const m = monitorZoom();

if (window.screen.width * window.devicePixelRatio >= 3840) {

? document.body.style.zoom = 100 / (Number(m) / 2); // 屏幕為 4k 時

} else {

? document.body.style.zoom = 100 / Number(m);

}

完整代碼

import Vue from "vue";

import App from "./App.vue";

import router from "./router";

/* 調整縮放比例 start */

import { monitorZoom } from "@/utils/monitorZoom.js";

const m = monitorZoom();

if (window.screen.width * window.devicePixelRatio >= 3840) {

? document.body.style.zoom = 100 / (Number(m) / 2); // 屏幕為 4k 時

} else {

? document.body.style.zoom = 100 / Number(m);

}

/* 調整縮放比例 end */

Vue.config.productionTip = false;

new Vue({

? router,

? render: (h) => h(App),

}).$mount("#app");

獲取屏幕的分辨率

獲取屏幕的寬:

window.screen.width * window.devicePixelRatio

獲取屏幕的高:

window.screen.height * window.devicePixelRatio

移動端適配(使用 postcss-px-to-viewport 插件)

官網:https://github.com/evrone/postcss-px-to-viewport

npm install postcss-px-to-viewport --save-dev

或者

yarn add -D postcss-px-to-viewport

配置適配插件的參數(在項目根目錄創(chuàng)建 .postcssrc.js 文件[與 src 目錄平級])粘貼以下代碼即可

module.exports = {

? plugins: {

? ? autoprefixer: {}, // 用來給不同的瀏覽器自動添加相應前綴,如-webkit-,-moz-等等

? ? "postcss-px-to-viewport": {

? ? ? unitToConvert: "px", // 需要轉換的單位,默認為"px"

? ? ? viewportWidth: 390, // UI設計稿的寬度

? ? ? unitPrecision: 6, // 轉換后的精度,即小數點位數

? ? ? propList: ["*"], // 指定轉換的css屬性的單位,*代表全部css屬性的單位都進行轉換

? ? ? viewportUnit: "vw", // 指定需要轉換成的視窗單位,默認vw

? ? ? fontViewportUnit: "vw", // 指定字體需要轉換成的視窗單位,默認vw

? ? ? selectorBlackList: ["wrap"], // 需要忽略的CSS選擇器,不會轉為視口單位,使用原有的px等單位

? ? ? minPixelValue: 1, // 默認值1,小于或等于1px則不進行轉換

? ? ? mediaQuery: false, // 是否在媒體查詢的css代碼中也進行轉換,默認false

? ? ? replace: true, // 是否直接更換屬性值,而不添加備用屬性

? ? ? exclude: [/node_modules/], // 忽略某些文件夾下的文件或特定文件,用正則做目錄名匹配,例如 'node_modules' 下的文件

? ? ? landscape: false, // 是否處理橫屏情況

? ? ? landscapeUnit: "vw", // 橫屏時使用的視窗單位,默認vw

? ? ? landscapeWidth: 2048 // 橫屏時使用的視口寬度

? ? }

? }

};

文章來源:https://www.jb51.net/article/268317.htm

?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 移動的端常見問題 ios滑動不流暢 上下滑動頁面會產生卡頓,手指離開頁面,頁面立即停止運動。整體表現就是滑動不流暢...
    kalrase閱讀 363評論 2 1
  • 自適應布局方案 一套代碼對應一份設計稿,實現向上/向下兼容自適應布局方案對比 這里只做最表面的使用方法。不對,不進...
    乙哥驛站閱讀 818評論 0 0
  • 特別說明:在開始這一切之前,請開發(fā)移動界面的工程師們在頭部加上下面這條meta: 簡單事情簡單做-寬度自適應所謂寬...
    張憲宇閱讀 9,922評論 0 3
  • 導讀 移動端適配,是我們在開發(fā)中經常會遇到的,這里面可能會遇到非常多的問題: 1px問題 UI圖完美適配方案 iP...
    編程鴨閱讀 1,894評論 0 0
  • 導讀 移動端適配,是我們在開發(fā)中經常會遇到的,這里面可能會遇到非常多的問題: 1px問題 UI圖完美適配方案 iP...
    精神蛙閱讀 1,218評論 0 2

友情鏈接更多精彩內容