Featherlight — это минималистичная библиотека для создания модальных окон на чистом JavaScript и jQuery. Она отличается лёгкостью и высокой настраиваемостью, позволяя создавать как простые, так и сложные всплывающие интерфейсы с минимальной нагрузкой на DOM. Основная цель Featherlight — упрощение работы с модальными окнами без избыточного кода и влияния на производительность страницы.
Библиотека строится вокруг простого вызова метода
.featherlight() на выбранном элементе или
селекторе:
$('#openModal').featherlight('<p>Содержимое модального окна</p>');
При этом можно передавать объект настроек, изменяющих поведение модального окна.
Featherlight использует объектные опции для гибкой конфигурации:
content — содержимое модального окна (HTML, селектор
или функция, возвращающая HTML);type — тип содержимого ('html',
'image', 'ajax');targetAttr — атрибут, откуда берётся содержимое при
клике;closeOnClick — закрытие по клику вне окна или на
фоне;persist — сохранять ли содержимое для повторного
открытия.Пример конфигурации с AJAX-загрузкой:
$.featherlight({
content: '<p>Загрузка...</p>',
ajax: '/path/to/content',
closeOnClick: 'background'
});
Одной из ключевых особенностей Featherlight является оптимизация производительности за счёт минимального воздействия на reflow и repaint браузера.
position: fixed: Фон и
контейнер модального окна используют фиксированное позиционирование.
Благодаря этому элементы вне модального окна не пересчитываются при его
открытии, что снижает нагрузку на layout.persist
позволяет сохранить уже загруженное содержимое, исключая повторное
создание и вставку в DOM при повторном открытии.Repaint часто возникает из-за частого изменения стилей элементов. Featherlight минимизирует это через:
top, left или width через
JavaScript.opacity и
visibility, что не вызывает полного перерасчёта
layout.Пример CSS-анимации для Featherlight:
.featherlight {
opacity: 0;
transition: opacity 0.3s ease-in-out;
}
.featherlight.opened {
opacity: 1;
}
JavaScript лишь добавляет или убирает класс opened, не
вмешиваясь в геометрию документа.
Для уменьшения блокировок reflow при работе с большим количеством данных применяются асинхронные методы загрузки:
$('#openAjaxModal').featherlight({
ajax: '/data/content.html',
afterContent: function() {
console.log('Контент загружен и вставлен');
}
});
afterContent — хук, вызываемый после
вставки содержимого. Использование этого события позволяет выполнять
тяжелые операции только после визуальной вставки, не
вызывая лишних перерасчетов до момента отображения окна.Featherlight предоставляет наблюдаемые события, позволяющие контролировать момент внесения изменений в DOM:
beforeOpen — до вставки окна в DOM;afterOpen — после отображения окна и завершения
анимации;beforeClose — перед закрытием;afterClose — после удаления элементов.Использование этих событий предотвращает лишние операции на стадии, когда браузер ещё не начал перерасчёт layout, что критично для сложных интерфейсов с множеством элементов.
Для больших изображений важно предварительно загружать их в кеш:
$.featherlight({
image: '/path/to/large-image.jpg',
beforeOpen: function() {
const img = new Image();
img.src = this.target.attr('href');
}
});
Это предотвращает моргание и сдвиг контента, который иначе вызвал бы повторный reflow при динамическом изменении размеров модального окна.
Featherlight автоматически учитывает особенности мобильного рендеринга:
will-change: opacity, transform,
позволяя GPU обрабатывать анимации вместо CPU, что снижает нагрузку и
repaint;persist: true для часто
открываемых окон;Featherlight сочетает минималистичную архитектуру с высокой оптимизацией для современных браузеров, позволяя создавать модальные окна без заметного влияния на производительность страницы даже при активной работе с DOM.