【Echarts】当容器div为display:none,图表初始化显示问题

场景:想对如下echarts折线图做切换近一年、近六个月、近三个月图表展示的功能时,遇到了如下问题
在这里插入图片描述
在这里插入图片描述
如上图,切换到近六个月时,出现了图表的宽度没有自适应的问题。而且我对比了一下展示正常的和不正常的区别
在这里插入图片描述
大家注意看我标记的地方,正常展示的图表宽度正常,但是显示不正常的图表宽度为100px,这就是显示不正常的问题所在。至于这个为什么会是100px,大家先往下看,后边会有解释。

遇到问题之后,先看看自己写的代码,有没有问题
在这里插入图片描述
除了近一年,其它两个图表展示的div我都加了display:none属性,会不会是这个属性导致的,然后我尝试去掉这个属性,测试下

在这里插入图片描述

在这里插入图片描述
折线图初始化正常了,结果证明,确实跟display:none这个属性有关系,但是到底这个属性是怎么影响最终的展示的呢,我查找了一些资料,发现了一些端倪。
原来在echarts源码中有这么一个方法:Painter.prototype._getWidth
在这里插入图片描述
我们可以看到,由于我们容器设置属性display:none,所以无法获取到clientWidth,而parseInt10(stl.width)将width:100%转为100,所以计算出图标的宽度为100px。
这就是图表显示有问题的原因。

找到原因了,那我们该怎么去解决这个问题呢?

基于以上的原因,我们可以给div设置一个固定的宽度,这个固定的宽度,我们就以近一年来展示的图表的宽度为参考
所以,直接贴上代码:
在这里插入图片描述
注意,设置宽高的代码得在调用初始化方法之前,不然不奏效。

在修改完成之后,我们再来看下最终的效果
在这里插入图片描述
我们可以看到,在切换之后的图表也已经显示正常了。

在解决完这个问题之后,我又多想了一下,为什么设置了display:none属性,只影响了图表显示的宽度,而没有影响高度呢?

对这个问题,我进一步的去了解,想着既然echarts源码中有获取宽度的方法,那应该也有获取高度的方法,我就顺藤摸瓜找到了这个方法Painter.prototype._getHeight
最后我debug观察数据:
在这里插入图片描述
发现容器去获取clientWidth 和 clientHeight 都是0,那就是都没有获取到,那为何高度不受影响呢?

经过调测,发现其实原因在这里:
在这里插入图片描述
在这里插入图片描述
大家有没有发现,str1获取的宽度是100%,而高度获取的是230px,这样就造成前边我们提到的 parseInt10(stl.width) 将width:100%转为100,最终计算就是100px,而 parseInt10(stl.height) 将高度转为230,最终计算就是230px

所以现在大家明白为什么高度没有受到影响了吧,是因为高度本来就有一个固定值。

现在高度不受影响的原因找到了,那我们是不是可以进一步想一下,我们之前肯定是设置了宽度为100%,那我们是否可以将100%的宽度也设置成一个固定的宽度,从而也就不会影响图表的宽度了呢?

我已经试过了,是可以的,但是这种方式总体感觉没有之前那种解决办法灵活,所以大家可以当做一种解决思路了解一下。

<think>好的,我需要解决用户提到的ECharts图表宽度设置为100%却只显示100px的问题。首先,我得回忆一下相关的引用内容,看看有什么解决方案已经被提到过。根据引用[3]和[4],问题通常出现在父元素被隐藏(比如display: none)的情况下,导致ECharts无法正确计算宽度,从而默认使用100px。这时候需要确保图表容器初始化时可见,或者在显示后重新调整图表尺寸。 用户可能是在Vue项目中遇到了这个问题,特别是在使用标签页(tabs)或条件渲染时。这时候,当图表所在的父元素初始状态是隐藏的,ECharts初始化时无法获取到正确的宽度,所以会使用默认的100px。解决方法是需要在父元素显示后再初始化图表,或者在每次显示时调用resize方法。 另外,引用[5]提到可以在初始化前通过JS动态设置宽度,比如获取窗口宽度然后赋值给容器元素。这可能也是一个可行的方案,但需要注意响应式的问题,比如窗口大小变化时需要重新调整。 还有一个关键点是要确保容器的父元素有正确的宽度设置。如果父元素的宽度没有明确定义,100%可能无法生效。需要检查DOM结构,确保从顶层容器图表容器的每一层都有正确的宽度传递。 综合这些信息,解决方案应该包括以下几个步骤:确保容器可见后再初始化图表、在父元素显示后调用resize方法、检查父元素的宽度设置是否正确,以及可能使用v-if替代v-show来避免初始化时隐藏的问题。同时,在Vue中可以使用nextTick来确保DOM更新完成后再进行操作,或者使用ResizeObserver来监听容器尺寸变化自动调整图表。 需要将这些步骤整理成用户容易理解的解决方案,分点说明,并引用相关的引用来源作为支持。此外,生成相关问题时要围绕ECharts的常见问题,比如响应式设计、Vue中的监听方法等。</think>### 解决方案:ECharts图表宽度设置为100%却显示100px的问题 #### 问题原因 当ECharts图表容器的父元素被隐藏(如`display: none`或`v-show="false"`)时,初始化图表会导致无法正确获取容器宽度,ECharts默认使用`100px`作为宽度[^3][^4]。 --- ### 解决步骤 #### 方法1:确保容器可见后再初始化 1. **延迟初始化**:在父元素显示(如切换Tab页、条件渲染为`true`)后再初始化图表。 **示例(Vue中)**: ```vue <template> <div v-if="isChartVisible"> <div ref="chart" style="width: 100%; height: 400px"></div> </div> </template> <script> export default { mounted() { // 在父元素显示初始化 this.initChart(); }, methods: { initChart() { const chartDom = this.$refs.chart; const chart = echarts.init(chartDom); chart.setOption({ /* 配置项 */ }); } } } </script> ``` #### 方法2:手动触发`resize` 2. **父元素显示后调用`resize`**: 在父元素从隐藏变为可见时(如切换Tab页),调用ECharts实例的`resize`方法。 ```vue <template> <div v-show="isActiveTab"> <div ref="chart" style="width: 100%; height: 400px"></div> </div> </template> <script> export default { watch: { isActiveTab(newVal) { if (newVal) { this.$nextTick(() => { this.chartInstance.resize(); // 重新计算尺寸 }); } } } } </script> ``` #### 方法3:强制设置容器宽度 3. **动态计算父元素宽度**: 在初始化图表前,通过JavaScript强制设置容器宽度(适合父元素宽度已知但未正确继承的场景)[^5]。 ```javascript const chartDom = document.getElementById('chart'); chartDom.style.width = chartDom.parentElement.clientWidth + 'px'; const chart = echarts.init(chartDom); ``` --- ### 关键注意事项 1. **避免在隐藏容器初始化**:优先使用`v-if`替代`v-show`,确保容器挂载时已可见[^3]。 2. **监听窗口变化**:若页面需响应式适配,添加窗口大小监听: ```javascript window.addEventListener('resize', () => { chartInstance.resize(); }); ``` 3. **使用ResizeObserver(推荐)**:现代浏览器支持监听元素尺寸变化,自动调整图表: ```javascript const observer = new ResizeObserver(() => { chartInstance.resize(); }); observer.observe(chartDom); ``` ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值