UNPKG

vue-progressive-image

Version:
130 lines (111 loc) 3.06 kB
: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; }