首页 > 其他分享 >可视化大屏的终极解决方案居然这么简单,vue-autofit一行全搞定!

可视化大屏的终极解决方案居然这么简单,vue-autofit一行全搞定!

时间:2023-04-23 11:36:02浏览次数:55  
标签:vue 缩放 适配 白边 autofit scale 大屏

可视化大屏适配/自适应现状

可视化大屏的适配是一个老生常谈的话题了,现在其实不乏一些大佬开源的自适应插件、工具但是我为什么还要重复造轮子呢?因为目前市面上适配工具每一个都无法做到完美的效果,做出来的东西都差不多,最终实现效果都逃不出白边的手掌心,可以解决白边问题的,要么太过于复杂,要么会影响dom结构。

三大常用方式

方案 实现方式 优点 缺点
vw vh 1.按照设计稿的尺寸,将px按比例计算转为vwvh 1.可以动态计算图表的宽高,字体等,灵活性较高 2.当屏幕比例跟 ui 稿不一致时,不会出现两边留白情况 1.每个图表都需要单独做字体、间距、位移的适配,比较麻烦
scale 1.通过 scale 属性,根据屏幕大小,对图表进行整体的等比缩放 1.代码量少,适配简单 2.一次处理后不需要在各个图表中再去单独适配 1.因为是根据 ui 稿等比缩放,当大屏跟 ui 稿的比例不一样时,会出现周边留白情况 2.当缩放比例过大时候,字体会有一点点模糊,就一点点 3.当缩放比例过大时候,事件热区会偏移。
rem + vw vh 1.获得 rem 的基准值 2.动态的计算html根元素的font-size 3.图表中通过 vw vh 动态计算字体、间距、位移等 1.布局的自适应代码量少,适配简单 1.因为是根据 ui 稿等比缩放,当大屏跟 ui 稿的比例不一样时,会出现周边留白情况 2.图表需要单个做字体、间距、位移的适配

作者:懒惰的智慧
链接:https://juejin.cn/post/7163932925955112996
来源:稀土掘金

基于此背景,我决定要造一个简单又好用的轮子。

解决留白问题

留白问题是在使用scale时才会出现,而其他方式实现起来又复杂,效果也不算太理想,总会破坏掉原有的结构,可能使元素挤在一起,所以我们还是选择使用scale方案,不过这次要做出一点小小的改变。

常用分辨率

首先来看一下我的拯救者的分辨率:

image-20230420141240837 它可以代表从1920往下的分辨率

我们可以发现,比例分别是:1.77、1.6、1.77、1.6、1.33... 总之,没有特别夸张的宽高比。

计算补齐白边所需的px

只要没有特别夸张的宽高比,就不会出现特别宽或者特别高的白边,那么我们能不能直接将元素宽高补过去?也就是说,当屏幕右侧有白边时,我们就让宽度多出一个白边的px,当屏幕下方有白边时,我们就让高度多出一个白边的px。

很喜欢CSGO玩家的一句话:"啊?"

先想一下,如果此时按宽度比例缩放,会在下方留下白边,所以设置一下它的高度,设置多少呢?比如 scale==0.8 ,也就是说整个#app缩小了0.8倍,我们需要将高扩大多少倍才可以回到原来的大小呢?

QQ录屏20230420144111

emmm.....

算数我最不在行了,启动高材生

image-20230420143742913

原来是八分之十,我vue烧了。

当浏览器窗口比设计稿大或者小的时候,就应该触发缩放,但是比例不一定,如果按照scale等比缩放时,宽度从1920缩小0.8倍也就是1536,而高度缩小0.8也就是743,如果此时浏览器高度过高,那么就会出现下方的白边,根据高材生所说的,缩小0.8后只需要放大八分之十就可以变回原大小,所以以现在的高度743*1.25=928,使宽度=928px就可以完全充满白边!

真的是这样吗?感觉哪里不对劲...

是浏览器高度!我忽略了浏览器高度,我可以直接使用浏览器高度乘以1.25然后再缩放达0.8!就是 1 !

也就是说 clientHeight / scale 就等于我们需要的高度!

我们用代码试一试

function keepFit(designWidth, designHeight, renderDom) {
let clientHeight = document.documentElement.clientHeight;
let clientWidth = document.documentElement.clientWidth;
let scale = 1;
if (clientWidth / clientHeight < designWidth / designHeight) {
scale = (clientWidth / designWidth)
document.querySelector(renderDom).style.height = `${clientHeight / scale}px`;
} else {
scale = (clientHeight / designHeight)
document.querySelector(renderDom).style.width = `${clientWidth / scale}px`;
}
document.querySelector(renderDom).style.transform = `scale(${scale})`;
}

上面的代码可能看起来乱糟糟的,我来解释一下:

参数分别是:设计稿的宽高和你要适配的元素,在vue中可以直接传#app。

下面的if判断的是宽度固定还是高度固定,当屏幕宽高比小于设计宽高比时,

我们把高度写成 clientHeight / scale ,宽度也是同理。

最终效果

将这段代码放到App.vue的mounted运行一下

autofit

如上图所示:我们成功了,我们仅用了1 2 3 4....这么几行代码,就做到了足以媲美复杂写法的自适应!

我把这些东西封装了一个npm包:vue-autofit ,开箱即用,欢迎下载!

亲手打造集成工具:vue-autofit

这是一款可以使你的项目一键自适应的工具 github源码

标签:vue,缩放,适配,白边,autofit,scale,大屏
From: https://www.cnblogs.com/Kay-Larry/p/17345972.html

相关文章

  • vue3 create-vue 开启vite自动验证eslint
    0.vue3 cli推荐新的构建工具vite,但没有yarnrundev后并不自动检测eslint规则,需要运行yarnruneslint1.添加组件即可 yarnadd vite-plugin-eslint--dev 2.在vite.config.js加入1import{fileURLToPath,URL}from'node:url'23import{defineConfig}......
  • 前端必须学会的vueh5布局瀑布流 简易通俗易懂 左右排版
    css简易版瀑布流布局通过v-if="index%2===0"v-if="index%2===1"进行判断显示左边右边左右瀑布流排版,在每一列中交替地排放元素。具体来说,可以通过对每一列进行编号,然后对奇数列和偶数列分别设置不同的样式来实现左右瀑布流排版。html<div><cl-pull-refreshv-model="isR......
  • ant design of vue的a-rang-picker时间控制既不能选今天以后的日期且开始时间跟结束时
    在项目中这个问题在困扰我,虽然我知道它是有一个Api是disableDate来控制时间的选择;但是只能够实现开始时间跟结束时间之间差不能超过3天。效果图接下来就是代码时间呀<a-col><a-form-model-itemlabel="任务时间范围"prop="priceRangeDate"><a-range-picker......
  • vue3 keep-alive实现tab页面缓存
    先上图 如何在我们切换tab标签的时候,缓存标签最后操作的内容,简单来说就是每个标签页中设置的比如搜索条件及结果、分页、新增、编辑等数据在切换回来的时候还能保持原样。看看keep-alive是如何实现该功能的。首先我们要了解keep-alive的基本使用。具体介绍请查看官方文档(htt......
  • vue 3.0 对应node 版本
    npmrundev我的版本v14.16.116.19.016.18.1node多版本管理工具https://blog.csdn.net/weixin_57844432/article/details/127788884failedtoloadconfigfromD:\ProFolder\hczhyq\slkj_custom_front\vite.config.tserrorwhenstartingdevserver:Error:Cannotfind......
  • vue 拖拽功能实现
    前言最新项目里使用到了拖拽的功能,查阅资料后,看到一篇关于拖拽的详细文章:https://www.cnblogs.com/xiaohuochai/p/5886618.html基于此,记录下vue实现拖拽的过程,以下是编写的示例demo效果图:设置拖拽时,需要拖拽的元素要设置draggable=true及元素是否可拖动。默认是draggab......
  • Vue设置默认加载页面,去掉地址栏#号
     {path:'/',component:Login,//想默认启动的页面},mode:"history"//去掉地址栏的#号 ......
  • 解决vue2.0路由 TypeError: Cannot read property 'matched' of undefined 的错误问题
      找了很久这个问题 解决vue2.0路由TypeError:Cannotreadproperty'matched'ofundefined的错误问题-北桥苏-博客园(cnblogs.com)  解决办法改为   问题解决  没有找到为什么 好像高版本的router没有这个问题 我因为需要降级到了3.1.3 ......
  • Vue Typescript 引入文件接口,就无法使用withDefaults
    就是代码写的不规范报错写法 import{Setting}from'@element-plus/icons-vue' import{defineProps,withDefaults}from'vue' import{PiProject}from'@/types/Project' interfaceProjectCardProps{ project:PiProject } constprops=de......
  • 记录一次艰难的云服务器部署前后端项目springBoot+mybatis和vue(两天解决的前后端跨域
    前言大家好我是歌谣今天继续给大家带来后端java的学习最近刚学习完java的一个增删改查紧接着就是部署项目了代码准备工作前端:vue后端:springboot+mybatis数据库mysql部署后端项目打包找到maven-package-runmavenbuild云服务器上面建立文件mkdir/www/springBoot创建文件......