Попап

HTML
<button class="pp-button" type="button" data-popup="main-popup">Открыть попап</button>

<div class="popups-overlay">
  <div id="main-popup" class="popup">
    <button class="close-popup-btn" type="button" aria-label="Закрыть окно"></button>
    <div class="popup__content">
      <div class="popup__title">Заголовок попапа</div>
      <div class="popup__subtitle">Текст под заголовком</div>
      <div class="popup__text">
        Съешь ещё этих мягких французских булок, да выпей чаю. В чащах юга жил бы цитрус? Да, но фальшивый экземпляр! Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства.
      </div>
    </div>
  </div>
</div>
CSS
.popups-overlay {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: 100%;
  height: 100%;
  background-color: #f0f0f0b7;
  transition: opacity .4s linear;
  z-index: 1000;

  pointer-events: none;
  visibility: hidden;
  opacity: 0;
}

.popups-overlay.show {
  pointer-events: initial;
  visibility: visible;
  opacity: 1;
}

.popup {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  background-color: #fff;
  border-radius: 6px;
  max-width: 500px;
  width: 100%;
  padding: 40px;
  box-shadow: 0 1px 8px rgba(0, 0, 0, 0.15);
  overflow-y: auto;
  max-height: 100dvh;
}

.popup__content {
  width: 100%;
  display: flex;
  flex-direction: column;
  align-items: center;
}

.popup__title {
  font-size: 24px;
  font-weight: 700;
  text-align: center;
  color: #2e4a82;
  margin-bottom: 6px;
}

.popup__subtitle {
  font-size: 16px;
  font-weight: 400;
  line-height: 1.5;
  text-align: center;
  margin-bottom: 20px;
  color: #444;
}

.popup__text {
  margin-bottom: 20px;
  font-size: 14px;
  font-weight: 400;
  line-height: 1.5;
  text-align: center;
}

.close-popup-btn {
  position: absolute;
  top: 16px;
  right: 16px;
  width: 24px;
  height: 24px;
  background: none;
  border: none;
  cursor: pointer;
}

.close-popup-btn::before,
.close-popup-btn::after {
  content: "";
  position: absolute;
  top: 50%;
  left: 50%;
  width: 18px;
  height: 2px;
  background-color: #000;
}

.close-popup-btn::before {
  transform: translate(-50%, -50%) rotate(45deg);
}

.close-popup-btn::after {
  transform: translate(-50%, -50%) rotate(-45deg);
}

@media (max-width: 500px) {
  .popup {
    padding: 24px;
    max-width: 96%;
  }

  .popup__title {
    font-size: 20px;
  }

  .popup__subtitle {
    font-size: 15px;
  }
}

.pp-button {
  cursor: pointer;
  display: flex;
  justify-content: center;
  align-items: center;
  padding: 12px 40px;
  background-color: #2e4a82;
  font-size: 18px;
  color: #fff;
  font-weight: 400;
  line-height: 1.1;
  transition: background-color 0.3s ease;
}

.pp-button:hover {
  background-color: #1A2C54;
}

@media (max-width: 500px) {
    .pp-button {
        font-size: 14px;
    }
}
JS
document.addEventListener('DOMContentLoaded', () => {
  const overlay = document.querySelector('.popups-overlay');
  const openButtons = document.querySelectorAll('[data-popup]');

  openButtons.forEach((btn) => {
    const popupId = btn.getAttribute('data-popup');
    const popup = document.getElementById(popupId);

    btn.addEventListener('click', (evt) => {
      evt.preventDefault();

      if (overlay) {
        overlay.classList.add('show');
      }

      if (popup) {
        popup.classList.add('show');
      }
    });

    if (popup) {
      const closeBtn = popup.querySelector('.close-popup-btn');

      if (closeBtn) {
        closeBtn.addEventListener('click', () => {
          if (overlay) {
            overlay.classList.remove('show');
          }

          popup.classList.remove('show');
        });
      }
    }
  });

  if (overlay) {
    overlay.addEventListener('click', (e) => {
      if (e.target === overlay) {
        overlay.classList.remove('show');

        const openPopups = overlay.querySelectorAll('.popup.show');
        openPopups.forEach((popup) => {
          popup.classList.remove('show');
        });
      }
    });
  }
});

Как сделать попап (всплывающее окно) на HTML, CSS и JavaScript

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

  • Открытие и закрытие по клику или по кнопке
  • Возможность закрытия по клику вне окна и по крестику
  • Чистый HTML и CSS без сторонних библиотек
  • Легкий и читаемый JavaScript-код
  • Удобная структура для кастомизации
  • Совместимость с любыми браузерами и адаптивность