Lightbox для Vue
Повноекранний Lightbox-галерея зображень і відео для Vue 3 на основі @reelkit/vue-lightbox.
Features
Встановлення
npm install @reelkit/vue-lightbox @reelkit/vue lucide-vue-nextНе забудьте імпортувати стилі:
import '@reelkit/vue-lightbox/styles.css';Icons
Стандартні елементи керування використовують lucide-vue-next for icons. If you prefer a different icon library, use the #controls та #navigation з областю видимості, щоб передати власні.
Швидкий старт
Імпортуйте таблицю стилів і компонент LightboxOverlay , а відкриттям і закриттям керуйте через v-model:is-open.
<script setup lang="ts">
import { ref } from 'vue';
import { LightboxOverlay, type LightboxItem } from '@reelkit/vue-lightbox';
import '@reelkit/vue-lightbox/styles.css';
const images: LightboxItem[] = [
{
src: '/cdn/samples/images/image-01.jpg',
title: 'Mountain River',
description: 'A beautiful mountain river',
},
{
src: '/cdn/samples/images/image-02.jpg',
title: 'Snowy Peaks',
},
{
src: '/cdn/samples/images/image-03.jpg',
title: 'Misty Forest',
description: 'Morning fog over the forest canopy',
},
{
src: '/cdn/samples/images/image-04.jpg',
title: 'Autumn Trail',
},
{
src: '/cdn/samples/images/image-05.jpg',
title: 'Ocean Cliff',
description: 'Dramatic cliffs above the Pacific',
},
{
src: '/cdn/samples/images/image-06.jpg',
title: 'Desert Dunes',
},
];
const open = ref(false);
const startIndex = ref(0);
function openAt(i: number) {
startIndex.value = i;
open.value = true;
}
</script>
<template>
<div style="display:grid;grid-template-columns:repeat(3,1fr);gap:8px">
<button
v-for="(img, i) in images"
:key="img.src"
style="aspect-ratio:4/3;cursor:pointer"
@click="openAt(i)"
>
<img :src="img.src" style="width:100%;height:100%;object-fit:cover" />
</button>
</div>
<LightboxOverlay
v-model:is-open="open"
:items="images"
:initial-index="startIndex"
/>
</template>Слоти з областю видимості
Шість іменованих слотів з областю видимості дають повністю налаштувати поверхні оверлея. Не задавайте слот, щоб лишити вбудований типовий вигляд; залиште слот порожнім (наприклад, через v-if="false") to hide that section entirely.
| Slot | Scope | Опис |
|---|---|---|
| #slide | SlideSlotScope | Замінює вміст окремого слайда (обов’язково для слайдів-відео) |
| #controls | ControlsSlotScope | Замінює верхню смугу керування (закриття, лічильник, повний екран) |
| #navigation | NavigationSlotScope | Замінює стрілки навігації вперед і назад |
| #info | InfoSlotScope | За мінює нижній градієнтний оверлей із заголовком та описом |
| #loading | LoadingSlotScope | Власний індикатор завантаження |
| #error | ErrorSlotScope | Власний індикатор помилки |
<template>
<LightboxOverlay v-model:is-open="open" :items="items">
<!-- Custom info overlay -->
<template #info="{ item }">
<div class="my-caption">
<h2>{{ item.title }}</h2>
<p>{{ item.description }}</p>
</div>
</template>
<!-- Custom navigation -->
<template #navigation="{ onPrev, onNext, activeIndex, count }">
<div class="my-nav">
<button :disabled="activeIndex === 0" @click="onPrev">Prev</button>
<span>{{ activeIndex + 1 }} / {{ count }}</span>
<button :disabled="activeIndex === count - 1" @click="onNext">Next</button>
</div>
</template>
<!-- Custom controls -->
<template #controls="{ onClose, isFullscreen, onToggleFullscreen }">
<div class="my-controls">
<button @click="onToggleFullscreen">
{{ isFullscreen ? 'Exit Fullscreen' : 'Enter Fullscreen' }}
</button>
<button @click="onClose">Close</button>
</div>
</template>
</LightboxOverlay>
</template>Підтримка відео
Слайди-відео вмикаються за бажанням, тож типовий бандл лишається без обв’язки для аудіо та відео. Викличте useVideoSlideRenderer(items) і передайте повернені VideoSlideRenderer / VideoControlsRenderer в слоти оверлея #slide та #controls . Загорніть оверлей у повернений SoundProvider щоб вбудований перемикач звуку мав контекст. Повернений об’єкт має тип UseVideoSlideRendererResult: SoundProvider, hasVideo, VideoSlideRenderer і VideoControlsRenderer.
<script setup lang="ts">
import { ref } from 'vue';
import {
LightboxOverlay,
useVideoSlideRenderer,
type LightboxItem,
} from '@reelkit/vue-lightbox';
import '@reelkit/vue-lightbox/styles.css';
const open = ref(false);
const items: LightboxItem[] = [
{ src: '/image-01.jpg', title: 'Image' },
{
type: 'video',
src: '/clip.mp4',
poster: '/clip.jpg',
title: 'Clip',
},
];
const { VideoSlideRenderer, VideoControlsRenderer, SoundProvider } =
useVideoSlideRenderer(items);
</script>
<template>
<SoundProvider>
<LightboxOverlay v-model:is-open="open" :items="items">
<template #slide="scope">
<VideoSlideRenderer v-bind="scope" />
</template>
<template #controls="scope">
<VideoControlsRenderer v-bind="scope" />
</template>
</LightboxOverlay>
</SoundProvider>
</template>Спільний елемент <video> що живить слайди-відео, працює за тим самим патерном, що й reel-плеєр для Vue: на iOS відтворення триває між змінами слайдів і не потребує окремого жесту користувача на кожному.
Повний екран
Використовуйте useFullscreen from @reelkit/vue щоб стежити за станом повного екрана для елемента за посиланням або перемикати його. Вбудована кнопка повного екрана в Lightbox працює через той самий композабл.
<script setup lang="ts">
import { shallowRef } from 'vue';
import { useFullscreen } from '@reelkit/vue';
const containerRef = shallowRef<HTMLDivElement | null>(null);
const { isFullscreen, toggle } = useFullscreen({ elementRef: containerRef });
</script>
<template>
<div ref="containerRef">
<button @click="toggle">
{{ isFullscreen.value ? 'Exit fullscreen' : 'Enter fullscreen' }}
</button>
</div>
</template>Стан в URL
Подивитися демо наживо →Build a controller with useOverlayUrlState from @reelkit/vue і передайте його в LightboxUrlOverlay as controller, and the address bar owns the gallery: it opens itself when the parameter names a slide and closes when the parameter goes away. Links are shareable, and the back button closes the gallery. It is a separate component from LightboxOverlay, so each carries exactly one open-state driver — the is-open модель або url controller, never both.
Вбудовані клавіші
Слайди можна адресувати вбудованим ключем — розгорніть urlIndexKey (за позицією) або urlStableIdKey (за стабільним id) into the controller — both re-exported from @reelkit/vue. See the посібник зі стану в URL та API ядра.
«Назад» закриває лише тоді, коли ви відкрили галерею всередині застосунку — посилання додало запис, тож «назад» повертає до галереї. За надісланим посиланням у новій вкладці історії позаду немає, тож кнопка «назад» виведе із сайту; кнопка закриття або Escape прибирає параметр на місці й лишає вас у галереї.
<script setup lang="ts">
import { LightboxUrlOverlay, type LightboxItem } from '@reelkit/vue-lightbox';
import { useOverlayUrlState, urlIndexKey, urlStableIdKey } from '@reelkit/vue';
import '@reelkit/vue-lightbox/styles.css';
const props = defineProps<{ images: LightboxItem[] }>();
const photo = useOverlayUrlState({
param: 'photo',
...urlIndexKey(() => props.images.length),
});
</script>
<template>
<!-- Opening is a link — the href is the open action. No open flag, no
handler: the overlay reads the URL and opens itself. -->
<RouterLink v-for="(img, i) in props.images" :key="img.src" :to="`?photo=${i}`">
<img :src="img.src" />
</RouterLink>
<LightboxUrlOverlay :controller="photo" :items="props.images" />
</template>Композабл приймає один об’єкт опцій і повертає UrlStateController (with set, index, value). Keep it for programmatic control: set — низькорівневий запис, який оверлей робить усередині (зміна слайда та set(null) для закриття). Ним же можна керувати оверлеєм програмно: set(index) відкриває його — так само, як перехід за параметром. Але для відкриття краще звичайне посилання: href можна надіслати, відкрити в новій вкладці, а кнопка «назад» його закриє — і все це без жодного обробника.
Full useOverlayUrlState options (param, adapter, codec, locator): see the довіднику API для Vue.
LightboxUrlOverlay приймає лише :controller (обов’язково), @close emit, а також усі візуальні та поведінкові пропси, які передає далі LightboxOverlay forwards (items, transition-fn, the scoped slots, and so on) — but no is-open.
- Відкриття коштує одного запису в історії; гортання слайдів замінює його, тож сто свайпів не додають жодного — один крок назад завжди виходить із галереї.
- Надіслане посилання на кшталт
?photo=3відкриває галерею на цьому слайді. Параметр, який не називає жодного слайда, прибирається з URL, а не наполягає на слайді, що не відкриється.
У застосунку з роутером передайте адаптер. Прямий запис в історію лишає власне місцеположення роутера застарілим, і наступна навігація втрачає параметр.
<script setup lang="ts">
import { useVueRouterUrlAdapter } from '@reelkit/vue/vue-router-url-adapter';
const adapter = useVueRouterUrlAdapter();
const photo = useOverlayUrlState({
param: 'photo',
adapter,
...urlIndexKey(() => images.length),
});
</script>
<template>
<LightboxUrlOverlay :controller="photo" :items="images" />
</template>Стабільні посилання. Індекс адресує за позицією, тож закладка відкриє інше зображення, щойно список перевпорядкують. urlStableIdKey адресує за стабільним id, scanning the live list — one call covers the common case.
<script setup lang="ts">
const photo = useOverlayUrlState({
param: 'photo',
...urlStableIdKey({ items: () => images }),
});
</script>
<template>
<LightboxUrlOverlay :controller="photo" :items="images" />
</template>Pass hashCodec: base64UrlCodec щоб закодувати id в URL у base64url — оборотне маскування, а не криптографічний хеш.
Адресуєте за іншим полем ( slug), or page an infinite feed with locateAsync, and build the codec/locator самі: codec записує ідентичність в URL, locator знаходить, де воно тепер лежить.
<script setup lang="ts">
const photo = useOverlayUrlState({
param: 'photo',
codec: { decode: (raw) => raw, encode: (id) => id },
locator: {
locate: (id) => images.findIndex((x) => x.slug === id),
identify: (index) => images[index].slug,
},
});
</script>
<template>
<LightboxUrlOverlay :controller="photo" :items="images" />
</template>Нескінченні та посторінкові галереї. locate синхронний, тож відповідає лише за вже завантажені елементи — надіслане посилання на зображення 400 у стрічці, де завантажено 20, нічого не знайде. locateAsync — запасний варіант, що викликається лише коли не знайшлося: завантажте потрібні сторінки й поверніть індекс, який ця ідентичність отримала.
Shortcut
Keying by the item’s id? Не пишіть кодек і локатор вручну — передайте locateAsync просто в urlStableIdKey({ items, locateAsync }) (він вантажить дані, якщо не знайшов, і повертає індекс). Розгорнутий варіант нижче — для адресації за іншим полем або для повного контролю.
<script setup lang="ts">
const photo = useOverlayUrlState({
param: 'photo',
codec: { decode: (raw) => raw, encode: (id) => id },
locator: {
locate: (id) => items.value.findIndex((x) => x.id === id),
identify: (index) => items.value[index].id,
locateAsync: async (id) => {
const loaded = await loadById(id); // or loadUntil(id) — fetch just that one, or page up to it
if (!loaded) return null; // exhausted — link names no item
items.value = loaded; // commit; the overlay renders from this
return loaded.findIndex((x) => x.id === id); // wherever it landed
},
},
});
</script>
<template>
<LightboxUrlOverlay :controller="photo" :items="items" />
</template>Поки він у процесі, Lightbox лишається закритим, а параметр — недоторканим, тож пряме посилання переживає запит. null або відмова прибирає параметр. Відповідь, що приходить після зміни URL, після закриття або після демонтажу, відкидається, тож повільний запит не відкриє слайд, якого ніхто не просив. Те, що він повертає, є остаточним: це індекс щойно завантажених даних, і Lightbox бере його як є, не перечитуючи items, which Vue has not re-rendered yet.
Автоперехід
Задайте auto-advance, щоб галерея після відкриття гралася як слайдшоу. Типово вимкнено, тож наявний Lightbox рендериться й поводиться як раніше.
<script setup lang="ts">
import { ref } from 'vue';
import { LightboxOverlay, type LightboxApi } from '@reelkit/vue-lightbox';
const open = ref(false);
const lightbox = ref<LightboxApi | null>(null);
</script>
<template>
<LightboxOverlay
ref="lightbox"
v-model:is-open="open"
:items="items"
auto-advance
:auto-advance-interval="4000"
/>
<!-- The template ref drives it from outside: lightbox?.pause() -->
</template>- Зображення лишаються на екрані
auto-advance-interval(типово 5000 мс), відлічуваних із моменту, коли зображення завантажилося, тож повільне зображення ніколи не пропускається, перш ніж його хтось побачив. Для зображення, що не завантажилося, відлік іде від помилки. - Відео програються один раз замість циклу й переходять далі, коли закінчуються.
VideoSlideRendererробить це за вас; власний#slideчитаєautoAdvanceзі своєї області видимості й повідомляє про кінець черезonEnded. - Воно чекає, поки миша лежить на елементі керування (кнопці, посиланні чи підписі), під час свайпу і поки сторінка прихована, а потім продовжує з місця зупинки.
- Ручне перемикання (стрілки, клавіші, колесо, свайп) запускає інтервал нового слайда з нуля; слайдшоу лишається увімкненим.
- На останньому слайді воно зупиняється, якщо не задано
loop. Кнопка відтворення й паузи серед елементів керування показує стан і дає глядачеві його перемкнути;play()іpause()у LightboxApi роблять те саме з коду.
Власний слот #controls отримує isAutoAdvancing і, лише коли auto-advance увімкнено, onToggleAutoAdvance — рендерте PlayPauseButton, коли він є. Сам таймінг — це createSlideshowController з @reelkit/core; див. посібник з автовідтворення і API ядра.
Завантаження
Задайте show-download, щоб додати до елементів керування кнопку завантаження. Вона зберігає активний елемент за його downloadUrl, а якщо його немає — за src, під іменем downloadName, а якщо його немає — під останнім сегментом URL.
<script setup lang="ts">
import { ref } from 'vue';
import {
CloseButton,
DownloadButton,
LightboxOverlay,
type LightboxItem,
} from '@reelkit/vue-lightbox';
const open = ref(false);
const items: LightboxItem[] = [
{
src: 'https://cdn.example.com/beach-1600.jpg',
// Save the original rather than the resized preview
downloadUrl: 'https://cdn.example.com/beach-original.jpg',
downloadName: 'beach.jpg',
},
];
</script>
<template>
<LightboxOverlay v-model:is-open="open" :items="items" show-download>
<!-- A custom bar shows the buttons only when their handler is there -->
<template #controls="{ onClose, isDownloading, onDownload }">
<DownloadButton
v-if="onDownload"
:is-downloading="isDownloading"
:on-press="onDownload"
/>
<CloseButton :on-press="onClose" />
</template>
</LightboxOverlay>
</template>Файл завантажується через fetch і зберігається, бо браузер ігнорує атрибут download на посиланні на інше джерело й відкрив би файл замість збереження. Коли fetch не вдається — зазвичай це сервер на іншому джерелі, що не надсилає заголовків CORS, — файл відкривається в новій вкладці, де глядач усе ще може його зберегти. Віддавайте файли з Access-Control-Allow-Origin, щоб зберігати одним кліком. Поки триває завантаження, кнопка вимкнена.
Власний слот #controls отримує isDownloading і, лише коли show-download увімкнено, onDownload — рендерте DownloadButton, коли він є. Помічник — це downloadFile з @reelkit/core; див. посібник із завантаження.
Кнопки керування
| Компонент | Пропси | Опис |
|---|---|---|
PlayPauseButton | PlayPauseButtonProps: isPlaying, onPress, className? | Перемикач слайдшоу (іконка Play або Pause, aria-pressed під час відтворення). Стандартні елементи керування показують її з auto-advance. |
DownloadButton | DownloadButtonProps: isDownloading, onPress, className? | Кнопка завантаження, вимкнена, поки isDownloading. Стандартні елементи керування показують її з show-download. |
CloseButton | CloseButtonProps: onPress, className? | Стандартна кнопка закриття, яку рендерить панель керування; розмістіть її у власному слоті #controls, щоб зберегти вбудований вигляд. |
Counter | CounterProps: currentIndex, count, className? | Стандартна плашка лічильника «3 / 10»; розмістіть її у власному слоті #controls, щоб зберегти вбудований вигляд. |
FullscreenButton | FullscreenButtonProps: isFullscreen, onPress, className? | Стандартний перемикач повного екрана; його іконка йде за isFullscreen. |
SoundButton | SoundButtonProps: isMuted, onPress, className? | Стандартний перемикач звуку для відео-елементів; його іконка йде за isMuted. |
Частини слайда та навігації
| Компонент | Пропси | Опис |
|---|---|---|
ImageSlide | ImageSlideProps: src, alt?, isActive, onReady?, onLoadError? | Стандартний слайд-зображення, який рендерить оверлей; розмістіть його у власному слоті #slide, щоб зберегти вбудований вигляд для зображень. |
LightboxVideoSlide | LightboxVideoSlideProps: src, poster?, isActive, size, slideKey, loop?, onPlaying?, onWaiting?, onLoadError? | Стандартний слайд-віде о, що грає через спільний елемент <video>; useVideoSlideRenderer рендерить його за вас. |
LightboxNavigation | LightboxNavigationProps: activeIndex, count, loop?, onPrev, onNext | Стандартні стрілки «назад» і «вперед»; розмістіть їх у власному слоті #navigation, щоб зберегти вбудований вигляд. |
Довідник API
Пропси LightboxOverlay
LightboxOverlayProps
| Prop | Тип | Типове значення | Опис |
|---|---|---|---|
isOpen | boolean | required | Керує видимістю; якщо false, оверлей прибирається з DOM. Прив’язується через v-model:is-open. |
items | LightboxItem[] | required | Масив елементів (зображення або відео) |
initialIndex | number | 0 | Індекс початково видимого елемента, від нуля |
transitionFn | TransitionTransformFn | slideTransition | Функція переходу між слайдами. Імпортуйте вбудовану (slideTransition, flipTransition, lightboxFadeTransition, lightboxZoomTransition) або передайте власну. Якщо не задано, використовується slideTransition. |
showInfo | boolean | true | Чи показувати інформаційний оверлей із заголовком та описом |
showControls | boolean | true | Чи показувати верхню смугу керування (закриття, лічильник, повний екран) |
showNavigation | boolean | true | Чи показувати стрілки навігації вперед і назад (лише на десктопі) |
transitionDuration | number | 300 | Тривалість анімації слайда в мілісекундах |
swipeDistanceFactor | number | 0.12 | Мінімальна частка відстані свайпу (0–1), щоб змінити слайд |
swipeToCloseDirection | 'up' | 'down' | 'up' | Напрямок жесту свайпу для закриття на мобільних |
loop | boolean | false | Чи переходить слайдер з останнього слайда на перший |
enableNavKeys | boolean | true | Вмикає навігацію стрілками клавіатури |
enableWheel | boolean | true | Вмикає навігацію колесом миші |
wheelDebounceMs | number | 200 | Тривалість дебаунсу подій кол еса в мілісекундах |
autoAdvance | boolean | false | Грати галерею як слайдшоу. Див. Автоперехід. |
autoAdvanceInterval | number | 5000 | Скільки кожне зображення лишається на екрані під час слайдшоу, у мілісекундах, з моменту його завантаження |
showDownload | boolean | false | Додає кнопку завантаження для активного елемента. Див. Завантаження. |
ariaLabel | string | 'Image gallery' | Доступна назва області діалогу |
Пропси LightboxUrlOverlay
LightboxUrlOverlayProps
Прий має всі візуальні та поведінкові пропси вище, крім is-open, and replaces it with a controller. Він видає close, slide-change та api-ready, but no update:is-open. initial-index тут ігнорується — слайд обирає position контролера, тож передане поруч значення перезаписувалося б на кожному відкритті.
| Prop | Тип | Типове значення | Опис |
|---|---|---|---|
controller | UrlStateController | required | Контролер із useOverlayUrlState. Його position вирішує, чи оверлей відкритий і який слайд показує; оверлей записує через нього назад на зміну слайда та на закриття. |
Події LightboxOverlay
| Event | Payload | Опис |
|---|---|---|
close | void | Видається, коли користувач закриває Lightbox |
slide-change | number | Видається з новим індексом активного слайда після зміни |
api-ready | LightboxApi | Видається, коли слайдер готовий, і відкриває імперативний API |
update:is-open | boolean | Видається на закриття; забезпечує роботу v-model:is-open |
LightboxApi
Об'єкт, який видає api-ready; він же доступний через template ref компонента. Слайдер існує лише поки оверлей відкритий, тож кожен метод слайдера нічого не робить, поки він закритий; close() працює завжди.
| Метод | Тип | Опис |
|---|---|---|
next() | () => void | Переходить до наступного слайда з анімацією. Лишається на останньому слайді, якщо loop вимкнено. |
prev() | () => void | Повертається до попереднього слайда з анімацією. Лишається на першому слайді, якщо loop вимкнено. |
goTo(index, animate?) | (number, boolean?) => Promise<void> | Переходить до слайда. index обмежується кількістю елементів, animate типово false. Завершується, коли рух закінчено. |
adjust() | () => void | Перераховує позицію слайда після зміни розкладки, якої оверлей сам не помітив |
observe() | () => void | Знову починає слухати жести, клавіатуру та колесо миші після unobserve() |
unobserve() | () => void | Перестає слухати жести, клавіатуру та колесо миші; слайди лишаються на місці |
close() | () => void | Закриває lightbox, як кнопка закриття або Escape |
play() | () => void | Запускає слайдшоу, продовжуючи активний слайд з місця зупинки. Без auto-advance нічого не робить. |
pause() | () => void | Зупиняє слайдшоу; активний слайд зберігає свій прогрес. Без auto-advance нічого не робить. |
Інтерфейс LightboxItem
| Field | Тип | Required | Опис |
|---|---|---|---|
src | string | yes | URL зображення або відео |
type | 'image' | 'video' | no | Тип елемента. Типово 'image' |
poster | string | no | Мініатюра для елементів-відео |
title | string | no | Заголовок в інформаційному оверлеї |
description | string | no | Опис під заголовком |
width | number | no | Власна ширина зображення в пікселях |
height | number | no | Власна висота зображення в пікселях |
downloadUrl | string | no | Що зберігає кнопка завантаження. Типово — src |
downloadName | string | no | Ім’я файлу для збереження. Типово — останній сегмент шляху URL |
Типи області видимості слотів
| Тип | Fields |
|---|---|
SlideSlotScope | { item, index, size: [number, number], isActive, autoAdvance, onReady, onWaiting, onError, onEnded } |
ControlsSlotScope | { item, activeIndex, count, isFullscreen, isAutoAdvancing, isDownloading, onClose, onToggleFullscreen, onToggleAutoAdvance?, onDownload? } |
NavigationSlotScope | { item, activeIndex, count, onPrev, onNext } |
InfoSlotScope | { item, index } |
LoadingSlotScope | { item, activeIndex } |
ErrorSlotScope | { item, activeIndex } |
Переходи
Передайте будь-яку TransitionTransformFn via the transition-fn Якщо імпортувати лише той перехід, який використовуєте, решту збирач прибере через tree-shaking. Типово — slideTransition , коли не задано.
| Function | Опис |
|---|---|
slideTransition | Типовий. Горизонтальний зсув між слайдами; реекспортовано з @reelkit/vue. |
lightboxFadeTransition | Плавне перетікання з легким горизонтальним зсувом. Власний для @reelkit/vue-lightbox. |
flipTransition | 3D-переворот навколо осі Y; реекспортовано з @reelkit/vue. |
lightboxZoomTransition | Новий слайд масштабується з 70% до 100% із затуханням. Власний для @reelkit/vue-lightbox. |
<script setup lang="ts">
import {
LightboxOverlay,
lightboxFadeTransition,
lightboxZoomTransition,
} from '@reelkit/vue-lightbox';
</script>
<template>
<!-- Built-in transition -->
<LightboxOverlay
v-model:is-open="open"
:items="items"
:transition-fn="lightboxFadeTransition"
/>
<!-- Different built-in -->
<LightboxOverlay
v-model:is-open="open"
:items="items"
:transition-fn="lightboxZoomTransition"
/>
</template>Завантаження вмісту та обробка помилок
Коли ви берете рендеринг на себе через слот #slide , в області слота доступні три колбеки життєвого циклу, щоб повідомляти стан завантаження. Lightbox стежить за станом кожного слайда й показує індикатор або значок помилки. Попереднє завантаження кешує зіпсовані URL, тож повторний перехід до невдалого слайда обходиться без нової спроби.
Колбеки життєвого циклу
| Колбек | Тип | Опис |
|---|---|---|
onReady | () => void | Повідомляє, що вміст слайда успішно завантажився (наприклад, зображення декодовано) |
onWaiting | () => void | Повідомляє, що вміст слайда вантажиться або буферизується (показує індикатор) |
onError | () => void | Повідомляє, що вміст слайда не завантажився (показує значок помилки) |
Підключення колбеків у #slide
<template>
<LightboxOverlay v-model:is-open="open" :items="items">
<template
#slide="{ item, size, isActive, onReady, onWaiting, onError }"
>
<template v-if="item.type === 'video'">
<video
:src="item.src"
:poster="item.poster"
:autoplay="isActive"
:style="{ width: `${size[0]}px`, height: `${size[1]}px`, objectFit: 'contain' }"
@canplay="onReady"
@waiting="onWaiting"
@error="onError"
/>
</template>
<template v-else>
<img
:src="item.src"
:style="{ width: `${size[0]}px`, height: `${size[1]}px`, objectFit: 'contain' }"
@load="onReady"
@error="onError"
/>
</template>
</template>
</LightboxOverlay>
</template>Власний слот завантаження
Скористайтеся пропсом #loading щоб замінити стандартний індикатор.
<template>
<LightboxOverlay v-model:is-open="open" :items="items">
<template #loading="{ item, activeIndex }">
<div class="my-loading">
<span>Loading image {{ activeIndex + 1 }}…</span>
<span class="muted">{{ item.title }}</span>
</div>
</template>
</LightboxOverlay>
</template>Власний слот помилки
Скористайтеся пропсом #error щоб замінити стандартний значок зіпсованого зображення.
<template>
<LightboxOverlay v-model:is-open="open" :items="items">
<template #error="{ item, activeIndex }">
<div class="my-error">
<span>Failed to load</span>
<span class="muted">{{ item.title ?? item.src }}</span>
</div>
</template>
</LightboxOverlay>
</template>Класи CSS
Усі класи CSS звичайні (не scoped), тож їх можна перекри ти селекторами вищої специфічності в таблиці стилів, підключеній після @reelkit/vue-lightbox/styles.css. Для змін кольору, розміру та z-index краще беріть власні властивості CSS, описані в розділі Theming нижче.
| Class | Component | Опис |
|---|---|---|
.rk-lightbox-overlay | Overlay | Кореневий контейнер (повноекранне тло) |
.rk-lightbox-top-shade | Overlay | Верхній градієнтний шар за елементами керування |
.rk-lightbox-spinner | Overlay | Стандартний індикатор завантаження |
.rk-lightbox-error | Overlay | Контейнер стану помилки (зіпсоване зображення) |
.rk-lightbox-error-text | Overlay | Текст стану помилки |
.rk-lightbox-controls-left | Controls | Контейнер елементів керування вгорі ліворуч |
.rk-lightbox-btn | Controls | Кнопка керування (повний екран, звук тощо) |
.rk-lightbox-play-pause | Controls | Кнопка відтворення й паузи слайдшоу (разом із .rk-lightbox-btn) |
.rk-lightbox-download | Controls | Кнопка завантаження (разом із .rk-lightbox-btn) |
.rk-lightbox-close | Controls | Кнопка закриття |
.rk-lightbox-counter | Controls | Значок лічильника зображень |
.rk-lightbox-nav | Навігація | Стрілка навігації (і вперед, і назад) |
.rk-lightbox-nav-prev | Навігація | Стрілка назад |
.rk-lightbox-nav-next | Навігація | Стрілка вперед |
.rk-lightbox-info | Info | Контейнер заголовка й опису |
.rk-lightbox-info-title | Info | Заголовок зображення |
.rk-lightbox-info-description | Info | Опис зображення |
.rk-lightbox-slide | Slide | Контейнер слайда |
.rk-lightbox-img | Slide | Елемент зображення |
.rk-lightbox-video-container | VideoSlide | Контейнер слайда-відео (за бажанням) |
.rk-lightbox-video-element | VideoSlide | Елемент відео (за бажанням) |
.rk-lightbox-video-poster | VideoSlide |