Частые ошибки

Featherlight — это легковесная и простая библиотека для реализации модальных окон на JavaScript. Несмотря на её простоту, при использовании часто встречаются типичные ошибки, которые приводят к некорректной работе или ухудшению пользовательского опыта.


1. Неправильная инициализация

Частая проблема — инициализация Featherlight до того, как DOM полностью загружен. Например:

$('.lightbox').featherlight();

Если этот код находится в <head> или до загрузки соответствующих элементов, модальное окно не будет работать.

Правильный подход:

$(document).ready(function() {
    $('.lightbox').featherlight();
});

Или с использованием более современного синтаксиса:

document.addEventListener('DOMContentLoaded', function() {
    $('.lightbox').featherlight();
});

Ключевой момент: Featherlight должен инициализироваться только после того, как элементы, к которым применяется, уже существуют в DOM.


2. Игнорирование делегирования событий

Featherlight позволяет использовать делегирование, что важно при динамическом добавлении контента на страницу. Неправильное использование:

$('.dynamic-item').featherlight(); // работает только для существующих элементов

Если элементы добавляются после загрузки страницы, они не будут иметь модальное окно.

Правильное решение с делегированием:

$(document).on('click', '.dynamic-item', function() {
    $.featherlight($(this).data('content'));
});

Делегирование обеспечивает корректную работу с динамическим контентом.


3. Неправильное использование селекторов

Featherlight использует селекторы jQuery для определения контента модального окна. Частая ошибка — передача неправильного селектора:

$('.button').featherlight('#modal'); // если #modal отсутствует, ничего не откроется

Важный момент — проверять наличие элемента и корректность селектора. Лучше использовать явное указание контента:

$('.button').featherlight($('#modal'));

Или через атрибут data-featherlight:

<a href="#" data-featherlight="#modal">Открыть</a>

4. Отсутствие управления закрытием модального окна

Featherlight по умолчанию закрывается при клике на фон или на крестик. Однако при кастомных интерфейсах можно забыть подключить обработку закрытия. Пример ошибки:

$.featherlight('<div>Контент</div>'); 
// нет кнопки закрытия, пользователи не могут закрыть окно

Решение: добавить кнопку закрытия и обработчик:

$.featherlight('<div>Контент <button class="close">Закрыть</button></div>', {
    afterOpen: function() {
        this.$content.find('.close').on('click', this.close.bind(this));
    }
});

Это предотвращает ситуации, когда пользователь оказывается “заперт” в модальном окне.


5. Использование тяжелого контента без оптимизации

Featherlight поддерживает загрузку изображений, iframe и HTML, но вставка большого контента напрямую может замедлять страницу. Пример ошибки:

$('.open-video').featherlight('<iframe src="big_video.mp4"></iframe>');

Лучше использовать ленивую загрузку или загружать контент динамически через Ajax:

$('.open-video').featherlight({
    ajax: 'video.html'
});

Это ускоряет рендер и улучшает пользовательский опыт.


6. Игнорирование опций Featherlight

Featherlight имеет множество опций: closeOnClick, closeOnEsc, persist, beforeOpen, afterClose и др. Часто разработчики используют библиотеку “как есть”, игнорируя их, что приводит к неконтролируемому поведению окна.

Пример плохого использования:

$('.button').featherlight('<div>Контент</div>');

Пример с правильной конфигурацией:

$('.button').featherlight('<div>Контент</div>', {
    closeOnClick: 'background',
    closeOnEsc: true,
    afterClose: function() {
        console.log('Модальное окно закрыто');
    }
});

Использование опций позволяет гибко контролировать поведение окон и предотвращает баги.


7. Конфликты с другими библиотеками

Featherlight зависит от jQuery. Часто возникают конфликты с другими библиотеками, особенно если используется noConflict или версии jQuery несовместимы. Пример:

var $j = jQuery.noConflict();
$j('.lightbox').featherlight(); // работает только через $j

Неправильное использование $ после noConflict приведет к ошибке “$ is not defined”.


8. Отсутствие очистки событий и контента

Featherlight создаёт элементы в DOM при открытии окна. Если не закрывать и не удалять обработчики, со временем это ведёт к утечкам памяти, особенно на страницах с динамическим контентом.

Решение:

var fl = $.featherlight('<div>Контент</div>');
fl.close(); // гарантированное удаление модального окна

Использование методов close и хуков afterClose помогает поддерживать чистоту DOM.


9. Ошибки при адаптивности

Featherlight не создаёт адаптивный дизайн сам по себе. Нередко контент выходит за пределы экрана. Ошибки чаще всего:

  • фиксированные размеры модального окна без медиазапросов
  • iframe с жесткими шириной/высотой

Правильный подход — использовать CSS для адаптивного оформления:

.featherlight-content {
    max-width: 90vw;
    max-height: 90vh;
    overflow: auto;
}

10. Игнорирование accessibility (доступности)

Featherlight не обеспечивает полноценную доступность по умолчанию. Ошибки:

  • отсутствие фокуса на модальном окне
  • невозможность закрытия с клавиатуры
  • отсутствие описаний для экранных читалок

Для исправления необходимо:

$.featherlight('<div role="dialog" aria-modal="true" aria-label="Модальное окно"></div>', {
    closeOnEsc: true
});

Добавление ARIA-атрибутов и управление фокусом повышает доступность для всех пользователей.


Эти ошибки — самые частые источники проблем при работе с Featherlight. Их понимание и правильная практика помогут создавать надёжные и отзывчивые модальные окна на веб-страницах.