当具有定义宽度的子元素位于具有 colspan 的单元格内时,如何修复 Microsoft Edge 显示不正确的表格单元格宽度?

Posted

技术标签:

【中文标题】当具有定义宽度的子元素位于具有 colspan 的单元格内时,如何修复 Microsoft Edge 显示不正确的表格单元格宽度?【英文标题】:How to fix Microsoft Edge displaying incorrect table cell widths when child element with defined width is within a cell with a colspan? 【发布时间】:2016-06-22 10:18:23 【问题描述】:

很难解释,但通过JSFiddle 更容易展示

我有一个table,有 3 个单元格:

  <table class="table">
    <tr>
      <td style="background:blue;width:60%;">Some text for 1st cell</td>
      <td style="width:40%;background:red;"></td>
    </tr>
    <tr>
      <td colspan="2" style="width:100%;background:yellow;"><div style="width:400px;">
      test
      </div></td>
    </tr>
  </table>

tablewidth 为 100%:

.table 
  width:100%;

当具有已定义 width 的子元素放置在具有 colspan 的底部单元格中时,Microsoft Edge 会为顶部单元格显示不正确的 widths。

它们应该是这样显示的:

不幸的是,Microsoft edge 是这样显示的:

删除子元素(或其width),一切都恢复正常了。

我该如何解决这个问题?我需要将table 的宽度保持为百分比,将子元素保持为固定的width

【问题讨论】:

【参考方案1】:

只需添加table-layout:fixed

固定

表格和列的宽度由表格和列的宽度设置 元素或第一行单元格的宽度。细胞在 后续行不影响列宽。

在“固定”布局方式下,整个表格可以渲染一次 第一个表格行已被下载并分析。这可以加速 与“自动”布局方法相比,渲染时间增加,但随后 单元格内容可能不适合提供的列宽。任何细胞 有溢出的内容使用溢出属性来确定 是否裁剪溢出内容。

.wrap 
  width: 500px

.table 
  width: 100%;
  table-layout: fixed

.cell1 
  background: blue;
  width: 60%

.cell2 
  background: red;
  width: 40%

.cell3 
  background: yellow;
  width: 100%

.cell3 div 
  width: 400px
<div class="wrap">
  <table class="table">
    <tr>
      <td class="cell1">Some text for 1st cell</td>
      <td class="cell2"></td>
    </tr>
    <tr>
      <td colspan="2" class="cell3">
        <div>
          test
        </div>
      </td>
    </tr>
  </table>
</div>

【讨论】:

table-layout:fixed 正是我需要的! 这个解决方案不能满足我的要求。我明确不想要fixed 布局,因为我的列的大小都是一样的,我想像auto 那样保持基于内容的相对大小。此行为在除 Edge 之外的所有浏览器中都能完美运行。 @MaxGhost 我也有同样的问题。你有想过解决办法吗? @Dave 是的。显然,需要在列中的每个 td 上设置宽度,而不仅仅是标题。至少这是我的解决办法。 @MaxGhost 我确实做到了,但它似乎不适用于百分比宽度。但是像素值确实有效。

以上是关于当具有定义宽度的子元素位于具有 colspan 的单元格内时,如何修复 Microsoft Edge 显示不正确的表格单元格宽度?的主要内容,如果未能解决你的问题,请参考以下文章

具有绝对父级的 div 的 jQuery 动画宽度

具有动态列的表布局固定和整行 colspan

清除响应表中的 colspan

具有绝对位置的 Flexbox 容器不适合 IE 中的内容宽度

相同宽度的子跨度

三个具有相对宽度的浮动元素上的 css 过渡