Featherlight — лёгкая jQuery-библиотека для создания модальных окон (lightbox), часто используемая для отображения изображений, HTML-контента и iframe. При работе с iframe ключевым моментом становится корректная настройка размеров, так как содержимое iframe не всегда известно заранее и может динамически изменяться.
При открытии iframe Featherlight создаёт контейнер
.featherlight-content, внутрь которого помещается элемент
<iframe>. Размеры модального окна напрямую зависят от
размеров этого контейнера и CSS-ограничений, применённых к нему и к
самому iframe.
По умолчанию Featherlight:
Это означает, что управление размерами происходит на уровне конфигурации и стилей.
Для открытия iframe используется тип iframe:
<a href="https://example.com" data-featherlight="iframe">Открыть</a>
Featherlight автоматически создаёт iframe с атрибутами:
<iframe class="featherlight-iframe" frameborder="0" allowfullscreen></iframe>
Размеры iframe на этом этапе определяются CSS.
Основной способ задания размеров — переопределение стилей класса
.featherlight-iframe:
.featherlight-iframe {
width: 800px;
height: 600px;
}
Если задать размеры только iframe, контейнер автоматически подстроится под него.
Featherlight по умолчанию применяет ограничения к
.featherlight-content:
.featherlight-content {
max-width: 100%;
max-height: 100%;
}
Для более строгого контроля:
.featherlight-content {
max-width: 90vw;
max-height: 90vh;
}
Использование vw и vh позволяет
адаптировать модальное окно под размер экрана.
Featherlight позволяет передавать параметры при инициализации.
<a
href="https://example.com"
data-featherlight="iframe"
data-featherlight-iframe-width="900"
data-featherlight-iframe-height="500">
Открыть
</a>
Значения интерпретируются как пиксели. Это самый простой способ задать размеры без CSS.
$.featherlight({
iframe: 'https://example.com',
iframeWidth: 800,
iframeHeight: 600
});
В этом случае Featherlight напрямую применяет размеры к iframe.
Фиксированные размеры редко подходят для реальных проектов. Более универсальный подход — использование относительных значений.
.featherlight-iframe {
width: 80vw;
height: 80vh;
}
Такой iframe всегда будет занимать 80% ширины и высоты окна браузера.
.featherlight-content {
width: 80vw;
max-width: 1000px;
}
.featherlight-iframe {
width: 100%;
height: 56.25vw;
max-height: 80vh;
}
Подход полезен для видео или страниц с фиксированным соотношением сторон.
Featherlight не умеет автоматически вычислять высоту iframe по его содержимому из-за ограничений безопасности браузера (Same Origin Policy). Однако при загрузке страницы с того же домена возможна ручная синхронизация.
Внутри iframe:
window.parent.postMessage({
type: 'resize',
height: document.body.scrollHeight
}, '*');
Снаружи, в основном документе:
window.addEventListener('message', function (event) {
if (event.data.type === 'resize') {
$('.featherlight-iframe').height(event.data.height);
}
});
Этот способ применим только при контроле обеих сторон.
Если высота iframe меньше содержимого, браузер добавляет внутренний скролл. Чтобы избежать двойной прокрутки:
.featherlight-content {
overflow: hidden;
}
.featherlight-iframe {
overflow: auto;
}
Либо наоборот, если требуется прокрутка всего модального окна:
.featherlight-content {
overflow-y: auto;
}
На мобильных экранах важно учитывать адресную строку и виртуальную клавиатуру.
Рекомендуемая конфигурация:
.featherlight-iframe {
width: 100vw;
height: 100vh;
}
И дополнительное ограничение:
.featherlight-content {
margin: 0;
max-height: 100vh;
}
Это позволяет использовать Featherlight как полноэкранный контейнер.
При изменении размеров окна браузера Featherlight не пересчитывает
размеры iframe автоматически, если они заданы в пикселях. Для
адаптивности используются относительные единицы или обработчик
resize:
$(window).on('resize', function () {
$('.featherlight-iframe').css({
width: $(window).width() * 0.8,
height: $(window).height() * 0.8
});
});
Жёсткое задание размеров без учета viewport Приводит к выходу окна за границы экрана.
Попытка читать размеры iframe с другого домена Заканчивается ошибками безопасности.
Игнорирование CSS .featherlight-content
Даже при правильных размерах iframe контейнер может обрезать
содержимое.
Использование height: auto для iframe
Не работает, так как iframe не умеет автоматически подстраивать
высоту.
.featherlight-content всегда участвует в
расчётах;vw, vh и
max-*;