背景图像的淡入淡出过渡效果 - 重叠问题

Fade-transitioning effect for background images - overlapping issue

AIM

我想显示三张图片之间的渐变效果(最好是 10 张,这道题我用了三张)。每张图片应逐渐增加其不透明度,直到完全不透明,然后下一张图片应开始相同的过程,即从不透明度 0 到 1。

问题

如果您查看该片段,您会发现只有第三张图片遵循此不透明过程,而前两张图片模糊显示,因为第一张图片与它们重叠。

感谢您的帮助!

尝试

.slider {
  margin: 0;
  padding: 0;
  }
  
  .slide {
  position: absolute;
  width: 100%;
  height: 100%;
  background-repeat: no-repeat;
  background-size: cover;
}

.slide-1 {
  background-image: url("https://images.immediate.co.uk/production/volatile/sites/23/2019/10/Federico_Veronesi_Lions-cover-image-e359a4e.jpg?quality=45&crop=10px,234px,3691px,2458px&resize=620,413");
  animation: fade1 10s infinite;
}
.slide-2 {
  background-image: url("https://images.unsplash.com/photo-1490100886609-e401a775fb3a?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&w=1000&q=80");
  animation: fade2 10s infinite;
}
.slide-3 {
  background-image: url("https://images.pexels.com/photos/326055/pexels-photo-326055.jpeg?auto=compress&cs=tinysrgb&dpr=1&w=500");
  animation: fade3 10s infinite;
}

@keyframes fade1 {
  from {
    opacity: 0;
  }

  to {
    opacity: 1;
  }
}

@keyframes fade2 {
  from {
    opacity: 0;
  }

  to {
    opacity: 1;
  }
}

@keyframes fade3 {
  from {
    opacity: 0;
  }

  to {
    opacity: 1;
  }
}
<body class="slider">
    <div class="slide slide-1"></div>
    <div class="slide slide-2"></div>
    <div class="slide slide-3"></div>
</body>

CSS 动画是可行的,但需要一些技巧。您的代码不起作用的原因是 所有 CSS 动画同时发生 。你想要的是确保 fade1、fade2 和 fade3 都以连续的时间间隔开始和停止,这样它们就会相继出现:

  • fade1 从 0% 开始到 33% (1/3) 结束
  • fade2 从 33% (1/3) 开始到 67% (2/3) 结束
  • fade3 从 67% (2/3) 开始到 100% (3/3) 结束

当然,这意味着您将需要 (1) 为添加的每张幻灯片声明一个新的关键帧,以及 (2) 调整 all 的 start/end 点添加新幻灯片时的关键帧。这可能很麻烦,并且自动化(或以编程方式执行)的唯一方法是使用 JS 或预处理 CSS.

请参阅下面的概念验证:

.slider {
  margin: 0;
  padding: 0;
}
  
  .slide {
  position: absolute;
  width: 100%;
  height: 100%;
  background-repeat: no-repeat;
  background-size: cover;
}

.slide-1 {
  background-image: url("https://images.immediate.co.uk/production/volatile/sites/23/2019/10/Federico_Veronesi_Lions-cover-image-e359a4e.jpg?quality=45&crop=10px,234px,3691px,2458px&resize=620,413");
  animation: fade1 10s infinite;
}
.slide-2 {
  background-image: url("https://images.unsplash.com/photo-1490100886609-e401a775fb3a?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&w=1000&q=80");
  animation: fade2 10s infinite;
}
.slide-3 {
  background-image: url("https://images.pexels.com/photos/326055/pexels-photo-326055.jpeg?auto=compress&cs=tinysrgb&dpr=1&w=500");
  animation: fade3 10s infinite;
}

@keyframes fade1 {
  0% {
    opacity: 0;
  }

  33% {
    opacity: 1;
  }
}

@keyframes fade2 {
  33% {
    opacity: 0;
  }

  67% {
    opacity: 1;
  }
}

@keyframes fade3 {
  67% {
    opacity: 0;
  }

  100% {
    opacity: 1;
  }
}
<body class="slider">
    <div class="slide slide-1"></div>
    <div class="slide slide-2"></div>
    <div class="slide slide-3"></div>
</body>


SCSS解法

如果您使用 CSS 预处理器,例如 SCSS,您可以简单地即时生成幻灯片:您只需要记住添加相应的标记即可:

// Just some demo images
$images: [
  'https://via.placeholder.com/400x300/3077FF/fff?text=Slide1',
  'https://via.placeholder.com/400x300/2C9EE8/fff?text=Slide2',
  'https://via.placeholder.com/400x300/3DE4FF/fff?text=Slide3',
  'https://via.placeholder.com/400x300/2CE8CE/fff?text=Slide4',
  'https://via.placeholder.com/400x300/30FFA8/fff?text=Slide5',
];

.slide {
  position: absolute;
  width: 400px;
  height: 300px;
  background-repeat: no-repeat;
  background-size: cover;
  opacity: 0;
}

@for $i from 1 through length($images) {
    $image: nth($images, $i);

    // Custom animation styles and background image for each slide
    .slide-#{$i} {
      animation: fade#{$i} 10s infinite;
      background-image: url(#{$image});
    }

    // Generate keyframe for each slide
    @keyframes fade#{$i} {
      #{(($i - 1) / length($images)) * 100%} {
        opacity: 0;
      }

      #{($i / length($images)) * 100%} {
        opacity: 1;
      }
    }
}

参见下面的示例(CSS 已预编译):

.slider {
  margin: 0;
  padding: 0;
}

.slide {
  position: absolute;
  width: 400px;
  height: 300px;
  background-repeat: no-repeat;
  background-size: cover;
  opacity: 0;
}

.slide-1 {
  animation: fade1 10s infinite;
  background-image: url(https://via.placeholder.com/400x300/3077FF/fff?text=Slide1);
}

@keyframes fade1 {
  0% {
    opacity: 0;
  }
  20% {
    opacity: 1;
  }
}
.slide-2 {
  animation: fade2 10s infinite;
  background-image: url(https://via.placeholder.com/400x300/2C9EE8/fff?text=Slide2);
}

@keyframes fade2 {
  20% {
    opacity: 0;
  }
  40% {
    opacity: 1;
  }
}
.slide-3 {
  animation: fade3 10s infinite;
  background-image: url(https://via.placeholder.com/400x300/3DE4FF/fff?text=Slide3);
}

@keyframes fade3 {
  40% {
    opacity: 0;
  }
  60% {
    opacity: 1;
  }
}
.slide-4 {
  animation: fade4 10s infinite;
  background-image: url(https://via.placeholder.com/400x300/2CE8CE/fff?text=Slide4);
}

@keyframes fade4 {
  60% {
    opacity: 0;
  }
  80% {
    opacity: 1;
  }
}
.slide-5 {
  animation: fade5 10s infinite;
  background-image: url(https://via.placeholder.com/400x300/30FFA8/fff?text=Slide5);
}

@keyframes fade5 {
  80% {
    opacity: 0;
  }
  100% {
    opacity: 1;
  }
}
<div class="slider">
    <div class="slide slide-1"></div>
    <div class="slide slide-2"></div>
    <div class="slide slide-3"></div>
    <div class="slide slide-4"></div>
    <div class="slide slide-5"></div>
</div>

要进行淡入淡出的过渡,您需要向关键帧添加百分比。这描述了您希望图像出现在屏幕上的时间百分比。 对于这个例子,你选择了三个,所以它是 100/3,不幸的是,它是 33.33333(你明白了。)

无论如何,这是您的三张图片的更新关键帧。要调整这 10 张以上的图像,您只需要 100/10(每张图像 10%)。

所有都应从 0% 的不透明度 0 开始,然后是起始百分比的 0 不透明度(在第一个图像的情况下,它是 33%。然后是 100% 的 0 不透明度)。

    @keyframes fade1 {
  0% {
    opacity: 0;
  }

  33% {
    opacity: 1;
  }
  100% {
    opacity: 0;
    }
}

@keyframes fade2 {
  0% {
    opacity: 0;
  }
  33% {
    opacity: 0;
  }

  66% {
    opacity: 1;
  }
  100% {
    opacity: 0;
    }
}

@keyframes fade3 {
  0% {
    opacity: 0;
  }
  66% {
    opacity: 0;
  }

  100% {
    opacity: 1;
  }
}

如果您想进一步解释,请告诉我。