1

我有一个小提琴 (Fiddle A),其中交叉淡入淡出的图像画廊发生在 2 张图像(2 个图块)中。这是我使用的 html/css 的片段。

<div class="featured-block" style="display:flex; justify-content: center;">
  <a href="https://www.google.com/" class="featured-block__item cf">
    <div class="featured-block__item-inner">
      <figure class="featured-block__image img-fit" itemprop="image" itemscope="" itemtype="http://schema.org/ImageObject">
        <img class="default-opacity" src="https://i.imgur.com/EUqZ1Er.png" data-fallback-img="https://i.imgur.com/EUqZ1Er.png" alt="Outburst">
      </figure>
    </div>
  </a>
</div>

这是我为上述 html 使用 2 张图像(2 个图块)的 @keyframes:

@keyframes cf4FadeInOut {
    0% {
        opacity: 0;
    }
    20% {
        opacity: 1;
        z-index: 999;
    }
    33% {
        opacity: 1;
    }
    53% {
        opacity: 0;
        z-index: 1;
    }
    100% {
        opacity: 0;
    }
}

当有2 个图块(2 个图像)时, Fiddle A中的上述 css 动画工作得非常好(这正是我想要的) 。

问题陈述:

上面的小提琴(Fiddle A)对于 2 张图像来说工作得很好。当有3 和 4 个图像时,我想要相同的css-animation/cross-fade 图像库

这是 4 张图像(4 个图块)的小提琴https://jsfiddle.net/zwjt8qko/1/embedded/result(小提琴 B)

这是 3 个图像(3 个图块)的小提琴https://jsfiddle.net/f6gr7kL1/embedded/result(小提琴 C)

我想知道我应该在上面的小提琴 B(4 张图像)和小提琴 C(3 张图像)中的关键帧中进行哪些更改,以便现在在小提琴 A中发生相同的css 动画/交叉淡入淡出。

我也对 JavaScript 解决方案持开放态度。

4

1 回答 1

1

JavaScript 方法

基本方法:

  1. 在您的 CSS 中,所有图片默认为opacity: 0.
  2. 在您的 HTML 中,在其中一张图片上设置一个类名,将该图片的不透明度更改为1.
  3. 在 JavaScript 中,定期在整个图片中切换该类。
  4. 甚至不用担心关键帧,直接在 JavaScript 中进行延迟。这使您可以更轻松地修改您希望脉冲动画的不同部分持续多长时间,而不必animation-duration像使用关键帧那样计算总数的百分比。

const pics = document.querySelectorAll('.pic');
const lastPic = pics.length - 1;
const transitionDuration = 800; // matches CSS
const transitionDelay = 3000; // up to you
const totalDelay = transitionDuration + transitionDelay;
const intervalDelay = (transitionDuration * 2) + transitionDelay; // time to fade out + time to fade in + time to stay active

function toggleClass() {
  const activePic = document.querySelector('.pic.active');
  const activeIndex = Array.prototype.indexOf.call(pics, activePic);
  const nextIndex = activeIndex === lastPic ? 0 : activeIndex + 1;
  const nextPic = pics[nextIndex];

  setTimeout(() => activePic.classList.remove('active'), transitionDelay);
  setTimeout(() => nextPic.classList.add('active'), totalDelay);
}

setInterval(toggleClass, intervalDelay);
.wrapper {
  width: 400px;
  height: 300px;
  position: relative;
}
.pic {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  opacity: 0;
  transition: opacity 800ms ease; /* immediately start fading out when active class is lost */
}
.pic.active {
  opacity: 1;
}
<div class="wrapper">
  <img class="pic active" src="https://via.placeholder.com/400x300?text=picture%201" alt="">
  <img class="pic" src="https://via.placeholder.com/400x300?text=picture%202" alt="">
  <img class="pic" src="https://via.placeholder.com/400x300?text=picture%203" alt="">
  <img class="pic" src="https://via.placeholder.com/400x300?text=picture%204" alt="">
</div>

关键帧方法

我不会在这里详细介绍,但它可能看起来像这样:

@keyframes pulse1 {
  0% {
    opacity: 1;
  }
  20% {
    opacity: 0;
  }
}

@keyframes pulse2 {
  0% {
    opacity: 0;
  }
  25% {
    opacity: 1;
  }
  45% {
    opacity: 0;
  }
}

@keyframes pulse3 {
  0% {
    opacity: 0;
  }
  50% {
    opacity: 1;
  }
  70% {
    opacity: 0;
  }
}

@keyframes pulse4 {
  0% {
    opacity: 0;
  }
  75% {
    opacity: 1;
  }
}

请注意,我们甚至不切换 ,z-index因为没有意义:一次只能看到其中一个。只需从一开始就将它们全部放在彼此之上,它们z-index无关紧要。

(我认为z-index您在问题中的动画部分甚至没有做任何事情,因为z-index它是不可动画的。)

于 2019-08-14T20:33:25.890 回答