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)
}
})