Skip to content

Ленивые фоновые изображения

v-lazy-img — директива для установки background-image на любой элемент после его появления во вьюпорте. Используйте, когда нельзя применить компонент <VImage> — CSS-фоны, обёртки сторонних библиотек и т. д.

vue
<!-- Простая строка -->
<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, опционален. Вызывается при неудаче загрузки изображения.

Поведение

  1. При монтировании — создаётся IntersectionObserver и начинает наблюдать за элементом
  2. Когда элемент попадает во вьюпорт — если задан placeholder, он немедленно применяется как background-image
  3. Новый объект Image загружает src в фоне
  4. При загрузке — background-image обновляется на src; вызывается onLoad
  5. При ошибке — вызывается onError; background-image остаётся плейсхолдером (если он был)
  6. При размонтировании — observer отключается
  7. При обновлении биндинга — observer пересоздаётся с новыми опциями

Регистрация директивы вручную

Директива регистрируется автоматически вместе с VImageKitPlugin. Чтобы зарегистрировать её в одном компоненте:

vue
<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>

Или глобально без плагина:

ts
import { vLazyImg } from '@macrulez/vue-image-kit'

app.directive('lazy-img', vLazyImg)

Пример — карточка с ленивым фоном

vue
<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-аналог.