Vue学习-echarts图表高度随父容器高度动态变更

前言

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


一、实现方式

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所以不存在渲染加载顺序。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值