Featherlight — это легковесная библиотека для создания модальных окон
на чистом JavaScript и jQuery. Несмотря на то, что React использует
собственную систему рендеринга компонентов, Featherlight можно
интегрировать, используя прямое обращение к DOM через
useEffect и ссылки (ref).
Подключение включает следующие шаги:
npm install jquery featherlight
import $ from 'jquery';
import 'featherlight';
import 'featherlight/dist/featherlight.min.css';
import { useRef, useEffect } from 'react';
function ModalExample() {
const modalRef = useRef(null);
useEffect(() => {
if (modalRef.current) {
$(modalRef.current).featherlight({
// Настройки можно задать здесь
});
}
}, []);
return (
<button ref={modalRef}>Открыть модальное окно</button>
);
}
Использование ref позволяет Featherlight работать с
конкретным элементом, избегая конфликтов с виртуальным DOM React.
Featherlight предоставляет обширный набор опций, которые позволяют управлять внешним видом, поведением и анимацией модальных окон:
true по умолчанию).Esc.true, модальное окно
сохраняется в DOM между открытиями, что полезно для динамического
контента.Пример конфигурации:
$(modalRef.current).featherlight({
target: '#myContent',
closeIcon: '✕',
closeOnClick: 'background',
afterOpen: function() {
console.log('Модальное окно открыто');
}
});
Featherlight хорошо работает с динамическим контентом, что важно для React-приложений, где состояние компонента может меняться.
const modalContent = (
<div>
<h2>Динамический заголовок</h2>
<p>Содержимое формируется на основе состояния компонента.</p>
</div>
);
function openModal() {
$.featherlight(modalContent);
}
$.featherlight({
ajax: '/api/modal-content',
loading: 'Загрузка...'
});
Это позволяет интегрировать модальные окна с серверным контентом без перезагрузки страницы.
Чтобы синхронизировать открытие модального окна с состоянием React, рекомендуется использовать хуки:
import { useState, useRef, useEffect } from 'react';
function StatefulModal() {
const [isOpen, setIsOpen] = useState(false);
const modalRef = useRef(null);
useEffect(() => {
if (isOpen && modalRef.current) {
$.featherlight(modalRef.current, {
afterClose: () => setIsOpen(false)
});
}
}, [isOpen]);
return (
<>
<button onCl ick={() => setIsOpen(true)}>Открыть окно</button>
<div ref={modalRef} style={{ display: 'none' }}>
<h3>Состояние: {isOpen ? 'Открыто' : 'Закрыто'}</h3>
</div>
</>
);
}
Такой подход гарантирует, что состояние React и отображение модального окна остаются синхронизированными.
Featherlight позволяет легко настраивать анимации и стили через CSS и встроенные опции:
featherlight-open и
featherlight-close классы для создания эффектов..featherlight и
.featherlight-content в CSS.Пример кастомного CSS:
.featherlight {
background-color: rgba(0, 0, 0, 0.8);
border-radius: 10px;
}
.featherlight-content {
padding: 20px;
max-width: 600px;
}
Featherlight можно применять для отображения форм, галерей изображений и интерактивного контента, встроенного в React-компоненты. Для этого важно:
featherlight.afterOpen и afterClose для
инициализации сторонних библиотек (например, слайдеров или
графиков).function FormModal() {
const modalRef = useRef(null);
useEffect(() => {
$(modalRef.current).featherlight({
afterOpen: () => console.log('Форма готова к заполнению'),
afterClose: () => console.log('Форма закрыта')
});
}, []);
return (
<div ref={modalRef} style={{ display: 'none' }}>
<form>
<input type="text" placeholder="Имя" required />
<button type="submit">Отправить</button>
</form>
</div>
);
}
function GalleryModal({ images }) {
const modalRef = useRef(null);
useEffect(() => {
$(modalRef.current).featherlight({
afterOpen: function() {
let index = 0;
const content = this.$content;
content.html(`<img src="${images[index]}" />`);
content.on('click', () => {
index = (index + 1) % images.length;
content.find('img').attr('src', images[index]);
});
}
});
}, [images]);
return <button ref={modalRef}>Открыть галерею</button>;
}
Эти примеры демонстрируют, как Featherlight позволяет создавать сложные интерактивные модальные окна в React, сочетая удобство jQuery и гибкость компонентов React.