html динамические - Почему вкладки Bootstrap отображают вкладки с вкладками с неправильной шириной при использовании высоких диаграмм?




3 Answers

Проблема в том, что Highcharts не может вычислить ширину контейнера с CSS: display:none , поэтому применяется ширина по умолчанию (600 пикселей). Фактически, браузер не может рассчитать ширину для таких элементов.

Например, когда вы будете использовать разделитель для изменения размера окна результатов, диаграмма изменит размер и будет работать. Таким образом, у вас есть три варианта:

  • диаграмму рендеринга после первого нажатия на эту вкладку
  • рендеринга в начале, но после каждого изменения размера клика и окна используйте chart.setSize(w,h) с новой шириной и высотой
  • диаграмму рендеринга в начале, но после нажатия кнопки click chart.reflow()
табы tabs

Поэтому я создаю страницу с вкладками с использованием загрузочного лотка Twitter, но содержание моего активного активного div всегда отличается от содержимого моих других вкладок. Например, я помещаю диаграммы с использованием highcharts.js на разных вкладках, но активный всегда отображается правильно, а другие имеют неправильную ширину.

Посмотрите пример ниже:

        <div class = "row-fluid">
        <div class = "span9">
            <div class = "row-fluid">
                <h3>Test</h3>

                    <ul class="nav nav-tabs">
                        <li class = "active">
                            <a data-toggle = "tab" href = "#one">One</a>
                        </li>
                        <li><a data-toggle = "tab" href = "#two">Two</a></li>
                        <li><a data-toggle = "tab" href = "#three">Three</a></li>
                    </ul>

                    <div class="tab-content">

                        <div class="tab-pane active" id="one" >
                            <h4>One</h4>
                            <div id = "container1"></div>
                            <script type = "text/javascript">
                                $(function () {
                                    $('#container1').highcharts({
                                        chart: {
                                        },
                                        xAxis: {
                                            categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
                                        },
                                        series: [{
                                            data: [29.9, 71.5, 106.4, 129.2, 144.0, 176.0, 135.6, 148.5, 216.4, 194.1, 95.6, 54.4]        
                                        }]
                                    });
                                });
                            </script>
                        </div>

                        <div class="tab-pane" id="two" >
                        <h4>Two</h4>
                        <div id = "container2"></div>
                        <script type = "text/javascript">
                            $(function () {
                                $('#container2').highcharts({
                                    chart: {
                                    },
                                    xAxis: {
                                        categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
                                    },
                                    series: [{
                                        data: [29.9, 71.5, 106.4, 129.2, 144.0, 176.0, 135.6, 148.5, 216.4, 194.1, 95.6, 54.4]        
                                    }]
                                });
                            });
                            </script>
                        </div>

                        <div class="tab-pane" id="three" >
                        <h4>Three</h4>
                        <div id = "container3"></div>
                        <script type = "text/javascript">
                            $(function () {
                                $('#container3').highcharts({
                                    chart: {
                                    },
                                    xAxis: {
                                        categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
                                    },
                                    series: [{
                                        data: [29.9, 71.5, 106.4, 129.2, 144.0, 176.0, 135.6, 148.5, 216.4, 194.1, 95.6, 54.4]        
                                    }]
                                });
                            });
                            </script>
                        </div>

                    </div> 
            </div>
        </div>
        <div class = "span3">
            <p>Here is the content on my sidebar</p>
        </div>
    </div>

В этом случае переключение активной вкладки на загрузку страницы делает эту диаграмму корректной для меня, но все остальное всегда распространяется вплоть до края (в случае моих данных, которые я хочу только заполнить пространство span9 div. В этом случае я использовал макетные диаграммы, но это та же идея.

Вот JSFiddle: http://jsfiddle.net/dw9tn/

Мои вопросы для всех вас:

1.) Это только я?

2.) Что именно происходит, когда вкладки активируются? Если посмотреть на bootstrap css, это, похоже, имеет дело с отображением: none и display: block, но у меня нет хорошего понимания того, как это работает в этом случае.

3.) Является ли это важной проблемой или проблемой начальной загрузки? Я заметил, что это произошло со мной с не-highchart элементами (например, показ твитов на боковой панели), поэтому я склоняюсь к бутстрапу.

4.) Есть ли какое-либо решение, которое вы можете найти, чтобы сделать все согласованным?

Спасибо, парни!




Основываясь на ответе Павла, я сделал рабочий пример:

http://codepen.io/colinsteinmann/pen/BlGfE

В основном функция .reflow () вызывается на каждой диаграмме при нажатии на вкладку. Таким образом, диаграмма перерисовывается на основе новых измерений, которые применяются к контейнеру, когда он становится видимым.

Это самый важный фрагмент кода:

// fix dimensions of chart that was in a hidden element
jQuery(document).on( 'shown.bs.tab', 'a[data-toggle="tab"]', function (e) { // on tab selection event
    jQuery( ".contains-chart" ).each(function() { // target each element with the .contains-chart class
        var chart = jQuery(this).highcharts(); // target the chart itself
        chart.reflow() // reflow that chart
    });
})



Я нашел более легкое решение в другом посте. В основном проблема возникает из-за того, что Highcharts не может отображать на div с настройкой «display: none». Решение - просто написать исправление в таблице стилей CSS.

.tab-content > .tab-pane,
.pill-content > .pill-pane {
    display: inline;
    visibility: hidden;
    position: absolute;
    width: 930px;
}

.tab-content > .active,
.pill-content > .active {
    display: inline;
    visibility: visible;
    position: absolute;
    width: 930px;
}

Это заставит вкладки работать с атрибутом visibility вместо display . Графики будут хорошо отображаться.




Related