CSS表格单元格等宽


147

我在表容器中有不确定数量的表单元元素。

<div style="display:table;">
  <div style="display:table-cell;"></div>
  <div style="display:table-cell;"></div>
</div>

有没有一种纯粹的CSS方法可以使表格单元格具有相等的宽度,即使表格单元格中的内容大小不同也是如此?

谢谢。

编辑:具有最大宽度将需要知道我有多少个单元格?


如何确定列数:客户端还是服务器端?
12

在尝试了一些方法之后,我想如果您想拥有多行并希望它们具有相同的宽度,请使用flexbox而不是表格
Eric

Answers:


298

这是工作单元数不确定的工作提琴:http : //jsfiddle.net/r9yrM/1/

您可以为每个父对象固定一个宽度div表格),否则它将像往常一样是100%。

诀窍是使用table-layout: fixed;每个单元格上的一定宽度触发它,此处为2%。这将触发另一个表算法,浏览器在此努力尝试遵循指示的尺寸。
请使用Chrome(如果需要,还可以使用IE8)进行测试。可以使用最新的Safari,但我不记得此技巧与它们的兼容性。

CSS(相关说明):

div {
    display: table;
    width: 250px;
    table-layout: fixed;
}

div > div {
    display: table-cell;
    width: 2%; /* or 100% according to OP comment. See edit about Safari 6 below */
}

编辑(2013):当心OS X上的Safari 6,它有table-layout: fixed; 错误(或者可能与其他浏览器不同,或者非常不同。我没有校对CSS2.1 REC表布局;))。为不同的结果做好准备。


1
谢谢,这似乎是答案。我不知道为什么,但是如果我将宽度设置为2%,它实际上会将每一列缩小为2%。但是100%似乎效果很好。知道那里发生了什么吗?
哈利

3
我遇到了同样的问题,需要在表格单元格上使用100%的宽度。之所以发生这种情况,是因为对带有display:table的父元素应用了clearfix。由于100%宽度的单元格在IE8中不起作用,因此对我来说,解决方法是删除clearfix。希望这对某人有帮助。
Alex Barrett

为了对此进行扩展,这适用于简单的布局(1x1、2x2、3x3等),但是复杂的布局(1x3x1、1x2x3x4等)需要使用其他divs,display:table就像它们是行一样,而不是display:tabl-row某些预期的。这里的例子
filoxo 2014年

2
100%的宽度在IE8(惊奇)上不起作用,但是最初建议使用2%的宽度可以提供正确的结果。

1
100%的宽度在IE10中也不起作用。它确实在IE11中工作。1%的宽度使Mobile Safari显示了超窄的列。因此,我最终使用了针对IE9和IE10 .my-cell { width: 100%; }; @media screen and (min-width:0\0) { .my-cell { width: 1%; } }的CSS hack :CSS hack来自此处:stackoverflow.com/a/24321386/6962
Henrik N

29

的HTML

<div class="table">
    <div class="table_cell">Cell-1</div>
    <div class="table_cell">Cell-2 Cell-2 Cell-2 Cell-2Cell-2 Cell-2</div>
    <div class="table_cell">Cell-3Cell-3 Cell-3Cell-3 Cell-3Cell-3</div>
    <div class="table_cell">Cell-4Cell-4Cell-4 Cell-4Cell-4Cell-4 Cell-4Cell-4Cell-4Cell-4</div>
</div>

的CSS

.table{
    display:table;
    width:100%;
    table-layout:fixed;
}
.table_cell{
    display:table-cell;
    width:100px;
    border:solid black 1px;
}

演示


小提琴在这里不起作用。单元格始终为25%。
2014年

对于任何动态情况(例如由客户端控制的站点导航),此解决方案都无法很好地扩展。
埃里克·K

也许您是正确的,顺便说一句,它已经近两年了,它是anser @QuantumDynamix。有什么更好的想法吗?为什么不只是分享您的想法,让世界知道更好的事情:-)
Alpha

15

只是max-width: 0display: table-cell对我有用的元素中使用:

.table {
  display: table;
  width: 100%;
}

.table-cell {
  display: table-cell;
  max-width: 0px;
  border: 1px solid gray;
}
<div class="table">
  <div class="table-cell">short</div>
  <div class="table-cell">loooooong</div>
  <div class="table-cell">Veeeeeeery loooooong</div>
</div>


1
只是在这里挑剔,但0px不是有效单位。应该是0
加文

这对我有用,但是您能解释一下它如何工作吗?
Emmanual

6

更换

  <div style="display:table;">
    <div style="display:table-cell;"></div>
    <div style="display:table-cell;"></div>
  </div>

  <table>
    <tr><td>content cell1</td></tr>
    <tr><td>content cell1</td></tr>
  </table>

查看围绕使div像表一样执行的所有问题。他们必须添加table-xxx来模仿表格布局

支持表并在所有浏览器中都很好地工作。为什么要抛弃他们?他们必须模仿他们的事实证明他们做得很好。

在我看来,使用最好的工具来完成这项工作,如果您希望使用表格数据或类似于表格数据表的东西就可以使用。

我知道很晚的回复,但值得发言。


2
+1是因为它可以工作并且CSS 仍然有效,因此在2014年无法在所有浏览器中正确执行此操作。
uck

6
有时,您需要非表格数据的表格式布局。这应该使用例如导航元素<nav><ul>等等

1
对于响应式,理想的是具有基于div的布局。在移动设备中显示表格是一件麻烦事。
Pablo Rincon

试图模拟表会妨碍响应式设计。我同意如果您要进行响应式设计,那么表不是您的选择。
DeveloperChris

2
创建表的目的是显示表格数据:过去是,现在将是用来显示表格数据的HTML元素,为什么有人会抛弃它们(为此)?表格的布局没有被模仿:一段时间以来它已经成为CSS2推荐的一部分,并且碰巧HTML表格的默认布局是display: table-etc(很自然)。我不会花很多时间在链接上模仿div或div模仿表,范围或输入:我只是使用CSS进行样式设计。最后,祝您好运IE9可以将display属性的任何其他值应用于表,tr,td元素。
FelipeAls 2015年

1

这将为每个人工作

<table border="your val" cellspacing="your val" cellpadding="your val" role="grid" style="width=100%; table-layout=fixed">
<!-- set the table td element roll attr to gridcell -->
<tr>
<td roll="gridcell"></td>
</tr>
</table>

这也适用于通过迭代创建的表数据


0

干得好:

http://jsfiddle.net/damsarabi/gwAdA/

您不能使用width:100px,因为显示是表格单元格。但是,您可以使用最大宽度:100像素。那么您的框将永远不会大于100px。但是您需要添加overflow:hidden,以确保该接触不流到其他单元格。您还可以添加空格:nowrap如果希望不增加高度。


0

可以通过将表格单元格样式设置为width: auto,并将内容设置为空来完成此操作。现在,这些列的宽度相等,但是没有内容。

要将内容插入单元格,请添加div带有CSS的:

position: absolute;
left: 0;
top: 0;
right: 0;
bottom: 0;

您还需要添加 position: relative到单元格。

现在,您可以将实际内容放入上述div中。

https://jsfiddle.net/vensdvvb/

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.