Featherlight — минималистичная библиотека для создания lightbox-окон на базе jQuery. Одной из ключевых точек расширения и кастомизации является контейнер контента — DOM-структура, в которую помещается загружаемое содержимое (HTML, изображение, iframe и т.д.). Понимание устройства контейнера и способов его модификации позволяет глубоко адаптировать поведение и внешний вид lightbox под конкретные требования проекта.
При инициализации Featherlight создаёт следующую базовую структуру:
<div class="featherlight">
<div class="featherlight-content">
<!-- контент -->
</div>
</div>
Класс .featherlight представляет собой корневой
overlay-контейнер, отвечающий за затемнение фона и позиционирование.
Внутренний блок .featherlight-content является основным
контейнером контента. Именно он подлежит наибольшему количеству
модификаций — как на уровне стилей, так и через JavaScript-API.
Контейнер создаётся динамически при каждом открытии lightbox, если не используется повторное открытие существующего экземпляра.
Каждый экземпляр Featherlight доступен как объект, содержащий ссылки на ключевые DOM-элементы:
this.$instance — корневой элемент
.featherlightthis.$content — элемент
.featherlight-contentПример получения доступа внутри колбэков:
$.featherlight({
afterOpen: function() {
this.$content.addClass('custom-content');
}
});
Методы жизненного цикла (beforeOpen,
afterOpen, beforeClose,
afterClose) являются основной точкой входа для изменения
контейнера на лету.
Иногда требуется добавить дополнительный уровень вложенности, например для кастомной прокрутки или декоративных элементов:
afterOpen: function() {
this.$content.wrapInner('<div class="content-wrapper"></div>');
}
Такой подход не нарушает внутреннюю логику Featherlight, поскольку
библиотека оперирует ссылкой на .featherlight-content, а не
на его прямых потомков.
В контейнер можно динамически вставлять дополнительные блоки:
afterOpen: function() {
$('<div class="content-footer">Дополнительная информация</div>')
.appendTo(this.$content);
}
Важно учитывать, что повторное открытие lightbox без очистки может привести к дублированию элементов.
По умолчанию Featherlight автоматически подстраивает размеры
.featherlight-content под загруженный контент, используя
CSS и перерасчёт при загрузке изображений.
Размеры контейнера можно контролировать через CSS:
.featherlight-content {
max-width: 80vw;
max-height: 80vh;
}
Либо программно:
afterOpen: function() {
this.$content.css({
width: '600px',
height: '400px'
});
}
При фиксированных размерах рекомендуется также управлять переполнением:
.featherlight-content {
overflow: auto;
}
Контейнер контента является естественным кандидатом для внутренней прокрутки. Featherlight не навязывает конкретную модель scroll-поведения, что позволяет:
Пример изоляции прокрутки:
body.featherlight-open {
overflow: hidden;
}
.featherlight-content {
max-height: 90vh;
overflow-y: auto;
}
Класс featherlight-open автоматически добавляется к
body при открытии.
Featherlight определяет тип контента (image, ajax, iframe, html) и
сохраняет его в свойстве this.namespace и
this.content. Это позволяет адаптировать контейнер под
конкретный сценарий:
afterOpen: function() {
if (this.$content.find('iframe').length) {
this.$content.addClass('iframe-content');
}
}
Для изображений часто применяются другие правила центрирования и масштабирования:
.featherlight-content img {
max-width: 100%;
height: auto;
display: block;
}
Featherlight поддерживает переопределение HTML-шаблона через опцию
template:
$.featherlight({
template:
'<div class="featherlight custom-lightbox">' +
'<div class="featherlight-content custom-content"></div>' +
'</div>'
});
Такой подход позволяет полностью контролировать структуру контейнера, включая:
При использовании собственного шаблона необходимо сохранять класс
.featherlight-content, так как библиотека ориентируется на
него при вставке контента.
При динамической подгрузке или изменении содержимого может потребоваться ручной перерасчёт размеров:
this.resize();
Метод resize() инициирует повторное вычисление размеров
и позиционирования контейнера. Его имеет смысл вызывать после:
.featherlight-content.Featherlight активно использует классы состояния, которые можно применять для стилизации контейнера:
.featherlight-loading.featherlight-open.featherlight-innerПример условной стилизации:
.featherlight-loading .featherlight-content {
opacity: 0.5;
}
Это позволяет визуально реагировать на этапы жизненного цикла без дополнительного JavaScript-кода.
При закрытии lightbox Featherlight удаляет экземпляр из DOM, если не используется повторное открытие. Однако при сложных модификациях рекомендуется явно очищать контейнер:
beforeClose: function() {
this.$content.empty();
}
Это особенно актуально при внедрении сторонних виджетов, таймеров или подписок на события.
Контейнер .featherlight-content является центральной
точкой кастомизации Featherlight. Через него реализуются:
Грамотная модификация контейнера позволяет использовать Featherlight не только как простой lightbox, но и как универсальный модальный слой для интерфейсов различной сложности.