z-index 不能与伪元素一起正常工作

z-index not working properly with pseudo-element

我试图在 anchor/button 周围制作边框,但不知何故 z-index 在以下代码中不起作用,即使我为它们中的任何一个分配了位置。 它在一定程度上与负 z-index 一起工作(但其他伪 类 如 :hover 等将不起作用 --> 请参阅我的最后一个问题),但有人可以解释为什么 ::在伪元素一直显示在按钮上方而不是下方之前?

这是我的代码:

.start-coding {
  display: block;
  font-size: 1.3rem;
  color: white;
  background-color: black;
  padding: 0.4rem 1.8rem;
  position: relative;
  z-index: 5;
  border-radius: 5px;
  width: 100%;
}

.start-coding::before {
  content: '';
  background: linear-gradient(115deg, #4fcf70, #fad648, #a767e5, #12bcfe, #44ce7b);
  border-radius: 5px;
  position: absolute;
  top: -3px;
  left: -3px;
  right: -3px;
  bottom: -3px;
  z-index: 1;
}
<a href="#" class="start-coding">Start Coding</a>

这是因为您已将伪元素绝对定位在 <a> 元素中,这导致它堆叠在具有静态定位的文本节点之上。

要解决此问题,只需将内部文本用 <span> 包裹起来,然后添加此规则:

.start-coding > span {
  position: relative;
  z-index: 2;
}

更好:您甚至不需要向 ::before 和嵌套的 <span> 添加 z 索引,因为它们的顺序确保当它们被放置在堆栈上下文,<span> 将始终位于顶部(因为它位于 DOM 树中的 ::before 元素之后)。参见示例:

.start-coding {
  display: block;
  font-size: 1.3rem;
  color: white;
  background-color: black;
  padding: 0.4rem 1.8rem;
  position: relative;
  z-index: 5;
  border-radius: 5px;
  width: 100%;
}

.start-coding::before {
  content: '';
  background: linear-gradient(115deg, #4fcf70, #fad648, #a767e5, #12bcfe, #44ce7b);
  border-radius: 5px;
  position: absolute;
  top: -3px;
  left: -3px;
  right: -3px;
  bottom: -3px;
}

.start-coding>span {
  position: relative;
}
<a href="#" class="start-coding"><span>Start Coding</span></a>