带有过渡和 translateY 的 Safari 错误:“跳跃”元素

Posted

技术标签:

【中文标题】带有过渡和 translateY 的 Safari 错误:“跳跃”元素【英文标题】:Safari bug with transition and translateY: "jumping" element 【发布时间】:2020-01-17 12:47:58 【问题描述】:

我正在使用 translateY 移动一个元素。在 Chrome、Firefox、IE、Edge 除了 Safari(12.1.2 和 13.1.2)和 GNOME Web (WebKit) 下一切正常。

在 Safari 下,元素“跳跃”。这里有一个小例子(也可以在CodePen 上找到):

.parent 
  height: 50px;
  background-color: blue;
  padding: 10px;


.child 
  background-color: yellow;
  padding: 10px;

  transition: all 150ms cubic-bezier(0.4, 0, 0.2, 1);

.child.move 
  transform: translateY(-150%);
  padding: 0; /* If 10px: no bug */
<br><br><br>
<div class="parent">
  <div class="child" onclick="this.classList.toggle('move')">Click me</div>
</div>

我在WebKit bug tracker 上找不到答案。

你知道一些解决方法吗?

其他 Stack Overflow 相关问题:

css transform + width + left + top transition jump on safari browser Transition both transform and size in Safari (9.1) Animating margins and padding with CSS Transition causes jumpy animation

【问题讨论】:

【参考方案1】:

您可以添加:transition-delay: 1ms;,这将在 transform 转换之前强制填充属性。

https://codepen.io/konstantin/pen/qBWJjjq

【讨论】:

这适用于transition: transform ...,但不适用于transition: all ... :-/ 这是一个很好的解决方案。这里的标志动画有同样的问题budapesturbanwalks.com(当视口低于 991px 并且横向和滚动位置不在站点顶部时)。这解决了它!它使用transition: all,但它就像魅力一样。【参考方案2】:

2021 年 4 月更新:Safari 14 不再存在此问题

【讨论】:

以上是关于带有过渡和 translateY 的 Safari 错误:“跳跃”元素的主要内容,如果未能解决你的问题,请参考以下文章

Safari 上涉及不透明度、缩放和 translateY 问题的 CSS 动画

带有 :before 和 :after 伪元素的 CSS 过渡

2D变换过渡不适用于IE11中的VW和VH单元

safari 中的 css3 过渡不顺畅

组合大小和翻译过渡会导致 Safari 卡顿

CSS 过渡:不透明度和可见性过渡不适用于 Firefox(适用于 Chrome / Safari)