首页 > 其他分享 >大屏自适应/适配方案【详解】(echarts自适配、rem、flexible.js、vscode中px2rem插件自动计算rem)

大屏自适应/适配方案【详解】(echarts自适配、rem、flexible.js、vscode中px2rem插件自动计算rem)

时间:2023-09-13 10:11:33浏览次数:46  
标签:插件 字体大小 适配 js fontSize rem flexible document

原文链接:https://blog.csdn.net/weixin_41192489/article/details/120004315

大屏自适应

的核心目标有:
  • 字体大小随屏幕尺寸自适应变化
    详见下文

  • 自动撑满全屏
    设置如下

.bg{
  background: url("~@/assets/images/主背景.png");
  position:fixed;
  top: 0;
  left: 0;
  width:100%;
  height:100%;
  min-width: 1000px;
  z-index:-10;
  zoom: 1;
  background-color: #fff;
  background-repeat: no-repeat;
  background-size: cover;
  -webkit-background-size: cover;
  -o-background-size: cover;
  background-position: center 0;
}
  • 弹性布局(使用 css 的flex布局)
    如下

重要提示:电脑开发大屏时,要使用浏览器全屏(按F11)查看最终效果!

使用flexible.js + rem实现字体自适应

flexible.js用于根据屏幕尺寸变化动态调整根元素的字体大小。
rem(font size of the root element)则是相对于根元素的字体大小单位。
具体用法如下:

1.新建flexible.js

// 来自 https://github.com/amfe/lib-flexible/blob/2.0/index.js
(function flexible(window, document) {
  var docEl = document.documentElement;
  // 获取当前显示设备的物理像素分辨率与CSS像素分辨率之比;
  var dpr = window.devicePixelRatio || 1;

  //根据分辨率调整全局字体大小
  function setBodyFontSize() {
    // html已完成加载,则立即调整字体大小,否则等待html加载完成再调整字体大小
    if (document.body) {
      document.body.style.fontSize = 12 * dpr + "px";
    } else {
      // 监听DOMContentLoaded 事件——当初始的 HTML 文档被完全加载和解析完成之后触发,无需等待样式表
      document.addEventListener("DOMContentLoaded", setBodyFontSize);
    }
  }
  setBodyFontSize();

  // 根据屏幕宽度,重置1rem的长度为当前屏幕宽度的1/10
  function setRemUnit() {
    var rem = docEl.clientWidth / 10;
    // 1rem的值永远为根元素的字体大小,所以此处通过调整全局字体大小来重置rem
    docEl.style.fontSize = rem + "px";
  }

  setRemUnit();

  // 监听resize事件——屏幕大小发生变化时触发
  window.addEventListener("resize", setRemUnit);
  // 监听pageshow事件——显示页面时触发
  window.addEventListener("pageshow", function(e) {
    // 若是浏览器中点击后退时显示页面,则重置rem
    if (e.persisted) {
      setRemUnit();
    }
  });

  // 检测是否支持0.5px
  if (dpr >= 2) {
    var fakeBody = document.createElement("body");
    var testElement = document.createElement("div");
    testElement.style.border = ".5px solid transparent";
    fakeBody.appendChild(testElement);
    docEl.appendChild(fakeBody);
    if (testElement.offsetHeight === 1) {
      docEl.classList.add("hairlines");
    }
    docEl.removeChild(fakeBody);
  }
})(window, document);

2.引入flexible.js

src\pages\index.vue

import "./utils/flexible.js";
1

3.将px转换为rem

转换规则:

rem值 = px值10/设计图宽度
1
举例:设计图的宽度为3840px,当前div元素的宽度384px
则转换为rem后为 384
10/3840 = 1rem
所以转换后页面中css的效果如下:

.mapBox {
  position: absolute;
  top: 0.963542rem /* 370/384 */;
  height: 3.125rem /* 1200/384 */;
  width: 5.208333rem /* 2000/384 */;
  left: 50%;
  transform: translate(-50%, 0);
}

如此复杂的计算,当然有神器相助!

vscode中px2rem插件自动计算rem

1.下载安装px2rem插件

![](/i/l/?n=23&i=blog/2653936/202309/2653936-20230913095308182-1234058021.png)

2.设置px2rem插件的转换系数

![](/i/l/?n=23&i=blog/2653936/202309/2653936-20230913095336771-84565100.png)

3.重启vscode

4.使用px2rem插件

在大屏页面中,输入px时,会自动帮你计算对应的rem值 ![](/i/l/?n=23&i=blog/2653936/202309/2653936-20230913095413415-248606110.png)

echarts自适配

rem如此强大,但echarts默认使用的px为单位,且不能在echarts配置中携带rem单位,怎么办?

其实很简单

1. 添加fontSize函数

在图表配置的页面添加下方的转换函数,其中3840为设计稿的宽度,记得根据实际情况修改!
function fontSize(res) {
  let docEl = document.documentElement,
    clientWidth =
      window.innerWidth ||
      document.documentElement.clientWidth ||
      document.body.clientWidth;
  if (!clientWidth) return;
  // 此处的3840 为设计稿的宽度,记得修改!
  let fontSize = clientWidth / 3840;
  return res * fontSize;
}

2. 使用fontSize函数实现转换

所有图表配置中涉及尺寸的数据,都要用fontSize进行转换,包括定位、字体大小、宽度、内外边距…… 此时无需任何计算,只需用fontSize()包裹原数据即可,fontSize函数会帮你完成适配!
      legend: [
        {
          data: ["人数"],
          top: fontSize(10),
          right: fontSize(320),
          itemWidth: fontSize(14),
          textStyle: {
            color: "#fff",
            fontSize: fontSize(20),
          },
        },
      yAxis: [
        {
          name: "万次",
          nameLocation: "end", //坐标位置,支持start,end,middle
          nameTextStyle: {
            color: "#fff",
            fontSize: fontSize(26),
            padding: [0, 0, fontSize(30), -fontSize(80)], //距离坐标位置的距离
          },

3. 记得监听屏幕尺寸变化事件,及时重绘图表

import echarts from "echarts";

    let option = {…… 图表配置 ……}
    let chart = echarts.init(this.$refs.myChart);
    chart.setOption(option);
    // 添加窗口大小改变监听事件,当窗口大小改变时,图表会重新绘制,自适应窗口大小
    window.addEventListener("resize", function() {
      chart.resize();
    });

标签:插件,字体大小,适配,js,fontSize,rem,flexible,document
From: https://www.cnblogs.com/hxy--Tina/p/17698750.html

相关文章

  • IIS上缺少 AspNetCoreModuleV2 如何解决
    实际上是少了装了.NetCoreSDK需要找到自己的程序使用的.NetCore对应版本进行下载https://dotnet.microsoft.com/en-us/download/dotnet/3.0只装Hosting就行了......
  • MGR新节点RECOVERING状态的分析与解决:caching_sha2_password验证插件的影响
    MGR新节点RECOVERING状态的分析与解决:caching_sha2_password验证插件的影响起因在GreatSQL社区上有一位用户提出了“手工构建MGR碰到的次节点一直处于recovering状态”,经过排查后,发现了是因为新密码验证插件caching_sha2_password导致的从节点一直无法连接主节点,帖子地址:(https:/......
  • uQRCode 全端二维码生成插件
    uQRCode全端二维码生成插件地址:https://ext.dcloud.net.cn/plugin?id=1287  #npm安装npminstalluqrcodejs//npm安装importUQRCodefrom'uqrcodejs';//npminstalluqrcodejs<canvasid="qrcode"canvas-id="qrcode"style="width:......
  • 插件支持——操作校验明细不允许为空
    背景: 业务要求单据审核根据单据状态校验明细是否为空,有些场景为空可以审核,有些场景明细为空不允许操作审核。  需求描述:售后单审核时,单据类型【更换、待返回】都需要明细必录才可以审核和下推。  方案设计:售后单审核时,获取单据类型的值,如果是“更换”或者“待修返......
  • USB适配器应用芯片 国产GP232RL软硬件兼容替代FT232RL DPU02直接替代CP2102
    USB适配器,是英文UniversalSerialBus(通用串行总线)的缩写,而其中文简称为“通串线”,是一个外部总线标准,用于规范电脑与外部设备的连接和通讯。是应用在PC领域的接口技术,移动PC由于没有电池,电源适配器对其尤为重要。今天来讲讲USB适配器的国产适用芯片。一、GP232RL,直接软硬件......
  • UVA-1401 - Remember the Word -----Trie前缀树
    题意:给出N个不同单词和一个长字符串S。把这个字符串分解成若干个单词的连接(单词尅重复使用),问有多少种方法?分析:令d[i]表示从字符i开始的字符串的分解方案数,则d[i]=sum{d[i+len[x]]|单词x是S[i...len]的前缀};详看《算法竞赛入门经典》---刘汝佳--Page208.......
  • 日常使用vscode开发flutter相关的插件
    简介这里整理了日常使用vscode开发flutter相关的插件,也有部分通用类型的插件Flutter&Dart这2个是flutter官方插件,开发flutter装机必备,不用多说。AwesomeFlutterSnippetsAwesomeFlutterSnippetsisacollectionsnippetsandshortcutsforcommonlyusedFlutterfunctions......
  • 界面控件DevExtreme DateRangeBox组件发布,支持日期范围选择!
    在最新的v23.1版本中,DevExpress官方已经正式发布了DevExtreme DateRangeBox小部件,支持所有JavaScript框架,包括Angular、React、Vue和jQuery。这个新的控件允许最终用户选择一个日期范围,该组件继承了DateBox组件的特性:屏蔽输入、灵活的弹出窗口和日历自定义、输入标签/样式模式等......
  • MyBatisPlus插件访问不到云数据库的解决方案
      今天在学mybatis-plus时候了解到除了MybatisX插件外还有个大佬写的MyBatisPlus插件,个人感觉他默认自动生成代码的风格会比MybatisX插件更适合中国程序员,跳转的图标也比小鸟更合适。  但是在连接云数据库的时候出了问题,发现他根本连接不到云数据库,问了其他人,他们表示自己的......
  • F. Remainder Problem 根号分治
    Problem-F-Codeforces 题意:一个500000长度的数列,一开始都是0,进行q次操作,操作如下1,输入x,y,令a[x]+=y。2,输入x,y,输出对于sum(a[idx]),idx的条件是idx=x%y。做法:如果我们模拟做,那么第一种操作就是o(1),第二种操作就是o(n)。我们换种想法,建立一个二维数组b[x][y],表......