JavaScript для верстальщика. Урок 07. Создание модального окна


Задача - создать функцию появления и исчезновения всплывающего модального окна по клику.
Для этого смотрим раздел Effects http://api.jquery.com/category/effects/
Нас интересуют два эффекта:  .fadeIn() и .fadeOut() - соответственно, появление и исчезновение элемента.

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

Модальному окну присваиваем класс js-modal, так как модальных окон может быть много и логику для всех лучше прописать одну. И добавляем id = "js-modal-login", чтобы отличить от других модальных окон. Этот же id прописываем в атрибуте href  ссылки, при клике по которой окно должно появляться. Для этой ссылки также прописываем класс js-show-modal. Класс, а не id, опять же потому, что подобных ссылок, при клике по которым должны открываться модальные окна, на странице может быть несколько.

 Модальное окно должно открываться по клику. Описываем событие клика:

$(".js-show-modal").on("click", function(event) {

    });


Отменяем событие по умолчанию

event.preventDefault();

И указываем, что при клике нужно показать модальное окно с классом js-modal.

$(".js-modal").fadeIn();

 В скобках после .fadeIn() можно указать время в миллисекундах или слова fast, slow, или оставить скорость появления по умолчанию и ничего не писать.

Если хотим, чтобы по клику появлялось не только модальное окно, но и оверлей, его id= "js-overlay" прописываем в коде через запятую:

$(".js-modal, #js-overlay").fadeIn();

При появлении модального окна должна исчезать полоса прокрутки.
Для этого в css прописываем свойство

 .open-modal {
        overflow-y: hidden;
        padding-right: 17px;
    }



Здесь overflow-y: hidden; отвечает за исчезновение вертикальной полосы прокрутки, а padding-right: 17px; сдвигает документ на ширину исчезнувшей полосы.

Добавляем класс .open-modal при открытии модального окна, а при закрытии, соответственно, убираем.
$("body").addClass("open-modal");
$("body").removeClass("open-modal");

 
Код открытия модального окна, появления оверлея, исчезновения полосы прокрутки:

$(".js-show-modal").on("click", function(event) {
    event.preventDefault();

    $(".js-modal, #js-overlay").fadeIn();

    $("body").addClass("open-modal");
 
});

Соответственно. код закрытия будет выглядеть как

$(".js-modal-close").on("click", function(event) {
    event.preventDefault();

    $(".js-modal, #js-overlay").fadeOut();

    $("body").removeClass("open-modal");
 
});

Здесь .js-modal-close - класс кнопки, при клике по которой модальное окно должно закрыться.

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

Как говорили выше, id модального окна прописываем в атрибуте href  ссылки, при клике по которой окно должно появляться.

Теперь при клике на данную кнопку мы сначала получим атрибут href, и откроем именно это модальное окно.

Код получения атрибута href той ссылки, по которой кликнули, и сохранения его в переменную currentModal:

var currentModal = $(this).attr("href");

И теперь вместо класса .js-modal мы открываем модальное окно с id, которое сохранено в переменной currentModal
То есть код  

$(".js-modal, #js-overlay").fadeIn(); заменится на  

$(currentModal + " ,#js-overlay").fadeIn();

Немного неожиданная запятая внутри кавычек нужна, чтобы при сложении двух аргументов currentModal, которому соответствует селектор #js-modal-login и
#js-overlay получить (#js-modal-login, #js-overlay)

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

Небольшое усовершенствование: возможность закрыть модальное окно по клику не только по кнопке, но и по оверлею.

Было:

$(".js-modal, #js-overlay").fadeOut();

Стало:

$(".js-modal, #js-overlay").fadeOut();

 Код полностью:


$(".js-show-modal").on("click", function(event) {

        e.preventDefault();

        var currentModal = $(this).attr("href");

        $(currentModal + ", #js-overlay").fadeIn(500);


        $("body").addClass("open-modal");

    });




   $("#js-overlay, .js-modal-close").on("click", function(event) {

        event.preventDefault();
       
        $(".js-modal, #js-overlay").fadeOut();


        $("body").removeClass("open-modal");

    });


Мы использовали два метода:
fadeIn() - открыть окно
fadeOut - закрыть окно

Вместо них могут использоваться методы
show - открыть окно
hide - закрыть окно

Отличие в том, что первые методы обеспечивают плавное появление окна, а два последних никаких эффектов плавности не имеют.