【问题标题】:Inconsistent behavior of display: table and display: table-cell in different browsersdisplay: table 和 display: table-cell 在不同浏览器中的不一致行为
【发布时间】:2016-05-21 13:07:00
【问题描述】:

单独使用时,display: tabledisplay: table-cell 在不同浏览器中的行为不同。


环境

我在三种不同的环境中进行了测试:

环境 1:

  • 操作系统:Linux Ubuntu 桌面 14、64 位
  • 浏览器 1:Chrome 45.0
  • 浏览器 2:Firefox 43.0

环境 2:

  • 操作系统:Windows 7,64 位
  • 浏览器 1:Chrome 48.0
  • 浏览器 2:Firefox 44.0

环境 3:

  • 操作系统:Windows 10,64 位
  • 浏览器 1:Chrome 51.0
  • 浏览器 2:Firefox 47.0

案例 1 - display: table & box-sizing: content-box

.container {
    display: table;
    width : 500px;
    height: 150px;
    background: #ccf;
}
    
.content {
    color: #000;
    height : 100%;
    padding: 20px;
    background: #ffc;
}
<div class="container">
    <div class="content">
        Lorem Ipsum
    </div>
</div>

在 FireFox 中,我得到以下输出:

在 Chrome 中,我得到以下输出:

另见this Fiddle


案例 2 - display: table & box-sizing: border-box

.container {
    display: table;
    width : 500px;
    height: 150px;
    background: #ccf;
}
    
.content {
    color: #000;
    height : 100%;
    padding: 20px;
    -ms-box-sizing: border-box;
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
    background: #ffc;
}
<div class="container">
    <div class="content">
        Lorem Ipsum
    </div>
</div>

在 FireFox 中,我得到以下输出:

在 Chrome 中,我得到以下输出:

另见this Fiddle


案例 3 - display: table-cell & box-sizing: content-box

.container {
    display: table-cell;
    width : 500px;
    height: 150px;
    background: #ccf;
}
    
.content {
    color: #000;
    height : 100%;
    padding: 20px;
    background: #ffc;
}
<div class="container">
    <div class="content">
        Lorem Ipsum
    </div>
</div>

在 FireFox 中,我得到以下输出:

在 Chrome 中,我得到以下输出:

另见this Fiddle


案例 4 - display: table-cell & box-sizing: border-box

.container {
    display: table-cell;
    width : 500px;
    height: 150px;
    background: #ccf;
}
    
.content {
    color: #000;
    height : 100%;
    padding: 20px;
    -ms-box-sizing: border-box;
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
    background: #ffc;
}
<div class="container">
    <div class="content">
        Lorem Ipsum
    </div>
</div>

在 FireFox 中,我得到以下输出:

在 Chrome 中,我得到以下输出:

另见this Fiddle


我的问题:

  • 规范是否定义了display : tabledisplay : table-rowdisplay : table-cell 在相互独立使用时的行为方式?如果是,哪些是预期的行为?
  • 这些浏览器差异是由 Firefox 的 Chrome 中的错误引起的吗?如果这些浏览器差异是由错误引起的,那么任一浏览器的开发团队是否正在尝试修复此问题?
  • 虽然这些浏览器差异仍然存在,但我应该考虑哪些策略来规范跨浏览器的行为?

【问题讨论】:

  • 两个测试都无效,导致表格单元格元素正常工作需要表格父级,以及表格单元格元素的表格或表格行。 在两个测试用例中,您都使用了所需的一半结构和规则。请注意,单个单元格将是 CSS 或普通 html 表格的表格行或表格的 100% 高度。所有兄弟都试图找出在屏幕上绘制这些的最佳方法 ... . 不知道你能在这里得到答案:)
  • @GCyrillus : 如果您能详细说明 两个测试都无效两个测试用例我都使用了一半的陈述,我将非常感激所需的结构和规则。您能否提供表明我的“测试无效”的“所需结构和规则”的来源参考?如果是,那可能就是我正在寻找的答案...
  • 您有没有想过单独使用 td 或使用 div 作为表的第一个子项? table 是 display:table,tr 是 table-row,tfoot 是 table-footer-group 等等,你为什么不选择另一个来看看它自己的行为如何? :) 。我信任的唯一来源是 W3C,您可以在其中找到这些显示选项所涉及的内容 :) 我的意见是您的测试无效,因为 html/css 基础不完整,如果失败,在我看来并不奇怪,或者至少不能作为参考;)
  • @GCyrillus :在过去的几年里,我一直将display : tabledisplay : table-cell 视为其他人代码中的独立语句。我想他们真的是一种黑客行为,但这是我第一次看到有人认为这是对 CSS 的不当使用。这就是你的意思,对吧?
  • firefox 1 是我使用的第一个能够处理 display:table 的浏览器(除了那个痛苦的 IE6),当你将容器设置为 display:table,direct-child 时转向display:table-cell 默认情况下,不再是这种情况了,因为 display:table 本身是一种处理浮动元素的简单方法。但它最初并不是要单独使用,我没有说它不合适,但它涉及一种行为,如果你有意想不到的结果,我对此并不感到惊讶。 display:flex 对于今天的这种使用来说更加可靠:)

标签: html css google-chrome firefox cross-browser


【解决方案1】:

来自Everything You Know About CSS Is Wrong

CSS 表格很乐意遵守表格布局的常规规则,即 启用 CSS 表格布局的一个极其强大的功能:缺少 表格元素由浏览器匿名创建。 CSS2.1 规范状态:

HTML 以外的文档语言可能不包含所有元素 在 CSS 2.1 表模型中。在这些情况下,“缺失”的元素 必须假设才能使表模型工作。任何桌子 element 会自动生成必要的匿名表对象 围绕自身,由至少三个嵌套对象组成 对应于“table”/“inline-table”元素,“table-row” 元素和一个“表格单元”元素。

这意味着如果我们使用 display: table-cell; 而没有先 包含设置为display: table-row; 的块中的单元格,该行 将被暗示——浏览器将表现得好像声明的行是 确实在那里。

因此,规范明确允许使用 display: table-cell;display: table; 并定义元素在这种情况下的行为方式。

我仍然不清楚每种情况下的预期行为是什么,但似乎我们正在处理错误,that at least Chrome is working on fixing them

我给了Oriol 这个答案的赏金,因为这是迄今为止我得到的唯一答案,它实际上解决了我提出的观点并提供了一些有价值的信息。

【讨论】:

    【解决方案2】:

    在第一个 sn-p 中,由于 .content 具有百分比高度,但其父级(匿名表格单元格)具有 height: auto,因此百分比应计算为 auto。见spec

    如果未明确指定包含块的高度 (即,它取决于内容高度),并且该元素不是 绝对定位,该值计算为“自动”。

    自版本 50.0.2629.0 (commit) 起,Chromium 已修复此问题 (bug 353580)。

    第二个 sn-p 更棘手,因为height of the table cell 将是height CSS 属性给定的长度和内容所需的高度之间的最大值。但如果该内容使用百分比,那就是循环定义。

    因此,这似乎是一个依赖于实现的案例。您可以通过使内容外流来避免循环定义:

    .container {
      position: relative;
    }
    .content {
      position: absolute;
      top: 0; right: 0; bottom: 0; left: 0;
    }
    

    .container {
      display: table-cell;
      width : 500px;
      height: 150px;
      background: #ccf;
      position: relative;
    }
    .content {
      color: #000;
      padding: 20px;
      -ms-box-sizing: border-box;
      -webkit-box-sizing: border-box;
      -moz-box-sizing: border-box;
      box-sizing: border-box;
      background: #ffc;
      position: absolute;
      top: 0;
      right: 0;
      bottom: 0;
      left: 0;
    }
    <div class="container">
      <div class="content">
        Center this!
      </div>
    </div>

    【讨论】:

    • 所以您是说display : table-cell 的不同行为不是由错误引起的,而是由于缺乏适当的标准/规范?还有其他我需要记住的 CSS 不一致(由于缺乏适当的标准/规范造成的)吗?
    • @JohnSlegers 是的,似乎是这样。 CSS2.1 没有定义(或松散地定义)很多东西。预计稍后会在 CSS3 中澄清它们,但 AFAIK 尚未在 CSS 表格中完成任何工作。
    • Chomium 50 是 alpha 或 beta 版本,我猜?无论如何,我刚刚在最新的稳定版本 (Chrome 48) 上对其进行了测试,并且得到了与 Chrome 43 相同的结果。
    • @JohnSlegers,在回答您第一条评论中的第二个问题时,我今天刚刚写了这篇文章:stackoverflow.com/q/35532987/3597276
    • 您的编辑是一项宝贵的贡献。再加上你让我的评论变得简单快捷:-)
    猜你喜欢
    • 2014-02-28
    • 1970-01-01
    • 2015-06-16
    • 2016-09-22
    • 2013-07-18
    • 1970-01-01
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多