当您尝试将元素绝对定位到tbody
,tr
甚至td
时,您会发现它在大多数浏览器中都不起作用。它可以在Firefox中按预期工作。不在IE,Edge和Chrome中。
position: relative
,tbody
甚至tr
上的 td
被忽略。然后将带有position: relative
的第一个父级用作绝对放置的“锚”。
顺便说一句:将position: relative
设置为tbody
时display: block
确实可以工作。但是,您可能会遇到表格行宽的麻烦。通常,子元素不再精确地充当表元素。列不见了。但这不是这个问题的一部分。
我的问题是:
为什么在position: relative
,tbody
tr
上忽略td
?
请问这种行为有什么原因吗?
是应该修复的错误吗?
.example {
border: 1px solid #ccc;
position: relative;
background: #eee;
margin: 2em;
padding: 2em;
width: 50%;
}
.abs {
display: block;
position: absolute;
left: 100%;
top: 0;
}
table {
//border: 5px solid rgba(255,200,0,0.2);
border-collapse: collapse;
}
tbody {
border: 2px solid red;
position: relative;
}
td {
border: 1px solid lime;
padding: 1em;
}
.text--red {
color: red;
}
.text--gray {
color: gray;
}
<ul>
<li class="text--gray">Gray background is table wrapper with position relative.</li>
<li class="text--red">Redline is tbody with position relative.</li>
</ul>
<div class="example">
<table>
<tbody>
<tr>
<td>tbody1>tr1>td</td>
</tr>
<tr>
<td>tbody1>tr2>td</td>
</tr>
<tr class="abs abs--1">
<td>tbody1>tr3>td absolute position to tbody</td>
</tr>
</tbody>
<tbody>
<tr>
<td>tbody2>tr1>td</td>
</tr>
</tbody>
<tbody>
<tr>
<td>tbody3>tr1>td</td>
</tr>
<tr class="abs abs--2">
<td>tbody3>tr2>td absolute position to tbody</td>
</tr>
</tbody>
</table>
</div>
https://www.w3.org/TR/css-position-3/#valdef-position-relative
https://www.w3.org/TR/css-position-3/#property-index
属性名称:
position
适用于:除table-column-group
和table-column
以外的所有元素
https://developer.mozilla.org/en-US/docs/Web/CSS/position#relative 关于“堆叠环境”,但这不是这个问题的主题
当z-index的值不是auto时,此值(
position: relative
)创建新的堆叠上下文。它对table-*-group
,table-row
,table-column
,table-cell
和table-caption
元素的影响是不确定的。
答案 0 :(得分:2)
MDN所说的从CSS2开始是准确的。多年来,position: relative
对内部表框的影响是不确定的(§9.3.1),实现远非可互操作。
这仅在最近的css-position-3(现在为defines the effects as follows)中发生了变化:
position: relative
对表元素的作用定义如下:
table-row-group,table-header-group,table-footer-group和table-row相对于其在表中的正常位置的偏移量。如果表格单元格跨越多行,则只有源自相对位置行的单元格才会偏移。
table-column-group,table-column不会偏移相应的列,并且在应用
position: relative
时没有视觉影响。表格标题和表格单元相对于表格中其正常位置的偏移量。如果一个表格单元格跨越多列或多行,则整个单元格都将偏移。
但是实现仍然无处不在,其原因是因为CSS表模型的实现仍然混乱,不可预测,无法完全互操作并且充满了历史重物,没人愿意碰10英尺高的杆。您可以通过浏览css-tables-3 spec和the CSSWG's GitHub issues for that spec来了解情况。
已经说过,浏览器供应商正在缓慢而谨慎地解决切线问题,例如像这样的内部表框的位置。只是不要期望快速的进步。
顺便说一句:当您将
position: relative
设置为tbody
时,display: block
确实可以工作。
是的,因为这样做tbody
会像tbody
一样停止工作,而开始像div
那样工作,从而完全破坏了表的CSS结构。