Сниппет создания модального окна
Придумал для себя интересное решения, для добавления модальных окон. Иначе мне приходилось часто их верстать и программировать с нуля. А тут, собственно, написан основной код для функциональности. Далее, уже на месте можно его доработать под проект. Должно получаться быстрее.
<div class="popup-layer"></div>
<div class="popup">
<button class="popup__close button button_close">×</button>
<div class="popup__body">
<p class="popup__title">Заголовок модального окна</p>
<p class="popup__text">Какой-то текст для данного модального окна</p>
<!-- Любое содержимое, например форма -->
</div>
</div>
<button onclick="popup.show('Оставьте заявку')">Оставить заявку</button>
<hr>
<button onclick="popup.show('Выберите тему')">Выбрать тему</button>
<hr>
<button onclick="popup.show('Сыграйте в игру')">Сыграть в игру</button>В коде HTML указана минимальная разметка для вставки модального окна. Данную разметку нужно разместить, как обычно после футера, ближе к закрывающему тегу body, но до вызова js. Кнопки для демонстрации — они скорее всего не понадобятся, просто показана возможность менять Заголовок модального окна.
.popup {
position: fixed;
top: 50%;
left: 50%;
translate: -50% -50%;
margin: auto;
background-color: #fff;
transition: 300ms;
opacity: 0;
z-index: 500;
pointer-events: none;
box-shadow: 0 0 32px #00000022;
border: 1px solid #00000011;
border-radius: 8px;
overflow: clip;
}
.popup-layer {
opacity: 0;
position: fixed;
z-index: 400;
inset: 0;
background-color: #00000033;
backdrop-filter: blur(8px);
pointer-events: none;
transition: 300ms;
}
.popup-layer.show {
opacity: 1;
pointer-events: all;
}
.popup__body {
position: relative;
background-color: #fff;
z-index: 1;
max-width: 450px;
padding: 32px;
}
.popup__body :where(*) {
margin: 0;
}
.popup__title {
margin-bottom: 16px;
line-height: 1;
font-size: 2rem;
font-weight: 800;
}
.popup__text {
line-height: 1.4;
font-size: 0.9rem;
font-weight: 400;
}
.popup.show {
opacity: 1;
pointer-events: all;
}
.popup__close {
position: absolute;
z-index: 2;
top: 4px;
right: 4px;
border-radius: 4px;
}
.popup .button_close {
padding: 0;
line-height: 1;
display: flex;
align-items: center;
justify-content: center;
width: 32px;
height: 32px;
font-size: 28px;
}Стили CSS написаны с базовыми настройками модального окна. Учтена плавность, положение и минимально нормальный внешний вид. Конечно, когда будет добавляться контент, то стили нужно дописать.
class ModalPopup{
constructor(selector){
this.popup = document.querySelector(selector);
this.popupTitle = this.popup.querySelector('.popup__title');
this.defaultPopupTitle = this.popupTitle.textContent;
this.closeBtn = this.popup.querySelector('.button_close');
this.popupLayer = document.querySelector('.popup-layer');
this.closeBtn.addEventListener('click', ()=>{
this.close();
});
if(this.popupLayer){
this.popupLayer.addEventListener('click', ()=>{
this.close();
});
}
}
show(popupTitle = this.popupTitle.textContent){
this.popup.classList.add('show');
this.popupTitle.textContent = popupTitle;
if(this.popupLayer){
this.popupLayer.classList.add('show');
}
}
close(){
this.popup.classList.remove('show');
if(this.popupLayer){
this.popupLayer.classList.remove('show');
}
setTimeout(()=>{
this.popupTitle.textContent = this.defaultPopupTitle;
},500);
}
}
let popup = new ModalPopup('.popup');
Ну и самое главное — JavaScript. В скрипте представлен класс модального окна, с помощью которого в общем-то и создается функционал окна. Прописаны два основных метода — show() и close()
На Codepen работает! Пробуем применять в работе)