Калибровка C3 слишком велика при первоначальной загрузке
Я использую библиотеку C3 JavaScript для отображения данных графа. Когда моя страница изначально загружается, графики скрыты. Пока не будет выбрана "вкладка" на странице, отображающая графики.
Проблема, которую я вижу, заключается в том, что мой первый график не соответствует его содержащему тегу div при первой загрузке. Я могу изменить диапазон дат, на который я просматриваю данные, нажав кнопку, и в это время графики будут иметь правильный размер.
Вот соответствующий HTML, который я использую для графиков (обратите внимание, что я использую AngularJS, если это вообще помогает/препятствует):
<div class="chartgrouping">
<div ng-show="showGraphSection" class="graphA">
<h2 class="section-main-heading">Data A</h2>
<div id="dataAChart" class="chart c3"></div>
</div>
<div ng-show="showGraphSection" class="graphB">
<h2 class="section-main-heading">Data B</h2>
<div class="stats">
<div class="highest-value">Data Breakdown<span>{{percentageOfSubstance}}%</span></div>
<div class="goals">GOAL: 20%</div>
</div>
<div id="dataBChart" class="c3" style="max-height: 320px; position: relative;"></div>
</div>
</div>
Исходный, неправильный дисплей (первый график растягивается весь путь):
![initial, incorrect width on first graph]()
И правильный результат после загрузки новых данных после первого результата (выше) был отображен:
![graphs with correct width]()
Есть ли хорошее решение этой проблемы?
Ответы
Ответ 1
Я нашел решение связано с тем, как он определяет полную ширину элемента при скрытии (часто в случае использования вкладок начальной загрузки и т.д. и других скрытых элементов).
Чтобы обойти это, вам нужно вызвать событие изменения размера в окне, чтобы сделать d3 (базовую библиотеку графиков), чтобы выработать правильный размер.
jQuery(window).trigger('resize');
Вы можете сделать это при загрузке, используя что-то похожее на
jQuery('a[data-toggle=tab]').on('shown.bs.tab', function() {
jQuery(window).trigger('resize');
});
Ответ 2
В моем случае ответ @Flanamacca работает только частично. Загрузка данных диаграммы с помощью setTimeout
с задержкой 0 кажется исправленной.
Ответ 3
Попробовав множество возможностей, я наконец нашел решение. Это решение Angular, поэтому любой другой, испытывающий проблему и не использующий Angular, должен будет соответствующим образом изменить его.
Как я решил, что это было, вместо использования ng-show в родительском div, я удалил его и добавил точные копии его в каждый субтег (h2 и h2s). Простое решение, но такая боль, чтобы понять.
Ответ 4
Материал jQuery(window).trigger('resize');
не работал у меня.
Но использование функции C3 resize ( )
работает как босс:
var chart = c3.generate({
bindto: '#chart',
data: {
columns: [
['data1', 300, 350, 300, 0, 0, 0],
['data2', 130, 100, 140, 200, 150, 50]
],
types: {
data1: 'area',
data2: 'area-spline'
}
}
});
$('.collapse').on('shown.bs.collapse', function() {//Your event listner
chart.resize();
});
Ответ 5
Если вы используете Foundation с несколькими вкладками, то для меня работало следующее:
$('#myPanelId' ).on('toggled', function(){
jQuery(window).trigger('resize');
})
Где myPanelId
- идентификатор панели, который содержит диаграммы.
Ответ 6
Ответ @Flanamacca не работал у меня, хотя это была проблема с загрузочной вкладкой, поэтому я использовал селектор jQuery, который они предложили.
Для меня работал метод c3 flush(), который заставляет диаграмму перерисовывать (см. http://c3js.org/reference.html#api-flush).
$('a[data-toggle=tab]').on('shown.bs.tab', function() {
my_c3_chart.flush();
});
Ответ 7
Просто настройка максимальной ширины CSS div, содержащей диаграмму, работала для меня.
Ответ 8
Наши ситуации могут быть другими, но, возможно, кто-то с более полным пониманием того, как рендерит HTML, может извлечь из этого информацию.
Моя проблема заключалась в том, что я скрывал график, пока мои данные не были извлечены, и график был создан с помощью c3.generate. Я скрывал график, используя css "display: none;". это было то, что вызвало проблему. Как только я изменил свой CSS на "Непрозрачность: 0", проблема исчезла.