JSFiddle - React, Tailwind, and code Playground

by maemaemae3

HTML

<div id="app">
  <transition name="blur">
    <div
       :key="imageIndex"
       :style="{'background-image': `url(${images[imageIndex].url})`}"
       class="full"
     />
  </transition>
</div>

SCSS

$blur-width: 20px;

.full {
  background-position: center;
  background-size: cover;
  position: absolute;
  width: 100%;
  height: 100%;
  transform: scale(1.2);
}

.blur-leave-active {
  animation: blur-animation-out 4s;
}
.blur-enter-active {
  animation: blur-animation-in 4s;
}

@keyframes blur-animation-out {
  0% {
    filter: blur(0);
    opacity: 1;
  }
  30% {
    filter: blur($blur-width);
    opacity: 0.8;
  }
  50% {
    opacity: 0;
  }
}

@keyframes blur-animation-in {
  0% {
    filter: blur($blur-width);
    opacity: 0;
  }
  50% {
    opacity: 1;
    filter: blur($blur-width);
  }
  80% {
    filter: blur(0);
  }
}

Vue

new Vue({
  el: "#app",
  data: {
  	imageIndex: 0,
    images: [
      { url: "https://cdn.stocksnap.io/img-thumbs/960w/old-barn_8GQRWBFOCZ.jpg" },
      { url: "https://cdn.stocksnap.io/img-thumbs/960w/blue-abstract_Z9CLCWFKBH.jpg" },
      { url: "https://cdn.stocksnap.io/img-thumbs/960w/city-skyline_HVKT6YLKOJ.jpg" }
    ]
  },
  mounted() {
    setInterval(() => {
      this.imageIndex = this.imageIndex < (this.images.length - 1) ? this.imageIndex + 1 : 0;
    }, 5000)
  }
})