大屏适配方案

方案一

drawMixin.js

// 屏幕适配 mixin 函数

// * 默认缩放值
const scale = {
  width: "1",
  height: "1",
};

// * 设计稿尺寸(px)
const baseWidth = 1920;
const baseHeight = 1080;

// * 需保持的比例(默认1.77778)
const baseProportion = parseFloat((baseWidth / baseHeight).toFixed(5));

export default {
  data() {
    return {
      // * 定时函数
      drawTiming: null,
    };
  },
  computed: {
    isScale() {
      return this.$store.state.setting.isScale; //是否适配
    },
  },
  mounted() {
    if (!this.isScale) {
      return;
    }
    // this.calcRate();
    // window.addEventListener("resize", this.resize);
  },
  beforeDestroy() {
    window.removeEventListener("resize", this.resize);
  },
  methods: {
    calcRate() {
      const appRef = this.$refs["appRef"];
      if (!appRef) return;
      // 当前宽高比
      const currentRate = parseFloat(
        (window.innerWidth / window.innerHeight).toFixed(5)
      );
      if (appRef) {
        if (currentRate > baseProportion) {
          // 表示更宽
          scale.width = (
            (window.innerHeight * baseProportion) /
            baseWidth
          ).toFixed(5);
          scale.height = (window.innerHeight / baseHeight).toFixed(5);
          appRef.style.transform = `scale(${scale.width}, ${scale.height}) translate(-50%, -50%)`;
        } else {
          // 表示更高
          scale.height = (
            window.innerWidth /
            baseProportion /
            baseHeight
          ).toFixed(5);
          scale.width = (window.innerWidth / baseWidth).toFixed(5);
          appRef.style.transform = `scale(${scale.width}, ${scale.height}) translate(-50%, -50%)`;
        }
      }
    },
    resize() {
      if (!this.isScale) {
        return;
      }
      clearTimeout(this.drawTiming);
      this.drawTiming = setTimeout(() => {
        this.calcRate();
      }, 200);
    },
  },
};

方案二

v-scale-screen

大屏自适应容器组件,可用于大屏项目开发,实现屏幕自适应,可根据宽度自适应,高度自适应,和宽高等比例自适应,全屏自适应(会存在拉伸问题)

在 2.2.0 以上的版本中,我们同时支持 Vue>=v3或 Vue >=2.7,如果你的项目是vue2.6版本以下,那么使用1.x版本

图例

安装

npm install v-scale-screen
# or
yarn add v-scale-screen

vue2.6 版本

在 vue2 中我们使用插件方式导出,故而需要 Vue.use() 进行注册

// main.js
import Vue from 'vue'
import VScaleScreen from 'v-scale-screen'

Vue.use(VScaleScreen)
<template>
  <v-scale-screen width="1920" height="1080">
    <div>
      <v-chart>....</v-chart>
      <v-chart>....</v-chart>
      <v-chart>....</v-chart>
      <v-chart>....</v-chart>
      <v-chart>....</v-chart>
    </div>
  </v-scale-screen>
</template>

Vue3 or Vue2.7 版本

// body 默认样式 overflow: hidden;
我们在 vue3 中以组件方式导出

<template>
  <v-scale-screen width="1920" height="1080">
    <div>
      <v-chart>....</v-chart>
      <v-chart>....</v-chart>
      <v-chart>....</v-chart>
      <v-chart>....</v-chart>
      <v-chart>....</v-chart>
    </div>
  </v-scale-screen>
</template>

<script>
import { defineComponent } from 'vue'
import VScaleScreen from 'v-scale-screen'

export default defineComponent({
  name: 'Demo',
  components: {
    VScaleScreen
  }
})
</script>

注:使用时请将 body 样式设置为 overflow: hidden;
注:使用时请将 body 样式设置为 overflow: hidden;
注:使用时请将 body 样式设置为 overflow: hidden;

API

属性 说明 类型 默认值
width 大屏宽度 Number or String 1920
height 大屏高度 Number or String 1080
autoScale 自适应配置,配置为 boolean 类型时,为启动或者关闭自适应,配置为对象时,若 x 为 true,x 轴产生边距,y 为 true 时,y 轴产生边距,启用 fullScreen 时此配置失效 Boolean or true
delay 窗口变化防抖延迟时间 Number 500
fullScreen 全屏自适应,启用此配置项时会存在拉伸效果,同时 autoScale 失效,非必要情况下不建议开启 Boolean false
boxStyle 修改容器样式,如居中展示时侧边背景色,符合 Vue 双向绑定 style 标准格式 Object null
wrapperStyle 修改自适应区域样式,符合 Vue 双向绑定 style 标准格式 Object null
bodyOverflowHidden 启用后body的样式会自动设置为 overflow: hidden Boolean true
posted @ 2023-08-29 11:40  混名汪小星  阅读(259)  评论(0编辑  收藏  举报