【问题标题】:CSS: display:block; vs display:table;CSS:显示:块;与显示:表格;
【发布时间】:2014-09-22 18:26:51
【问题描述】:

display:block;display:table; 有区别吗?在我看来,包含 table-rowtable-cell 节点的 dom 节点的显示类型并不重要。 MDN says that display:table; makes it behave like a table,但没有详细说明这种行为是什么。这是什么行为?

同样,display:inline-block;display:inline-table; 有区别吗?

【问题讨论】:

    标签: html css html-table


    【解决方案1】:

    比较两者(块和表),我不知道您会在真空中看到任何核心差异(可能存在细微差异)。我相信主要的区别是针对儿童的。表格及其子项与 div 及其子项的属性/关系非常不同。

    关于 inline-block 和 inline-table 参见:What is the difference between inline-block and inline-table?

    这篇文章 (http://css-tricks.com/almanac/properties/d/display/) 有一些有趣的信息,特别是有关与表格相关的所有不同显示属性的信息。

    【讨论】:

    • 其他答案之一使“表现得像一张桌子”的含义更加清晰。我看到的几个主要区别是,带有一些子元素和一些子元素不是表格行的元素的工作方式不同,具体取决于它的 display:table 还是 display:block。谢谢!
    • -1 用于忽略 display: block 占用 100% 可用宽度的事实,而 display: table 仅与其内容所需的宽度一样宽。这不是一个小区别:在许多情况下,它会完全改变页面的布局。
    【解决方案2】:

    在父元素上使用display: table 而不是display: block 的一个主要好处是您可以安全地在子元素上使用display: inline-block,而不必担心子元素之间的空白。

    否则,您必须通过在结束/开始标签之间使用 html cmets(例如,在典型的水平导航中使用多个 <li> 元素)来消除多余的空白,或者将所有内容嵌入您的代码没有运营商退货(这是一个编辑噩梦)。

    【讨论】:

    • 这听起来更像是一种黑客行为/副作用,而不是预期的用例。
    【解决方案3】:

    我今天正在研究这个,我发现 CSS 规范的这一部分很有帮助:http://www.w3.org/TR/CSS21/tables.html#model

    值得注意的是,

    表生成一个称为表包装盒的主体块盒 包含表格框本身和任何标题框(在文档中 命令)。表框是一个块级框,包含表的 内部表格框。

    据我了解,这实质上意味着浏览器会为带有 display: table! 的任何内容生成一个不可见的容器块!

    【讨论】:

    • 说得好!当 table 用作“flex”子时,它会产生明显的影响:在这种情况下,它的主要块框将是显式的!
    【解决方案4】:

    另外:在一个带有复杂 CSS 的 wordpress 主题中,在一个特殊的类区域上存在冲突的效果,由于 CSS 冲突,我无法使该区域居中。最终,使该部分居中的唯一方法是将其从 display: inline-block 切换到 display:table,然后最后它接受了居中规则,无论是 text-align 还是 margin:0 auto。

    我并没有声称我的案例具有统计学意义,只是提供个人经验反馈,以防其他处于类似困境的人在网络搜索后偶然发现此页面:)

    【讨论】:

      【解决方案5】:

      两者都是块级的,默认情况下它们不会显示在其他任何东西旁边。

      元素的实际显示存在显着差异。 display: block; 将扩展到 100% 的可用空间,而 display: table; 将仅与其内容一样宽。

      另外,正如其他人所提到的,display: table; 需要让 display: table-cell; 或其他 table- 东西在后代中工作。

      我只知道这一点,因为我刚刚遇到了试图让display: table; 填充容器宽度的问题。一直没能看出display: inline;display: inline-table;的显示是否有区别。

      https://jsfiddle.net/nnbonhc6/

      【讨论】:

      • 正如下面其他人所指出的,另一个区别是overflow: auto/overflow: scroll 不适用于表。不过,我希望有滚动条而不将 table 包装在 div 中(因为我的表格来自 Markdown)。设置table { display: block; overflow-x: auto; } 解决了滚动问题,但由于您所描述的原因,我无法使用margin: 0 auto; 将不跨越整个宽度的表格水平居中。经过一番搜索,我发现display: block 表上的max-width: [-webkit-|-moz-]fit-content 可以解决问题。
      【解决方案6】:

      最近我找到了另一个例子来说明display: blockdisplay: table之间的区别

      我从 litmus 获取电子邮件模板:

      <table class="row footer">
        <tbody>
          <tr>
            <td class="wrapper">
      
              <table class="six columns">
                <tbody><tr>
                  <td class="left-text-pad">
      
                    <h5>Connect With Us:</h5>
      
                    <table class="tiny-button facebook">
                      <tbody><tr>
                        <td>
                          <a href="#">Facebook</a>
                        </td>
                      </tr>
                    </tbody></table>
      
                    <br>
      
                    <table class="tiny-button twitter">
                      <tbody><tr>
                        <td>
                          <a href="#">Twitter</a>
                        </td>
                      </tr>
                    </tbody></table>
      
                    <br>
      
                    <table class="tiny-button google-plus">
                      <tbody><tr>
                        <td>
                          <a href="#">Google +</a>
                        </td>
                      </tr>
                    </tbody></table>
      
                  </td>
                  <td class="expander"></td>
                </tr>
              </tbody></table>
      
            </td>
            <td class="wrapper last">
      
              <table class="six columns">
                <tbody><tr>
                  <td class="last right-text-pad">
                    <h5>Contact Info:</h5>
                    <p>Phone: 408.341.0600</p>
                    <p>Email: <a href="mailto:hseldon@trantor.com">hseldon@trantor.com</a></p>
                  </td>
                  <td class="expander"></td>
                </tr>
              </tbody></table>
      
            </td>
          </tr>
        </tbody>
      </table>
      

      在页脚表上有display: block !important;,看起来:

      在页脚表上有display: table !important;,看起来:

      快照是使用 iOS 10.0.1 上的邮件应用程序拍摄的。

      【讨论】:

      • 条款、隐私和退订链接的唯一区别是居中吗?我认为如果您修剪掉代码中不相关的部分并裁剪图像,而不是期望人们阅读和解析整个庞然大物,我认为这个答案会更有帮助。
      【解决方案7】:

      似乎存在的一个区别是display:table 清除了行(就像display:block 一样)但不会扩展以填充行(显示块将占用最大宽度,内联不会)

      因此,您可以获得一个可根据您的内容调整大小的框,但会单独留在其“行”中

      【讨论】:

        【解决方案8】:

        基本上,display:inline-block 允许元素在没有任何媒体查询的情况下相互堆叠。如果将元素设置为 display:table-cell,则不使用媒体查询就无法更改其布局。

        【讨论】:

          【解决方案9】:

          我发现display:blockdisplay:table 之间的另一个区别在于,如果内容超过视口,display:block 显示滚动条,display:table 不会

          【讨论】:

          • 你有没有办法让滚动条和显示表格的全宽?
          • “展示台的全宽”是什么意思,@HahnSolo?你会得到一个表格,用width: 100% 覆盖整个宽度。相反,如果您希望块仅与其子块一样宽(以便将其与margin: auto 水平居中),类似于表格的行为,您可以在块上使用max-width: fit-content。 (供应商前缀似乎是必需的,max-width: -webkit-fit-contentmax-width: -moz-fit-content 也是如此,参见 caniuse.com。)
          猜你喜欢
          • 2017-02-15
          • 2020-09-21
          • 2012-08-02
          • 2011-11-02
          • 2012-01-12
          • 1970-01-01
          • 2014-01-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多