Ich arbeite derzeit an einem PC-Projekt, bei dem ich das Echarts-Diagramm in der Bootstrap-Modalbox anzeigen m?chte. Wenn der Benutzer auf die Schaltfl?che klickt, wird ein Modal mit dem Inhalt des Echarts-Diagramms angezeigt.
1. Erstellen Sie zun?chst eine modale Box~
HTML:
<button type="button" class="btn btn-primary"><!--彈出按鈕-->
彈出來
</button>
<p id="myModal" class="modal fade bs-example-modal-lg"><!--模態(tài)框-->
<p class="modal-dialog modal-lg" style="height: 80%">
<p class="modal-content" style="height: 100%;">
<p id="box" style="height: 100%"></p><!--給echarts準(zhǔn)備的容器-->
</p>
</p>
</p>
JS:
$('.btn').click(function(){
$('#myModal').modal();//點(diǎn)擊按鈕彈出模態(tài)框
})
2. Diagramm rendern:
$.ajax({//發(fā)送請(qǐng)求
url : BASE_URL + "/index/search",
data : {
"keyword" : keyword
},
type : 'GET',
dataType : 'json',
success : function(data.data){//拿回?cái)?shù)據(jù)
var data = data.data;
var myChart = echarts.init(document.getElementById('box'));//初始echarts
option = {//配置圖表(從echarts官網(wǎng)示例上扒的option,可忽略)
backgroundColor: new echarts.graphic.RadialGradient(0.3, 0.3, 0.8, [{
offset: 0,
color: '#f7f8fa'
}, {
offset: 1,
color: '#cdd0d5'
}]),
title: {
text: '1990 與 2015 年各國(guó)家人均壽命與 GDP'
},
legend: {
right: 10,
data: ['1990', '2015']
},
xAxis: {
splitLine: {
lineStyle: {
type: 'dashed'
}
}
},
yAxis: {
splitLine: {
lineStyle: {
type: 'dashed'
}
},
scale: true
},
series: [{
name: '1990',
data: data[0],
type: 'scatter',
symbolSize: function (data) {
return Math.sqrt(data[2]) / 5e2;
},
label: {
emphasis: {
show: true,
formatter: function (param) {
return param.data[3];
},
position: 'top'
}
},
itemStyle: {
normal: {
shadowBlur: 10,
shadowColor: 'rgba(120, 36, 50, 0.5)',
shadowOffsetY: 5,
color: new echarts.graphic.RadialGradient(0.4, 0.3, 1, [{
offset: 0,
color: 'rgb(251, 118, 123)'
}, {
offset: 1,
color: 'rgb(204, 46, 72)'
}])
}
}
}, {
name: '2015',
data: data[1],
type: 'scatter',
symbolSize: function (data) {
return Math.sqrt(data[2]) / 5e2;
},
label: {
emphasis: {
show: true,
formatter: function (param) {
return param.data[3];
},
position: 'top'
}
},
itemStyle: {
normal: {
shadowBlur: 10,
shadowColor: 'rgba(25, 100, 150, 0.5)',
shadowOffsetY: 5,
color: new echarts.graphic.RadialGradient(0.4, 0.3, 1, [{
offset: 0,
color: 'rgb(129, 227, 238)'
}, {
offset: 1,
color: 'rgb(25, 183, 207)'
}])
}
}
}]
};
myChart.setOption(option);//渲染圖表
}
})
An diesem Punkt denken wir vielleicht, dass diese Funktion erfolgreich war, aber tats?chlich gibt es hier eine kleine Grube, wie im Bild gezeigt:
Das Diagramm wird zu einem Klumpen, anstatt den gesamten Container adaptiv zu füllen.
業(yè)精于勤,荒于嬉;行成于思,毀于隨。
原因是這樣的:
echarts在渲染圖表時(shí),會(huì)自動(dòng)根據(jù)容器的尺寸撐滿圖表,而此時(shí)我們的容器同時(shí)又是未彈出的bootstrap模態(tài)框,當(dāng)我們把容器的width、height單位設(shè)置為百分比(我們都知道百分比是根據(jù)父元素的尺寸來的,模態(tài)框沒打開,父元素的尺寸也就不存在),echarts無法得知容器的尺寸,就會(huì)按照默認(rèn)最小值進(jìn)行渲染,就導(dǎo)致了上圖中的情況。那怎樣解決呢?
既然沒打開模態(tài)框時(shí)echarts渲染蒙逼了,那我們可以讓echarts在模態(tài)框打開后重新渲染一遍。該怎么做?從bootstrap和echarts的官方文檔可以找到答案:
上圖所示,我們可以利用bootstrap模態(tài)框的回調(diào)函數(shù)等模態(tài)框完全打開再去重新渲染圖表:
$('#myModal').on('shown.bs.modal',function(){
//.....
})
上圖所示,echarts為我們提供了重新渲染圖表的resize方法,這樣我們就可以結(jié)合bootstrap模態(tài)框的回調(diào)函數(shù)根據(jù)新的尺寸重新渲染:
$('#myModal').on('shown.bs.modal',function(){
myChart.resize()
})
把以上代碼放進(jìn)ajax請(qǐng)求成功的回調(diào)函數(shù)就ok了!
一個(gè)小坑,小小的分享一下,能幫助遇到相同問題的童鞋最好!有問題歡迎留言,歡迎指導(dǎo)。