为什么粘性定位的绝对子元素总是隐藏在另一个粘性元素后面?

5

我想要一个固定的首列以及一些CSS工具提示。这是我的设置的简化模型:

div.container
{
  width: 300px;
  overflow: auto;
}

table
{
  border-collapse: collapse;
}

td 
{
  border: 1px black solid;
}


td div 
{
  width: 80px;
  height: 30px;
}

td:first-child
{
  position: sticky;
  left: 0;
  background-color: lime;
}


[data-tooltip]:hover:after
{
  content: attr(data-tooltip);
  position: absolute;
  background: white;
  top: 22px;
}
<!doctype html>
<div class="container">
  <table>
    <tr>
      <td><div data-tooltip="123">hover me</div>
      <td><div></div>
      <td><div></div>
      <td><div></div>
      <td><div></div>
      <td><div></div>
      <td><div></div>
      <td><div></div>
    <tr>
      <td><div></div>
      <td><div></div>
      <td><div></div>
      <td><div></div>
      <td><div></div>
      <td><div></div>
      <td><div></div>
      <td><div></div>
  </table>
</div>

问题在于工具提示隐藏在下一行的单元格后面,我找不到任何解决方案(除了删除position: sticky),但在我的情况下这不是可接受的解决方案。
我该怎么做才能将工具提示置于前面?在这种情况下,z-index似乎没有起作用。
1个回答

8

您需要仅增加第一个粘性元素的z-index。两者具有相同的z-index,因此我们将考虑树顺序来绘制它们,并且两者都创建堆叠上下文,因此调整position:absolute元素的z-index将没有效果:

div.container
{
  width: 300px;
  overflow: auto;
}

table
{
  border-collapse: collapse;
}

td 
{
  border: 1px black solid;
}


td div 
{
  width: 80px;
  height: 30px;
}

td:first-child
{
  position: sticky;
  left: 0;
  background-color: lime;
}
tr:first-child  td:first-child{
  z-index:2;
}

[data-tooltip]:hover:after
{
  content: attr(data-tooltip);
  position: absolute;
  background: white;
  top: 22px;
}
<div class="container">
  <table>
    <tr>
      <td><div data-tooltip="123">hover me</div>
      <td><div></div>
      <td><div></div>
      <td><div></div>
      <td><div></div>
      <td><div></div>
      <td><div></div>
      <td><div></div>
      </tr>
    <tr>
      <td><div></div>
      <td><div></div>
      <td><div></div>
      <td><div></div>
      <td><div></div>
      <td><div></div>
      <td><div></div>
      <td><div></div>
      </tr>
  </table>
</div>

有关绘画顺序的更多详细信息: https://www.w3.org/TR/CSS2/zindex.html


(注:该链接为英文页面)

1
这仅适用于第一行中的第一列。如果表格有更多行,则必须为每个后续行创建z-index层次结构。这必须有某种解决方案,或者这是一个“position:sticky”错误吗? - wlh
@wlh 这不是一个bug,这是逻辑上的绘制顺序... 我们会在后面绘制元素,因为它们具有相同的z-index。这不仅会发生在sticky中,在情况下如果有很多行,我们可能需要考虑一种全新的方式来解决这个问题。 - Temani Afif
假设你有二十行数据(更不用说动态创建的行了),第一行第一列的z-index需要是20,第二行19,第三行18等等。每一行可能会有工具提示,因此每一行的z-index都需要比前一行低1。 - wlh
为什么没有使用sticky时,情况不同?我的意思是删除“position:sticky”,添加“[data-tooltip] {position:relative;}”,这样绝对提示框就有了正确的父级,而且提示框在任何单元格的顶部。为什么绘画顺序不会干扰它呢? - Džuris
@Džuris 因为 position:relative 不像 sticky 一样创建堆叠上下文(就像我在我的答案中所说的),使用 position:relative + z-index:0,您将获得相同的行为...当您有一个堆叠上下文时,元素应该放置在此上下文中。 - Temani Afif
显示剩余6条评论

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