Lightbox для Angular

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

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

Features

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

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

bash
Icons
Стандартні елементи керування використовують lucide-angular for icons. If you prefer a different icon library, use the rkLightboxControls та rkLightboxNavigation щоб передати власні.

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

Імпортуйте стилі та автономний компонент RkLightboxOverlayComponent у imports array.

gallery.component.ts

Шаблонні слоти

Чотири директиви шаблонних слотів дають повністю налаштувати інтерфейс оверлея, не форкаючи компонент. Кожен слот отримує строго типізований об’єкт контексту.

DirectiveТип контекстуОпис
[rkLightboxControls]LightboxControlsContextЗамінює верхню смугу керування (кнопка закриття, лічильник, перемикач повного екрана)
[rkLightboxNavigation]LightboxNavContextЗамінює стрілки навігації вперед і назад
[rkLightboxInfo]LightboxInfoContextЗамінює нижній градієнтний оверлей із заголовком та описом
[rkLightboxSlide]LightboxSlideContextЗамінює вміст окремого слайда (обов’язково для слайдів-відео)
[rkLightboxLoading]{ $implicit: activeIndex, item }Власний індикатор завантаження
[rkLightboxError]{ $implicit: activeIndex, item }Власний індикатор помилки
typescript

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

Слайди-відео вмикаються через шаблонний слот rkLightboxSlide та RkLightboxVideoSlideComponent. Так відеоплеєр не потрапляє в бандл галерей, яким потрібні лише зображення.

typescript

Повний екран

Використовуйте fullscreenSignal, requestFullscreen, та exitFullscreen from @reelkit/angular щоб стежити за станом повного екрана або перемикати його.

typescript

Стан в URL

RkLightboxUrlOverlayComponent — окремий компонент, стан відкриття якого живе в адресному рядку. Побудуйте контролер через createOverlayUrlState і передайте його як [controller]: галерея відкривається сама, коли параметр називає слайд, і закривається, коли параметр зникає. Посиланнями можна ділитися, а кнопка «назад» закриває галерею, а не виводить зі сторінки.

Вбудовані клавіші
Слайди можна адресувати вбудованим ключем — розгорніть urlIndexKey (за позицією) або urlStableIdKey (за стабільним id) into the controller — both re-exported from @reelkit/angular. See the посібник зі стану в URL та API ядра.
typescript

Викликайте його в контексті впровадження — в ініціалізаторі поля або в конструкторі. Він під’єднується одразу й звільняється через DestroyRef, so a component destroyed while the gallery is open leaves no listener behind. Full options live in the довіднику API для Angular.

  • Відкриття додає один запис в історію. Гортання слайдів замінює його, тож N кроків не додають записів, і один крок назад завжди виводить із галереї.
  • «Назад» закриває лише тоді, коли галерею відкрили всередині застосунку — посилання додало запис. За надісланим посиланням у новій вкладці історії позаду немає, тож кнопка «назад» виведе із сайту; кнопка ✕ або Escape прибирає параметр на місці й лишає вас на сторінці.
  • Параметр, який не називає жодного слайда — застаріла закладка, змінене вручну значення, — прибирається з URL, а не лишається наполягати на слайді, що не відкриється.
  • Шаблонні слоти працюють без змін: url-компонент сам виконує шість запитів слотів і передає кожен шаблон у галерею, тож rkLightboxControls та сусідні директиви живуть усередині нього точно так само, як усередині rk-lightbox-overlay.
  • У застосунку з роутером передайте адаптер на базі Router. Запис в історію повз Router лишає його місцеположення застарілим, і наступна навігація втрачає параметр.

У застосунку з роутером передайте адаптер. Запис в історію повз Router лишає його місцеположення застарілим, і наступна навігація втрачає параметр, тож збудуйте адаптер на базі Router and pass it as adapter:

typescript

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

typescript

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

Адресуєте за іншим полем ( slug), or page an infinite feed with locateAsync, and build the codec (формат передавання) та locator (пошук) самі:

typescript

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

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

Входи RkLightboxUrlOverlayComponent

Приймає всі входи rk-lightbox-overlay except isOpen, replaced by a controller. Outputs are the same closed та slideChange; the URL drives closing, so closed тут радше сповіщення, ніж механізм.

InputТипТипове значенняОпис
controllerUrlStateControllerrequiredКонтролер із createOverlayUrlState. Його position вирішує, чи галерея відкрита і який слайд показує; компонент записує через нього назад на зміну слайда та на закриття.

Входи RkLightboxOverlayComponent

InputТипТипове значенняОпис
isOpenbooleanrequiredКерує видимістю; якщо false, оверлей прибирається з DOM
itemsLightboxItem[]requiredМасив елементів Lightbox (зображення або відео)
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'Доступна назва області діалогу

Виходи RkLightboxOverlayComponent

OutputТипОпис
closedEventEmitter<void>Видається, коли користувач закриває Lightbox
slideChangeEventEmitter<number>Видається, коли змінюється індекс активного слайда

Інтерфейс LightboxItem

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

Типи контексту шаблонних слотів

ТипFields
LightboxControlsContext{ item, onClose, activeIndex, count, isFullscreen, onToggleFullscreen }
LightboxNavContext{ item, onPrev, onNext, activeIndex, count }
LightboxInfoContext{ $implicit: LightboxItem, index }
LightboxSlideContext{ $implicit: LightboxItem, index, size: [number, number], isActive, onReady, onWaiting, onError }

Переходи

Передайте будь-яку TransitionTransformFn via the transitionFn . Якщо імпортувати лише той перехід, який використовуєте, решту збирач прибере через tree-shaking. Типово — slideTransition , коли не задано.

FunctionFromОпис
slideTransition@reelkit/angular-lightboxЗвичайний горизонтальний зсув (типово)
lightboxFadeTransition@reelkit/angular-lightboxПлавне перетікання між зображеннями
flipTransition@reelkit/angular-lightboxЕфект 3D-перевороту картки
lightboxZoomTransition@reelkit/angular-lightboxНаближення від меншого до звичайного розміру
typescript

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

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

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

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

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

html

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

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

html

Власний шаблон помилки

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

html

Класи CSS

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

ClassComponentОпис
.rk-lightbox-overlayOverlayКореневий контейнер (повноекранне тло)
.rk-lightbox-top-shadeOverlayВерхній градієнтний шар за елементами керування
.rk-lightbox-spinnerOverlayСтандартний індикатор завантаження
.rk-lightbox-img-errorOverlayКонтейнер стану помилки (зіпсоване зображення)
.rk-lightbox-img-error-textOverlayТекст стану помилки
.rk-lightbox-swipe-hintOverlayПідказка про свайп на мобільних
.rk-lightbox-emptyOverlayТекст порожнього стану
.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-titleInfoЗаголовок зображення
.rk-lightbox-descriptionInfoОпис зображення
.rk-lightbox-slideSlideКонтейнер слайда
.rk-lightbox-imgSlideЕлемент зображення
.rk-lightbox-video-containerVideoSlideКонтейнер слайда-відео (за бажанням)
.rk-lightbox-video-elementVideoSlideЕлемент відео (за бажанням)
.rk-lightbox-video-posterVideoSlideПостер відео (за бажанням)
.rk-lightbox-video-errorVideoSlideКонтейнер стану помилки відео

Theming

Кожен колір, розмір, z-index і перехід живе у власній властивості CSS. Перевизначайте одну чи кілька на :root (або на будь-якому предку Lightbox), щоб змінити тему, не чіпаючи код компонентів. Токени збігаються з Lightbox для React, тож перевизначення переносяться між прив’язками.

TokenТипове значенняControls
--rk-lightbox-overlay-bg#000Full-screen backdrop color
--rk-lightbox-overlay-z9999Overlay z-index
--rk-lightbox-top-shade-height80pxTop gradient scrim height
--rk-lightbox-top-shade-bglinear-gradient(rgba(0,0,0,0.6), transparent)Top gradient scrim color
--rk-lightbox-edge-padding16pxEdge inset for close / nav / top-left controls
--rk-lightbox-controls-gap12pxGap between top-left controls
--rk-lightbox-transition0.2sButton hover transition duration
--rk-lightbox-blur8pxBackdrop blur radius for buttons / chips
--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-fg#fffCounter text color
--rk-lightbox-counter-bgrgba(0, 0, 0, 0.5)Counter chip background
--rk-lightbox-counter-size14pxCounter font size
--rk-lightbox-counter-padding6px 12pxCounter chip padding
--rk-lightbox-counter-radius20pxCounter chip border-radius
--rk-lightbox-spinner-size28pxDefault spinner width/height
--rk-lightbox-spinner-duration0.8sSpinner rotation duration
--rk-lightbox-error-fgrgba(255, 255, 255, 0.4)Error icon + text color
--rk-lightbox-info-bglinear-gradient(transparent, rgba(0,0,0,0.8))Caption scrim gradient
--rk-lightbox-info-padding24pxCaption inner padding
--rk-lightbox-title-size18pxTitle font size
--rk-lightbox-description-size14pxDescription font size
--rk-lightbox-hint-fgrgba(255, 255, 255, 0.5)Swipe hint text color
--rk-lightbox-hint-bgrgba(0, 0, 0, 0.3)Swipe hint chip background
--rk-lightbox-video-bg#000Letterbox background behind <video>

Вставте фрагмент нижче в таблицю стилів, підключену після @reelkit/angular-lightbox/styles.css.

css

Accessibility

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

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

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

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