Featherlight — это минималистичная библиотека для реализации лёгких модальных окон на основе jQuery. Несмотря на простоту, при использовании всплывающих окон часто возникают сложности с позиционированием, особенно в контексте динамического контента, адаптивного дизайна и вложенных элементов.
По умолчанию Featherlight центрирует модальное окно по
вертикали и горизонтали относительно окна браузера.
Центрирование достигается через CSS-свойства
position: fixed, top: 50%,
left: 50% и последующее смещение с помощью
transform: translate(-50%, -50%). Этот метод работает
корректно для небольших окон, однако возникают проблемы при:
Для исправления рекомендуется использовать динамическое вычисление размеров окна через JavaScript и корректировку позиции с учётом текущей высоты и ширины:
var $modal = $.featherlight.current();
var winHeight = $(window).height();
var modalHeight = $modal.$content.outerHeight();
if(modalHeight > winHeight) {
$modal.$content.css({
top: '10px',
transform: 'translate(-50%, 0)'
});
}
Стандартное позиционирование position: fixed делает
модальное окно независимым от прокрутки страницы. Это удобно для
большинства случаев, но вызывает трудности, если контент внутри
модального окна должен следовать за документом или окно
должно быть относительно родительского контейнера.
Решения:
position: absolute с вычислением
координат относительно родителя:var $parent = $('#container');
var offset = $parent.offset();
$.featherlight.current().$content.css({
position: 'absolute',
top: offset.top + 20,
left: offset.left + $parent.width() / 2
});
scroll и
пересчитывать положение окна:$(window).on('scroll', function() {
var $modal = $.featherlight.current();
if($modal) {
$modal.$content.css({
top: $(window).scrollTop() + 50
});
}
});
Featherlight вставляет модальное окно в конец
<body>, что исключает влияние большинства
родительских стилей. Однако CSS-свойства вроде
transform, overflow: hidden или
position: relative у предков могут изменить
поведение модального окна при позиционировании.
Классические проблемы:
overflow: hidden у <body> или
контейнера приводит к обрезанию модального окна.transform на родительских блоках создаёт новый контекст
наложения, что может нарушить расчёт координат.Для обхода таких ограничений лучше:
overflow: hidden на <body>
или контейнерах, когда открывается модальное окно.transform необходим, использовать
position: fixed на контенте Featherlight и вычислять
смещение относительно window.Позиционирование часто тесно связано с z-index,
особенно при множественных слоях контента. Featherlight устанавливает
базовый z-index для .featherlight через CSS, но при
использовании сторонних слоёв может возникнуть ситуация, когда окно
скрыто под другими элементами.
Рекомендации:
$.featherlight.defaults.zIndex для
глобальной настройки.$.featherlight.defaults.zIndex = 1050;
Когда модальное окно содержит контент, размер которого определяется
после загрузки (например, изображения, таблицы, AJAX-запросы),
центрирование может работать некорректно. Featherlight предоставляет
событие afterContent для перерасчёта позиции после загрузки
содержимого:
$.featherlight.open('<img src="large-image.jpg">', {
afterContent: function() {
var $modal = this.$content;
var winHeight = $(window).height();
var modalHeight = $modal.outerHeight();
$modal.css({
top: (modalHeight > winHeight ? 10 : (winHeight - modalHeight)/2) + 'px'
});
}
});
Эти нюансы помогают создавать модальные окна Featherlight, которые корректно отображаются в любых условиях и не теряются при изменении размеров, скролле или динамическом наполнении.