【问题标题】:How keep the image rotated during the reverse movement?如何在反向运动期间保持图像旋转?
【发布时间】:2016-02-16 12:48:09
【问题描述】:

我想创建的效果有问题。我在 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%;
}
<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>

我已经尝试了 @keyframes 中的所有内容,并查看了 W3Schools website 关于动画属性的信息,但它对我没有帮助。有什么建议吗?

【问题讨论】:

  • This 是我对这个问题的尝试。它工作得更好一些,但仍然不是那么好。我试过添加49%/50%,它似乎有帮助:)。

标签: css css-animations css-transforms


【解决方案1】:

原因:

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

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

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

解决方案:

要让元素处于旋转状态,transform 必须保留一段时间。因此,对于您的情况,最好取消 animation-direction: alternate 设置并在关键帧本身内写入正向和反向运动,如下面的 sn-p 所示。

注意:由于我们在关键帧中同时编写正向和反向运动,您可能需要将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%;
}
<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>

【讨论】:

  • 非常感谢@Harry,我可以理解动画方向的概念(我认为这是我遇到的主要问题),以及使用向前移动和重新使用相同的想法背部。现在它工作正常:)
【解决方案2】:

问题是您的 CSS 中有 animation-direction: alternate;。为了弥补这一点,您还需要将img 移动到left: 90%,使其位于动画中的50% 标记处,而不是100% 标记处。

希望这会有所帮助! :)

@keyframes fish01{
        0% {
		    left: 0%;
		    transform: rotateY(0deg);
	    }
	
	    49% {
		    transform: rotateY(0deg);
	    }
	
	    50% {
	        left: 90%;
		    transform: rotateY(180deg);
	    }
	
	    99% {
	    	transform: rotateY(180deg);
	    }
        100% {
		    left: 0%;
		    transform: rotateY(0deg);
	    }
}

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-timing-function: ease-in;
} 

div img:nth-child(2) {
	float: left;
	position: absolute;
	top: 20%;
	left: 60%;
}
<!DOCTYPE html>
<html lang="es">
	<head>
		<meta charset="UTF-8"/>
		<title>CSS rotate animation</title>
		<link rel="stylesheet" href="Transicion02.css"/>
	</head>
	<body>
		<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>
	</body>
</html>

【讨论】:

  • 同时给出相同的答案(一个缺点是无法看到您将要做什么:D)。顺便说一句,根本不需要 100% 关键帧,因为一旦到达 100%,它将开始执行下一次迭代(即 0%)。
  • 好吧,我明白了……你的回答比我好得多@Harry :)。我花了很长时间才解决它,但仍然无法解决它。这是我刚刚错过的animation-direction: alternate;。无论如何,好的,谢谢! :D
  • @Harry 实际上,就我而言,100% 框架是必需的。我只是因为某种原因冻结了。看到这个fiddle 去掉了100% 框架......奇怪......
  • 我的意思是您可以将 99% 和 100% 合二为一(也就是说,left: 0% 应该是其中的一部分)并将其称为 100%。没有它会发生什么 - UA 将元素保留在 left: 90% 从 50 - 99% (这是持续时间的一半)。这就是为什么你会看到它冻结了一段时间。
  • 我很困惑! :D 无论如何,让我们希望我们中的一个被接受:)。
猜你喜欢
  • 1970-01-01
  • 2014-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多