本文收集网上常见大屏适配方案,仅供参考

方法1: 使用插件vue2 请使用vscalescreen@1.0.0版本

import VScaleScreen from 'v-scale-screen'
Vue.use(VScaleScreen)

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

方法2: 利用scale函数

export default {
  mounted() {
    //初始化适应
    this.handleScreenAuto()
    //绑定适应函数   ---防止浏览器栏变化后不再适配
    window.onresize = () => this.handleScreenAuto()
  },
  destroyed() {
    window.onresize = null
  },
  methods: {
    //数据大屏自适应函数
    handleScreenAuto() {
      const designDraftWidth = 1920 //设计稿的宽度
      const designDraftHeight = 1080 //设计稿的高度
      //根据屏幕的变化适配的比例
      const scale =
        document.documentElement.clientWidth / document.documentElement.clientHeight <
        designDraftWidth / designDraftHeight
          ? document.documentElement.clientWidth / designDraftWidth
          : document.documentElement.clientHeight / designDraftHeight
      //缩放比例
      document.querySelector(
        '#screen'
      ).style.transform = `scale(${scale}) translate(-50%)`
    },
  },
}
// id=screen中放大展示内容可以通过mixins混入引入

方法3: flexiable + rem

  1. https://github.com/amfe/libflexible/blob/2.0/index.js 下载 flexible.js 文件

    var rem = docEl.clientWidth / 10 // rem值 = px值*10/设计图宽度

  2. 安装插件 px2rem插件, 并配置假设设计稿的尺寸为 1980, 则配置 rem = 198px

  3. echarts 图表自适应

    function fontSize(res, defaultWidth = 3840) {
      let docEl = document.documentElement,
        clientWidth =
          window.innerWidth ||
          document.documentElement.clientWidth ||
          document.body.clientWidth
      if (!clientWidth) return
      // 此处的3840 为设计稿的宽度,记得修改
      let fontSize = clientWidth / defaultWidth 
      return res * fontSize
    }
    // 使用,在需要位置函数包裹即可
    fontSize: fontSize(30)
    
    window.addEventListener('resize', function () {
      chart.resize()
    }) // chart 为注册绑定echarts对象
    

方法4: 使用DataV的全屏容器 + flex + 百分比布局

<dv-full-screen-container>content</dv-full-screen-container>

方法5: vw + vh

  1. 创建极端 vw 和 vh 的样式函数
    // utils.scss
    // 使用scssmath函数https://sass-lang.com/documentation/breaking-changes/slash-div
    @use 'sass:math';
    
    //默认设计稿的宽度
    $designWidth: 1920;
    //默认设计稿的高度
    $designHeight: 1080;
    
    //px转为vw函数
    @function vw($px) {
      @return math.div($px, $designWidth) * 100vw;
    }
    
    //px转为vh的函数
    @function vh($px) {
      @return math.div($px, $designHeight) * 100vh;  // math.div(x, y) = x / y
    }
    
  2. vue.config.js 中进行全局注册
 css: {
    loaderOptions: {
      //全局配置utils.scss,详细配置参考vue-cli官网
      sass: {
        additionalData: `@import "@/assets/styles/utils.scss";`, // 注意:在 sass-loader v8 中,这个选项名是 "prependData"
      },
    },
  },

  1. xx.vue 中使用
chart-wrapper {
    width: vw(300); // 300 / 1980
    height: vh(200);
    font-size: vh(16); // 16 / 1080
    background-color: black;
  }

关于echart字体大小适配屏幕尺寸

<template>
  <div class="linechart" ref="line"></div>
</template>
<script>
import adaptFontSize from '@/utils/fontSIze'
export default {
  name: 'linechart',
  mixins: [adaptFontSize],
  mounted() {
    this.initChart()
    this.adapterChart()
    
    window.addEventListener('resize', () => {   // 屏幕尺寸变化时,重新渲染
    this.adapterChart()
    })
  },
  
   beforeDestoryed() {
    // 组件销毁移除监听,防止内存泄露
    window.removeEventListener('resize')
  },
  
  methods: {
	// 字体大小适配代码!!!
    transfomrFontSize(val) {
      let clientWidth =
        window.innerWidth ||
        document.documentElement.clientWidth ||
        document.body.clientWidth
      if (!clientWidth) return
      let radio = clientWidth / 1920
      return radio * val
    },
  },
    initChart() {
      /*大屏*/
      this.myChart = this.$echarts.init(this.$refs.line)
      let option = {
        tooltip: {
          trigger: 'axis',
          axisPointer: {
            // 坐标轴指示器,坐标轴触发有效
            type: 'shadow', // 默认直线,可选为:'line' | 'shadow'
          },
        },
        grid: {
          left: '0%',
          right: '10%',
          top: '15%',
          bottom: '5%',
          containLabel: true,
        },
        xAxis: {
          type: 'category',
          data: this.xData,
          name: this.xName,
        },
        textStyle: {
          //图例文字样式
          color: 'red',
        },
        yAxis: {
          name: this.yName,
          nameLocation: 'end',
          nameTextStyle: {
            color: 'white',
          },
          textStyle: {
            color: 'white',
          },
          type: 'value',
          axisLine: { show: true },
          splitLine: { show: true, lineStyle: { type: 'dashed' } },
        },
        series: [
          {
            type: this.type,
            label: {
              normal: {
                show: true,
                formatter: '{b}',
              },
            },
            data: this.yData,
          },
        ],
      }

      option &amp;&amp; this.myChart.setOption(option)
    },
    adapterChart() {
      let option = {
        textStyle: {
          fontSize: this.transfomrFontSize(20),
        },
      }
      this.myChart.setOption(option)
      this.myChart.resize() // 必须调用自身的resize方法!!!!!
    },
  },
}
</script>

混入规则

  1. data: mixins 中的 data合并data 中,有冲突的话,data数据覆盖 mixins 中的数据
  2. 钩子函数:合并执行,先执行 mixins 中的钩子函数。
  3. ​​methods​​、​​components​​ 和 ​​directives​​: 有冲突时,组件内会覆盖 mixins 中的 ​。​​​

原文地址:https://blog.csdn.net/qq_33404590/article/details/128827224

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_44842.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注