c3.js 图表在 jquery 选项卡内使用时无法正常工作
c3.js chart not working properly when used inside jquery tab
我正在尝试在 jquery 选项卡中生成 c3 图表。当我呈现页面时,第一个选项卡中的 c3 图表似乎很好。然而,第二个选项卡内的 c3 图表似乎比第一个大。用于两个选项卡中图表的 div 块的维度是相同的。不确定为什么第二个选项卡中的图表比第一个选项卡大。请帮我解决这个问题。我在下面列出代码
tabs.css
的内容
#tabs_wrapper {
#width: 500px;
}
#tabs_container {
border-bottom: 1px solid #ccc;
}
#tabs {
list-style: none;
padding: 5px 0 4px 0;
margin: 0 0 0 10px;
font: 0.75em arial;
}
#tabs li {
display: inline;
}
#tabs li a {
border: 1px solid #ccc;
padding: 4px 6px;
text-decoration: none;
background-color: #eeeeee;
border-bottom: none;
outline: none;
border-radius: 5px 5px 0 0;
-moz-border-radius: 5px 5px 0 0;
-webkit-border-top-left-radius: 5px;
-webkit-border-top-right-radius: 5px;
font-weight: bold;
font-size: 0.9em;
}
#tabs li a:hover {
background-color: #dddddd;
padding: 4px 6px;
}
#tabs li.active a {
border-bottom: 1px solid #fff;
background-color: #fff;
padding: 4px 6px 5px 6px;
border-bottom: none;
}
#tabs li.active a:hover {
background-color: #eeeeee;
padding: 4px 6px 5px 6px;
border-bottom: none;
}
#tabs li a.icon_accept {
#background-image: url(accept.png);
background-position: 5px;
background-repeat: no-repeat;
padding-left: 24px;
}
#tabs li a.icon_accept:hover {
padding-left: 24px;
}
#tabs_content_container {
border: 1px solid #ccc;
border-top: none;
padding: 10px;
#width: 400px;
}
.tab_content {
display: none;
}
html的内容如下
<html>
<meta charset="utf-8">
<head>
<link rel="stylesheet" type="text/css" href="c3.css"/>
<link rel="stylesheet" type="text/css" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/themes/smoothness/jquery-ui.css"/>
<link rel="stylesheet" type="text/css" href="tabs.css"/>
<script src="http://d3js.org/d3.v3.min.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/c3/0.4.10/c3.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/jquery-ui.js"></script
</head>
<body>
<div id="barChartWrapperId" style="float:left;#clear:left;#display:none;margin-left:12%;#margin:0 auto;">
<div id="tabs_container">
<ul id='tabs'>
<li class="active"><a href='#tab1'>Activity for today</a></li>
<li><a href='#tab2'>Activity for current week</a></li>
<li><a href='#tab3'>Activity for current month</a></li>
</ul>
</div>
<div id="tabs_content_container" style="height:300px;">
<div id='tab1' class="tab_content" style="display: block;">
<div style="margin:0 auto;text-align:center;">
<div style="width:340px;#float:left;display:inline-block;">
<div style="font-family:Arial;font-size:0.7em;">counts for today</div>
<div style="clear:both;"></div>
<div id="importChart" style="width:340px;"></div>
</div>
<div style="width:530px;#float:left;display:inline-block;">
<div style="font-family:Arial;font-size:0.7em;">counts for today</div>
<div style="clear:both;"></div>
<div id="exportChart" style="width:530px;"></div>
</div>
</div>
</div>
<div id='tab2' class="tab_content" style="height:300px;">
<div style="margin:0 auto;text-align:center;">
<div style="width:340px;#float:left;display:inline-block;">
<div style="font-family:Arial;font-size:0.7em;">counts for this week</div>
<div style="clear:both;"></div>
<div id="weeklyImportChart" style="width:340px;"></div>
</div>
<div style="width:530px;#float:left;display:inline-block;">
<div style="font-family:Arial;font-size:0.7em;">counts for this week</div>
<div style="clear:both;"></div>
<div id="weeklyExportChart" style="width:530px;"></div>
</div>
</div>
</div>
<div id='tab3' class="tab_content" style="height:300px;">
<div style="margin:0 auto;text-align:center;">
<div style="width:340px;#float:left;display:inline-block;">
<div style="font-family:Arial;font-size:0.7em;">counts for this month</div>
<div style="clear:both;"></div>
<div id="monthlyImportChartC3" style="width:340px;"></div>
</div>
<div style="width:530px;#float:left;display:inline-block;">
<div style="font-family:Arial;font-size:0.7em;">counts for this month</div>
<div style="clear:both;"></div>
<div id="monthlyExportChartC3" style="width:530px;"></div>
</div>
</div>
</div>
</div>
<script>
var barDailyRcvdC3 = [757];
var barDailyCreatedC3 = [748];
var barDailyErrorC3 = [9];
var barDailyExRcvdC3 = [8966];
var barDailyExToDC3 = [7390];
var barDailyExToSC3 = [567];
var barDailyExToIC3 = [178];
var barDailyExToQC3 = [91];
var barDailyExToNC3 = [544];
var barDailyExToEC3 = [196];
var chart = c3.generate({
bindto: '#importChart',
data: {
columns: [
['imprcvd',].concat(barDailyRcvdC3),
['impc',].concat(barDailyCreatedC3),
['impe',].concat(barDailyErrorC3)
],
type:'bar',
labels: true
},
legend : {
position:'right'
},
axis : {
y: {
label: 'Counts'
}
},
bar:{
width: {
ratio: 0.5 // this makes bar width 50% of length between ticks
}
}
});
var chart = c3.generate({
bindto: '#exportChart',
data: {
columns: [
['exprcvd',].concat(barDailyExRcvdC3),
['expd',].concat(barDailyExToDC3),
['exps',].concat(barDailyExToSC3),
['expi',].concat(barDailyExToIC3),
['expq',].concat(barDailyExToQC3),
['expn',].concat(barDailyExToNC3),
['expe',].concat(barDailyExToEC3)
],
type:'bar',
labels: true
},
legend : {
position:'right'
},
axis : {
y: {
label: 'Counts'
}
},
bar:{
width: {
ratio: 0.6 // this makes bar width 50% of length between ticks
}
}
});
var barWeeklyRcvdC3 = [4244];
var barWeeklyCreatedC3 = [4218];
var barWeeklyErrorC3 = [29];
var barWeeklyExRcvdC3 = [18218];
var barWeeklyExToDC3 = [14795];
var barWeeklyExToSC3 = [1106];
var barWeeklyExToIC3 = [401];
var barWeeklyExToQC3 = [158];
var barWeeklyExToNC3 = [1029];
var barWeeklyExToEC3 = [733];
var chart = c3.generate({
bindto: '#weeklyImportChart',
data: {
columns: [
['imprcvd',].concat(barWeeklyRcvdC3),
['impc',].concat(barWeeklyCreatedC3),
['impe',].concat(barWeeklyErrorC3)
],
type:'bar',
labels: true
},
legend : {
position:'right'
},
axis : {
y: {
label: 'Counts'
}
},
bar:{
width: {
ratio: 0.5 // this makes bar width 50% of length between ticks
}
}
});
var chart = c3.generate({
bindto: '#weeklyExportChart',
data: {
columns: [
['exprcvd',].concat(barWeeklyExRcvdC3),
['expd',].concat(barWeeklyExToDC3),
['exps',].concat(barWeeklyExToSC3),
['expi',].concat(barWeeklyExToIC3),
['expq',].concat(barWeeklyExToQC3),
['expn',].concat(barWeeklyExToNC3),
['expe',].concat(barWeeklyExToEC3)
],
type:'bar',
labels: true
},
legend : {
position:'right'
},
axis : {
y: {
label: 'Counts'
}
},
bar:{
width: {
ratio: 0.6 // this makes bar width 50% of length between ticks
}
}
});
</script>
<script>
$(document).ready( function() {
// When user clicks on tab, this code will be executed
$("#tabs li").click(function() {
// First remove class "active" from currently active tab
$("#tabs li").removeClass('active');
// Now add class "active" to the selected/clicked tab
$(this).addClass("active");
// Hide all tab content
$(".tab_content").hide();
// Here we get the href value of the selected tab
var selected_tab = $(this).find("a").attr("href");
// Show the selected tab content
$(selected_tab).fadeIn();
// At the end, we add return false so that the click on the link is not executed
return false;
});
});
</script>
</body>
</html>
容器在 display: none
时不会有渲染的宽度/高度。
解决您遇到的问题的最简单方法是在初始化图表时明确设置宽度,就像这样
...
var chart = c3.generate({
bindto: '#weeklyImportChart',
size: {
width: 340
},
data: {
...
和
...
var chart = c3.generate({
bindto: '#weeklyExportChart',
size: {
width: 530
},
data: {
...
或者,您也可以在选项卡完全可见后初始化/重新初始化图表。
我正在尝试在 jquery 选项卡中生成 c3 图表。当我呈现页面时,第一个选项卡中的 c3 图表似乎很好。然而,第二个选项卡内的 c3 图表似乎比第一个大。用于两个选项卡中图表的 div 块的维度是相同的。不确定为什么第二个选项卡中的图表比第一个选项卡大。请帮我解决这个问题。我在下面列出代码
tabs.css
的内容#tabs_wrapper {
#width: 500px;
}
#tabs_container {
border-bottom: 1px solid #ccc;
}
#tabs {
list-style: none;
padding: 5px 0 4px 0;
margin: 0 0 0 10px;
font: 0.75em arial;
}
#tabs li {
display: inline;
}
#tabs li a {
border: 1px solid #ccc;
padding: 4px 6px;
text-decoration: none;
background-color: #eeeeee;
border-bottom: none;
outline: none;
border-radius: 5px 5px 0 0;
-moz-border-radius: 5px 5px 0 0;
-webkit-border-top-left-radius: 5px;
-webkit-border-top-right-radius: 5px;
font-weight: bold;
font-size: 0.9em;
}
#tabs li a:hover {
background-color: #dddddd;
padding: 4px 6px;
}
#tabs li.active a {
border-bottom: 1px solid #fff;
background-color: #fff;
padding: 4px 6px 5px 6px;
border-bottom: none;
}
#tabs li.active a:hover {
background-color: #eeeeee;
padding: 4px 6px 5px 6px;
border-bottom: none;
}
#tabs li a.icon_accept {
#background-image: url(accept.png);
background-position: 5px;
background-repeat: no-repeat;
padding-left: 24px;
}
#tabs li a.icon_accept:hover {
padding-left: 24px;
}
#tabs_content_container {
border: 1px solid #ccc;
border-top: none;
padding: 10px;
#width: 400px;
}
.tab_content {
display: none;
}
html的内容如下
<html>
<meta charset="utf-8">
<head>
<link rel="stylesheet" type="text/css" href="c3.css"/>
<link rel="stylesheet" type="text/css" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/themes/smoothness/jquery-ui.css"/>
<link rel="stylesheet" type="text/css" href="tabs.css"/>
<script src="http://d3js.org/d3.v3.min.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/c3/0.4.10/c3.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/jquery-ui.js"></script
</head>
<body>
<div id="barChartWrapperId" style="float:left;#clear:left;#display:none;margin-left:12%;#margin:0 auto;">
<div id="tabs_container">
<ul id='tabs'>
<li class="active"><a href='#tab1'>Activity for today</a></li>
<li><a href='#tab2'>Activity for current week</a></li>
<li><a href='#tab3'>Activity for current month</a></li>
</ul>
</div>
<div id="tabs_content_container" style="height:300px;">
<div id='tab1' class="tab_content" style="display: block;">
<div style="margin:0 auto;text-align:center;">
<div style="width:340px;#float:left;display:inline-block;">
<div style="font-family:Arial;font-size:0.7em;">counts for today</div>
<div style="clear:both;"></div>
<div id="importChart" style="width:340px;"></div>
</div>
<div style="width:530px;#float:left;display:inline-block;">
<div style="font-family:Arial;font-size:0.7em;">counts for today</div>
<div style="clear:both;"></div>
<div id="exportChart" style="width:530px;"></div>
</div>
</div>
</div>
<div id='tab2' class="tab_content" style="height:300px;">
<div style="margin:0 auto;text-align:center;">
<div style="width:340px;#float:left;display:inline-block;">
<div style="font-family:Arial;font-size:0.7em;">counts for this week</div>
<div style="clear:both;"></div>
<div id="weeklyImportChart" style="width:340px;"></div>
</div>
<div style="width:530px;#float:left;display:inline-block;">
<div style="font-family:Arial;font-size:0.7em;">counts for this week</div>
<div style="clear:both;"></div>
<div id="weeklyExportChart" style="width:530px;"></div>
</div>
</div>
</div>
<div id='tab3' class="tab_content" style="height:300px;">
<div style="margin:0 auto;text-align:center;">
<div style="width:340px;#float:left;display:inline-block;">
<div style="font-family:Arial;font-size:0.7em;">counts for this month</div>
<div style="clear:both;"></div>
<div id="monthlyImportChartC3" style="width:340px;"></div>
</div>
<div style="width:530px;#float:left;display:inline-block;">
<div style="font-family:Arial;font-size:0.7em;">counts for this month</div>
<div style="clear:both;"></div>
<div id="monthlyExportChartC3" style="width:530px;"></div>
</div>
</div>
</div>
</div>
<script>
var barDailyRcvdC3 = [757];
var barDailyCreatedC3 = [748];
var barDailyErrorC3 = [9];
var barDailyExRcvdC3 = [8966];
var barDailyExToDC3 = [7390];
var barDailyExToSC3 = [567];
var barDailyExToIC3 = [178];
var barDailyExToQC3 = [91];
var barDailyExToNC3 = [544];
var barDailyExToEC3 = [196];
var chart = c3.generate({
bindto: '#importChart',
data: {
columns: [
['imprcvd',].concat(barDailyRcvdC3),
['impc',].concat(barDailyCreatedC3),
['impe',].concat(barDailyErrorC3)
],
type:'bar',
labels: true
},
legend : {
position:'right'
},
axis : {
y: {
label: 'Counts'
}
},
bar:{
width: {
ratio: 0.5 // this makes bar width 50% of length between ticks
}
}
});
var chart = c3.generate({
bindto: '#exportChart',
data: {
columns: [
['exprcvd',].concat(barDailyExRcvdC3),
['expd',].concat(barDailyExToDC3),
['exps',].concat(barDailyExToSC3),
['expi',].concat(barDailyExToIC3),
['expq',].concat(barDailyExToQC3),
['expn',].concat(barDailyExToNC3),
['expe',].concat(barDailyExToEC3)
],
type:'bar',
labels: true
},
legend : {
position:'right'
},
axis : {
y: {
label: 'Counts'
}
},
bar:{
width: {
ratio: 0.6 // this makes bar width 50% of length between ticks
}
}
});
var barWeeklyRcvdC3 = [4244];
var barWeeklyCreatedC3 = [4218];
var barWeeklyErrorC3 = [29];
var barWeeklyExRcvdC3 = [18218];
var barWeeklyExToDC3 = [14795];
var barWeeklyExToSC3 = [1106];
var barWeeklyExToIC3 = [401];
var barWeeklyExToQC3 = [158];
var barWeeklyExToNC3 = [1029];
var barWeeklyExToEC3 = [733];
var chart = c3.generate({
bindto: '#weeklyImportChart',
data: {
columns: [
['imprcvd',].concat(barWeeklyRcvdC3),
['impc',].concat(barWeeklyCreatedC3),
['impe',].concat(barWeeklyErrorC3)
],
type:'bar',
labels: true
},
legend : {
position:'right'
},
axis : {
y: {
label: 'Counts'
}
},
bar:{
width: {
ratio: 0.5 // this makes bar width 50% of length between ticks
}
}
});
var chart = c3.generate({
bindto: '#weeklyExportChart',
data: {
columns: [
['exprcvd',].concat(barWeeklyExRcvdC3),
['expd',].concat(barWeeklyExToDC3),
['exps',].concat(barWeeklyExToSC3),
['expi',].concat(barWeeklyExToIC3),
['expq',].concat(barWeeklyExToQC3),
['expn',].concat(barWeeklyExToNC3),
['expe',].concat(barWeeklyExToEC3)
],
type:'bar',
labels: true
},
legend : {
position:'right'
},
axis : {
y: {
label: 'Counts'
}
},
bar:{
width: {
ratio: 0.6 // this makes bar width 50% of length between ticks
}
}
});
</script>
<script>
$(document).ready( function() {
// When user clicks on tab, this code will be executed
$("#tabs li").click(function() {
// First remove class "active" from currently active tab
$("#tabs li").removeClass('active');
// Now add class "active" to the selected/clicked tab
$(this).addClass("active");
// Hide all tab content
$(".tab_content").hide();
// Here we get the href value of the selected tab
var selected_tab = $(this).find("a").attr("href");
// Show the selected tab content
$(selected_tab).fadeIn();
// At the end, we add return false so that the click on the link is not executed
return false;
});
});
</script>
</body>
</html>
容器在 display: none
时不会有渲染的宽度/高度。
解决您遇到的问题的最简单方法是在初始化图表时明确设置宽度,就像这样
...
var chart = c3.generate({
bindto: '#weeklyImportChart',
size: {
width: 340
},
data: {
...
和
...
var chart = c3.generate({
bindto: '#weeklyExportChart',
size: {
width: 530
},
data: {
...
或者,您也可以在选项卡完全可见后初始化/重新初始化图表。