Echarts自适应div大小

本文详细介绍了如何在Echarts5.4.3中实现图表的自适应性,包括在窗口大小变化和用户手动调整容器大小时,通过resize()API函数来动态调整图表尺寸。提供了两个示例代码,展示了不同情况下Echarts的响应式布局应用。
摘要由CSDN通过智能技术生成


在这里插入图片描述
详情往后看

准备条件

Echarts官网:Apache ECharts,这里使用的是Echarts5.4.3版本。这里有直接在线引入echarts的方式:获取 ECharts - 入门篇 - 使用手册 - Apache ECharts
在这里插入图片描述

需要使用到的API函数resize()

在这里插入图片描述
在这里插入图片描述
改变图表尺寸,在容器大小发生改变时需要手动调用。Documentation - Apache ECharts
在这里插入图片描述
以下内容来自官网:

Function

(opts?: {
    width?: number|string,
    height?: number|string,
    silent?: boolean,
    animation?: {
        duration?: number
        easing?: string
    }
}) => ECharts

改变图表尺寸,在容器大小发生改变时需要手动调用。

参数解释

opts

opts 可缺省。有下面几个属性:

width 可显式指定实例宽度,单位为像素。如果传入值为 null/undefined/‘auto’,则表示自动取 dom(实例容器)的宽度。
height 可显式指定实例高度,单位为像素。如果传入值为 null/undefined/‘auto’,则表示自动取 dom(实例容器)的高度。
silent 是否禁止抛出事件。默认为 false。
animation resize 的时候是否应用过渡动画,包含时长duration和缓动easing两个配置,默认duration为 0,即不应用过渡动画。
Tip: 有时候图表会放在多个标签页里,那些初始隐藏的标签在初始化图表的时候因为获取不到容器的实际高宽,可能会绘制失败,因此在切换到该标签页时需要手动调用 resize 方法获取正确的高宽并且刷新画布,或者在 opts 中显示指定图表高宽。

窗口大小变化,Echarts自适应

echarts1.html

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<style>
  html,
  body {
    width: 100%;
    height: 100%;
    margin: 0 auto;
    padding: 0;
    box-sizing: border-box;
  }
</style>

<!-- 在线引入echarts,如果链接失效,就去官网找一个,这个也是从官网中找的 -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/echarts/5.4.3/echarts.min.js"></script>

<body>
  <!-- 注意了:这里一定要使用自适应宽高,如百分比、或者vw、vh等,不能使用固定宽高,如200px这是不可以的,myChart.resize();
    也就是说echarts的resize()不生效不生效
  想想就通了,一个div的大小如果是固定的,不是自适应的,那么即使在怎么改浏览器窗口大小,也是不变的。
所以百分比或者自适应的vw、vh就可以 -->
  <div id="myChart" style="width: 100%; height: 80%;"></div>
  <script>
    var myChart = echarts.init(document.getElementById('myChart'));

    // 指定图表的配置项和数据
    var option = {
      title: {
        text: 'ECharts 入门示例'
      },
      tooltip: {
        trigger: 'axis',
      },
      legend: {
        data: ['销量']
      },
      xAxis: {
        data: ['衬衫', '羊毛衫', '雪纺衫', '裤子', '高跟鞋', '袜子']
      },
      yAxis: {},
      series: [
        {
          name: '销量',
          type: 'bar',
          data: [5, 20, 36, 10, 10, 20]
        }
      ]
    };

    // 使用刚指定的配置项和数据显示图表。
    myChart.setOption(option);


    window.addEventListener('resize', function () {
      // 改变图表尺寸,在容器大小发生改变时需要手动调用
      myChart.resize();
    });
  </script>
</body>

</html>

结果如下所示

注意了,这里我调整的是浏览器窗口大小
在这里插入图片描述

在这里插入图片描述

窗口大小不变,Echarts自适应

echarts2.html

<!DOCTYPE html>
<html>

<head>
  <!-- 在线引入echarts,如果链接失效,就去官网找一个,这个也是从官网中找的 -->
  <script src="https://cdnjs.cloudflare.com/ajax/libs/echarts/5.4.3/echarts.min.js"></script>
  <script>
    window.onload = function () {
      var elem = document.getElementById("resizable");
      var handle = document.getElementById("handle");

      handle.onmousedown = function (e) {
        e.preventDefault();
        document.body.style.cursor = "nwse-resize";
        startResize(e);
      }

      function startResize(e) {
        window.addEventListener('mousemove', resize);
        window.addEventListener('mouseup', stopResize);
      }

      function stopResize(e) {
        document.body.style.cursor = "default";
        window.removeEventListener('mousemove', resize);
      }

      // var myChart = echarts.init(document.getElementById('main'), null, { autoResize: true });
      var myChart = echarts.init(document.getElementById('main'));

      function resize(e) {
        elem.style.width = (e.clientX - elem.offsetLeft) + 'px';
        elem.style.height = (e.clientY - elem.offsetTop) + 'px';
        // 改变图表尺寸,在容器大小发生改变时需要手动调用
        myChart.resize();
      }
      // 指定图表的配置项和数据
      var option = {
        title: {
          text: 'ECharts 入门示例'
        },
        tooltip: {
          trigger: 'axis',
        },  
        legend: {
          data: ['销量']
        },
        xAxis: {
          data: ['衬衫', '羊毛衫', '雪纺衫', '裤子', '高跟鞋', '袜子']
        },
        yAxis: {},
        series: [
          {
            name: '销量',
            type: 'bar',
            data: [5, 20, 36, 10, 10, 20]
          }
        ]
      };

      // 使用刚指定的配置项和数据显示图表。
      myChart.setOption(option);

    }
  </script>
  <style>
    .resizable {
      position: absolute;
      top: 50px;
      left: 50px;
      width: 800px;
      height: 600px;
      border: 1px solid black;
    }

    .handle {
      height: 10px;
      width: 10px;
      background-color: red;
      position: absolute;
      right: 0;
      bottom: 0;
      cursor: nwse-resize;
    }
  </style>
</head>

<body>
  <div class="resizable" id="resizable">
    <p>拖拽改变大小</p>
    <!-- 为 ECharts 准备一个定义了宽高的 DOM -->
    <div id="main" style="width: 100%; height: 85%;"></div>
    <div class="handle" id="handle"></div>
  </div>
</body>

</html>

结果如下所示

这里我调整的是,某个div的大小
在这里插入图片描述

使用内置Web API让echarts自适应容器大小

详情看这篇文章,使用ResizeObserver观察DOM元素的尺寸变化-CSDN博客,使用这种方式,就不需要再vue项目中下载额外的插件了。直接使用Web API即可。

  • 22
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以通过监听div大小变化,然后重新设置echarts大小来实现自适应。具体实现可以参考以下步骤: 1. 在mounted钩子函数中初始化echarts,并获取div元素的宽高。 2. 监听div元素的resize事件,当div大小发生变化时,重新设置echarts大小。 3. 在beforeDestroy钩子函数中销毁echarts实例。 示例代码如下: ``` <template> <div ref="chart" class="chart"></div> </template> <script> import echarts from 'echarts' export default { mounted() { // 初始化echarts this.chart = echarts.init(this.$refs.chart) // 获取div元素的宽高 this.width = this.$refs.chart.clientWidth this.height = this.$refs.chart.clientHeight // 设置echarts的初始大小 this.chart.resize({ width: this.width, height: this.height }) // 监听div元素的resize事件 window.addEventListener('resize', this.handleResize) }, beforeDestroy() { // 销毁echarts实例 this.chart.dispose() // 移除resize事件监听 window.removeEventListener('resize', this.handleResize) }, methods: { handleResize() { // 获取div元素的新宽高 const newWidth = this.$refs.chart.clientWidth const newHeight = this.$refs.chart.clientHeight // 设置echarts的新大小 this.chart.resize({ width: newWidth, height: newHeight }) } } } </script> <style> .chart { width: 100%; height: 100%; } </style> ``` ### 回答2: Vue Echarts是一款基于Vue.js的开源图表库,它能够将数据转化为直观、清晰的图表,展示数据之间的关系和趋势。但是,在实际开发中,我们往往会遇到图表所在的div大小会随着浏览器窗口大小的改变而改变的情况,这时我们需要对Vue Echarts进行自适应。 实现Vue Echarts自适应div大小,首先需要在mounted钩子函数中获取div元素的宽度和高度,可以使用Vue的$refs属性来获取元素: ``` mounted() { let echartsDiv = this.$refs.echartsDiv; let echartsW = echartsDiv.offsetWidth; let echartsH = echartsDiv.offsetHeight; } ``` 接着,需要在窗口大小改变时动态修改div的宽度和高度。可以通过window对象的resize事件来监听窗口大小的变化: ``` mounted() { window.addEventListener('resize', this.resizeEcharts); }, methods: { resizeEcharts() { let echartsDiv = this.$refs.echartsDiv; let echartsW = echartsDiv.offsetWidth; let echartsH = echartsDiv.offsetHeight; // 修改图表大小 this.chart.resize({ width: echartsW, height: echartsH }); } } ``` 上述代码中,resizeEcharts方法会在窗口大小改变时被调用,获取到div的宽度和高度后,再通过this.chart.resize()方法来修改图表的大小。我们需要在创建Echarts实例时,将其赋值给this.chart: ``` created() { this.chart = echarts.init(this.$refs.echartsDiv); } ``` 通过以上的代码实现,就能实现Vue Echarts自适应div大小的功能了。需要注意的是,在获取div宽度和高度时,由于组件渲染需要时间,因此需要判断echartsDiv是否已经加载完成。如果echartsDiv对象未定义,我们可以使用Vue的$nextTick方法来等待前一次渲染完成: ``` mounted() { this.$nextTick(() => { let echartsDiv = this.$refs.echartsDiv; let echartsW = echartsDiv.offsetWidth; let echartsH = echartsDiv.offsetHeight; // 创建图表实例 this.chart = echarts.init(this.$refs.echartsDiv); // 修改图表大小 this.chart.resize({ width: echartsW, height: echartsH }); // 监听窗口大小 window.addEventListener('resize', this.resizeEcharts); }); }, ``` ### 回答3: Vue是一款非常流行的前端框架,而Echarts则是其中一个非常强大的数据可视化工具。在Vue中使用Echarts时,可能会遇到一个问题,即如何实现Echarts图表的自适应div大小。下面我将详细介绍如何解决这个问题。 在Vue中,我们可以使用v-if指令来判断Echarts是否已经被渲染,从而动态设置div大小。具体做法如下: 首先,我们需要在Vue的mounted生命周期函数中渲染Echarts图表: ``` mounted() { // 初始化Echarts this.chart = echarts.init(this.$refs.chart) // 绘制Echarts图表 this.drawChart() } ``` 其中,this.$refs.chart表示Echarts所在的div容器。 接下来,我们可以在window的resize事件中重新设置div大小,从而实现Echarts图表的自适应: ``` mounted() { // 初始化Echarts this.chart = echarts.init(this.$refs.chart) // 绘制Echarts图表 this.drawChart() // 监听屏幕大小变化 window.addEventListener('resize', this.resize) }, methods: { resize() { // 销毁当前图表实例 this.chart.dispose() // 重新创建图表实例 this.chart = echarts.init(this.$refs.chart) // 重新绘制图表 this.drawChart() }, drawChart() { // 绘制Echarts图表 ... } } ``` 其中,resize方法用于销毁当前图表实例并重新创建一个新的实例,并调用drawChart方法重新绘制图表。 最后,我们还需要在div上添加样式,让它具有一定的最小高度,避免Echarts图表过小时出现错位的情况。具体样式如下: ``` .chart-container { min-height: 300px; } ``` 通过以上的方法,我们就可以实现Echarts图表的自适应div大小。而且,这种方法通用性比较好,不仅适用于Vue,还适用于其他前端框架。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值