如何指定一个 td
标签跨越所有列(当HTML被渲染时,表格中确切的列数会是不确定/难以确定的)?w3schools 提到可以使用 colspan="0"
,但它没有明确说明哪些浏览器支持该值(我们需要支持IE 6)。
看起来将 colspan
设置为大于您可能拥有的理论列数的值将起作用,但如果您将 table-layout
设置为 fixed
,则不起作用。使用具有大量 colspan
的自动布局是否有任何缺点?是否有更正确的方法来实现这一点?
如何指定一个 td
标签跨越所有列(当HTML被渲染时,表格中确切的列数会是不确定/难以确定的)?w3schools 提到可以使用 colspan="0"
,但它没有明确说明哪些浏览器支持该值(我们需要支持IE 6)。
看起来将 colspan
设置为大于您可能拥有的理论列数的值将起作用,但如果您将 table-layout
设置为 fixed
,则不起作用。使用具有大量 colspan
的自动布局是否有任何缺点?是否有更正确的方法来实现这一点?
tr
元素,通过选择整行、计算其 td
元素及其 colSpan
属性的数量,并将扩展后的行设置为 el.colSpan = newcolspan;
。就像这样...
var headertablerows = document.getElementsByClassName('max-col-span');
[].forEach.call(headertablerows, function (headertablerow) {
var colspan = 0;
[].forEach.call(headertablerow.nextElementSibling.children, function (child) {
colspan += child.colSpan ? parseInt(child.colSpan, 10) : 1;
});
headertablerow.children[0].colSpan = colspan;
});
html {
font-family: Verdana;
}
tr > * {
padding: 1rem;
box-shadow: 0 0 8px gray inset;
}
<table>
<tr class="max-col-span">
<td>1 - max width
</td>
</tr>
<tr>
<td>2 - no colspan
</td>
<td colspan="2">3 - colspan is 2
</td>
</tr>
</table>
如果您正在使用表格 headers
,则可能需要进行调整,但是这应该提供了一种使用 100%纯JavaScript的概念验证方法。
还有其他人觉得为了这个看似小问题而深入研究JS有点过分吗?
嘿!我有一个纯CSS的解决方案可以给你!下面是一个示例,你只需要给要跨越所有列的行添加一个类。然后CSS将使第一个<td>
元素跨越整个宽度,并隐藏其余的<td>
元素。(对于此操作,您必须使用visibility:hidden;
而不是display:none;
)
注意:为了使此方法正常渲染,您至少需要两个单元格,并且如果保持正确数量的<td>
元素,CSS将呈现最佳效果 - 不要删除任何元素以腾出空间来放置跨越元素。这将有助于确保单元格/行仍然正常流动。
/* standard styling css */
table {
border-collapse: collapse;
}
table, tr, td {
border: 1px solid black;
}
td {
padding: 3px;
}
/* make full width class span the whole table */
.full-span {
position:relative;
}
.full-span > * {
visibility: hidden;
border:0;
}
.full-span > *:nth-child(1) {
display: block;
visibility: unset;
position:absolute;
}
<table>
<tbody>
<tr>
<td>A1</td>
<td>A2</td>
<td>A3</td>
<td>A4</td>
</tr>
<tr class="full-span">
<td>B1 long text</td>
<td>B2</td>
<td>B3</td>
<td>B4</td>
</tr>
<tr>
<td>C1</td>
<td>C2</td>
<td>C3</td>
<td>C4</td>
</tr>
<tr>
<td>D1</td>
<td>D2</td>
<td>D3</td>
<td>D4</td>
</tr>
</tbody>
</table>
如果你在PHP/JS中动态生成表格,这个方法可以简化你的代码。假设你正在通过循环遍历一个二维数组来创建表格:对于每一行需要跨越所有列的情况,你需要添加一些逻辑来计算列数,添加colspan属性,添加任何剩余的<td>
元素以填满整个表格的宽度等等。
使用我的方法,你可以遍历所有列并输出它们,然后简单地在父行中包含该类。
td colspan=1000
或者如果你想非常具体化,而且不介意使用jQuery:
$('table td.whichCol').attr('colspan',$('table tr:first td').length)
其中: "td.whichCol" 指定要合并的列的类名
其中: "$('table tr:first td').length" 计算表格第一行的列数。
我只想分享我的经验并回答这个问题。
注意:这仅在您有预定义的table
和一个带有th
的tr
时有效,但是通过动态加载行(例如通过AJAX)。
在这种情况下,您可以计算第一个标题行中有多少个th
,并使用它来跨越整个列。
当您想要在没有找到结果时传达消息时,可能需要这样做。
在jQuery中的类似以下代码中,其中table
是您的输入表:
var trs = $(table).find("tr");
var numberColumns = 999;
if (trs.length === 1) {
//Assume having one row means that there is a header
var headerColumns = $(trs).find("th").length;
if (headerColumns > 0) {
numberColumns = headerColumns;
}
}
colspan
,所以th
的数量并不一定等于列数,因此这个解决方案不能直接套用。 - Mark Amerycolspan="100%"
它也适用于电子邮件Outlook,Gmail等...