Vue2+Echarts大屏自适应缩放解决方案【超详细图解】

目录

一、背景

二、解决方案

1.前端自适应解决方案

(1)使用felx布局

(2)使用rem单位

[2.大屏自适应最优解决方案 ==> transform:scale](#2.大屏自适应最优解决方案 ==> transform:scale)

三、实战开始【速看!重点】

1.创建一个组件sacleBox.vue

2.在大屏.vue页面引用sacleBox组件

3.用ScaleBox组件包裹整个页面

4.码自己页面

总结:


一、背景

一名被组长逼着干前端的苦逼后端,在一个晴天霹雳的日子,被要求前端驾驶舱大屏根据显示器尺寸大小自适应。
效果如图:

可以根据页面大小缩放调整宽高,始终保持原始比例,并且画质清除,保证在任何屏幕上都能够展示完全。

二、解决方案

1.前端自适应解决方案

(1)使用felx布局

**要点:**使用flex各种布局,结合元素使用百分比

**使用场景:**H5页面、简单后台业务系统页面

大神笔记: Flex 布局教程:语法篇 - 阮一峰的网络日志

(2)使用rem单位

参考链接:前端自适应实现方法_前端学习笔记-DS的博客-CSDN博客_前端自适应

2.大屏自适应最优解决方案 ==> transform:scale

大屏使用rem 耗时 而且对浏览器最小字体不支持,

使用transform:scale可以节省百分之九十工作量

三、实战开始【速看!重点】

1.创建一个组件sacleBox.vue

复制代码
<template>
  <div
    class="ScaleBox"
    ref="ScaleBox"
    :style="{
      width: width + 'px',
      height: height + 'px',
    }"
  >
    <slot></slot>
  </div>
</template>

<script>
export default {
  name: "ScaleBox",
  props: {},
  data() {
    return {
      scale: 0,
      width: 1920,
      height: 1080,
    };
  },
  mounted() {
    this.setScale();
    window.addEventListener("resize", this.debounce(this.setScale));
  },
  methods: {
    getScale() {
      // 固定好16:9的宽高比,计算出最合适的缩放比
      const { width, height } = this;
      const wh = window.innerHeight / height;
      const ww = window.innerWidth / width;
      console.log(ww < wh ? ww : wh);
      return ww < wh ? ww : wh;
    },
    setScale() {
      // 获取到缩放比例,设置它
      this.scale = this.getScale();
      if (this.$refs.ScaleBox) {
        this.$refs.ScaleBox.style.setProperty("--scale", this.scale);
      }
    },
    debounce(fn, delay) {
      const delays = delay || 500;
      let timer;
      return function () {
        const th = this;
        const args = arguments;
        if (timer) {
          clearTimeout(timer);
        }
        timer = setTimeout(function () {
          timer = null;
          fn.apply(th, args);
        }, delays);
      };
    },
  },
};
</script>

<style lang="scss">
#ScaleBox {
  --scale: 1;
}
.ScaleBox {
  position: absolute;
  transform: scale(var(--scale)) translate(-50%, -50%);
  display: flex;
  flex-direction: column;
  transform-origin: 0 0;
  left: 50%;
  top: 50%;
  transition: 0.3s;
  z-index: 999;
  // background: rgba(255, 0, 0, 0.3);
}
</style>

2.在大屏.vue页面引用sacleBox组件

复制代码
import ScaleBox from "../../components/sacleBox.vue";
export default {
  name: "home",
  components: {
    ScaleBox,
  },
  data() {
    return {
    }
}

3.用ScaleBox组件包裹整个页面

4.码自己页面

注意:

(1)使用px做单位,不使用rem

(2)ScaleBox内部页面元素最大的盒子按照1920*1080为容器 严格计算。所有宽高加起来为1920*1080

(3)最好不要使用百分比分配宽高

至此应该可以完成大屏自适应了,组件化之后也更好用,前期可以直接单独写页面,最后再加上ScaleBox即可,是非常方便简洁的方法。

多数友友反应做出来的效果在非全屏下左右两边会存在一定的空白。这里要解释一下,当前案例的实现效果就是如此,在非全屏情况下,由于导航栏存在,页面的真实高度已经不是1080了,这是宽度自然会变小。

总结:

使用ScaleBox的优点:

1.保证页面宽高在任何情况下等比例缩放

2.页面性能最优且代码简洁

相关推荐
小小小小宇4 小时前
前端 Service Worker
前端
只喜欢赚钱的棉花没有糖5 小时前
http的缓存问题
前端·javascript·http
小小小小宇5 小时前
请求竞态问题统一封装
前端
loriloy5 小时前
前端资源帖
前端
源码超级联盟5 小时前
display的block和inline-block有什么区别
前端
GISer_Jing5 小时前
前端构建工具(Webpack\Vite\esbuild\Rspack)拆包能力深度解析
前端·webpack·node.js
让梦想疯狂5 小时前
开源、免费、美观的 Vue 后台管理系统模板
前端·javascript·vue.js
海云前端6 小时前
前端写简历有个很大的误区,就是夸张自己做过的东西。
前端
葡萄糖o_o6 小时前
ResizeObserver的错误
前端·javascript·html
AntBlack6 小时前
Python : AI 太牛了 ,撸了两个 Markdown 阅读器 ,谈谈使用感受
前端·人工智能·后端