Echarts实现图随窗口或父组件的大小变化缩放

问题描述

图形因浏览器窗口的缩放而错位。

  • 缩放前:
    在这里插入图片描述
  • 缩放后,饼状图错位。
    在这里插入图片描述

解决方式

通过Echarts的resize()方法解决。
具体代码实现,重要代码已经标识

<template>
  <el-container>
    <!--侧边栏-->
    <el-aside width="200px">Aside</el-aside>
    <el-container>
      <el-header>Header</el-header>
      <el-main>
        <el-row type="flex" class="row-bg" justify="center" style="height: 100%;width: 100%">
          <el-col :span="6">
            <el-empty description="描述文字"></el-empty>
          </el-col>
          <el-col :span="12">
            <div id="main" style="height: 100%;width: 100%"></div>
          </el-col>
          <el-col :span="6">
            <el-empty description="描述文字"></el-empty>
          </el-col>
        </el-row>
      </el-main>
      <el-footer>Footer</el-footer>
    </el-container>
  </el-container>
</template>

<script>
import * as echarts from 'echarts';
//重要代码,防止抖动
function debounce(fn, delay1){
  let delay = delay1 || 200
  let timer;
  return function () {
    let _this = this;
    let args = arguments
    if(timer){
      clearTimeout(timer);
    }
    timer = setTimeout(function () {
      timer = null;
      fn.apply(_this,args);
    },delay);
  };
}
export default {
  mounted() {
    this.init()
    // 增加监听事件 窗口变化。 重要代码
    window.addEventListener('resize',()=> this.chartResize())
  },
  beforeUnmount() {
    // 组件销毁前 移除监听事件。 重要代码
     window.removeEventListener('resize',()=> this.chartResize())
  },
  methods: {
    init() {
      let chartDom = document.getElementById('main');
      let myChart = echarts.init(chartDom);
      let option;

      option = {
        title: {
          text: 'Referer of a Website',
          subtext: 'Fake Data',
          left: 'center'
        },
        tooltip: {
          trigger: 'item'
        },
        legend: {
          orient: 'vertical',
          left: 'left'
        },
        series: [
          {
            name: 'Access From',
            type: 'pie',
            radius: '50%',
            data: [
              { value: 1048, name: 'Search Engine' },
              { value: 735, name: 'Direct' },
              { value: 580, name: 'Email' },
              { value: 484, name: 'Union Ads' },
              { value: 300, name: 'Video Ads' }
            ],
            emphasis: {
              itemStyle: {
                shadowBlur: 10,
                shadowOffsetX: 0,
                shadowColor: 'rgba(0, 0, 0, 0.5)'
              }
            }
          }
        ]
      };

      option && myChart.setOption(option);

    },
    //重要代码
    chartResize:debounce(function(){
      let myChart = echarts.getInstanceByDom(document.getElementById('main'));
      if(myChart == null){
        myChart = echarts.init(document.getElementById('main'))
      }
      myChart.resize()
    },500),
  }
}
</script>

<style scoped>
.el-header, .el-footer {
  background-color: #B3C0D1;
  color: #333;
  text-align: center;
  line-height: 60px;
  height: 100%
}

.el-aside {
  background-color: #D3DCE6;
  color: #333;
  text-align: center;
  line-height: 100vh;
}

.el-main {
  background-color: #E9EEF3;
  color: #333;
  text-align: center;
  line-height: 160px;
}

body > .el-container {
  margin-bottom: 40px;
}

.el-container:nth-child(5) .el-aside,
.el-container:nth-child(6) .el-aside {
  line-height: 260px;
}

.el-container:nth-child(7) .el-aside {
  line-height: 100%;
}
</style>

效果

  • 缩放前:
    在这里插入图片描述
  • 缩放后,图随窗口的大小变化而变化。
    在这里插入图片描述
  • 34
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小鹿~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值