当前位置: 首页 > news >正文

vue 项目的屏幕自适应方案

方案一:使用 scale-box 组件
属性:
  1. width 宽度 默认 1920
  2. height 高度 默认 1080
  3. bgc 背景颜色 默认 "transparent"
  4. delay自适应缩放防抖延迟时间(ms) 默认 100

vue2版本:vue2大屏适配缩放组件(vue2-scale-box - npm)

npm install 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;
}
</style>

 vue3版本:vue3大屏适配缩放组件(vue3-scale-box - npm)

npm install 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;
}
</style>
 方案二:设置设备像素比例(设备像素比)

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

class devicePixelRatio {/* 获取系统类型 */getSystem() {const agent = navigator.userAgent.toLowerCase();const isMac = /macintosh|mac os x/i.test(navigator.userAgent);if (isMac) return false;// 目前只针对 win 处理,其它系统暂无该情况,需要则继续在此添加即可if (agent.indexOf("windows") >= 0) return true;}/* 监听方法兼容写法 */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;}/* 监听页面缩放 */watch() {const that = this;// 注意: 这个方法是解决全局有两个window.resizethat.addHandler(window, "resize", function () {that.correct(); // 重新校正浏览器缩放比例});}/* 初始化页面比例 */init() {const that = this;// 判断设备,只在 win 系统下校正浏览器缩放比例if (that.getSystem()) {that.correct(); // 校正浏览器缩放比例that.watch(); // 监听页面缩放}}
}
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 插件)

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

配置适配插件的参数(在项目根目录创建 .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", // 指定需要转换成的视窗单位,默认vwfontViewportUnit: "vw", // 指定字体需要转换成的视窗单位,默认vwselectorBlackList: ["wrap"], // 需要忽略的CSS选择器,不会转为视口单位,使用原有的px等单位minPixelValue: 1, // 默认值1,小于或等于1px则不进行转换mediaQuery: false, // 是否在媒体查询的css代码中也进行转换,默认falsereplace: true, // 是否直接更换属性值,而不添加备用属性exclude: [/node_modules/], // 忽略某些文件夹下的文件或特定文件,用正则做目录名匹配,例如 'node_modules' 下的文件landscape: false, // 是否处理横屏情况landscapeUnit: "vw", // 横屏时使用的视窗单位,默认vwlandscapeWidth: 2048 // 横屏时使用的视口宽度}}
};

 

相关文章:

  • wpf Grid布局详解 `Auto` 和 `*` 是两种常见的设置方式 行或列占多个单元格,有点像excel里的合并单元格。使其余的列平均分配剩余的空间
  • C# set的一些使用方法
  • 提升ChatGPT答案质量和准确性的方法Prompt专家
  • react_11
  • 消息中间件-RabbitMQ介绍
  • 机器人伺服驱动控制环
  • python爬虫(数据获取——selenium)
  • 【css】sass中的模块化
  • Jmeter_逻辑控制器
  • JavaScript继承的几种方式
  • Python中 lambda 的妙用
  • 昇腾CANN 7.0 黑科技:DVPP硬件加速训练数据预处理,友好解决Host CPU预处理瓶颈
  • TCP/IP的基础知识
  • C# 继承,抽象,接口,泛型约束,扩展方法
  • 微服务中配置文件(YAML文件)和项目依赖(POM文件)的区别与联系
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • 「面试题」如何实现一个圣杯布局?
  • HashMap ConcurrentHashMap
  • Java应用性能调优
  • js中的正则表达式入门
  • leetcode98. Validate Binary Search Tree
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • scrapy学习之路4(itemloder的使用)
  • Spring Boot快速入门(一):Hello Spring Boot
  • webpack入门学习手记(二)
  • windows下如何用phpstorm同步测试服务器
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 探索 JS 中的模块化
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 一些关于Rust在2019年的思考
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • ${ }的特别功能
  • (1)bark-ml
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (10)STL算法之搜索(二) 二分查找
  • (二)JAVA使用POI操作excel
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (三十五)大数据实战——Superset可视化平台搭建
  • (转)Linux整合apache和tomcat构建Web服务器
  • (转)winform之ListView
  • ****Linux下Mysql的安装和配置
  • .mysql secret在哪_MYSQL基本操作(上)
  • .NET 4.0中的泛型协变和反变
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .NET MVC第三章、三种传值方式
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • [ 渗透工具篇 ] 一篇文章让你掌握神奇的shuize -- 信息收集自动化工具
  • [ 数据结构 - C++] AVL树原理及实现
  • [BZOJ 3531][Sdoi2014]旅行(树链剖分+线段树)
  • [CUDA 学习笔记] CUDA kernel 的 grid_size 和 block_size 选择
  • [DM复习]关联规则挖掘(下)
  • [Docker]十一.Docker Swarm集群raft算法,Docker Swarm Web管理工具
  • [HeadFrist-HTMLCSS学习笔记][第一章Web语言:开始了解HTML]
  • [hive]中的字段的数据类型有哪些
  • [JavaWeb学习] Spring Ioc和DI概念思想