【问题标题】:CSS animation bug on SafariSafari 上的 CSS 动画错误
【发布时间】:2019-08-05 17:51:51
【问题描述】:

我在 Safari 上有一个 CSS 动画错误,我创建的波浪动画没有按预期运行。

下面是我的动画关键帧:

@keyframes wave {
  20% {
    transform: translateY(-18px);
  }
  0%,
  40%,
  100% {
    transform: initial;
  }
}

我为它制作了一支笔 - https://codepen.io/ikhazen/pen/BXdqrN 它在其他浏览器中的行为与预期一样,但在 Safari iPhone 6s 上却没有。

解释我的 iPhone 上发生了什么。 前三个点同时动画,然后是第 4 和第 5 个点。似乎动画延迟属性不是很好。 有时,我注意到所有的点都会同时产生动画。这很奇怪。

谢谢

【问题讨论】:

  • 我检查了 iPhone 7,它工作正常。也许您的 iPhone 上没有安装所有更新?
  • @somega 谢谢,是的,它有时在我的手机上运行良好,但通常情况下,它的行为不同,这真的很奇怪。
  • 在 Mac 上的 Safari 上,第一个点先出现,然后所有其他点一起出现。
  • @MarkFisher 谢谢!你认为可能是什么问题?这真的是 Safari 浏览器的错误吗?

标签: ios css


【解决方案1】:

我可以在 Mac OS 上的 Safari 上看到类似的问题,除了第一个点是独立的,其余的都是一起的。我创建了一支工作笔here

问题在于您的笔中的以下 css

@-webkit-keyframes wave {
  20% {
    transform: translateY(-18px);
  }
  0%,
  40%,
  100% {
    transform: initial;
  }
}

更改它以使百分比按顺序修复它:

@-webkit-keyframes wave {
  0% {
    transform initial;
  }
  20% {
    transform: translateY(-18px);
  }
  40% {
    transform: initial;
  }
  100% {
    transform: initial;
  }
}

如果我正确地解释了specification,当它说

为了确定关键帧的集合,选择器中的所有值都按时间升序排序

那么这似乎是 Safari 中的一个错误,因为您指定关键帧的顺序无关紧要。

【讨论】:

  • @thanks,但它仍然没有工作。我真的认为这是一个 Safari 错误。在此处查看您的笔屏幕截图。 imgur.com/a/cmREdz6
  • @Hitori,你说得对,我刚刚在 iPhone 6s 上使用 browserstack 在 ios 11 上进行了测试。有趣的是,每次页面刷新时的行为都会有所不同。有时第 2 和第 3 几乎同步,但其他点都可以。有时所有的点都是同步的。有时我明白你所描述的。对于它的价值,您的原始笔在 iOS12 甚至在 6s 上的较旧的 ios9 中始终如一,即使认为 codepen 本身并不完全受支持。但是 ios11 上的行为似乎不一致 - 我想这就是你正在使用的?
  • @Hitori,我也意识到你的笔在桌面 mac 上有时可以工作,有时会失败,而我的解决方案实际上似乎并没有改变这一点——它只是在第一次尝试时就成功了。
  • 谢谢。看起来对动画延迟使用负值对我有用。这是更新后的笔 - codepen.io/ikhazen/pen/BXdqrN
【解决方案2】:

如果有人偶然发现这一点,请尝试在您的动画延迟属性中使用负值。

这是链接https://codepen.io/ikhazen/pen/BXdqrN

&-6 {
  background: #c73e2c;
  animation-delay: -150ms;
  -webkit-animation-delay: -150ms;
}

&-5 {
  background: #ac3c3f;
  animation-delay: -300ms;
  -webkit-animation-delay: -300ms;
}

&-4 {
  background: #903a51;
  animation-delay: -450ms;
  -webkit-animation-delay: -450ms;
}

&-3 {
  background: #733866;
  animation-delay: -600ms;
  -webkit-animation-delay: -600ms;
}

&-2 {
  background: #573678;
  animation-delay: -750ms;
  -webkit-animation-delay: -750ms;
}

&-1 {
  background: #3c348a;
  animation-delay: -900ms;
  -webkit-animation-delay: -900ms;
}

【讨论】:

  • 谢谢。刚刚在 Safari 中的悬停状态上遇到了同样的问题,在伪元素 :before:after 中带有链接和图标字体。解决方法是使每个属性的延迟为 -0.1 秒。正值不起作用。这使用 transition 速记并且没有 webkit 前缀并且动画在其他浏览器中似乎仍然可以正常工作。
【解决方案3】:

这部分:

&-1 {
  background: #3c348a;
  animation-delay: 150ms;
}

缺少-webkit-animation-delay: 150ms;

工作代码:

&-1 {
  background: #3c348a;
  animation-delay: 150ms;
  -webkit-animation-delay: 150ms;
}

建议:使用 css autoprefixer 来避免此类错误。

【讨论】:

  • 其实没有。因为我使用的是 webpack。它应该自动为这些 CSS 规则添加前缀。
  • 如果您使用脚本 create-react-app,自动前缀应该开箱即用。如果你使用 webpack 构建你的应用程序,你应该自己设置它。
  • 我正在使用 Vue 和 laravel-mix 设置,并且我确认编译后的 CSS 文件具有供应商前缀。
猜你喜欢
  • 2018-03-21
  • 1970-01-01
  • 2015-08-17
  • 2015-03-29
  • 2018-04-05
  • 1970-01-01
  • 2015-12-03
  • 1970-01-01
  • 2018-03-01
相关资源
最近更新 更多