Ленивые фоновые изображения
v-lazy-img — директива для установки background-image на любой элемент после его появления во вьюпорте. Используйте, когда нельзя применить компонент <VImage> — CSS-фоны, обёртки сторонних библиотек и т. д.
<!-- Простая строка -->
<div v-lazy-img="'/background.jpg'" class="hero" />
<!-- Объект с опциями -->
<div
v-lazy-img="{
src: '/background.jpg',
placeholder: 'data:image/jpeg;base64,...',
rootMargin: '100px',
onLoad: () => console.log('loaded'),
onError: (e) => console.error(e),
}"
class="hero"
/>Опции
src
string, обязателен. URL фонового изображения.
placeholder
string, опционален. Base64 или URL, показываемый сразу; заменяется после загрузки.
rootMargin
string · по умолчанию: "200px". rootMargin для IO.
threshold
number · по умолчанию: 0. threshold для IO.
onLoad
() => void, опционален. Вызывается при завершении загрузки изображения.
onError
(e: Event) => void, опционален. Вызывается при неудаче загрузки изображения.
Поведение
- При монтировании — создаётся
IntersectionObserverи начинает наблюдать за элементом - Когда элемент попадает во вьюпорт — если задан
placeholder, он немедленно применяется какbackground-image - Новый объект
Imageзагружаетsrcв фоне - При загрузке —
background-imageобновляется наsrc; вызываетсяonLoad - При ошибке — вызывается
onError;background-imageостаётся плейсхолдером (если он был) - При размонтировании — observer отключается
- При обновлении биндинга — observer пересоздаётся с новыми опциями
Регистрация директивы вручную
Директива регистрируется автоматически вместе с VImageKitPlugin. Чтобы зарегистрировать её в одном компоненте:
<script setup lang="ts">
import { vLazyImg } from '@macrulez/vue-image-kit'
</script>
<template>
<div v-lazy-img="'/bg.jpg'" style="width:100%;height:400px" />
</template>Или глобально без плагина:
import { vLazyImg } from '@macrulez/vue-image-kit'
app.directive('lazy-img', vLazyImg)Пример — карточка с ленивым фоном
<script setup lang="ts">
import { vLazyImg } from '@macrulez/vue-image-kit'
const cards = [
{ id: 1, bg: '/card-1.jpg', placeholder: 'data:image/jpeg;base64,/9j/...' },
{ id: 2, bg: '/card-2.jpg', placeholder: 'data:image/jpeg;base64,/9j/...' },
]
</script>
<template>
<div
v-for="card in cards"
:key="card.id"
v-lazy-img="{ src: card.bg, placeholder: card.placeholder }"
class="card"
/>
</template>
<style scoped>
.card {
width: 300px;
height: 200px;
background-size: cover;
background-position: center;
border-radius: 12px;
}
</style>Нужен srcset/image-set() для адаптивных фонов? См. Адаптивные ленивые фоны — composable-аналог.