【问题标题】:How can you determine the minimum width of a html table using javascript?如何使用 javascript 确定 html 表格的最小宽度?
【发布时间】:2014-06-14 06:57:19
【问题描述】:

如果 html 表格设置为table-layout: auto;,则它的最小宽度由浏览器设置,由表格内容确定。因此,即使使用width: 100%,该表也会超出其容器。有没有办法使用 javascript 来找到这个最小宽度?

我正在尝试制作响应式表格解决方案。我做了类似的东西:http://jsbin.com/apane6/14

在移动设备上,表格的内容是隐藏的,您可以点击它来查看它的全屏版本。现在我正在使用媒体查询,但我想知道表格必须切换到这个移动视图的确切宽度。您甚至可以在示例中看到表格延伸到页面宽度之外,从而创建了一个滚动条,这是我试图避免的。

这是我的 CSS:

table {
    border-collapse: collapse;
    border-spacing: 0;
    table-layout: auto;
    width: 100%;
}

@media (max-width: 768px) {
    table {
        table-layout: fixed;
        white-space:nowrap;
    }
    th, td {
        overflow: hidden;
        height: 15px;
        font-size: 0;
        color: transparent
    }
}

【问题讨论】:

  • @Popnoodles 我知道你可以找到一张桌子的宽度。我试图找出宽度在什么时候超出其容器,并且在窗口大小发生变化时理想地工作。
  • 好的,我从标题开始,并没有阅读链接。请在问题中发布您的代码。
  • 非常有趣的问题,并“强迫”我进行谷歌搜索并找到表的 w3 标准(呃!)的链接。这里的页面非常有趣 - dev.w3.org/csswg/css3-tables-algorithms/Overview.src.htm - 转到“算法摘要”,您将看到有关如何根据 td 大小计算宽度的详细信息。
  • @TimSPQR 看起来符合我正在尝试做的事情。但我不知道如何获得文章中所述的“tableMinWidth”。看起来我尝试这样做的方式可能没有解决方案

标签: javascript html css


【解决方案1】:

只是为了好玩,今天下午我玩弄了代码,想出了这个复杂的FIDDLE,这真的只是一个开始。

它将块模型分解为表格每个部分的每个组件。如果所有 td 的宽度相同,那么您只需要执行一个 td (:eq(0)),否则,您将不得不遍历所有列。假设没有内容,您可以将内部宽度调整为您想要的任何大小。

这有点复杂,但如果你对元素的相关部分求和,它应该会给你一个像素的答案。

JS

var tableleftmargin = $('table').css("margin-left").slice(0, -2);
var tableleftborder = $('table').css("borderLeftWidth").slice(0, -2);
var tableleftpadding = $('table').css("padding-left").slice(0, -2);

var tdleftborder = $('table tr td:eq(0)').css('borderLeftWidth').slice(0, -2);
var tdleftpadding = $('table tr td:eq(0)').css('padding-left').slice(0, -2);

var tdinnerwidth = $('table tr td:eq(0)').css('width').slice(0, -2);

var tdrightpadding = $('table tr td:eq(0)').css('padding-right').slice(0, -2);
var tdrightborder = $('table tr td:eq(0)').css('borderRightWidth').slice(0, -2);

var rightpaddingwidth = $('table').css("padding-right").slice(0, -2);
var rightborderwidth = $('table').css("borderRightWidth").slice(0, -2);
var rightmarginwidth = $('table').css("margin-right").slice(0, -2);

$('.putmehere').html(
                     "Table left margin = " + tableleftmargin + "<br />" +
                     "Table left border = " + tableleftborder + "<br />" +
                     "Table left padding = " + tableleftpadding + "<br />" +
                     "td left border = " + tdleftborder + "<br />" +
                     "td left padding = " + tdleftpadding + "<br />" +
                     "td inner width = " + tdinnerwidth + "<br />" +
                     "td Right padding = " + tdrightpadding + "<br />" +
                     "td Right border = " + tdrightborder + "<br />" +
                     "Table right padding = " + rightpaddingwidth + "<br />" +
                     "Table right border = " + rightborderwidth + "<br />" +
                     "Table right margin = " + rightmarginwidth + "<br />"
                    );

【讨论】:

    【解决方案2】:

    嗯,这并不是我想要的,但它确实有效。因为我正在复制表格以显示为叠加层,所以我可以抓住它的宽度,而不是试图弄清楚原始表格的宽度是多少(我不能,因为它的 CSS 已更改)。希望这个 JS 有意义。

    $(document).ready(function (){  
    
        $('.overlay-element').on("click", function() {
    
            var overlayID = $(this).attr('id') + "-overlay";
    
            //animate overlay opening
            $("#"+overlayID).addClass('open');
    
            //drag.js allowing you to move the container within overlay with mouse
            drag("#"+overlayID+' .overlay-container').bind();
    
            //exit overlay
            $("#"+overlayID+' .overlay-exit').on("click", function() {
                $("#"+overlayID).removeClass( 'open' );
            });
    
        });
    
    
    });
    
    
    $(window).load(function() {
    
        //create overlay elements
        $('.overlay-element').each( function() {
            var overlayID = $(this).attr('id') + "-overlay";
            $("body").append(
                    "<div id='"+overlayID+"' class='overlay overlay-scale'>
                        <div class='overlay-exit'></div>
                        <div class='overlay-container'>"
                             + $(this)
                                .clone()
                                .removeAttr('id')
                                .removeClass('overlay-element closed')[0]
                                .outerHTML 
                        + "</div>
                    </div>"
                );
    
            //switch to mobile view for tables if their min width is larger than parent
            if ($("#"+overlayID+' table').width() > $(this).width()) {
                $(this).addClass('closed');
            }
        });
    
    });
    
    $(window).resize(function() {
    
        //switch to mobile view for tables if their min width is larger than parent
        $('.overlay-element').each( function() {
            var overlayID = $(this).attr('id') + "-overlay";
    
            if ($("#"+overlayID+' table').width()>$(this).width()) {
                $(this).addClass('closed');
            } else {
                $(this).removeClass('closed');
            }
        });
    
    });
    

    【讨论】:

      猜你喜欢
      • 2019-08-25
      • 2012-08-08
      • 2010-09-08
      • 2013-09-01
      • 2019-01-10
      • 1970-01-01
      • 1970-01-01
      • 2011-09-18
      • 1970-01-01
      相关资源
      最近更新 更多