<div class="carousel">
  <div class="slides">
    <img
      src="https://i.loli.net/2020/01/20/2wx8npJFiDUzu4T.png"
      alt="Stainless Steel"
    />
    <img
      src="https://i.loli.net/2020/01/20/YWA6RhCcESgN3Ty.png"
      alt="Army Green"
    />
    <img
      src="https://i.loli.net/2020/01/19/4HaLyI7NQRf3teO.png"
      alt="Cranberry"
    />
    <img
      src="https://i.loli.net/2020/01/19/QVY6JSEbqiOvAp1.png"
      alt="Midnight Blue"
    />
  </div>
  <div class="overlays">
    <div class="bar" style="--bar-color: #bdc3c7;"></div>
    <div class="bar" style="--bar-color: #218c74;"></div>
    <div class="bar" style="--bar-color: #dd6b7b;"></div>
    <div class="bar" style="--bar-color: #30465c;"></div>
  </div>
  <ul class="nav-links">
    <li><a href="#" class="nav-link">Stainless Steel</a></li>
    <li><a href="#" class="nav-link">Army Green</a></li>
    <li><a href="#" class="nav-link">Cranberry</a></li>
    <li><a href="#" class="nav-link">Midnight Blue</a></li>
  </ul>
</div>
@import url("https://fonts.googleapis.com/css?family=Lora:400,400i,700");

body {
  display: flex;
  justify-content: flex-start;
  align-items: center;
  min-height: 100vh;
  margin: 0;
  background: #ECEFFC;
}

.carousel {
  position: relative;
  display: flex;

  .slides {
    position: relative;
    top: -4em;
    left: 10em;

    img {
      position: absolute;
      width: 450px;
      height: 450px;
      opacity: 0;
      z-index: 9999;

      &.active {
        opacity: 1;
      }
    }
  }

  // palette: https://flatuicolors.com
  .overlays {
    position: relative;
    width: 36em;
    height: 18em;

    .bar {
      position: absolute;
      top: 0;
      left: 0;
      width: 100%;
      height: 100%;
      background: var(--bar-color);
      transform-origin: left;
    }
  }

  .nav-links {
    display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: flex-start;
    margin: 0;
    padding: 0 0 0 6em;
    list-style-type: none;

    .nav-link {
      font-size: 2rem;
      font-family: Lora, serif;
      line-height: 2;
      text-decoration: none;
      color: #7f8c8d;
      transition: 0.3s;

      &:hover {
        color: #1c1e1f;
      }

      &.active {
        color: black;
        pointer-events: none;
      }
    }
  }
}
View Compiled
let navLinks = document.querySelectorAll(".carousel .nav-link");
let slides = document.querySelectorAll(".carousel .slides img");
let overlays = document.querySelectorAll(".carousel .bar");
let maxZIndex = navLinks.length;
let easeInOutQuart = "cubic-bezier(0.77, 0, 0.175, 1)";
slides[0].classList.add("active");
navLinks[0].classList.add("active");
navLinks.forEach((navLink, activeIndex) => {
  (overlays[activeIndex] as HTMLElement).style.zIndex = `${navLinks.length -
    activeIndex}`;
  navLink.addEventListener("click", () => {
    // nav-link
    navLinks.forEach(navLink => navLink.classList.remove("active"));
    navLink.classList.add("active");
    // slide
    let currentSlide = document.querySelector(".carousel .slides img.active");
    let slideFadeOut = currentSlide.animate(
      [
        { transform: "translateX(0)", opacity: 1 },
        { transform: "translateX(5%)", opacity: 0 }
      ],
      {
        duration: 600,
        easing: "ease-in",
        fill: "forwards"
      }
    );
    slideFadeOut.onfinish = () => {
      slides.forEach(slide => slide.classList.remove("active"));
      let activeSlide = slides[activeIndex];
      activeSlide.classList.add("active");
      activeSlide.animate(
        [
          {
            transform: "translateX(-5%)",
            opacity: 0
          },
          {
            transform: "translateX(0)",
            opacity: 1
          }
        ],
        { duration: 600, easing: "ease-out", fill: "forwards" }
      );
    };
    // overlay
    maxZIndex += 1;
    let activeOverlay = overlays[activeIndex];
    (activeOverlay as HTMLElement).style.zIndex = `${maxZIndex}`;
    activeOverlay.animate(
      [{ transform: "scaleX(0)" }, { transform: "scaleX(1)" }],
      { duration: 1200, fill: "forwards", easing: easeInOutQuart }
    );
  });
});
View Compiled

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

This Pen doesn't use any external JavaScript resources.