> Как сделать попап без JavaScript и возможно ли это (JavaScript)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: LoyaltyLabs
Стек: JavaScript
> Пример ответа
Короткий ответ
Да, попап без JavaScript возможен с использованием HTML и CSS. Основные подходы: псевдокласс :target для показа/скрытия блока при переходе по якорю, чекбокс-хак с :checked и label, или CSS-анимации с :hover. Однако такие попапы имеют ограничения: нет программного контроля, сложности с закрытием по клику вне области и с доступностью (focus trapping, ARIA-атрибуты). Для production-решений с хорошим UX JavaScript обычно необходим.
Подробное объяснение
Попап (модальное окно) без JavaScript реализуется чисто CSS-средствами за счёт использования состояний элементов, управляемых пользовательским взаимодействием:
:target: при клике на ссылку сhref="#popup"браузер устанавливает фокус на элемент с id="popup", и псевдокласс:targetактивирует его отображение. Закрытие - через ссылку на другой якорь или#.:checked: скрытый чекбокс, чьё состояние переключается через label. CSS-правило.checkbox:checked ~ .popupуправляет видимостью. Закрытие - повторный клик по label или дополнительный label для снятия checked.:focus-within: попап показывается, пока фокус находится внутри контейнера. Закрытие - клик вне области или Tab.:hover: показ при наведении, но это не модальное окно, а тултип.
Ограничения: нет возможности закрыть по Escape, нет focus trapping (фокус может уйти за пределы попапа), сложно реализовать анимацию появления/исчезновения с плавностью, нет поддержки ARIA-атрибутов динамически. Для accessibility требуется дополнительная разметка (role="dialog", aria-modal), которую браузер не обновляет без JS.
На практике
На собеседовании senior-уровня важно показать понимание trade-off: чисто CSS-решение - это академический интерес или ограниченный use-case (например, прототип, лендинг без JS). В реальных проектах попап требует:
- программного управления (открыть/закрыть из любого места)
- обработки клавиатуры (Escape, Tab trapping)
- блокировки скролла body
- управления фокусом при открытии/закрытии
- поддержки стека модалок
Без JS эти задачи решаются частично или костыльно. Интервьюер ожидает, что кандидат назовёт CSS-подходы, но аргументированно объяснит, почему для продакшена нужен JavaScript.
Пример кода
HTML<!-- :target approach --><a href="#popup">Открыть попап</a><div id="popup" class="popup"><div class="popup-content"><p>Содержимое</p><a href="#">Закрыть</a></div></div><style>.popup {display: none;position: fixed;top: 0; left: 0; right: 0; bottom: 0;background: rgba(0,0,0,0.5);}.popup:target {display: flex;align-items: center;justify-content: center;}.popup-content {background: white;padding: 2rem;}</style>
HTML<!-- :checked approach --><input type="checkbox" id="popup-toggle" hidden><label for="popup-toggle">Открыть</label><div class="popup"><div class="popup-content"><p>Содержимое</p><label for="popup-toggle">Закрыть</label></div></div><style>.popup {display: none;/* ... */}#popup-toggle:checked ~ .popup {display: flex;}</style>
Как отвечать на собеседовании
- Сразу подтвердить возможность: "Да, можно через
:targetили:checked". - Кратко описать механику каждого подхода.
- Перейти к ограничениям: отсутствие focus trapping, Escape, ARIA, программного контроля.
- Упомянуть, что для простых статичных страниц это допустимо, но для SPA или сложных интерфейсов - нет.
- Если спросят про accessibility - объяснить, что без JS нельзя динамически установить aria-modal, управлять фокусом, и screen reader не поймёт, что это модалка.
- Закончить выводом: "Чистый CSS - это трюк, но не production-решение".
Что проверяет интервьюер
- Понимание CSS-селекторов и псевдоклассов (
:target,:checked,~,+). - Умение оценивать границы применимости технологии (CSS vs JS).
- Знание accessibility и UX-паттернов для модальных окон.
- Способность аргументировать выбор подхода в контексте реального проекта.
- Отсутствие догматизма: кандидат не отрицает CSS-решение, но и не предлагает его как универсальное.
Типичные ошибки
- Утверждение, что попап без JS невозможен в принципе.
- Предложение только одного подхода (например, только
:targetбез упоминания:checked). - Игнорирование accessibility: "Работает же, зачем ARIA?".
- Попытка использовать
:hoverкак полноценный попап (это тултип, не модалка). - Отсутствие упоминания проблем с закрытием (например, при
:targetнужно кликнуть именно на ссылку, а не на overlay). - Предложение
display: none/blockчерез:focusбез учёта, что фокус теряется при клике вне.
> Похожие задачи по frontend
Как улучшить реализацию EventEmitter с использованием Map и Set в JavaScript
Что происходит при встрече промиса во время выполнения синхронного кода в JavaScript
Всегда ли JavaScript выполняется после события onload
Что такое SPA приложение
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью