Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Html 为什么引导选项卡在使用highcharts时显示宽度不正确的选项卡窗格div?_Html_Twitter Bootstrap_Highcharts - Fatal编程技术网

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

Html 为什么引导选项卡在使用highcharts时显示宽度不正确的选项卡窗格div?,html,twitter-bootstrap,highcharts,Html,Twitter Bootstrap,Highcharts,因此,我使用Twitter的引导程序创建了一个带有标签内容的页面,但是我的起始活动div的内容总是不同于我的其他标签。例如,我在不同的选项卡中使用highcharts.js输入图表,但活动的图表始终显示正确,而其他的图表的宽度不正确 查看下面的示例: <div class = "row-fluid"> <div class = "span9"> <div class = "row-fluid">

因此,我使用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的空间。在本例中,我只使用了虚拟图表,但这是相同的想法

下面是一个JSFIDLE:

我想问大家的问题是:

一,。这就是我吗

二,。选项卡处于活动状态时到底发生了什么?看看引导css,它似乎处理display:none和display:block,但我不太了解在这种情况下如何工作

三,。这是highcharts问题还是bootstrap问题?我注意到这种情况发生在我身上,我使用了非高端图表元素,比如在侧边栏中显示tweet,所以我倾向于使用bootstrap

四,。你能找到什么解决办法使每件事都保持一致吗


谢谢大家

图表的行内样式宽度不同。我不确定何时以及如何计算这些值,但您可以覆盖css中的值。

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

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

在第一次单击该选项卡后渲染图表 在开始时呈现图表,但每次单击并调整窗口大小后,请使用新宽度和高度的chart.setizew,h 在开始时呈现图表,但在选项卡后单击call chart.reflow
根据Pawel的回答,我开始渲染图表,然后调整图表的大小

与bootstrap 3.0.3和HighCharts 3.0.7一起使用的代码

$('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
    $('#container').highcharts().setSize($('#container').width(),$('#container').height());
})
来源:

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

.tab内容>.tab窗格,.pill内容>.pill窗格{ 显示:无;/*这就是问题所在*/ } 这导致Highcharts无法获得初始化图表的预期宽度,因此默认为600px。这将发生在使用相同方法隐藏内容的其他工具上

纯CSS解决方案 我们可以使用height:0实现隐藏效果,而不是通过额外的重画或延迟初始化来解决问题;overflow-y:隐藏,这样隐藏的选项卡窗格仍在原位,并且具有有效宽度:

/*引导破解:修复隐藏标签内的内容宽度*/ .tab内容>.tab窗格:未激活, .pill content>.pill窗格:未激活{ 显示:块; 身高:0; 溢出y:隐藏; } /*自举黑客端*/ 更新:我们现在通过:not.active直接针对非活动选项卡,以避免可能的副作用(如果有)

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

关于级联顺序的注意事项 这个补丁需要在引导css之后加载,因为,简言之,后一个规则获胜

演示 vs


提示:切换到Profile选项卡查看差异。

根据Paweł的回答,我给出了一个工作示例:

基本上,单击选项卡时,会在每个图表上调用.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无法在设置了“display:none”的div上渲染。解决方案就是在CSS样式表中编写一个补丁

.tab内容>.tab窗格, .pill内容>.pill窗格{ 显示:内联; 可见性:隐藏; 位置:绝对位置; 宽度:930px; } .tab内容>.active, .pill content>.active{ 显示:内联; 能见度:可见; 位置:绝对位置; 宽度:930px; }
这将使选项卡使用可见性属性而不是显示。图表会很好地呈现。

谢谢你,伙计。我想我必须以某种方式覆盖宽度,但不幸的是,没有更简单的方法来解决这个问题。我注意到其他bootstrap元素媒体列表也出现了这种情况,所以我很快就会找到解决方案。关于这一点,有很多帖子,但找到这篇帖子花了很长时间,
唯一有好办法的。因此,这里有一些关键字,以帮助使其更可见:highcharts,引导,重画,隐藏,标签,回流,更新,宽度,高度,打破家长,css,显示:无,重新渲染,重新渲染,触发重画,调整大小,响应,引导3Wesome!我还得补充一句!每个属性之后都很重要,以克服引导优先级,但它工作得非常完美。这正是所需要的!谢谢。@Steve!重要提示:如果此修补程序之后出现了某些样式规则或引导程序本身,则可能需要更改顺序。虽然这对我有效,但当我访问以前的选项卡时,高位图表被隐藏,当我将鼠标悬停在它们上方时,它们变得可见,我也必须添加宽度的修复:宽度:0;溢出x:隐藏;和:宽度:自动;这有道理吗?很遗憾它没有引发真正的重画。初始渲染时的动画非常逼真。当我尝试此操作时,选项卡的“高度”计算不正确。例如,我的包含选项卡内容div上有一个边框样式,它不够大,无法包含选项卡的所有内容。