Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Как сделать модальное окно

Короткий ответ

Тег dialog и одна строка JavaScript для открытия:

<button onclick="offer.showModal()">Show the offer</button>
 
<dialog id="offer">
  <p>Get 20% off your first order!</p>
  <form method="dialog">
    <button>Close</button>
  </form>
</dialog>

showModal() показывает окно поверх страницы, делает остальную страницу недоступной для клика и закрывает окно по клавише Esc. Форма с method="dialog" закрывает окно при отправке — JavaScript для закрытия не нужен.

Оформление

Окно оформляется как обычный блок, а затемнение за ним — через псевдоэлемент ::backdrop:

<style>
  .modal { border: none; border-radius: 16px; padding: 24px; max-width: 300px; box-shadow: 0 10px 40px rgb(0 0 0 / 30%); }
  .modal::backdrop { background: rgb(0 0 0 / 50%); backdrop-filter: blur(3px); }
</style>
 
<button onclick="signup.showModal()">Subscribe</button>
<dialog id="signup" class="modal">
  <h3 style="margin-top: 0;">Stay in touch</h3>
  <form method="dialog"><button>No thanks</button></form>
</dialog>

Закрытие по клику снаружи

Атрибут closedby="any" закрывает окно кликом по затемнённому фону. Его поддерживают ещё не все браузеры; Esc и кнопка работают везде.

Частая ошибка

Показывают окно атрибутом open или через show() и удивляются, что фон не затемняется, а страница под окном остаётся кликабельной. Это немодальный вариант. Для настоящего модального окна вызывайте именно showModal().

Функции из этого ответа

  • <dialog> — Диалоговое окно; модальное открывается методом `showModal()` и блокирует остальную страницу.
  • ::backdrop — Слой прямо под модальным `<dialog>` или элементом в полноэкранном режиме.
  • <form> — Форма: собирает данные из полей и отправляет их на сервер.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.