vue-progressive-image
Version:
Vue progressive image loading plugin
130 lines (111 loc) • 3.06 kB
CSS
:root {
--progressive-image-background-color: #f4f4f4;
--progressive-image-blur: 16px;
--progressive-image-main-fade-ease: ease-in;
--progressive-image-main-fade-speed: 0.9s;
--progressive-image-placeholder-fade-ease: ease-out;
--progressive-image-placeholder-fade-speed: 1.2s;
--progressive-image-skeleton-speed: 2s;
--progressive-image-skeleton-background: linear-gradient(
90deg,
rgba(255, 255, 255, 0) 0%,
rgba(255, 255, 255, 0.7) 70%,
rgba(255, 255, 255, 0) 100%
);
}
.v-progressive-image,
.v-progressive-image *,
.v-progressive-image *:before,
.v-progressive-image *:after {
box-sizing: border-box;
}
.v-progressive-image {
position: relative;
overflow: hidden;
width: 100%;
display: inline-block;
background: var(--progressive-image-background-color);
}
.v-progressive-image-loading::before {
content: "";
display: block;
position: absolute;
background: var(--progressive-image-skeleton-background);
height: 100%;
width: 100%;
z-index: 1;
}
@media screen and (prefers-reduced-motion: no-preference) {
.v-progressive-image-loading::before {
animation: shimmer var(--progressive-image-skeleton-speed) infinite;
}
@keyframes shimmer {
0% {
transform: translateX(-100%);
}
100% {
transform: translateX(100%);
}
}
}
.v-progressive-image-main {
position: absolute;
top: 0;
left: 0;
bottom: 0;
right: 0;
z-index: 0;
max-width: 100%;
max-height: 100%;
}
.v-progressive-image-placeholder {
position: absolute;
top: calc(var(--progressive-image-blur) * -1);
left: calc(var(--progressive-image-blur) * -1);
width: calc(100% + var(--progressive-image-blur) * 2);
height: calc(100% + var(--progressive-image-blur) * 2);
filter: blur(var(--progressive-image-blur));
transform: scale(1.2);
z-index: 1;
object-fit: cover;
}
.v-progressive-image-slot-default {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 2;
}
.v-progressive-image-object-cover {
height: 100%;
width: 100%;
}
.v-progressive-image-object-cover .v-progressive-image-main {
object-position: center;
object-fit: cover;
height: 100%;
width: 100%;
}
.v-progressive-image-main-fade-leave,
.v-progressive-image-main-fade-leave-active,
.v-progressive-image-main-fade-enter-active {
transition: opacity var(--progressive-image-main-fade-speed)
var(--progressive-image-main-fade-ease);
}
.v-progressive-image-main-fade-leave-to,
.v-progressive-image-main-fade-enter-from {
transition: opacity var(--progressive-image-main-fade-speed)
var(--progressive-image-main-fade-ease);
opacity: 0;
}
.v-progressive-image-placeholder-fade-leave,
.v-progressive-image-placeholder-fade-leave-active {
transition: opacity var(--progressive-image-placeholder-fade-speed)
var(--progressive-image-placeholder-fade-ease);
}
.v-progressive-image-placeholder-fade-leave-to {
transition: opacity var(--progressive-image-placeholder-fade-speed)
var(--progressive-image-placeholder-fade-ease);
opacity: 0;
}