Echarts图表自适应?你可以这样做

文章讲述了在使用Echarts绘制图表时可能遇到的变形问题及其解决方案,主要是通过ResizeObserver监听DOM元素尺寸变化或window.resize事件来调用resize()方法,确保图表自适应。对于多个图表和防止事件覆盖,文章提供了相应的处理策略。

一、图表变形

使用 Echarts 绘制图表时,可能会遇到变形的问题。如下图: alt

其原因是 Echarts 在初始化实例的时候,对应 dom 元素的宽高还没有确定。

解决方案也很简单: 监听对应 dom 元素,如果大小发生变化,调用resize()方法。

import echarts from 'echarts';

...

const chartDom = document.getElementById('myChart');
let myChart = echarts.init(chartDom);
// 若dom尺寸变化,则resize
const chartObserver = new ResizeObserver(() => {
    myChart.resize();
});
chartObserver.observe(chartDom);

二、自适应解决方案

自适应是浏览器窗口变化的时候,echarts 图表大小能够相应的变化。可通过监听浏览器窗口实现。

window.onresize = () => {
    myChart.resize();
}

多个 echarts 图的话,则

window.onresize = () => {
    myChart1.resize();
    myChart2.resize();
}

个别时候,也会遇到myChart1myaChart2不在同一个作用域内,如果多次调用window.onresize(),后一个将会覆盖掉前一个。如下:


window.onresize = () => {
    myChart1.resize();
}

...

// 后一个执行的代码会覆盖掉前一个window监听
window.onresize = () => {
    myChart2.resize();
}

这时,可以使用window.addEventListener('resize', callback)来避免监听被覆盖:

window.addEventListener('resize', () => {
    myChart1.resize();
}, false); // false代表事件句柄在冒泡阶段执行

...

window.addEventListener('resize', () => {
    myChart2.resize();
}, false);

当然,也可以跟最上面的处理一样,使用ResizeObserver分别监听对应 dom 元素,调用resize()解决。

「参考资料:」

「ResizeObserver API」:https://developer.mozilla.org/zh-CN/docs/Web/API/ResizeObserver

本文由 mdnice 多平台发布

在响应式布局中确保 ECharts 图表大小自适应,可采用以下方法: #### 利用 `resize` 方法 当图表所在的容器大小发生变化时,可调用 `myChart.resize()` 方法使图表自适应其容器的新尺寸。例如浏览器窗口被调整大小,或者图表所在元素的尺寸发生改变,调用此方法能确保图表正确填充新的可用空间。 单个图表的示例代码如下: ```javascript var myChart = echarts.init(document.getElementById('XXX')); window.onresize = myChart.resize; ``` 多个图表的示例代码如下: ```javascript var myChart = echarts.init(document.getElementById('areaData')); var myChart1 = echarts.init(document.getElementById('familyPerIncomeData')); var myChart2 = echarts.init(document.getElementById('familyMouthIncomeData')); window.onresize = function(){ myChart.resize(); myChart1.resize(); myChart2.resize(); } ``` #### 使用 CSS 设置容器自适应宽高 给图表容器设置自适应的百分比宽高。示例代码如下: ```html <div class="chart_box"> <div id='chinesechart'></div> </div> ``` 通过 CSS 给 `chart_box` 这个 `div` 设置自适应的百分比宽高。 #### 在 Vue 项目中实现响应式 在 Vue 项目中使用子父组件方式时,在父组件的 `mounted` 钩子中监听窗口大小变化并调用子组件的方法来实现图表伸缩响应。示例代码如下: 父组件: ```vue <template> <div class="index2"> <p slot="title" class="title">我的处理量</p> <Mydisposes ref="myChange" /> </div> </template> <script> import Mydisposes from './ECharts/mydisposes'; export default { name: 'index2', data () { return { } }, components: { Mydisposes }, mounted () { window.onresize = () => { this.$refs.myChange.my() } } } </script> ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值