【问题标题】:Hiding a <tr>, while still involving it in width calculations隐藏一个 <tr>,同时仍然涉及它的宽度计算
【发布时间】:2014-11-06 14:09:44
【问题描述】:

搜索结果存储在如下表中:

<table>
    <tbody>
        <tr>
            <td>Column One</td>
            <td>Column Two</td>
            <td>Column Three</td>
        </tr>
    </tbody>
</table>

实际的表格包含更多的数据(列和行)并且是流动的宽度。由于数据是可变的,我希望table-layout 保持auto,因为它处理自动调整大小(这在javascript 中对于1000 行来说会很昂贵且复杂)。

此表还由实时搜索小部件过滤,该小部件通过添加 display: none; 隐藏与查询不匹配的行。但是,我发现这通常会导致重新计算列宽(通常会导致列宽出现一些不和谐的跳跃)。这是有道理的,因为行可能只包含有display: table-row; 的计算。但这不是我所追求的行为。

是否可以从视图中隐藏&lt;tr&gt;,但仍将其包含在由浏览器在具有table-layout: auto; 的表格上完成的列宽计算中(例如调整大小)?

我尝试过设置height: 0;(和max-height: 0;),但从other SO questions 了解到这不起作用,因为display: table-cell;。同样,设置line-height: 0; 失败,但我认为会失败,因为我的一些列有块内容。

我还考虑过在&lt;td&gt;s 上显式设置宽度,但这会使表格保持流畅(我必须在调整大小时删除显式宽度,这可能会导致宽度跳跃,除非所有行都是可见的,并包含在浏览器的表格调整大小计算中)。

编辑:澄清一下,从视图中隐藏是指隐藏在display: none; 的意义上,而不是visibility: hidden;。如果元素在隐藏时没有保留其原始高度,则后者会起作用,但不幸的是,情况并非如此。

注意:我知道乍一看这似乎是一个非常适用的问题,但我相信这可能是一个常见的用例。因此,我将问题中最适用的部分(阅读:最重要)加粗。其余部分(对我来说有点特殊)比其他任何东西都更具解释性。

【问题讨论】:

  • 通常在计算之前暂时显示它,然后在完成后再次隐藏它应该可以解决问题,因为隐藏的对象不会获得任何 CSS 值。因此,首先将其显示设置为块(或内联单元格,或其他),然后返回显示没有通常对我有用。如果您的计算速度很快,就没有闪光。
  • 试试max-height。只是猜测。
  • @torazaburo 这是一个有趣的想法。不幸的是,它遇到了与设置表格行的高度相同的问题。我已经尝试使用heightvisibility: hidden;overflow: hidden; 的组合,但无济于事。

标签: html css html-table


【解决方案1】:

如果我理解正确,您正在寻找visibility: collapse; 声明:

17.5.5 Dynamic row and column effects

visibility 属性采用值 collapse 表示行,行 组、列和列组元素。这个值会导致整个 要从显示中删除的行或列,以及正常的空间 由要用于其他内容的行或列占用。 与折叠的相交的跨行和列的内容 列或行被剪裁。行或列的抑制, 但是,不会影响表格的布局。这 允许动态效果删除表格行或列而不强制 重新布局表格以考虑潜在的变化 在列约束中。

但是,这在某些网络浏览器上似乎存在问题。 MDN states

visibility:collapse 的支持缺失或部分不正确 在一些现代浏览器中。在许多情况下,它可能没有得到正确处理 像 visibility:hidden 在表格行和列以外的元素上。

不幸的是,它在 Chrome37 上充当 visibility: hiddenDemo Here

但幸运的是,你可以通过line-height: 0声明来伪造效果:

Updated Demo

.hidden {
  visibility: collapse;
  line-height: 0; /* Set the height of the line box to 0
                     in order to remove the occupied space */
}

【讨论】:

  • +1 这正是我想要的。如果只有 Chrome 支持 IE8 支持的属性值!我想知道是否有 polyfill 或其他解决方法。
  • 解决了!我有几行包含块内容,但折叠它们只是使它们成为height:0; 的问题。这确实崩溃了行!谢谢!
  • 当有边框的时候,即使收起,仍然有可见的内边距,并且边框没有收起。我可以将填充设置为 0 并隐藏折叠行的边框,还可以隐藏上一行或下一行的顶部或底部边框,然后看起来不错。有更简单的解决方案吗?
  • 我必须添加 padding:0 才能完全删除垂直空间(使用引导 css)。
  • 对我来说是border-collapse:collapse;边框:0px;边框间距:0px;设置为 table, td, th, tr, ... grrr。
【解决方案2】:

使用 CSS:

tr {
    visibility: hidden;
}

【讨论】:

  • 感谢您的回复。但是,请参阅我的编辑。隐藏在视线之外,我的意思是完全消失。不幸的是,visibility: hidden; 在表格中留下了空白,这是不可取的。
猜你喜欢
  • 2011-10-18
  • 2013-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-23
  • 1970-01-01
  • 2019-12-05
  • 1970-01-01
相关资源
最近更新 更多