前端可视化大屏自适应终极解决方案autofit.js

news2025/1/11 18:48:54

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

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

三大常用方式

  1. vw/vh方案
    1. 概述:按照设计稿的尺寸,将px按比例计算转为vw和vh
    2. 优点:可以动态计算图表的宽高,字体等,灵活性较高,当屏幕比例跟 ui 稿不一致时,不会出现两边留白情况
    3. 缺点:每个图表都需要单独做字体、间距、位移的适配,比较麻烦
  2. scale方案
    1. 概述:也是目前效果最好的一个方案
    2. 优点:代码量少,适配简单 、一次处理后不需要在各个图表中再去单独适配.
    3. 缺点:留白,有事件热区偏移,下面介绍的autofit.js已经完全解决了此问题
  3. rem + vw vh方案
    1. 概述:这名字一听就麻烦,具体方法为获得 rem 的基准值 ,动态的计算html根元素的font-size ,图表中通过 vw vh 动态计算字体、间距、位移等
    2. 优点:布局的自适应代码量少,适配简单
    3. 缺点:留白,有时图表需要单独适配字体
autofit.js初代核心代码
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})`;
}

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

  • 从npm下载
npm i autofit.js

  • 引入
import autofit from 'autofit.js'
  • 快速开始
autofit.init()
默认参数为1920*929(即去掉浏览器头的1080), 直接在大屏启动时调用即可
  • 使用
// App.vue 需要在renderDom挂载到dom之后,才可以生效
export default {  
  mounted() {
  autofit.init({
        designHeight: 1080,
        designWidth: 1920,
        renderDom:"#app",
        resize: true
    })
  },
}
以上使用的是默认参数,可根据实际情况调整,参数分别为
* - renderDom(可选):渲染的dom,默认是 "#app",必须使用id选择器 
   * - designWidth(可选):设计稿的宽度,默认是 1920 
   * - designHeight(可选):设计稿的高度,默认是 929 ,如果项目以全屏展示,则可以设置为1080
   * - resize(可选):是否监听resize事件,默认是 true

解决问题

使用了autofit.js依然出现了白边

因为autofit.js使用的是scale方案,transform: scale() 缩放时,dom元素在文档中的实际占位是不变

这样下方就出现了白边,右侧还出现了滚动条

解决此问题将body设置超出隐藏即可:

1

2

3

body{

    overflow: hidden;

}

image-20230509154748146

在设置超出隐藏后,滚动条和白边都不见了。

#app充满了全屏,里面的元素却不能自适应位置。

出现这种问题的原因很明显,你需要将内容元素做一个简单的适配定位,因为autofit.js只做了缩放和填充部分。如果你的页面元素没有做均匀分布的位置,也是会出现这种情况的。

以上图为例

如果出现了这个问题,推荐使用flex进行布局即可。

1

2

display:flex;

justify-content: space-between;

或者直接使用定位,将三块内容定位到左上、中间、右上。

1

2

3

4

5

6

7

8

.left, .right {

    position: fixed;

    width: 25%;

    height: 100%;

    top: 0;

    padding-top: 70px;

    z-index: 9999;

}

手动缩放浏览器窗口时,echarts图表被拉伸了

这个问题按说不会是因为autofit.js引起的(前提是你没有使用百分比),但是既然有人提到了,这里说一下解决办法。

echarts图表拉伸,说明你的echarts外层容器变大或者变小的,导致canvas元素拉伸了,解决办法为:

1

2

3

4

5

6

window.addEventListener('resize', this.redraw, false);   

redraw() {

      this.myChart.clear();

      this.myChart.resize();

      this.draw();

},

像我这样,监听resize事件,并重绘echarts即可。

手动缩放浏览器可以正常适应,点击最大化(或F11全屏)时却失效了

这个问题属于autofit.js的一个bug,目前在最新版本已经修复了。

造成Bug的代码

1

2

3

4

5

6

7

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`;

}

造成这个bug的原因是,全屏时的宽高比不小于(因为是等于)设计图宽高比,导致高度没有被重新设置。

所以在曾经设置过高度(即基于宽度px不变的缩放),再最大化的情况,高度不会变。在这种逻辑下,宽度有时也会失效。

修改后的代码(1.0.8):

1

2

3

4

let scale = (clientWidth / clientHeight < designWidth / designHeight) ? (clientWidth / designWidth) : (clientHeight / designHeight)

dom.style.height = `${clientHeight / scale}px`;

dom.style.width = `${clientWidth / scale}px`;

dom.style.transform = `scale(${scale})`;

这样无论是怎样的宽高比,它都会同时设置宽度和高度。

使用autofit.js后,在小屏幕上字体(或元素)变得过小

造成这种问题的原因大概率是你同时使用了其他自适应工具,或者使用了相对单位,导致你的网站进行了双重适配。

解决方式也很简单,autofit.js不需要任何其他辅助工具,如果想体验autofit.js一行搞定,关闭其他插件,且不要使用任何相对单位即可!

autofit.js仅推荐使用px进行开发。

使用autofit.js后,地图事件热区偏移了

不要手动设置:transform-origin,因为autofit.js将它设置成了 0 0,即以左上角为基准点缩放,这可以保证dom元素不会偏移。

如果你使用的地图是基于canvas绘制的,那么有可能会出现偏移现象(往往伴随着拉伸),那么和上面的echarts的解决方式一样,只需要重绘就可以了。

如果是基于svg绘制的,那么不应该会出现这个问题。

原生项目或jquery项目引入方式

将准备好的包放在项目中,常规引入方式<script src="assets/autofit/autofit.js"></script>

需要修改autoofit.js文件,将//export { elRectification };
//export default autofit;注释掉,不然报错,当然如果你项目支持import方式可以不用注释掉;

在你的项目js中使用autofit.init()同上 

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

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

相关文章

编程题:电话号码

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 &#x1f4d1;题目解析 这个题目比较…

小程序1rpx边框不完美

问题展示 原因 rpx类似rem&#xff0c;渲染后实际转换成px之后可能存在小数&#xff0c;在不同的设备上多多少少会存在渲染的问题。而1rpx的问题就更加明显&#xff0c;因为不足1个物理像素的话&#xff0c;在IOS会进行四舍五入&#xff0c;而安卓好像统一向上取整&#xff0c…

Mars3d标绘的时候通过绑定单击事件,查询点击落点的图层类型

需求期望&#xff1a; 期望可以判断标绘点落下的位置是什么图层类型&#xff0c;例如是否是3dtitles模型&#xff0c;或者是gltf模型&#xff0c;或者是其他数据图层。 需求来源&#xff1a; 标绘点时&#xff0c;无法知道点落下的地方的图层类型 解决方案&#xff1a; ma…

【c】角谷猜想

#include<stdio.h> int coll(int x)//定义函数 {int count0;while(x>1){if(x%20){xx/2;count;}else{x3*x1;count;}}return count; } int main() {int n,num;scanf("%d",&n);int arr[n1];for(int i1;i<n;i)//输入n组数据保存到数组中{scanf("%d&…

详细流程来教你使用接码平台(内列举多平台的账号单价)

在现在社交网络和在线服务的普及下&#xff0c;我们经常需要提供电话号码来注册账户、接收验证码等。但是现在对于电话号码的实名验证越来越严格&#xff0c;而且对于出海企业来说有些网站需要使用国外的账号来进行注册。所以这个时候就需要用上接码平台&#xff0c;他们会通过…

(03)vite 处理 css

文章目录 系列全集vite 处理css流程vite如何解决协同开发&#xff0c;样式重复覆盖的问题&#xff1f;使用less通过配置&#xff0c;更改vite的css默认行为 系列全集 &#xff08;01&#xff09;vite 从启动服务器开始 &#xff08;02&#xff09;vite环境变量配置 &#xff…

助力业务协同:品牌商与经销商ERP系统的完美对接

助力业务协同&#xff1a;品牌商与经销商系统的完美对接 品牌方全链路数字营销系统的目的是为了提升营销效率、实现一致的品牌形象、深化用户洞察、加强与经销商合作以及提升营销效果评估。建立统一的数字营销平台可以帮助品牌方更好地管理和整合各个渠道上的营销活动&#xff…

Bishop新著 - 深度学习:基础与概念 - 前言

译者的话 十几年前&#xff0c;笔者在MSRA实习的时候&#xff0c;就接触到了Christopher M, Bishop的经典巨著《Pattern Recogition and Machine Learning》(一般大家简称为PRML)。Bishop大神是微软剑桥研究院实验室主任&#xff0c;物理出身&#xff0c;对机器学习的基本概念…

【C++11/线程相关】thread类编写多线程、mutex互斥锁和lock_guard、atomic原子类型

目录 通过thread类编写C多线程程序线程间互斥——mutex互斥锁和lock_guardmutex互斥锁lock_guard 线程间通信C11实现生产者与消费者模型 基于CAS操作的atomic原子类型 橙色 通过thread类编写C多线程程序 为什么结果没有子线程中所打印的字符串呢&#xff1f;因为通过detach进…

语音合成与配音工具(视频配音、微课配音、有声读物、产品营销)

在数字时代&#xff0c;语音技术的崛起正在改变我们与技术互动的方式。现在&#xff0c;我给大家介绍一款很赞的工具——AI文字转语音配音神器&#xff0c;为您的文字赋予生动、自然的声音&#xff0c;全新的沉浸式体验即将改变您的创作方式&#xff01;非常适合用于视频配音、…

LeetCode | 572. 另一棵树的子树

LeetCode | 572. 另一棵树的子树 OJ链接 我们需要判断两棵二叉树是否相同&#xff0c;如果再判断的的时候不同我们就直接返回false&#xff0c;否则就返回true然后再检查左子树和右子树里面是否存在subRoot子树~~ bool isSameTree(struct TreeNode* q, struct TreeNode* p) {…

音频录制软件哪个好?帮助你找到最合适的一款

音频录制软件是日常工作、学习和创作中不可或缺的一部分。选择一个适合自己需求的录音软件对于确保音频质量和提高工作效率至关重要。可是您知道音频录制软件哪个好吗&#xff1f;本文将深入探讨两种常见的音频录制软件&#xff0c;通过详细的步骤指南&#xff0c;帮助您了解它…

软件设计中如何画各类图之四探索类图:揭示软件系统的静态结构

目录 1 前言2 类图的符号及说明2.1 类&#xff08;Class&#xff09;2.2 属性&#xff08;Attributes&#xff09;2.3 方法&#xff08;Methods&#xff09;2.4 关系&#xff08;Relationships&#xff09; 3 画类图的步骤3.1 确定系统范围3.2 识别类3.3 建立类之间的关系3.4 细…

oops-framework框架 之 界面管理(三)

引擎&#xff1a; CocosCreator 3.8.0 环境&#xff1a; Mac Gitee: oops-game-kit 注&#xff1a; 作者dgflash的oops-framework框架QQ群&#xff1a; 628575875 回顾 在上文中主要通过oops-game-kit大家了一个新的模版项目&#xff0c; 主要注意项是resources目录下的两个文…

leetcode 201 数字范围按位与

leetcode 201 题目题解代码 题目 给你两个整数 left 和 right &#xff0c;表示区间 [left, right] &#xff0c;返回此区间内所有数字 按位与 的结果&#xff08;包含 left、right 端点&#xff09;。 具体示例如下&#xff1a; 题解 本题是一个在思维上的方法&#xff0c;不…

HarmonyOS4.0系列——03、声明式UI、链式编程、事件方法、以及自定义组件简单案例

HarmonyOS4.0系列——03、声明式UI、链式编程、事件方法、以及自定义组件简单案例 声明式 UI ArkTS以声明方式组合和扩展组件来描述应用程序的UI&#xff0c;同时还提供了基本的属性、事件和子组件配置方法&#xff0c;帮助开发者实现应用交互逻辑。 如果组件的接口定义没有包…

Git:分布式版本控制系统的崛起与演变

简介 Git是一个开源的分布式版本控制系统&#xff0c;旨在有效、高速地处理从很小到非常大的项目版本管理。它是由Linus Torvalds于2005年创建的&#xff0c;最初是为了服务于Linux内核开发的版本控制需求。Git通过强大的分支功能、高效的缓存机制以及可扩展的架构设计&#xf…

实验六 单脉冲触发中断实验(汇编与微机原理)

实验目的&#xff1a; 掌握可编程中断控制器8259一般的使用方法。 掌握8259初始化的编程方法及中断服务程序的编写方法&#xff0c;中断程序的调试方法。 实验内容&#xff1a; 用单脉冲按钮的正脉冲输出作为中断控制器8259的中断源产生中断请求&#xff0c;在中断服务程序…

启动微服务idea控制台配置及样式

启动微服务idea控制台配置及样式 1. view —> tool windows —> services 2.控制台样式&#xff0c;下载插件 Grep Console &#xff0c;可在设置中设置颜色

element 弹窗在弹出后鼠标还可以点击页面其他元素

文章目录 需求分析需求 如下图所示,在点击弹出弹框后,支持 鼠标可点击弹框外的其他地方可拖拽弹框弹出弹出后不可有遮挡弹出样式可自定义 分析 官网:https://vxetable.cn/v4/#/table/start/install 安装 vxe-table 引入import {App, createApp }