前言

后管平台首页展示数据图表,想实现不同分辨率,图表高度动态调整。下面展示实现方式以及碰到的问题。


一、实现方式

1.图表初始化时调用【根据父容器高度动态更改子容器高度方法+echarts.resize()】已便不同分辨率浏览器下初次加载时图表高度未动态变更。
2.通过【window.addEventListener(["resize"],()=>{})】 监听页面分辨率变化同时调用【根据父容器高度动态更改子容器高度方法+echarts.resize()】实现图表适应。
<template>
  <div class="index_div" :style="{height:maxHeight}">
    <div class="left-top">
        <div class="left-left-top">
          <div id="releaseGoodsType" style="height:100px"></div>
        </div>  
    </div>
  </div>
</template>

<script>

//引入echarts
import * as echarts from "echarts"

import util from "@/util"

export default {

  data(){
    return{
      maxHeight:0,
      releaseGoodsTypeEchart:"",
    }
  },

  methods: {

    //查询货源类型占比圆饼图
    initReleaseGoodsType(){

      //echarts初始化
      this.releaseGoodsTypeEchart = echarts.init(document.getElementById("releaseGoodsType"));

      let option = {
        legend: {
          top: 'bottom'
        },
        tooltip: {
          trigger: 'item',
          formatter: '{a} <br/>{b} : {c} ({d}%)'
        },
        series: [
          {
            name: 'xxxx占比',
            type: 'pie',
            radius: [50, 100],
            center: ['50%', '50%'],
            roseType: 'area',
            itemStyle: {
              borderRadius: 8
            },
            data: [
              { value: 40, name: 'rose 1' },
              { value: 38, name: 'rose 2' },
              { value: 32, name: 'rose 3' },
              { value: 30, name: 'rose 4' },
              { value: 28, name: 'rose 5' },
              { value: 26, name: 'rose 6' },
              { value: 22, name: 'rose 7' },
              { value: 18, name: 'rose 8' }
            ]
          }
        ]
      }
      this.releaseGoodsTypeEchart.setOption(option);
	  //根据父级高度设置子级高度(动态修改高度)
      util.setEchartsHeight('left-left-top', 'releaseGoodsType',0)
      this.releaseGoodsTypeEchart.resize();
    }

  },

  mounted(){
    this.maxHeight = Number(document.documentElement.clientHeight - 300) + "px";

    this.initReleaseGoodsType();
    //监听高度变化
    window.addEventListener(["resize"],()=>{
      console.log(11)
      util.setEchartsHeight('left-left-top', 'releaseGoodsType',0)
      this.releaseGoodsTypeEchart.resize();
    });
  }

}
</script>

<style>
  .index_div{
    display: flex;
    width: 100%;
  }

  .left-top{
    flex: 1;
    height: 100%;
    border: 1px solid red;
    margin: 0px 10px;
    display: flex;
  }

  .left-left-top{
    flex: 1;
    height: 49%;
  }
</style>


//根据父容器高度动态更改子容器高度
util.setEchartsHeight = function (className,childClassName,num){
  //父级高度
  let fatherHeight = document.getElementsByClassName(className)[0].offsetHeight;
  //计算echarts高度
  let echartHeight = fatherHeight - num
  //echarts高度重新赋值
  document.getElementById(childClassName).style.height = echartHeight + "px";
}


二、问题

以上代码存在一个问题:图表首次加载展现不了。原因是因为获取父级容器高度为0,导致图表容器高度计算也为0.但我已经设置了图表容器的父级以及祖父级的高度!,这是为什么呢?继续向下看。

 //根据父级高度设置子级高度(动态修改高度)
 util.setEchartsHeight('left-left-top', 'releaseGoodsType',0)
  this.releaseGoodsTypeEchart.resize();

三、解决方式

将this.maxHeight = Number(document.documentElement.clientHeight - 300) + "px"; 替换成 document.getElementById('index_div').style.height = Number(document.documentElement.clientHeight - 300) + "px";

问题点修改前:
mounted(){
    this.maxHeight = Number(document.documentElement.clientHeight - 300) + "px";
    this.initReleaseGoodsType();
    
    //监听高度变化
    window.addEventListener(["resize"],()=>{
      util.setEchartsHeight('left-left-top', 'releaseGoodsType')
      this.releaseGoodsTypeEchart.resize();
    });
  }
问题点修改后:
mounted(){
    document.getElementById('index_div').style.height = Number(document.documentElement.clientHeight - 300) + "px";
    this.initReleaseGoodsType();
    
    //监听高度变化
    window.addEventListener(["resize"],()=>{
      util.setEchartsHeight('left-left-top', 'releaseGoodsType')
      this.releaseGoodsTypeEchart.resize();
    });
  }

总结

此总结纯属为个人分析,如错误请留言。有可能是父级和祖父级还没有渲染好,图表容器就去取高度了,导致没取到,所以我觉得:style是对已渲染的dom进行修改的,存在渲染加载顺序。document.getElementById('xxx').style.height是直接操作的dom所以不存在渲染加载顺序。

更多推荐