在做项目的时候遇到这样一个问题:在tabs多标签切换的情况下显示echart绘制的图形时,只有第一个页签下的图形显示出来,其余页签下的都是空白。
总结了一下,主要是这个原因:除了第一个的其他tab页未加载,所以宽高就发生了问题;
先来理解这样一段话:多标签页中,那些初始隐藏的标签在初始化图标的时候获取不到容器的实际高度,可能会绘制失败,因此在切换标签页时需要手动调用resize()方法获取正确的高度并且刷新画布或者在option中显示指定图表高度。
解决办法:1、在刚入页面的时候全部绘制所有标签页下的echarts图形,然后在切换tab页签的时候调用chartObj(echarts 实例)的resize()刷新画布。(注意:有几个echarts图形,就要创建几个chartObj对象);
我自己在其中遇到的坑:
1、五个标签页下全部显示echarts绘制的折线图,偷懒五个图形调用同一个方法,使用同一个chartObj(echarts 实例)。结果只有第一个页签和最后一个页签下的图形显示出来。原因应该是中间三个的图形被最后一个给覆盖了;
2、就牵扯到$(function(){})作用域的问题了,普通函数跟普通函数中使用的全局变量需要全部放在$(function(){})中,要不然会报错chartObj(echarts 实例)找不到的错误;
代码如下:
html部分:
<div class="container">
<div class="row">
<div class="col-lg-12 col-md-12 col-xs-12">
<div class="layui-tab layui-tab-card" lay-filter=\'test\'>
<ul class="layui-tab-title">
<li class="layui-this" data-index=\'0\'>网站设置</li>
<li data-index=\'1\'>用户管理</li>
<li data-index=\'2\'>权限分配</li>
<li data-index=\'3\'>商品管理</li>
<li data-index=\'4\'>订单管理</li>
</ul>
<div class="layui-tab-content">
<div class="layui-tab-item layui-show">
<div id="chart1" style="height: 300px;"></div>
</div>
<div class="layui-tab-item">
<div id="chart2" style="height: 300px;"></div>
</div>
<div class="layui-tab-item">
<div id="chart3" style="height: 300px;"></div>
</div>
<div class="layui-tab-item">
<div id="chart4" style="height: 300px;"></div>
</div>
<div class="layui-tab-item">
<div id="chart5" style="height: 300px;"></div>
</div>
</div>
</div>
</div>
</div>
</div>
js部分:
$(function(){
layui.use(\'element\',function(){
var element=layui.element;
var $=layui.jquery;
$(".layui-tab-title li").hover(function(){
var $i=$(this).attr("data-index");
$(this).addClass("layui-this").siblings().removeClass("layui-this");
$(".layui-tab-content .layui-tab-item").eq($i).addClass("layui-show").siblings().removeClass("layui-show");
var id = $(".layui-tab-content .layui-tab-item").eq($i).children(\'div\').attr(\'id\');
myChartObj[id].resize();
});
});
var myChartObj = {\'chart1\':null,\'chart2\':null,\'chart3\':null,\'chart4\':null,\'chart5\':null};
getChart(\'chart1\');
getChart(\'chart2\');
getChart(\'chart3\');
getChart(\'chart4\');
getChart(\'chart5\');
function getChart(chartId){
myChartObj[chartId] = echarts.init(document.getElementById(chartId));
var option = {
title: {
text: \'\'
},
tooltip: {
trigger: \'axis\'
},
legend: {
data:[\'邮件营销\',\'联盟广告\',\'视频广告\',\'直接访问\',\'搜索引擎\']
},
grid: {
left: \'3%\',
right: \'4%\',
bottom: \'3%\',
containLabel: true
},
xAxis: {
type: \'category\',
boundaryGap: false,
data: [\'周一\',\'周二\',\'周三\',\'周四\',\'周五\',\'周六\',\'周日\']
},
yAxis: {
type: \'value\'
},
series: [
{
name:\'邮件营销\',
type:\'line\',
data:[120, 132, 101, 134, 90, 230, 210]
},
{
name:\'联盟广告\',
type:\'line\',
data:[220, 182, 191, 234, 290, 330, 310]
},
{
name:\'视频广告\',
type:\'line\',
data:[150, 232, 201, 154, 190, 330, 410]
},
{
name:\'直接访问\',
type:\'line\',
data:[320, 332, 301, 334, 390, 330, 320]
},
{
name:\'搜索引擎\',
type:\'line\',
data:[820, 932, 901, 934, 1290, 1330, 1320]
}
]
};
myChartObj[chartId].setOption(option);
}
})