echarts切换tab,图表设置宽度100%结果为100px

当外层div盒子设置宽度为100%时,可echarts渲染出来宽度只有100px,这种情况大多数echarts所在的div设置了display:none,获取不到外部盒子的宽度。

这里可以通过echarts源码获取宽度的行为来解释

究其原因就是出现在了图表设置了display:none属性上(属性含义:不为被隐藏的对象保留其物理空间,关闭元素的显示,并且所有后代元素不显示)

我们通过浏览器打断点可以看清楚echarts在计算图表宽度这部分的逻辑$("#chart").css("width",$("#chart").width());,("#chart")指的是当前绘制图表的div,获取当前元素的宽度后把固定宽度赋值给图表。

但是为什么我们宽度设置了100%,结果变为了100px? 这里上源码可以解释:

源码解读:当echarts绘制表格(也就是执行init方法)计算宽度的时候,由于初始化图表时外层div盒子的属性为display:none,所以无法获取到盒子的clientWidth(可视化宽度),而parseInt(stl.width,10)将宽度100%转换成了100(这里的stl.width,就是外层的div的样式中的width属性,因为我们初始时设置了100%,所以这里可以获取到),所以计算出的图表宽度为100px。

(源码这里没有获取到clientWidth(可视化宽度,因为display:none属性,无法获取到,就会将设置的width:100%转换称100px))

解决方法:外部div盒子必须要在init初始化前就已经存在于dom树中(也就是已经挂载)。

不要 在display:none的情况下(包括v-show、v-if后面的逻辑值是false时),一上来就初始化(init)echart。只要一初始化,就会执行源码计算出echart的宽度。

如何确保dom已经存在再去初始化呢:这里可以监视display属性(一般在项目中是通过v-if或者v-show,所以这里监视的是掌控盒子是否显示的变量 ,在监视中(watch),要配合nextTick方法使用,这样才能完全确保初始化之前,外部盒子已经存在于dom树中。(一般初始化过程是写在nextTick中)

转载于echarts图表设置宽度100%结果为100px_echarts_cxy-Study-华为云开发者联盟

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
<script setup> import { ref,reactive,onMounted ,computed,onUpdated} from 'vue' import * as echarts from 'echarts'; import bootstrap from 'bootstrap/dist/js/bootstrap.js' let isfull=ref() let ismin=ref() let midSize=1080 let windowWidth=ref(window.innerWidth) let windowHeight=ref(window.innerHeight) function pageinit(){ getWindowSize(); if(windowWidth.value>midSize){ isfull.value=true ; ismin.value=false; }else{ isfull.value=false ; ismin.value=true; } } function getWindowSize() { windowWidth.value = window.innerWidth; windowHeight.value = window.innerHeight; } onUpdated(()=>{ rizeChart(OutPutChart) rizeChart(ObjChart) }) onMounted(()=>{ pageinit(); let OutPutOption=({ xAxis: { type: 'category', data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] }, yAxis: { type: 'value' }, series: [ { data: [820, 932, 901, 934, 1290, 1330, 1320], type: 'line', smooth: true } ] }; let OutPutChart= echarts.init(document.getElementById('OutPutChart')) OutPutOption && OutPutChart.setOption(OutPutOption) rizeChart(OutPutChart) window.addEventListener('resize', function() { pageinit() rizeChart(OutPutChart) }) }) function rizeChart(chart){ chart.resize; } const card_size = computed(() => { return isfull.value ? 'card_size_full' : 'card_size_min' }) </script> <template> <div> <div class="card " :class="card_size" > <div class="card-header card-color"> 成品数据报表 </div> <div class="card-body"> <div ref="OutPutChart" id="OutPutChart" style="width: 100%;height: 400px; margin: 0 auto;"></div> </div> </div> </div> </template> <style scoped> .card-color{ text-align: center !important; background-color: #ffffff !important; } .card_size_full{ width: 49%; height: 450px; margin-right: 10px; margin-bottom: 10px; float: left; } .card_size_min{ width: 99%; height: 450px; margin: 5px auto; } </style>我的代码是这样的能帮我改一下吗
07-17
当你在Vue组件中使用`<script setup>`语法时,无法直接使用`onMounted`和`onUpdated`等钩子函数。你可以使用`onBeforeMount`和`onUpdated`代替它们。 此外,你在调用`chart.resize()`方法时,需要加上括号,即`chart.resize()`。 以下是根据你提供的代码进行的修改: ```vue <script setup> import { ref, onBeforeMount, onUpdated, computed } from 'vue' import * as echarts from 'echarts'; let isfull = ref(false); let ismin = ref(true); let midSize = 1080; let windowWidth = ref(window.innerWidth); let windowHeight = ref(window.innerHeight); function pageinit() { getWindowSize(); if (windowWidth.value > midSize) { isfull.value = true; ismin.value = false; } else { isfull.value = false; ismin.value = true; } } function getWindowSize() { windowWidth.value = window.innerWidth; windowHeight.value = window.innerHeight; } onUpdated(() => { resizeChart(OutPutChart); resizeChart(ObjChart); }) onBeforeMount(() => { pageinit(); let OutPutOption = { xAxis: { type: 'category', data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] }, yAxis: { type: 'value' }, series: [ { data: [820, 932, 901, 934, 1290, 1330, 1320], type: 'line', smooth: true } ] }; let OutPutChart = null; onBeforeMount(() => { OutPutChart = echarts.init(document.getElementById('OutPutChart')); OutPutChart.setOption(OutPutOption); resizeChart(OutPutChart); }) function resizeChart(chart) { chart.resize(); } window.addEventListener('resize', () => { pageinit(); resizeChart(OutPutChart); }) }) const card_size = computed(() => { return isfull.value ? 'card_size_full' : 'card_size_min'; }) </script> <template> <div> <div class="card" :class="card_size"> <div class="card-header card-color"> 成品数据报表 </div> <div class="card-body"> <div ref="OutPutChart" id="OutPutChart" style="width: 100%; height: 400px; margin: 0 auto;"></div> </div> </div> </div> </template> <style scoped> .card-color { text-align: center !important; background-color: #ffffff !important; } .card_size_full { width: 49%; height: 450px; margin-right: 10px; margin-bottom: 10px; float: left; } .card_size_min { width: 99%; height: 450px; margin: 5px auto; } </style> ``` 这些修改包括修正钩子函数的使用,调整了代码的结构,并将`OutPutChart`的声明放在了正确的位置。希望这可以解决你的问题。如果还有其他问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值