24

我目前有一个 3 标签页。每个选项卡都是一个display: hidden未选中时设置为的 div。在这些选项卡中,我有一个使用 Susy(指南针插件)创建的网格系统。此外,每个标签页都有一组 Highcharts。当我加载页面时,根据 URl 中的哪个选项卡,将加载其中一个选项卡。所有的图表看起来都很好,但是当我切换到不同的选项卡时,一些图表在它们的 div 中不正确。如果我只是重新调整窗口大小,图表会重新计算,然后它们会完美契合。或者,如果我重新加载同一个选项卡,图表也很合适。当我切换标签时,我可以调用一个函数来调整页面上所有图表的大小吗?

它看起来像这样: 它看起来如何

什么时候应该是这样的: 它应该是什么样子

编辑:似乎这不是与 highcharts 直接相关的问题,例如我的谷歌地图如下所示: Google 地图的外观

但是当我调整窗口大小时,它会正确调整: 调整大小后 Google 地图的外观

切换选项卡时,我可以通过 JS 中的函数调用使 CSS 刷新/调整我的网格吗?

4

3 回答 3

46

对我有用的是:

$(window).resize();

当我加载新标签时。Google Maps API 仍然存在问题,但它与 Highcharts 配合得很好。

于 2013-04-25T18:01:28.547 回答
6

当您尝试使用“display: none”开始渲染事物时,您会发现很多问题。虽然 $(window).resize() 可能在许多情况下都有效,但我建议尝试在 display: none 生效之前先渲染您的页面。一个可能的解决方案是设置 opacity: 0 或 visibility: hidden。

display 属性控制元素的渲染方式,例如块(100% 宽度)或内联(适合内容)。当一个元素具有 display: none 时,它​​会覆盖它,最终删除它的有效宽度和高度,直到该元素接收到块类型。

这是一个演示示例:http: //jsfiddle.net/m2f3scmm/3/

<div id="log1" style="display: none;">
</div>
<div id="log2" style="visibility: hidden;">
</div>
<div id="log3" style="opacity: 0">
</div>

当您使用“调整大小”技巧时,您假设您正在使用的插件或脚本绑定到窗口的调整大小事件,但情况并非总是如此。触发 window.resize 还可能减慢渲染速度或导致不需要的效果(例如,第一次渲染时 highcharts 的小动画 - 每次更改选项卡时都会出现这种情况)。

于 2015-06-14T22:58:24.293 回答
3
/**
 * Adjust size for hidden charts
 * @param chart highcharts
 */
function adjustGraph(chart) {
    try {
        if (typeof (chart === 'undefined' || chart === null) && this instanceof jQuery) { // if no obj chart and the context is set
            this.find('.chart-container:visible').each(function () { // for only visible charts container in the curent context
                $container = $(this); // context container
                $container.find('div[id^="chart-"]').each(function () { // for only chart
                    $chart = $(this).highcharts(); // cast from JQuery to highcharts obj
                    $chart.setSize($container.width(), $chart.chartHeight, doAnimation = true); // adjust chart size with animation transition
                });
            });
        } else {
            chart.setSize($('.chart-container:visible').width(), chart.chartHeight, doAnimation = true); // if chart is set, adjust
        }
    }
    catch (err) {
        // do nothing
    }
}

用法

$(window).resize(function () {
        if (this.resizeTO) clearTimeout(this.resizeTO);
        this.resizeTO = setTimeout(function () {
            // resizeEnd call function with pass context body
            adjustGraph.call($('body'));

        }, 500);
    });

对于引导选项卡

$('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
            var isChart = $(this).attr('data-chart');
            var target = $(this).attr('href');
            if (isChart) {
                // call functio inside context target
                adjustGraph.call($(target));
            }
        });



  <ul id="tabs" class="nav nav-tabs" data-tabs="tabs">
        <li class="active">
            <a href="#anagrafica" data-toggle="tab"><h5>Anagrafica</h5></a>
        </li>
        <li>
            <a href="#consumi" data-toggle="tab" data-chart="1"><h5>Consumi</h5></a>
        </li>
    </ul>

在图表上

new Highcharts.Chart({
            chart: {
                renderTo: 'chart-bar',
                defaultSeriesType: 'column',
                zoomType: 'xy',
                backgroundColor: null,
                events: {
                    load: function (event) {
                        adjustGraph(this);
                    }
                }
            },

html代码

div class="tab-pane" id="charts">
    <div class="row-fluid">
        <div class="span6 offset3">
            <div id="myCarousel" class="carousel slide">
                <!-- Carousel items -->
                <div class="carousel-inner chart-container">
                    <div class="active item">
                        <h3>Chart 1/h3>
                        <div id="bar-pod-annuale">
                           <div id="chart-bar" style="width:100%;margin: 0 auto"></div>
                        </div>
                    </div>
                    <div class="item">
                        <h3>Char 2</h3>
                        /** chart **/
                    </div>
                    <div class="item">
                        <h3>Char 3</h3>
                        /** chart **/
                    </div>
                </div>
                <!-- Carousel nav -->
                <a class="carousel-control left" href="#myCarousel" data-slide="prev">‹&lt;/a>
                <a class="carousel-control right" href="#myCarousel" data-slide="next">›&lt;/a>
            </div>
        </div>
    </div>

请参阅 jsfiddle http://jsfiddle.net/davide_vallicella/LuxFd/2/

于 2014-08-01T15:05:55.520 回答