【问题标题】:Adding fade transition between animation在动画之间添加淡入淡出过渡
【发布时间】:2015-08-12 00:33:35
【问题描述】:

我的问题是这样的:

.container {
  width: 200px;
  height: 170px;
  display: inline-block;
  position: relative;
}
.image {
  width: 100%;
  height: 100%;
  position: absolute;
  top: 0;
  left: 0;
  -webkit-background-size: cover!important;
  background-size: cover!important;
  background-repeat: no-repeat!important;
  animation: image 8s linear 1s infinite;
  animation-timing-function: steps(1);
}
@keyframes image {
  20% {
    background-position: 25% center;
  }
  40% {
    background-position: 50% center;
  }
  60% {
    background-position: 75% center;
  }
  80% {
    background-position: 100% center;
  }
}
<div class="container">
  <div class="image" style="background:url(http://i.imgur.com/GX23d5Y.jpg)"></div>
</div>

我有一张由 5 张拼接在一起的图片组成的长图片,我正在以类似的方式为其 background-position 设置动画。

目前正在发生过渡,但分步进行,因此每张图像都会“闪烁”。

我想知道是否有可能在 background-position 更改的同时进行某种淡入/淡出。我尝试插入

0% { opacity:1; }
20% { background-position: 25% center; opacity:0; }
21% { opacity:1; }

进入我的动画,但我无法获得良好的淡入/淡出效果。

任何关于如何做到这一点的建议(不插入多个图像,如here)都非常感谢。

【问题讨论】:

  • 我认为是animation: fadein 2s;
  • 您能否提供一个示例代码来说明您所说的 5 张图像拼接在一起 的含义?即使图像完全不相关也很好。只是一个样本应该没问题。
  • 你在说this fiddle之类的东西吗?
  • @BogdanKuštan:不错的一个,除了我认为它不能用单个动画完成,因为 OP 正在寻找图像上的步长(也就是说,更像是跳跃/眨眼而不是循序渐进)。将不透明度更改与图像步进动画相结合会破坏这一点。
  • @BogdanKuštan 我已经尝试过了,但效果不太好,因为您在不透明度更改中有点松了第二张幻灯片。

标签: html css animation css-animations


【解决方案1】:

假设我正确理解了您的问题,您需要两个动画,其中一个以线性方式淡入淡出图像,而另一个以逐步方式移动背景位置。

.image {
  background-image: url(http://i.imgur.com/GX23d5Y.jpg);
  background-size: cover;
  background-repeat: no-repeat;
  animation: image 8s steps(1) 1s infinite, fadein 8s linear 1s infinite;
  opacity: 0;
}
@keyframes image {
  20% {background-position: 25% center;}
  40% {background-position: 50% center;}
  60% {background-position: 75% center;}
  80% {background-position: 100% center;}
}
@keyframes fadein {
  10%  {opacity: 1;}
  20%  {opacity: 0;}
  30%  {opacity: 1;}
  40%  {opacity: 0;}
  50%  {opacity: 1;}
  60%  {opacity: 0;}
  70%  {opacity: 1;}
  80%  {opacity: 0;}
  90%  {opacity: 1;}
  100% {opacity: 0;}
}

如您所见,image 动画完全符合您的预期(即移动 background-position)。第二个动画执行以下操作:

  • 在 0% 和 10% 之间,opacity 以线性方式从 0 变为 1。这使得图像的第一部分看起来好像在加载时淡入淡出。
  • 在 20%(与位置移动到第二张图像的同一时间),opacity 再次变为 0。这会暂时隐藏图像。
  • 然后在 30% 不久之后,我们将 opacity 重新设置为 1,这会使图像的第二部分外观淡入。
  • 图像的第 3、第 4 和第 5 部分也遵循类似的模式。也就是说,对于第一个 10%,图像会淡入,而对于下一个 10%,它会淡出。
  • 最后在 100% 时,opacity 再次变为 0,因为我们希望图像的第一部分在下一个循环中淡入。

    .container {
      width: 200px;
      height: 170px;
      position: relative;
    }
    .image {
      width: 100%;
      height: 100%;
      position: absolute;
      top: 0;
      left: 0;
      background-image: url(http://i.imgur.com/GX23d5Y.jpg);
      background-size: cover;
      background-repeat: no-repeat;
      animation: image 8s steps(1) 1s infinite, fadein 8s linear 1s infinite;
      opacity: 0;
    }
    @keyframes image {
      20% {background-position: 25% center;}
      40% {background-position: 50% center;}
      60% {background-position: 75% center;}
      80% {background-position: 100% center;}
    }
    @keyframes fadein {
      10%  {opacity: 1;}
      20%  {opacity: 0;}
      30%  {opacity: 1;}
      40%  {opacity: 0;}
      50%  {opacity: 1;}
      60%  {opacity: 0;}
      70%  {opacity: 1;}
      80%  {opacity: 0;}
      90%  {opacity: 1;}
      100% {opacity: 0;}
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/prefixfree/1.0.7/prefixfree.min.js"></script>
    <div class="container">
      <div class="image"></div>
    
    </div>
  • sn-p 中使用的关键帧分解导致图像部分连续淡入淡出(即,图像仅在很短的时间内停留在opacity: 1)。如果您需要休息一下,只需相应地修改框架即可。以下 sn-p 中有一个示例:

    .container {
      width: 200px;
      height: 170px;
      position: relative;
    }
    .image {
      width: 100%;
      height: 100%;
      position: absolute;
      top: 0;
      left: 0;
      background-image: url(http://i.imgur.com/GX23d5Y.jpg);
      background-size: cover;
      background-repeat: no-repeat;
      animation: image 16s steps(1) 1s infinite, fadein 16s linear 1s infinite;
      opacity: 0;
    }
    @keyframes image {
      20% {background-position: 25% center;}
      40% {background-position: 50% center;}
      60% {background-position: 75% center;}
      80% {background-position: 100% center;}
    }
    @keyframes fadein {
      5%  {opacity: 1;}
      15%  {opacity: 1;}
      20%  {opacity: 0;}
      25%  {opacity: 1;}
      35%  {opacity: 1;}
      40%  {opacity: 0;}
      45%  {opacity: 1;}
      55%  {opacity: 1;}
      60%  {opacity: 0;}
      65%  {opacity: 1;}
      75%  {opacity: 1;}
      80%  {opacity: 0;}
      85%  {opacity: 1;}
      95%  {opacity: 1;}
      100% {opacity: 0;}
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/prefixfree/1.0.7/prefixfree.min.js"></script>
    <div class="container">
      <div class="image"></div>
    
    </div>

【讨论】:

  • 好的,我会在我的示例中尝试这个,但我很确定这看起来像我需要的 :)
  • @dingo_d:很好。我添加了一个额外的 sn-p,它使用来自问题的图像。
  • 是的,它做到了!我一直在玩小提琴让它与 5 一起工作,但你打败了我:D 谢谢^^
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-06
  • 1970-01-01
  • 2013-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多