Lightbox для Vue

Повноекранний Lightbox-галерея зображень і відео для Vue 3 на основі @reelkit/vue-lightbox.

Подивитися демо наживо →

Features

Зображення та відео
Вбудована підтримка слайдів-відео
Дотикові жести
Свайп для гортання
Свайп для закриття
Свайп угору закриває
Навігація з клавіатури
Стрілки + Escape
Повний екран
Кросбраузерний API
Переходи
Зсув, затухання, переворот, наближення
Preloading
±2 сусідні слайди завантажуються заздалегідь
Перемикач звуку
Звук вмикається й вимикається для кожного слайда
Стани завантаження
Індикатор і власний слот
Обробка помилок
Значок помилки та власний слот
Слоти з областю видимості
6 налаштовних зон-слотів
v-model
Двостороння прив’язка v-model:is-open
Стан в URL
Посилання, якими можна ділитися й зберігати в закладки

Встановлення

bash

Не забудьте імпортувати стилі:

typescript
Icons
Стандартні елементи керування використовують lucide-vue-next for icons. If you prefer a different icon library, use the #controls та #navigation з областю видимості, щоб передати власні.

Базове використання

Імпортуйте таблицю стилів і компонент LightboxOverlay , а відкриттям і закриттям керуйте через v-model:is-open.

App.vue

Слоти з областю видимості

Шість іменованих слотів з областю видимості дають повністю налаштувати поверхні оверлея. Не задавайте слот, щоб лишити вбудований типовий вигляд; залиште слот порожнім (наприклад, через v-if="false") to hide that section entirely.

SlotScopeОпис
#slideSlideSlotScopeЗамінює вміст окремого слайда (обов’язково для слайдів-відео)
#controlsControlsSlotScopeЗамінює верхню смугу керування (закриття, лічильник, повний екран)
#navigationNavigationSlotScopeЗамінює стрілки навігації вперед і назад
#infoInfoSlotScopeЗамінює нижній градієнтний оверлей із заголовком та описом
#loadingLoadingSlotScopeВласний індикатор завантаження
#errorErrorSlotScopeВласний індикатор помилки
vue

Підтримка відео

Слайди-відео вмикаються за бажанням, тож типовий бандл лишається без обв’язки для аудіо та відео. Викличте useVideoSlideRenderer(items) і передайте повернені VideoSlideRenderer / VideoControlsRenderer в слоти оверлея #slide та #controls . Загорніть оверлей у повернений SoundProvider щоб вбудований перемикач звуку мав контекст.

vue
Спільний елемент <video> що живить слайди-відео, працює за тим самим патерном, що й reel-плеєр для Vue: на iOS відтворення триває між змінами слайдів і не потребує окремого жесту користувача на кожному.

Повний екран

Використовуйте useFullscreen from @reelkit/vue щоб стежити за станом повного екрана для елемента за посиланням або перемикати його. Вбудована кнопка повного екрана в Lightbox працює через той самий композабл.

vue

Стан в 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 прибирає параметр на місці й лишає вас у галереї.

vue

Композабл приймає один об’єкт опцій і повертає 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, а не наполягає на слайді, що не відкриється.

У застосунку з роутером передайте адаптер. Прямий запис в історію лишає власне місцеположення роутера застарілим, і наступна навігація втрачає параметр.

vue

Стабільні посилання. Індекс адресує за позицією, тож закладка відкриє інше зображення, щойно список перевпорядкують. urlStableIdKey адресує за стабільним id, scanning the live list — one call covers the common case.

vue

Pass hashCodec: base64UrlCodec щоб закодувати id в URL у base64url — оборотне маскування, а не криптографічний хеш.

Адресуєте за іншим полем ( slug), or page an infinite feed with locateAsync, and build the codec/locator самі: codec записує ідентичність в URL, locator знаходить, де воно тепер лежить.

vue

Нескінченні та посторінкові галереї. locate синхронний, тож відповідає лише за вже завантажені елементи — надіслане посилання на зображення 400 у стрічці, де завантажено 20, нічого не знайде. locateAsync — запасний варіант, що викликається лише коли не знайшлося: завантажте потрібні сторінки й поверніть індекс, який ця ідентичність отримала.

Shortcut
Keying by the item’s id? Не пишіть кодек і локатор вручну — передайте locateAsync просто в urlStableIdKey({ items, locateAsync }) (він вантажить дані, якщо не знайшов, і повертає індекс). Розгорнутий варіант нижче — для адресації за іншим полем або для повного контролю.
vue

Поки він у процесі, Lightbox лишається закритим, а параметр — недоторканим, тож пряме посилання переживає запит. null або відмова прибирає параметр. Відповідь, що приходить після зміни URL, після закриття або після демонтажу, відкидається, тож повільний запит не відкриє слайд, якого ніхто не просив. Те, що він повертає, є остаточним: це індекс щойно завантажених даних, і Lightbox бере його як є, не перечитуючи items, which Vue has not re-rendered yet.

Довідник API

Пропси LightboxOverlay

LightboxOverlayProps

PropТипТипове значенняОпис
isOpenbooleanrequiredКерує видимістю; якщо false, оверлей прибирається з DOM. Прив’язується через v-model:is-open.
itemsLightboxItem[]requiredМасив елементів (зображення або відео)
initialIndexnumber0Індекс початково видимого елемента, від нуля
transitionFnTransitionTransformFnslideTransitionФункція переходу між слайдами. Імпортуйте вбудовану (slideTransition, flipTransition, lightboxFadeTransition, lightboxZoomTransition) або передайте власну. Якщо не задано, використовується slideTransition.
showInfobooleantrueЧи показувати інформаційний оверлей із заголовком та описом
showControlsbooleantrueЧи показувати верхню смугу керування (закриття, лічильник, повний екран)
showNavigationbooleantrueЧи показувати стрілки навігації вперед і назад (лише на десктопі)
transitionDurationnumber300Тривалість анімації слайда в мілісекундах
swipeDistanceFactornumber0.12Мінімальна частка відстані свайпу (0–1), щоб змінити слайд
swipeToCloseDirection'up' | 'down''up'Напрямок жесту свайпу для закриття на мобільних
loopbooleanfalseЧи переходить слайдер з останнього слайда на перший
enableNavKeysbooleantrueВмикає навігацію стрілками клавіатури
enableWheelbooleantrueВмикає навігацію колесом миші
wheelDebounceMsnumber200Тривалість дебаунсу подій колеса в мілісекундах
ariaLabelstring'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ТипТипове значенняОпис
controllerUrlStateControllerrequiredКонтролер із useOverlayUrlState. Його position вирішує, чи оверлей відкритий і який слайд показує; оверлей записує через нього назад на зміну слайда та на закриття.

Події LightboxOverlay

EventPayloadОпис
closevoidВидається, коли користувач закриває Lightbox
slide-changenumberВидається з новим індексом активного слайда після зміни
api-readyLightboxApiВидається, коли слайдер готовий, і відкриває імперативний API
update:is-openbooleanВидається на закриття; забезпечує роботу v-model:is-open

Інтерфейс LightboxItem

FieldТипRequiredОпис
srcstringyesURL зображення або відео
type'image' | 'video'noТип елемента. Типово 'image'
posterstringnoМініатюра для елементів-відео
titlestringnoЗаголовок в інформаційному оверлеї
descriptionstringnoОпис під заголовком
widthnumbernoВласна ширина зображення в пікселях
heightnumbernoВласна висота зображення в пікселях

Типи області видимості слотів

ТипFields
SlideSlotScope{ item, index, size: [number, number], isActive, onReady, onWaiting, onError }
ControlsSlotScope{ item, activeIndex, count, isFullscreen, onClose, onToggleFullscreen }
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.
flipTransition3D-переворот навколо осі Y; реекспортовано з @reelkit/vue.
lightboxZoomTransitionНовий слайд масштабується з 70% до 100% із затуханням. Власний для @reelkit/vue-lightbox.
vue

Завантаження вмісту та обробка помилок

Коли ви берете рендеринг на себе через слот #slide , в області слота доступні три колбеки життєвого циклу, щоб повідомляти стан завантаження. Lightbox стежить за станом кожного слайда й показує індикатор або значок помилки. Попереднє завантаження кешує зіпсовані URL, тож повторний перехід до невдалого слайда обходиться без нової спроби.

Колбеки життєвого циклу

КолбекТипОпис
onReady() => voidПовідомляє, що вміст слайда успішно завантажився (наприклад, зображення декодовано)
onWaiting() => voidПовідомляє, що вміст слайда вантажиться або буферизується (показує індикатор)
onError() => voidПовідомляє, що вміст слайда не завантажився (показує значок помилки)

Підключення колбеків у #slide

vue

Власний слот завантаження

Скористайтеся пропсом #loading щоб замінити стандартний індикатор.

vue

Власний слот помилки

Скористайтеся пропсом #error щоб замінити стандартний значок зіпсованого зображення.

vue

Класи CSS

Усі класи CSS звичайні (не scoped), тож їх можна перекрити селекторами вищої специфічності в таблиці стилів, підключеній після @reelkit/vue-lightbox/styles.css. Для змін кольору, розміру та z-index краще беріть власні властивості CSS, описані в розділі Theming нижче.

ClassComponentОпис
.rk-lightbox-overlayOverlayКореневий контейнер (повноекранне тло)
.rk-lightbox-top-shadeOverlayВерхній градієнтний шар за елементами керування
.rk-lightbox-spinnerOverlayСтандартний індикатор завантаження
.rk-lightbox-errorOverlayКонтейнер стану помилки (зіпсоване зображення)
.rk-lightbox-error-textOverlayТекст стану помилки
.rk-lightbox-controls-leftControlsКонтейнер елементів керування вгорі ліворуч
.rk-lightbox-btnControlsКнопка керування (повний екран, звук тощо)
.rk-lightbox-closeControlsКнопка закриття
.rk-lightbox-counterControlsЗначок лічильника зображень
.rk-lightbox-navНавігаціяСтрілка навігації (і вперед, і назад)
.rk-lightbox-nav-prevНавігаціяСтрілка назад
.rk-lightbox-nav-nextНавігаціяСтрілка вперед
.rk-lightbox-infoInfoКонтейнер заголовка й опису
.rk-lightbox-info-titleInfoЗаголовок зображення
.rk-lightbox-info-descriptionInfoОпис зображення
.rk-lightbox-slideSlideКонтейнер слайда
.rk-lightbox-imgSlideЕлемент зображення
.rk-lightbox-video-containerVideoSlideКонтейнер слайда-відео (за бажанням)
.rk-lightbox-video-elementVideoSlideЕлемент відео (за бажанням)
.rk-lightbox-video-posterVideoSlideПостер відео (за бажанням)

Theming

Перевизначайте будь-яку власну властивість CSS --rk-lightbox-* на :root (або на будь-якому предку .rk-lightbox-overlay) to retheme. Direct declarations on .rk-lightbox-overlay перекрив би успадковані значення, тож тримайте перевизначення на селекторі предка.

TokenТипове значенняControls
--rk-lightbox-overlay-bg#000Backdrop color
--rk-lightbox-overlay-z9999Overlay z-index
--rk-lightbox-top-shade-height80pxTop scrim height
--rk-lightbox-top-shade-bglinear-gradient(rgba(0,0,0,0.6), transparent)Top scrim gradient
--rk-lightbox-edge-padding16pxEdge inset for close / nav / controls
--rk-lightbox-btn-bgrgba(0, 0, 0, 0.5)Default background for close / nav / small buttons
--rk-lightbox-btn-bg-hoverrgba(255, 255, 255, 0.2)Hover background for close / nav / small buttons
--rk-lightbox-btn-fg#fffIcon color for close / nav / small buttons
--rk-lightbox-btn-size36pxSmall button size (fullscreen toggle, etc.)
--rk-lightbox-close-size40pxClose button size
--rk-lightbox-nav-size48pxPrev / next arrow size
--rk-lightbox-nav-opacity0.7Idle opacity of prev / next arrows
--rk-lightbox-counter-bgrgba(0, 0, 0, 0.5)Counter chip background
--rk-lightbox-counter-fg#fffCounter text color
--rk-lightbox-info-bglinear-gradient(transparent, rgba(0,0,0,0.8))Caption scrim gradient
--rk-lightbox-title-size18pxTitle font size
--rk-lightbox-description-size14pxDescription font size
--rk-lightbox-video-bg#000Letterbox background behind <video>
css

Accessibility

Корінь оверлея — модальний діалог (role="dialog", aria-modal="true"). Set the aria-label щоб змінити оголошення для екранного читача; типове значення — «Image gallery». Кожен слайд несе role="group", aria-roledescription="slide", and an aria-label виведений із позиції (наприклад, «Зображення 2 з 5»).

Lightbox захоплює фокус під час відкриття й повертає його на елемент-тригер після закриття. Tab і Shift+Tab циклічно проходять фокусовані елементи всередині; фокус, що вислизнув (клік поза Lightbox, програмна установка), повертається назад. Реалізовано через captureFocusForReturn та createFocusTrap from @reelkit/vue.

Клавіатурні скорочення

KeyAction
ArrowLeftPrevious image
ArrowRightNext image
EscapeClose lightbox (or exit fullscreen if active)