vue3+ts+vite数据大屏自适应总结(两种方法)

总结一下我常用的数据大屏自适应方法

目录

    • 1、通过css缩放方案: 利用transform:scale 进行适配
    • 2、采用rem布局, 根据屏幕分辨率大小不同,调整根元素html的font-size, 从而达到每个元素宽高自动变化,适配不同屏幕
      • 2.1、先下载postcss-pxtorem
      • 2.2、在vite.config.ts配置
      • 2.3、在src/utils下创建flexible.js文件(lib-flexible插件建议放到本地)
      • 2.4、在main.js中引入flexible.js
      • 2.5、注意事项

1、通过css缩放方案: 利用transform:scale 进行适配

我一般使用 v-scale-screen 插件
主要用于同比例缩放,例如16:9(1k,2k,4k)

vue2版本(npm官网):https://www.npmjs.com/package/vue2-scale-box
vue3版本(npm官网):https://www.npmjs.com/package/vue3-scale-box

yarn add vue3-scale-box<template><ScaleBox:width="1920":height="1080"bgc="transparent":delay="100":isFlat="false"><div class="ec-demo" id="ec-demo"></div></ScaleBox>
</template>
<script setup>
import ScaleBox from "vue3-scale-box";
</script>

2、采用rem布局, 根据屏幕分辨率大小不同,调整根元素html的font-size, 从而达到每个元素宽高自动变化,适配不同屏幕

我一般使用 postcss-pxtorem + lib-flexible 插件
主要用于多个不同比例缩放,例如16:9(1k,2k,4k),21:9或其他比例
适配的方法总体分为两步:

  1. px转换成rem
  2. rem根据屏幕大小重置基数改变大小

2.1、先下载postcss-pxtorem

yarn add postcss-pxtorem "postcss-pxtorem": "^6.0.0",

2.2、在vite.config.ts配置

import postcssPxtoRem from "postcss-pxtorem";css: {postcss: {plugins: [postcssPxtoRem({rootValue: 192, // 按照自己的设计稿修改 1920/10unitPrecision: 5, // 保留到5位小数selectorBlackList: ["ignore"], // 忽略转换正则匹配项propList: ["*", "!border"],replace: true,mediaQuery: false, // 媒体查询( @media screen 之类的)中不生效minPixelValue: 1, //可以选择px小于1的不会被转换}),],},
},

2.3、在src/utils下创建flexible.js文件(lib-flexible插件建议放到本地)

因为我要适配不同比例的大屏,我把lib-flexible插件放在了本地(方便修改)

可以在 refreshRem() 方法中对不同分辨率进行设置

(function (win, lib) {var doc = win.document;var docEl = doc.documentElement;var metaEl = doc.querySelector('meta[name="viewport"]');var flexibleEl = doc.querySelector('meta[name="flexible"]');var dpr = 0;var scale = 0;var tid;var flexible = lib.flexible || (lib.flexible = {});if (metaEl) {console.warn("将根据已有的meta标签来设置缩放比例");var match = metaEl.getAttribute("content").match(/initial\-scale=([\d\.]+)/);if (match) {scale = parseFloat(match[1]);dpr = parseInt(1 / scale);}} else if (flexibleEl) {var content = flexibleEl.getAttribute("content");if (content) {var initialDpr = content.match(/initial\-dpr=([\d\.]+)/);var maximumDpr = content.match(/maximum\-dpr=([\d\.]+)/);if (initialDpr) {dpr = parseFloat(initialDpr[1]);scale = parseFloat((1 / dpr).toFixed(2));}if (maximumDpr) {dpr = parseFloat(maximumDpr[1]);scale = parseFloat((1 / dpr).toFixed(2));}}}if (!dpr && !scale) {var isAndroid = win.navigator.appVersion.match(/android/gi);var isIPhone = win.navigator.appVersion.match(/iphone/gi);var devicePixelRatio = win.devicePixelRatio;if (isIPhone || isAndroid) {// iOS下,对于2和3的屏,用2倍的方案,其余的用1倍方案if (devicePixelRatio >= 3 && (!dpr || dpr >= 3)) {dpr = 3;} else if (devicePixelRatio >= 2 && (!dpr || dpr >= 2)) {dpr = 2;} else {dpr = 1;}} else {// 其他设备下,仍旧使用1倍的方案dpr = devicePixelRatio;}scale = 1 / dpr;// scale = 1 * dpr;}docEl.setAttribute("data-dpr", dpr);if (!metaEl) {metaEl = doc.createElement("meta");metaEl.setAttribute("name", "viewport");metaEl.setAttribute("content","initial-scale=" +scale +", maximum-scale=" +scale +", minimum-scale=" +scale +", user-scalable=no");if (docEl.firstElementChild) {docEl.firstElementChild.appendChild(metaEl);} else {var wrap = doc.createElement("div");wrap.appendChild(metaEl);doc.write(wrap.innerHTML);}}function refreshRem() {var width = docEl.getBoundingClientRect().width;var height = docEl.getBoundingClientRect().height;if (width / dpr < 1600) {width = 1920 * dpr;}var rem = (width * dpr) / 10;docEl.style.fontSize = rem + "px";flexible.rem = win.rem = rem;// if(width>3040&&width<3640){//   docEl.style.fontSize = 1 + "px";//   flexible.rem = 1 + "px";// }}win.addEventListener("resize",function () {refreshRem();},false);win.addEventListener("pageshow",function (e) {if (e.persisted) {refreshRem();}},false);if (doc.readyState === "complete") {doc.body.style.fontSize = 12 * dpr + "px";} else {doc.addEventListener("DOMContentLoaded",function () {doc.body.style.fontSize = 12 * dpr + "px";},false);}refreshRem();flexible.dpr = win.dpr = dpr;flexible.refreshRem = refreshRem;flexible.rem2px = function (d) {var val = parseFloat(d) * this.rem;if (typeof d === "string" && d.match(/rem$/)) {val += "px";}return val;};flexible.px2rem = function (d) {var val = parseFloat(d) / this.rem;if (typeof d === "string" && d.match(/px$/)) {val += "rem";}return val;};
})(window, window["lib"] || (window["lib"] = {}));

2.4、在main.js中引入flexible.js

//px转rem
// 使用下面@ts-ignore表示忽略ts类型检测,否则下面代码打包时会报错
import '@/utils/flexible.js'

2.5、注意事项

1、 框架组件和标签中直接定义的 width和height进行不了转换, 例如img标签
2、 大多框架只适配1920*1080的,其他比例,框架组件可能会变形,需要单独设置,可以在全局css文件进行修改。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/712001.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

接口测试实战--mock测试、日志模块

一、mock测试 在前后端分离项目中,当后端工程师还没有完成接口开发的时候,前端开发工程师利用Mock技术,自己用mock技术先调用一个虚拟的接口,模拟接口返回的数据,来完成前端页面的开发。 接口测试和前端开发有一个共同点,就是都需要用到后端工程师提供的接口。所以,当…

Redis速学

一、介绍Redis 基本概念和特点 Redis是一个开源的内存数据库&#xff0c;它主要用于数据缓存和持久化。其数据存储在内存中&#xff0c;这使得它具有非常快的读写速度。Redis支持多种数据结构&#xff0c;包括字符串、哈希、列表、集合和有序集合&#xff0c;这使得它非常灵活…

书生·浦语大模型图文对话Demo搭建

前言 本节我们先来搭建几个Demo来感受一下书生浦语大模型 InternLM-Chat-7B 智能对话 Demo 我们将使用 InternStudio 中的 A100(1/4) 机器和 InternLM-Chat-7B 模型部署一个智能对话 Demo 环境准备 在 InternStudio 平台中选择 A100(1/4) 的配置&#xff0c;如下图所示镜像…

微店商品详情 API 支持哪些商品信息的获取?

微店&#xff08;Weidian&#xff09;并没有一个公开的、官方维护的API文档来供开发者使用。这意味着&#xff0c;如果你想要获取微店商品详情或其他相关信息&#xff0c;你通常需要通过微店官方提供的方式来实现&#xff0c;例如使用其开放平台、官方SDK或联系微店的技术支持获…

Spring常见面试题知识点总结(三)

7. Spring MVC&#xff1a; MVC架构的概念。 MVC&#xff08;Model-View-Controller&#xff09;是一种软件设计模式&#xff0c;旨在将应用程序分为三个主要组成部分&#xff0c;以实现更好的代码组织、可维护性和可扩展性。每个组件有着不同的职责&#xff0c;相互之间解耦…

11.Prometheus常见PromeQL表达式

平凡也就两个字: 懒和惰; 成功也就两个字: 苦和勤; 优秀也就两个字: 你和我。 跟着我从0学习JAVA、spring全家桶和linux运维等知识&#xff0c;带你从懵懂少年走向人生巅峰&#xff0c;迎娶白富美&#xff01; 关注微信公众号【 IT特靠谱 】&#xff0c;每天都会分享技术心得~ …

YOLO算法

YOLO介绍 YOLO&#xff0c;全称为You Only Look Once: Unified, Real-Time Object Detection&#xff0c;是一种实时目标检测算法。目标检测是计算机视觉领域的一个重要任务&#xff0c;它不仅需要识别图像中的物体类别&#xff0c;还需要确定它们的位置。与分类任务只关注对…

【矩阵】【方向】【素数】3044 出现频率最高的素数

作者推荐 动态规划的时间复杂度优化 本文涉及知识点 素数 矩阵 方向 LeetCode 3044 出现频率最高的素数 给你一个大小为 m x n 、下标从 0 开始的二维矩阵 mat 。在每个单元格&#xff0c;你可以按以下方式生成数字&#xff1a; 最多有 8 条路径可以选择&#xff1a;东&am…

安装 Ubuntu 22.04.3 和 docker

文章目录 一、安装 Ubuntu 22.04.31. 简介2. 下载地址3. 系统安装4. 系统配置 二、安装 Docker1. 安装 docker2. 安装 docker compose3. 配置 docker 一、安装 Ubuntu 22.04.3 1. 简介 Ubuntu 22.04.3 是Linux操作系统的一个版本。LTS 版本支持周期到2032年。 系统要求双核 C…

C++的模板template

一、什么是模板 C中的模板分为类模板和函数模板&#xff0c;并不是一个实际的类或函数&#xff0c;这指的是编译器不会自动为其生成具体的可执行代码。只有在具体执行时&#xff0c;编译器才帮助其实例化。 二、为什么引入模板 拿我们最常见的交换函数来举例子&#xff0c;如果…

代码随想录 二叉树第二周

目录 101.对称二叉树 100.相同的树 572.另一棵树的子树 104.二叉树的最大深度 559.N叉树的最大深度 111.二叉树的最小深度 222.完全二叉树的节点个数 110.平衡二叉树 257.二叉树的所有路径 101.对称二叉树 101. 对称二叉树 已解答 简单 相关标签 相关企业 给你一…

《求生之路2》服务器如何选择合适的内存和CPU核心数,以避免丢包和延迟高?

根据求生之路2服务器的实际案例分析选择合适的内存和CPU核心数以避免丢包和延迟高的问题&#xff0c;首先需要考虑游戏的类型和对服务器配置的具体要求。《求生之路2》作为一款多人在线射击游戏&#xff0c;其服务器和网络优化对于玩家体验至关重要。 首先&#xff0c;考虑到游…

Java应用程序注册成Linux系统服务后,关闭Java应用程序打印系统日志

Java应用程序有自己的日志框架&#xff0c;有指定位置的日志文件&#xff0c;不需要在系统日志里记录&#xff0c;占用磁盘空间。 1.Linux系统文件目录 /etc/systemd/system/ 找到要修改的Java应用程序服务配置 比如bis-wz-80.service 2.设置不打印日志 StandardOutputnull S…

centos7 搭建 harbor 私有仓库

一、下载安装 1.1、harbor 可以直接从 github 上下载&#xff1a;Releases goharbor/harbor GitHub 这里选择 v2.10.0 的版本 wget https://github.com/goharbor/harbor/releases/download/v2.10.0/harbor-offline-installer-v2.10.0.tgz 1.2、解压 tar zxvf harbor-offlin…

L2 网络 Mint Blockchain 正式对外发布测试网

Mint Blockchain 是由 NFTScan Labs 发起的聚焦在 NFT 生态的 L2 网络&#xff0c;致力于促进 NFT 资产协议标准的创新和 NFT 在现实商业应用场景中的大规模采用。 Mint Blockchain 于 2024 年 2 月 28 号正式对外发布测试网&#xff0c;开始全面进入生态开发者测试开发阶段。 …

2403C++,C++11玩转无栈协程

原文 C11里也能玩无栈协程了? 答案是:可以! 事实上异网在很早时,C11里就可用无栈协程写异步代码了,只不过用起来不太方便,来看看C11里怎么用异网无栈协程写一个回音服务器的吧. #包含 <异网.h> #包含 <内存> #包含 <向量> #包含 <异网/产生.h> 用 …

c++异常机制(5)-- 继承与异常

我们在c异常机制(3)中自定义类型&#xff0c;我们将相应的异常封装成了类&#xff0c;在类中实现一些方法&#xff0c;对异常进行处理。其中每一个类都实现了print()方法。 我们使用throw抛出相应异常的虚拟对象&#xff0c;在catch参数中进行匹配&#xff0c;但是如果有很多异…

Springboot项目集成短信验证码(超简单)

操作流程 注册验证码平台创建验证码模版开始集成&#xff08;无需引入第三方库&#xff09; 注册并登陆中昱维信验证码平台 获取AppID和AppKey。 创建验证码模版 创建验证码模版&#xff0c;获取验证码模版id 开始集成 创建controller import org.springframework.web.bi…

MATLAB环境下基于随机游走拉普拉斯算子的快速谱聚类方法

古人有云&#xff0c;物以类聚&#xff0c;在面临信息爆炸问题的今天&#xff0c;对信息类别划分的价值日益显现&#xff0c;并逐步成为学者们的研究热点。分类和聚类是数据挖掘的重要工具&#xff0c;是实现事物类别划分的左右手&#xff0c;聚类又是分类一种特殊的方式。所谓…

CodeWhisperer安装教导--一步到位!以及本人使用Whisperer的初体验。

CodeWhisperer是亚马逊出品的一款基于机器学习的通用代码生成器&#xff0c;可实时提供代码建议。类似 Cursor 和Github AWS CodeWhisperer 亚马逊科技的CodeWhisperer是Amazon于2021年12月推出的一款代码补全工具&#xff0c;与GitHub Copilot类似。主要的功能有:代码补全注释…