任何方式来同步表格列宽度与HTML + CSS?

我有一些表的列相同,如果他们共享相同的列宽,它会看起来好多了。 这样的事情可能吗? 把它们放在同一个表格中,一些没有边界的行是不可行的。

编辑:是的,我知道我可以自己修复宽度,但我希望能够配合浏览器的列宽度algorithm,但只是将两个或更多的表格绑在一起做这种布局的目的。

我不认为这样的事情是可能的,但我想我会检查以防万一。

只有固定宽度的列才可能。 如果你可以设置一个固定的宽度然后像这样的CSS应该工作:

td { width: 25%; } 

你可以像这样自定义每一列的宽度:

 <table> <tr> <td class="col1">...</td> <td class="col2">...</td> </tr> </table> ... <table> <tr> <td class="col1">...</td> <td class="col2">...</td> </tr> </table> 

然后指定宽度像这样:

 .col1 { width: 25%; } .col2 { width: 75%; } 

如果您对浏览器显示的列宽不太感兴趣,只要它们在不同的表格中相同,就可以将CSS table-layout属性(由所有主stream浏览器支持)与表格结合使用宽度:

 table { table-layout: fixed; width: 100%; } 

这将导致所有列(没有指定宽度)具有相同的宽度,无论表内容如何。

下面是一个小的JavaScript,用来调整单元格的大小,使它们在页面上的所有表格中具有相同的宽度。

 function resizeTables() { var tableArr = document.getElementsByTagName('table'); var cellWidths = new Array(); // get widest for(i = 0; i < tableArr.length; i++) { for(j = 0; j < tableArr[i].rows[0].cells.length; j++) { var cell = tableArr[i].rows[0].cells[j]; if(!cellWidths[j] || cellWidths[j] < cell.clientWidth) cellWidths[j] = cell.clientWidth; } } // set all columns to the widest width found for(i = 0; i < tableArr.length; i++) { for(j = 0; j < tableArr[i].rows[0].cells.length; j++) { tableArr[i].rows[0].cells[j].style.width = cellWidths[j]+'px'; } } } window.onload = resizeTables; 

要扩大Ken的答案,您还可以指定像素的确切宽度:

 td { width: 250px } 

或ems(字母m的宽度):

 td { width: 32em } 

或者ex或者pt或者其他什么(好吧…实际上是%,pt,px,em,ex可能就是这样)。 如果你需要你的列是不同的宽度,那么简单的方法是给表格单元格类:

 <table><tr> <td class="col1">...</td><td class="col2">...</td>... </tr></table> 

并将列宽分配给类:

 td.col1 { width: 48em } td.col2 { width: 200px } ... 

将列宽分配给每个表中的第一行就足够了。 [编辑:看起来就像我在写作的时候一直在挖掘]

你也可能会疯狂的CSS 2兄弟select器,并写了类似的东西

 tr > td:first-child { width:48em } /* first column */ tr > td:first-child + td { width: 200px } /* second column */ tr > td:first-child + td + td { width: 5% } /* third column */ ... 

但是如果你有几列,那可能会变丑。 如果您使用某种模板系统或脚本来生成这些表格,我相信只要在模板中的每个单元格上放置class =“col#”属性就会更容易/更清晰。

我感到震惊,没有人build议列组 ! 有了它,你可以给一个特定的类,宽度和其他有用的属性列。 而且由于它是HTML 4.01,所有支持doctype的浏览器都支持它。

Luis Siquot的答案就是我用过的。 然而,而不是使用clientWidth,你应该使用jquery的宽度()函数来标准化浏览器之间的宽度,并不计算填充。 使用clientWidth将导致表格单元格由于填充(如果填充用于TD中)而在ajaxpostbacks上展开。 所以,使用Luis Siquot的答案的正确的代码将被取代

 var cell = $(this)[0].rows[0].cells[j]; if(!cellWidths[j] || cellWidths[j] < cell.clientWidth) cellWidths[j] = cell.clientWidth; 

 var cell = $($(this)[0].rows[0].cells[j]); if (!cellWidths[j] || cellWidths[j] < cell.width()) cellWidths[j] = cell.width(); 

最简单的方法是一种“肮脏”的方式,但它是最好的。 它确实需要:

把你的两个表合并成一个表。 在我的情况下,两张桌子之间唯一的一个是h3

所以我的桌子

 <table> <tr></tr> <table> <h3>Title<h3> <table> <tr></tr> <table> 

成为这样:

 <table> <tr></tr> <tr><td colspan="6"> <h3>Title<h3> </td></tr> <tr></tr> <table> 

这样你的表将“同步”它的大小。 当然这只有在两张桌子之间没有太多复杂的东西的时候才有用,但是我猜在大多数情况下并不是这样。 如果是这样,首先就不需要同步。

每一对表的大小调整到相同的宽度
类似于Ole J. Helgesen,但使用jquery和一个参数来select哪些表均衡。
(我不能投票,但它本质上是你的解决scheme)

 <table data-ss="1" border="1"> <tr><td>asdf<td>129292<td>text </table> <table data-ss="1" border=1> <tr><td>a<td>1<td>each column here has the same size than the table above </table> <table data-ss="2" border=1> <tr><td>asdf<td>129292<td>text </table> <table data-ss="2" border=1> <tr><td>each column here has the same size than the table above<td>a<td>1 </table> 

并使用这个sctipt

 $(function(){ resizeTables('1'); resizeTables('2'); }); //please set table html attribute `data-ss="something"` to properly call this js // ss is short for SharedSize function resizeTables(sharedSize){ var tableArr = $('table[data-ss='+sharedSize+']'); var cellWidths = new Array(); $(tableArr).each(function() { for(j = 0; j < $(this)[0].rows[0].cells.length; j++){ var cell = $(this)[0].rows[0].cells[j]; if(!cellWidths[j] || cellWidths[j] < cell.clientWidth) cellWidths[j] = cell.clientWidth; } }); $(tableArr).each(function() { for(j = 0; j < $(this)[0].rows[0].cells.length; j++){ $(this)[0].rows[0].cells[j].style.width = cellWidths[j]+'px'; } }); }