如何将表格单元格强制换行?

9

我有一张HTML表格(由MVC WebGrid生成),横向有5列。我想让前4列占据100%的宽度,第5列则在下方也占据100%的宽度。

  <tr>
    <td class="date">13/05/2015 13:40:55</td>
    <td class="firstname">Bob</td>
    <td class="lastname">Reed</td>
    <td class="errors"></td>
    <td class="profile">This is a lot of content that could potentially screw up the table layout if it were to be sat on the same row as the other 4 columns</td>
  </tr>

有相应的CSS,但它与表格布局无关。

我必须承认我很困惑。我尝试过搜索,但似乎只找到了关于在div或list元素上使用display:table / table-row / table-cell CSS属性的问题。

我正在尝试的是否可能仅使用CSS修改当前的HTML来实现,或者更有可能需要完全重写HTML结构(因此可能要放弃WebGrid),以使其按照我想要的方式显示?


我认为这是不可能的,除非使用JS从tr中删除单元格并将其放入下面的另一个tr中。 - evolutionxbox
1
我支持@evolutionxbox的观点。你不能只编辑WebGrid的模板,将表格改为div吗? - timgavin
我其实不知道,我对WebGrids的经验不是很丰富。我一直试图避免这种情况,因为这意味着基本上要重新做整个表格的结构,但我开始觉得那可能是唯一的方法了。 - Dark Hippo
2个回答

13

您可以尝试重置表元素的显示属性并使用Flex模型:

table,
tbody {
  display:inline-block;/* whatever, just  reset table layout display to go further */
}
td {
  border:solid 1px;
}
tr {
  display:flex;
  flex-wrap:wrap; /* allow to wrap on multiple rows */
}
td {
  display:block;
  flex:1 /* to evenly distributs flex elements */
}
.date, .profile {
  width:100%; /* fill entire width,row */
  flex:auto; /* reset the flex properti to allow width take over */
}
<table>
  <tr>
    <td class="date">13/05/2015 13:40:55</td>
    <td class="firstname">Bob</td>
    <td class="lastname">Reed</td>
    <td class="errors"></td>
    <td class="profile">This is a lot of content that could potentially screw up the table layout if it were to be sat on the same row as the other 4 columns</td>
  </tr>
</table>

不确定每个浏览器都能以相同的方式接受这个。

codepen地址:http://codepen.io/anon/pen/WvwpQq

要将td元素堆叠,可使用display:block

td {
  border:1px solid;
  display:block;
  } 
    <table>
      <tr>
        <td class="date">13/05/2015 13:40:55</td>
        <td class="firstname">Bob</td>
        <td class="lastname">Reed</td>
        <td class="errors"></td>
        <td class="profile">This is a lot of content that could potentially screw up the table layout if it were to be sat on the same row as the other 4 columns</td>
      </tr>
    </table>


你知道吗,我读了很多关于通过设置列表的显示属性来模拟表格布局的文章,但从未想过尝试重置表格元素的显示属性。太棒了,我现在会尝试一下。 - Dark Hippo
在Chrome上运行得很好(至少在Chrome上是这样的,现在要让它在其他浏览器上也能正常工作)。感谢您的帮助,非常感激。 - Dark Hippo
2
对于任何感兴趣的人,我已经在几个浏览器中测试了上述两个代码片段:FF 53:正常工作; Chromium 58:正常工作; Android 7上的Chrome(Galaxy S7):正常工作(只能在codepen上测试); Android 4.4上的Chrome(Nexus 5):正常工作(只能在codepen上测试); IOS 10.3上的Safari(iPad Pro模拟器):正常工作; IOS 9上的Safari(iPhone 6):正常工作(只能在codepen上测试); IE 11:大部分正常工作。在第一个示例中,最后一个单元格中的文本不会断成两行,而是会出现滚动条。我相信如果需要的话,可以解决IE11的问题。 - Alice Heaton
1
@AliceHeaton 非常感谢您的反馈。对于IE11,我会尝试使用max-width:100%来设置table/tbody的display:block;。 - G-Cyrillus
太棒了!非常感谢! - Ewout

0

如果您将自己限制在第5个单元格中只有一个子元素(如文本节点或元素,但实际上是 CSS 盒子术语),则可以使用 display: contents 并将其保留为表格(如果将 before 更改为 after,也可以是第4个单元格)。

.profile {
    display: contents;
.profile::before {
    content: "";
    display: table-row;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接