在反向运动过程中如何保持图像旋转?

Cri*_*per 6 css css3 css-transforms css-animations

我遇到了想要创建的效果的问题.我的身体在HTML文件中它只是一个带有两个图像的div.

我试图通过以下方式为第一张图像添加动画:

  • 在0%它开始在div的开头(鱼的头在右边)
  • 在100%它最终结束,但此时我想旋转图像并保持该效果,直到它再次达到0%.(也就是说,反向运动时鱼应指向左侧)

但它只是旋转100%而不是更多.我不知道是否会发生这种情况,因为我不了解动画属性的一些概念.

这是我的全部代码:

@keyframes fish01 {
  0% {
    left: 0%;
    transform: rotateY(180deg);
  }
  1% {
    transform: rotateY(0deg);
  }
  99% {
    transform: rotateY(0deg);
  }
  100% {
    left: 90%;
    transform: rotateY(180deg);
  }
}
body {
  background-color: black;
}
div {
  position: absolute;
  margin-left: 18%;
  margin-top: 3%;
  width: 800px;
  height: 500px;
  border: 5px double #DDDDDD;
  border-radius: 1em 1em;
  background-image: url("https://i.onthe.io/vllkyt28101smv87bg.349283fe.jpg");
}
div img:nth-child(1) {
  float: left;
  position: absolute;
  margin: 0px;
  top: 20%;
  width: 100px;
  height: 50px;
  transform: scale(1.5, 1.5);
  animation-name: fish01;
  animation-duration: 5s;
  animation-iteration-count: infinite;
  animation-direction: alternate;
  animation-timing-function: ease-in;
}
div img:nth-child(2) {
  float: left;
  position: absolute;
  top: 20%;
  left: 60%;
}
Run Code Online (Sandbox Code Playgroud)
<section>
  <div>
    <img src="https://www.hyperone.com.eg/media/catalog/product/cache/4/thumbnail/9df78eab33525d08d6e5fb8d27136e95/f/i/fish_1.png" />
    <img src="http://www.pets4homes.co.uk/images/fish_hero.png" />
  </div>
</section>
Run Code Online (Sandbox Code Playgroud)

我已经尝试了所有内容,@keyframes并查看了W3Schools网站关于动画属性,但它没有帮助我.有什么建议?

Har*_*rry 1

原因:

所看到的行为是基于您@keyframes和animation-direction设置的预期行为。当动画的方向设置为交替时,UA 在奇数迭代中从 0 到 100 执行动画,在偶数迭代中从 100 到 0 执行动画。

根据您的关键帧,transform从rotateY(180deg)到 为rotateY(0deg)动画持续时间本身的 1%,因此在奇数迭代期间,您看不到任何可见的旋转(因为持续时间非常小),并且它从rotateY(180deg)(100%) 变为rotateY(0deg)( 99%),因此在偶数迭代期间您也看不到任何可见的旋转。

为正向编写关键帧并在反向重新使用相同的关键帧(使用animation-direction)的问题在于,只有当两者的状态相同时才能完成。在这种情况下,这并不是因为元件在向前运动期间应该处于不旋转状态而rotateY(180deg)在反向运动期间应该处于不旋转状态。

解决方案:

为了使元素在旋转状态下可见,transform必须保留一段时间。因此,对于您的情况,最好取消该animation-direction: alternate设置并在关键帧本身内写入向前和向后运动,如下面的代码片段所示。

(注意:由于我们在关键帧内同时写入向前和向后运动,因此您可能需要加倍animation-duration)。

@keyframes fish01 {
  0% {
    left: 0%;
    transform: rotateY(0deg);
  }
  49.5% {
    left: 90%;
    transform: rotateY(0deg);
  }
  50.5% {
    left: 90%;
    transform: rotateY(180deg);
  }
  100% {
    left: 0%;
    transform: rotateY(180deg);
  }
}
body {
  background-color: black;
}
div {
  position: absolute;
  margin-left: 18%;
  margin-top: 3%;
  width: 800px;
  height: 500px;
  border: 5px double #DDDDDD;
  border-radius: 1em 1em;
  background-image: url("https://i.onthe.io/vllkyt28101smv87bg.349283fe.jpg");
}
div img:nth-child(1) {
  float: left;
  position: absolute;
  margin: 0px;
  top: 20%;
  width: 100px;
  height: 50px;
  transform: scale(1.5, 1.5);
  animation-name: fish01;
  animation-duration: 10s; /* double of original time */
  animation-fill-mode: forwards;
  animation-iteration-count: infinite;
  animation-timing-function: ease-in;
}
div img:nth-child(2) {
  float: left;
  position: absolute;
  top: 20%;
  left: 60%;
}
Run Code Online (Sandbox Code Playgroud)
<section>
  <div>
    <img src="https://www.hyperone.com.eg/media/catalog/product/cache/4/thumbnail/9df78eab33525d08d6e5fb8d27136e95/f/i/fish_1.png" />
    <img src="http://www.pets4homes.co.uk/images/fish_hero.png" />
  </div>
</section>
Run Code Online (Sandbox Code Playgroud)