为什么 Bootstrap 选项卡在使用 highcharts 时显示宽度不正确的选项卡窗格 div?

新手上路,请多包涵

因此,我正在使用 Twitter 的 Bootstrap 创建一个包含选项卡式内容的页面,但我的起始活动 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,这似乎处理显示:无和显示:块,但我不太了解在这种情况下它是如何工作的。

3.) 这是高图问题还是引导程序问题?我注意到这发生在我身上的非高图表元素(比如在侧边栏中显示推文),所以我倾向于引导程序。

4.) 是否有任何解决方案可以使所有内容保持一致?

谢谢你们!

原文由 VirtualValentin 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 341
2 个回答

原因

这不是 Highcharts 问题,至少不是它本身,问题是由 Bootstrap 使用 display: none 隐藏非活动选项卡 这一事实引起的:

 .tab-content > .tab-pane /* , .pill-content > .pill-pane */ {
    display: none;      /* this is the problem */
}

这会导致 Highcharts 无法获得预期的宽度来初始化图表,因此 默认为 600 (px)。使用相同方法隐藏内容的任何其他工具也会发生这种情况。

纯 CSS 解决方案

我们可以使用 height: 0; overflow-y: hidden 来实现隐藏效果,而不是通过额外的重绘或延迟初始化来解决这个问题,这样隐藏的选项卡窗格仍然存在并且具有有效的 width

 /* bootstrap hack: fix content width inside hidden tabs */
.tab-content > .tab-pane:not(.active) /* , .pill-content > .pill-pane:not(.active) */ {
    display: block;
    height: 0;
    overflow-y: hidden;
}
/* bootstrap hack end */

更新:现在我们通过 :not(.active) 直接定位非活动标签,以避免可能的副作用。

此解决方案是无缝的,因此您不必再担心图表是否在选项卡窗格内。而且它的效率很高,因为它首先解决了宽度问题,因此之后无需使用 javascript 通过调整大小/重绘/重排来解决宽度问题。

关于 CSS 级联顺序的注意事项

这个patch需要 在bootstrap css之后 加载,因为 CSS级联顺序规则,总之 以后者规则为准

演示

之前之后

提示:切换到“ _配置文件_”选项卡以查看差异。

原文由 ryenus 发布,翻译遵循 CC BY-SA 4.0 许可协议

问题是 Highcharts 无法计算具有 CSS 的容器的宽度: display:none ,因此应用的是默认宽度 (600px)。事实上,浏览器无法计算此类元素的宽度。

例如,当您将使用分隔符调整结果窗口大小时,图表将调整大小并起作用。所以你有三个选择:

  • 首次单击该选项卡后呈现图表
  • 在开始时呈现图表,但在每次单击和调整窗口大小后使用 chart.setSize(w,h) 新的宽度和高度
  • 在开始时呈现图表,但在选项卡单击调用之后 chart.reflow()

原文由 Paweł Fus 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题