CSS 动画在 Safari/所有 iPhone 浏览器上表现不同

CSS Animation Behaving Differently on Safari / All iPhone Browsers

我已经被这个问题困扰了 3 天,并且已经在 Internet 上搜索了解决方案,但还没有找到有效的解决方案。

我有一个卡通火箭飞过屏幕的动画。火箭应用了 4 个链接的关键帧动画:

1.) “发射”将火箭从屏幕左侧移到右侧
2.) "rightself" 旋转火箭使其指向上方
3.) "descend" 将火箭向下移动到行星
4.) “收缩”使火箭在接近行星表面时变小

我无法在此处添加视频,但这里有一些链接,说明视频应该如何显示和不应该如何显示:

外观应该如何:
https://twitter.com/planet_katie/status/1415739110505996291

它如何在所有 iOS 浏览器和桌面 Safari 上出现故障:
https://twitter.com/planet_katie/status/1418312787906998275

游戏Link,如果你想自己试试:
http://www.codeeverydamnday.com/projects/rocketblaster/index.html

火箭动画在桌面 Chrome 和 Firefox 中运行流畅,但在 Safari 中出现故障。它在 Android 手机上也能顺利运行,但在我在 iPhone 上尝试过的每个浏览器上都会再次出现故障。 Chrome 的开发工具中的 iPhone 模拟器也可以顺利地显示它 运行,所以我不确定为什么它没有转换为 iPhone 本身。

我尝试过的事情:

到目前为止,运气不好。任何人都可以查看我的代码并查看我是否遗漏了什么?注意:为简洁起见,我删除了 -moz-、-ms- 和 -o- 前缀,但它们也在我的代码中。

#rocketfire {
  background-color: red;
  position: absolute;
  top: 100px;
  left: -320px;
  height: 200px;
  -webkit-animation: launch 4s ease-in-out 0.01s 1 forwards,
    rightself 2s ease-in-out 3.5s 1 forwards,
    shrink 3.5s ease-in-out 4s 1 forwards, descend 4s ease-in-out 5s 1 forwards;
  animation: launch 4s ease-in-out 1 forwards,
    rightself 2s ease-in-out 3.5s 1 forwards,
    shrink 3.5s ease-in-out 4s 1 forwards, descend 4s ease-in-out 5s 1 forwards;
}

@-webkit-keyframes launch {
  0% {
    -webkit-transform: translateX(-0px);
  }
  100% {
    -webkit-transform: translateX(1050px);
  }
}

@keyframes launch {
  0% {
    transform: translateX(-320px);
  }
  100% {
    transform: translateX(1050px);
  }
}

@-webkit-keyframes rightself {
  0% {
    -webkit-transform: translateX(1050px) rotate(0deg);
  }
  100% {
    -webkit-transform: translateX(1050px) rotate(-82deg);
  }
}

@keyframes rightself {
  100% {
    transform: translateX(1050px) rotate(-82deg);
  }
}

@-webkit-keyframes descend {
  0% {
    -webkit-top: 0px;
  }
  100% {
    -webkit-top: 270px;
  }
}

@keyframes descend {
  100% {
    top: 270px;
  }
}

@-webkit-keyframes shrink {
  0% {
    -webkit-transform: translateX(1050px) rotate(-82deg) scale(1);
  }
  100% {
    -webkit-transform: translateX(1050px) rotate(-82deg) scale(0.5);
  }
}

@keyframes shrink {
  100% {
    transform: translateX(1050px) rotate(-82deg) scale(0.5);
  }
}
<img id="rocketfire" src="images/rocketfireright.png" />

我认为你不应该需要 -webkit 版本的动画,所以删除它们会使 CSS 更容易调试。我发现了一些不一致和缺失值。清理后,CSS 如下所示:

#rocketfire {
  background-color: red;
  position: absolute;
  top: 100px;
  left: -320px;
  height: 200px;
  animation: launch 4s ease-in-out 1 forwards,
             rightself 2s ease-in-out 3.5s 1 forwards,
             shrink 3.5s ease-in-out 4s 1 forwards,
             descend 4s ease-in-out 5s 1 forwards;
}

@keyframes launch {
  0% {
    transform: translateX(-320px);
  }
  100% {
    transform: translateX(1050px);
  }
}

@keyframes rightself {
  0% {
    transform: translateX(1050px) rotate(0deg);
  }
  100% {
    transform: translateX(1050px) rotate(-82deg);
  }
}

@keyframes descend {
  0% {
    top: 0px;
  }
  100% {
    top: 270px;
  }
}

@keyframes shrink {
  0% {
    transform: translateX(1050px) rotate(-82deg) scale(1);
  }
  100% {
    transform: translateX(1050px) rotate(-82deg) scale(0.5);
  }
}

尝试一下,看看是否能解决问题![​​=12=]

最终对我有用的是将四个动画合二为一,如下所示:

@keyframes launch {
  30% {transform: translateX(1050px) rotate(0);}
  50% {transform: translateX(1050px) scale(1) rotate(-82deg); top: 100px;}
  80% {transform: translateX(1050px) scale(0.5) rotate(-82deg);}
  100% {transform: translateX(1050px) scale(0.5) rotate(-82deg); top: 270px;}
}

似乎 Safari 在尝试一次 运行 多个关键帧动画时遇到问题。