如何将 CSS 过渡添加到自动滑块?

How to add CSS transitions to Automatic Slider?

我正在尝试为我的自动滑块应用 'opacity / sliding to left',但我做不到。请帮我解决这个问题。

let images = ["images/a.jpg", "images/b.jpg", "images/c.jpg", "images/d.jpg", ];
let i = 0;

function changeImg() {
  document.querySelector("#slider img").src = images[i];
  if (i < images.length - 1) {
    i++;
  } else {
    i = 0;
  }
  setTimeout("changeImg()", 1000);

}
onload(changeImg());
#slider img {
  width: 100vw;
  height: 60vh;
  transition: opacity 2s ease-out;
}
<section id="slider">
  <img name="slide" width="400" height="200" />
</section>

最初的要求是图像淡出并显示另一个图像。

这可以通过将图像一个放在另一个之上(绝对位置)和不透明度 0 以及在不透明度上设置过渡来实现。当要显示特定图像时,将其设置为不透明度 0 之前的图像,而新图像的不透明度设置为 1.

let images = ["https://picsum.photos/id/1015/300/300", "https://picsum.photos/id/1016/200/300", "https://picsum.photos/id/1018/300/200.jpg", "https://picsum.photos/id/1022/400/300", ];
const slider = document.querySelector('#slider');
const imgEls = [];
images.forEach(image => {
  let imgEl = document.createElement('img');
  imgEl.src = image;
  imgEls.push(imgEl);
  slider.appendChild(imgEl);
});
let i = 0;

function changeImg() {
  imgEls[i].style.opacity = 0;
  if (i < images.length - 1) {
    i++;
  } else {
    i = 0;
  }
  imgEls[i].style.opacity = 1;
  setTimeout("changeImg()", 1000);
}
window.onload = changeImg;
#slider {
  width: 100vw;
  height: 60vh;
  position: relative;
  isplay: felx;
  justify-content: center;
  align-items: center;
}

#slider img {
  display: inline-block;
  width: 100vw;
  height: 60vh;
  object-fit: contain;
  transition: opacity 2s ease-out;
  opacity: 0;
  position: absolute;
  top: 0;
  left: 0;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<section id="slider">
  < name="slide" width="400" height="200" />
</section>

虽然该动作似乎与评论中讨论的内容相对应,但它并没有真正实现 'slider',而且问题还谈到使用 CSS.[=16 向左滑动=]

此代码片段对问题的代码采用了一种略有不同的方法,因为一旦使用 Javascript 完成了幻灯片的初始设置,其他所有内容都通过 CSS 完成。这样做的好处是系统可以将动画交给 GPU,而无需在超时时中断回主程序。

每个图像都位于左侧 100%(即刚好在屏幕右侧),并且与另一个图像具有相同的动画 - 移动到中心,等待然后移出到左侧 - 不透明度淡入和出来分别。然而,图像在交错的时间开始动画,因此滑动看起来是连续的。

const slider = document.querySelector('#slider');
const images = ["https://picsum.photos/id/1015/300/300", "https://picsum.photos/id/1016/200/300", "https://picsum.photos/id/1018/300/200", "https://picsum.photos/id/1022/400/300"];
let div;
let count = 0;
images.forEach(image => {
  div = document.createElement('div');
  div.style.animationDelay = (count * 2) + 's';
  count++;
  div.style.setProperty('--img', 'url(' + image + ')');
  slider.appendChild(div);
});
slider.style.setProperty('--n', count);
#slider {
  overflow: hidden;
  width: 100vw;
  height: 60vh;
  position: relative;
}

#slider div {
  width: 100%;
  height: 100%;
  position: absolute;
  left: 0;
  top: 0;
  opacity: 0;
  display: inline-block;
  background-size: contain;
  background-position: center center;
  background-repeat: no-repeat;
  background-image: var(--img);
  animation-name: slide;
  animation-iteration-count: infinite;
  animation-timing-function: linear;
  animation-duration: calc(var(--n) * 2s);
  animation-fill-mode: forwards;
}

@keyframes slide {
  0% {
    opacity: 0;
    transform: translateX(100vw);
  }
  12.5% {
    opacity: 1;
    transform: translateX(0);
  }
  25% {
    opacity: 1;
    transform: translateX(0);
  }
  37.5%,
  100% {
    opacity: 0;
    transform: translateX(-100vw);
  }
}
<div id="slider"></div>

请注意,关键帧设置假设有 4 张图像。必须将 % 值更改为更多或更少。不幸的是 CSS 不允许变量作为关键帧中的 % 值,因此 JS 会理想地找到图像的数量并创建正确的关键帧。