Категории статей

На создание данного урока меня подтолкнул один начинающий разработчик. Красивого дизайна здесь не будет, суть урока показать принцип создания таких окон.

По своей сути модальное окно - независимый от содержимого страницы блок, следовательно, лежит он сразу в теге body (обычно в самом низу, на одном уровне с контейнером). Логика будет писаться на чистом Javascript, даже не на Jquery (потому что вот).

Для начала сделаем простую верстку шаблона страницы с модальным окном. На странице у нас присутствует кнопка открытия модального окна и само модальное окно. Модальное окно содержит в себе шапку и тело, а также кнопку его закрытия.

<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <title>Модальное окно</title>
    <!-- Стили модального окна -->
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <!-- Кнопка для открытия модального окна -->
    <button class="modal-open" data-name="first">Открыть окно</button>

    <!-- Фон всех модальных окон -->
    <div id="modal-bg"></div>
    <!-- Модальное окно -->
    <div class="modal" data-name="first">
        <div class="modal-header">
            Модальное окно <span class="modal-close">&times;</span>
        </div>
        <div class="modal-body">
            Тело модального окна
        </div>
    </div>

    <!-- Логика работы модального окна -->
    <script src="script.js"></script>
</body>
</html>

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

#modal-bg {
    display: none;
    position: absolute;
    top: 0; bottom: 0;
    left: 0; right: 0;
    background-color: rgba(0, 0, 0, 0.5);
    z-index: 1;
    cursor: pointer;
}

.modal {
    display: none;
    width: 500px; height: 250px;
    border: 1px solid #0c4128;
    position: absolute;
    top: calc(50% - 125px);
    left: calc(50% - 250px);
    border-radius: 5px;
    margin: 0 auto;
    z-index: 2;
    background-color: #fff;
}

.modal-header {
    padding: 0 10px;
    height: 30px;
    line-height: 30px;
    border-bottom: 1px solid #0c4128;
}
.modal-close {
    font-size: 20px;
    float: right;
    cursor: pointer;
    width: 20px; height: 20px;
    margin-top: 5px;
    line-height: 20px;
    text-align: center;
}
.modal-close:hover {
    color: rgba(0, 0, 0, .5);
}

.modal-body {
    width: 480px;
    height: 200px;
    padding: 10px;
}

И, наконец, сама логика работы, магия модального окна. По сути на нажатие кнопки у нас вылазит фон поверх контента, а поверх фона модальное окно. По нажатию на фон все открытые модальные окна закрываются, по нажатию на крестик в форме закрывается только модальное окно на крестик которого нажали. Режим Javascript у нас строгий (strict), ошибок не прощаем. Код модального окна представлен ниже.

(function () {
    "use strict";
    // Кнопка открытия модалки
    let $buttons = document.querySelectorAll('.modal-open');
    // Фон модального окна
    let $modalBg = document.getElementById('modal-bg');
    // Вешаем событие закрытия всех модальных окон
    $modalBg.addEventListener('click', function (){
        $modalBg.style.display = 'none';
        let $modalsOnPage = document.querySelectorAll('.modal');
        for (let i = 0; i < $modalsOnPage.length; i++) {
            $modalsOnPage[i].style.display = 'none';
        }
    });
    // Событие на открытие модального окна (вешаем на все кнопки, чтобы модалки открывать)
    for (let i = 0; i < $buttons.length; i++) {
        $buttons[i].addEventListener('click', function () {
            $modalBg.style.display = 'block';
            let $modal = document.querySelector(`.modal[data-name="${$buttons[i].dataset.name}"]`)
            if ($modal) {
                $modal.style.display = 'block';
            }
        });
    }
    // Вешаем событие на закрытие модалок
    let $modalClose = document.querySelectorAll('.modal-close');
    for (let i = 0; i < $modalClose.length; i++) {
        $modalClose[i].addEventListener('click', function () {
            $modalClose[i].parentElement.parentElement.style.display = 'none';
            $modalBg.style.display = 'none';
        });
    }
})()

Готово! У вас получилось сделать простейшее модальное окно. Его стили не зависят от содержимого страницы, можно сделать его любым и оно никак не повлияет на сайт, хотя если постараться, можно и сайт поломать.

Дата публикации: 6 апреля 2022 г. 11:59

Категория: Мини-уроки