动画后收到 pointer-events 的 link 在 Safari 中不可点击

A link that receives pointer-events after animating isn't clickable in Safari

我正在使用 CSS 动画文本,其中元素一个接一个地出现。先试试看我的意思:

.wrapper {
  pointer-events: none; /* remove pointer events from elements before they animate */
}

.text {
  position: absolute;
}

/* The first element starts off visible and fades out after 2s */
.first {
  opacity: 1;
  animation: fade 500ms reverse forwards 2000ms;
}

/* The second element starts off hidden and fades in after 3s */
.second {
  opacity: 0;
  animation: fade 500ms forwards 3000ms;
}

@keyframes fade {
  from {
    opacity: 0;
  }
  to {
    opacity: 1;
    pointer-events: all; /* add pointer events to elements after they finish animating */
  }
}
<div class="wrapper">
  <h1 class="text first">Wait 2 seconds...</h1>
  <h1 class="text second">Now <a href="https://example.com">click</a></h1>
<div>

正如您在代码片段中看到的,第二个元素有一个 link。默认情况下,它在整个动画过程中都是可点击的,即使它的不透明度仍然是 0.

我希望 link 只有在出现时才可点击,所以我在 parent 元素上设置 pointer-events: none;,在 [=61 上设置 pointer-events: all; =] 在他们完成动画后(在 @keyframes)。

这在 Chrome 和 Firefox 中效果很好,但在 Safari 中效果不佳:link 在动画结束时无法点击。 parent 的 pointer-event: none; 规则不会被更具体的 pointer-events: all; 规则覆盖,该规则应在动画结束时应用于元素本身。

(您可以重现该问题或在 this CodeSandbox 中进行分叉)

这是我的问题:

提前致谢!

编辑

我通过使用 visibility: hidden; 而不是禁用 pointer-events 找到了适用于 Safari 的 ,已在下方发布。

我注意到的另一件事是,当我使用 Playwright(一种可以启动无头 webkit 浏览器的测试自动化工具)测试我的代码时,我无法重现 pointer-events 错误,所以我想知道这是否只是 Safari 的问题,而不是 webkit 本身的问题。我仍然想知道这是否是已知行为!

这是我寻求的解决方案,它也适用于 Safari:

.text {
  position: absolute;
}

/* The first element starts off visible and fades out after 2s */
.first {
  opacity: 1;
  visibility: visible;
  animation: fade 500ms reverse forwards 2000ms;
}

/* The second element starts off hidden and fades in after 3s */
.second {
  opacity: 0;
  visibility: hidden;
  animation: fade 500ms forwards 3000ms;
}

@keyframes fade {
  from {
    opacity: 0; /* We still need opacity to animate on */
    visibility: hidden;
  }
  to {
    opacity: 1;
    visibility: visible;
  }
}
<div>
  <h1 class="text first">Wait 2 seconds...</h1>
  <h1 class="text second">Now <a href="https://example.com">click</a></h1>
<div>

我们可以使用 visibility: hidden; 来确保 link 在应该可以点击之前不可点击,而不是禁用 pointer-events