Модальное окно — это всплывающее окно, которое появляется поверх основного окна. Обычно оно используется для отображения дополнительной информации или для того, чтобы попросить пользователя подтвердить действие.

Модальные окна часто используются в веб-приложениях для отображения важных сообщений или диалогов подтверждения. Они могут быть очень полезны для того, чтобы убедиться, что пользователь видит содержимое и взаимодействует с ним, прежде чем двигаться дальше.

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

Полезные ссылки

Пример работы модального окна: https://toni.codelab.pro/modal/index.html

* Модальное окно вызывается при клике на кнопку Click me.

Стартовый проект: https://github.com/toni-wheel/youtube-base-page

Создаем модальное окно

В качестве примера сделал простое модальное окно, которое открывается при клике на кнопку и закрывается также.

В нашем примере модальное окно:

  • Имеет заголовок, текстовое содержимое и две кнопки.
  • Адаптируется под мобильные устройства.
  • Блокирует скролл веб-страницы.
  • При переполнении контентом — появляется скролл в самом модальном окне.

Разметка

В начале сделаем разметку для модального окна и кнопки.

Модальное окно можно разместить в самом начале веб-страницы.

<div class="modal" id="modal">
  <div class="modal__box">
    <div class="modal__title">Some title</div>
    <div class="modal__info">
      Lorem ipsum dolor sit amet consectetur adipisicing elit. Mollitia sunt
      possimus voluptas dignissimos nostrum vero distinctio qui deserunt unde
      rerum.
    </div>
    <div class="modal__bottom">
      <a href="#" class="btn">Go to</a>
      <a href="#" class="btn btn--close" id="btn_close">Close</a>
    </div>
  </div>
</div>

Кнопку для вызова окна разместите в нужном вам месте кода.

<a href="#" class="btn" id="btn">Click me</a>

Стили

Стили для модального окна.

.modal {
  display: none; /* По умолчанию окно закрыто */
  z-index: 10; /* Чтобы сделать окно поверх всех элементов */
  background-color: rgba(0, 0, 0, 0.5); /* Полупрозрачный темный фон */
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  align-items: flex-start;
  justify-content: center;
  overflow-y: scroll; /* При переполнении окна делаем скролл */
  padding: 20px;
}

.modal--open {
  display: flex; /* Модификатор для открытого окна */
}

.modal__box {
  width: 100%;
  max-width: 600px;
  padding: 20px;
  background-color: #fff;
  border-radius: 10px;
  margin-top: auto;
  margin-bottom: auto;
}

.modal__title {
  color: #111;
  font-size: 32px;
  text-align: center;
  margin-bottom: 20px;
}

.modal__info {
  color: #111;
  font-size: 16px;
  margin-bottom: 30px;
}

.modal__bottom {
  display: flex;
  justify-content: center;
  align-items: center;
}

Стили для кнопок.

.btn {
  box-sizing: border-box;
  display: block;
  width: max-content;
  background-color: #0066cc;
  padding: 10px 20px;
  font-size: 1.2rem;
  color: #fff;
  border-radius: 10px;
}

.modal__bottom > .btn {
  margin-right: 20px;
}

.modal__bottom > .btn:last-child {
  margin-right: 0;
}

.modal__bottom > .btn--close {
  background-color: #dedede;
  color: #0066cc;
}

Чтобы заблокировать скролл веб-страницы добавим дополнительный класс lock.

.lock {
  overflow-y: hidden;
}

Скрипт

Скрипт довольно простой.

// считываем все элементы
const body = document.body;
const btn = document.querySelector("#btn");
const btnClose = document.querySelector("#btn_close");
const modal = document.querySelector("#modal");

// обработчики клика на кнопки
btn.addEventListener("click", btnHandler);
btnClose.addEventListener("click", btnCloseHandler);

// при нажатии на кнопку Click me
function btnHandler(e) {
  e.preventDefault();
  body.classList.add("lock"); // блокируем скролл веб-страницы
  modal.classList.add("modal--open"); // открываем модальное окно
}

// при нажатии на кнопку Close
function btnCloseHandler(e) {
  e.preventDefault();
  body.classList.remove("lock"); // разблокируем скролл страницы
  modal.classList.remove("modal--open"); // закрываем окно
}

// при нажатии на пустое пространство - закрываем окно
window.addEventListener("click", function (e) {
  if (e.target == modal) {
    body.classList.remove("lock");
    modal.classList.remove("modal--open");
  }
});

Warning: Undefined variable $aff_bottom_mark in /sites/codelab.pro/wp-content/themes/myTheme/dist/partials/post/post_base.php on line 81

Warning: Undefined variable $aff_bottom_info in /sites/codelab.pro/wp-content/themes/myTheme/dist/partials/post/post_base.php on line 85