Приветствую всех посетителей моего блога! Писать статьи получается очень редко, что не есть хорошо. Уже боюсь что-то обещать, как раньше — писать буду чаще и все такое. Причина вся та же — нехватка времени. Ну ладно, сегодняшний пост не об этом. Поговорим о всплывающих окнах для сайта. На просторах интернета практически нет сайтов, которые не используют всплывающие (модальные) окна. В связи с этим я посчитал, что данная тема для веб-разработчика очень важна. Скриптов модальных окон в сети интернет очень много. Какой из них выбрать, чтобы было проще подключать, проще пользоваться, обладал широкими возможностями и т.д.? Я для себя такой нашел…
Структура статьи [скрыть]
Magnific Popup — jQuery плагин всплывающих окон, сделанный с акцентом на производительность и удобство пользования. Так кратко описывает автор скрипта — Дмитрий Семенов и я с ним абсолютно согласен. Я уже достаточно долго использую Magnific Popap для модальных окон и успел в этом убедиться.
Вообще хотелось бы отметить, что Magnific очень популярен, как в рунете, так и в буржуйнете, не смотря на то, что разработчик русскоговорящий. В общем, Magnific Popup заслужил то, чтобы я про него написал отдельный пост.
Вот основные преимущества плагина, которые я могу выделить от себя:
Для того, чтобы сачать Magnific Popup переходим на официальный сайт разработчика. Жмем по ссылке «Build tool» и в модальном окне выбираем нужные нам модули. После всего жмем «Generate build» и получаем код плагина. Данный код необходимо скопировать в редактор кода, например, Notepade++ или Sublime Text и сохранить с расширением «.js«. Также в этом же окне билда вам надо сохранить код CSS. Для этого щелкаем правом кнопкой мыши по ссылке «CSS version» и сохраняем файл стилей. Если вы пользуетесь препроцессором, то сохраните файл «Sass version«. Если не получается сохранить перейдите по ссылке сохраните код самостоятельно в редакторе кода.
Подключить плагин и начать работать с ним достаточно просто. Вообще на сайте есть подробная документация, правда она на английском. Но я скажу вам — чтобы заниматься веб-разработкой крайне важно знать английский язык на техническом уровне. Без этого никуда. Для меня лично не составляет труда изучить документацию по скриптам на английском языке. В конце концов есть также гугл переводчик, которым можно воспользоваться, если что-то непонятно.
В данной статье я рассмотрю только те моменты модальных окон, с которыми я разобрался и которые активно внедряю в процессе разработки сайтов. И так давайте начнем.
Подключаем файл плагина и файл стилей Magnific Popup. Если у вас не подключена библиотека jQuery, то обязательно следует подключить и ее. В общем, здесь подключение ничем не отличается от подключения любого другого скрипта jQuery. Про подключение стилей и скриптов я написал отдельную статью, советую ее почитать.
<!-- Magnific Popup core CSS file -->
<link rel="stylesheet" href="/css/magnific-popup.css">
<!-- jQuery 1.7.2+ or Zepto.js 1.0+ -->
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<!-- Magnific Popup core JS file -->
<script src="/js/jquery.magnific-popup.js"></script>
Далее нам следует инициализировать наш плагин. Для этого нам нужно определиться с типом всплываемого контента. Давайте вызовем в модальном окне обычный текст. Тогда код инциализации будет для контента с типом — Inline.
jQuery(document).ready(function($) {
$('.popup-content').magnificPopup({
type: 'inline'
});
});
Как видим событие вызова модального окна вешается на объект с классом «popup-content«. Поэтому создадим его, например, это будет ссылка с якорем на вызываемый блок с id=»text-popup».
<a href="#text-popup" class="popup-content">Вызвать окно с текстом</a>
<div id="text-popup" class="white-popup mfp-hide">
<p>С другой стороны постоянное информационно-пропагандистское обеспечение нашей деятельности позволяет оценить значение направлений прогрессивного развития.</p>
</div>
И еще кое что. Для того, чтобы наше окно стало видно нам необходимо в файл стилей «magnific-popup.css» добавить следующий код:
.white-popup {
position: relative;
background: #FFF;
padding: 20px;
width: auto;
max-width: 500px;
margin: 20px auto;
}
Данное правило задает фоновый цвет окну и отступы. Их изначально его нет в файле стилей, т.к. само окно можно оформить на свое усмотрение.
В результате у нас открывается модальное окно с нашим текстом. Все довольно просто.
Теперь давайте откроем картинки в модальных окнах.
<!-- Без анимации --> <p><a class="image-popup" title="Это описание изображения" href="images/images-magnific-popup/Img_1_b.jpg"> <img src="images/images-magnific-popup/img_1_s.jpg" alt="" /></a> </p>
<!-- С анимацией --> <p><a class="image-popup-zoom" title="Это описание изображения с анимацией" href="images/images-magnific-popup/Img_2_b.jpg"> <img src="images/images-magnific-popup/img_2_s.jpg" alt="" /></a> </p>
// Type Image - картинка без анимации
$('.image-popup').magnificPopup({
type: 'image'
});
// Type Image Zoom - картинка с анимацией
$('.image-popup-zoom').magnificPopup({
type: 'image',
zoom: {
enabled: true,
duration: 300 // продолжительность анимации. Не меняйте данный параметр также и в CSS
}
});
<div class="popup-gallery">
<a href="images/images-magnific-popup/gallery/img_1_b.jpg" rel="alternate"><img src="images/images-magnific-popup/gallery/img_1_s.jpg" alt="" /></a>
<a href="images/images-magnific-popup/gallery/img_2_b.jpg" rel="alternate"><img src="images/images-magnific-popup/gallery/img_2_s.jpg" alt="" /></a>
<a href="images/images-magnific-popup/gallery/img_3_b.jpg" rel="alternate"><img src="images/images-magnific-popup/gallery/img_3_s.jpg" alt="" /></a>
<a href="images/images-magnific-popup/gallery/img_4_b.jpg" rel="alternate"><img src="images/images-magnific-popup/gallery/img_4_s.jpg" alt="" /></a>
</div>
инициализация будет следующей:
// Тип Image - галерея картинок
$('.popup-gallery').magnificPopup({
delegate: 'a',
type: 'image',
tLoading: 'Загрузка изображения #%curr%...',
gallery: {
enabled: true,
navigateByImgClick: true,
preload: [0, 1] // Will preload 0 - before current, and 1 after the current image
}
});
Теперь давайте откроем в модальном окне видео Youtube.
<a class="popup-youtube" rel="nofollow" href="http://www.youtube.com/watch?v=0O2aH4XLbto">Открыть видео Youtube</a>
Код инициализации будет следующим:
// Type Iframe - видео Youtube (или Vimeo), карты Гугл или другой контент в iframe
$('.popup-youtube').magnificPopup({
type: 'iframe'
});
Заметьте, что адрес видео берется из адресной строки браузера, а не ссылка поделиться в Youtube. Также, если вы знаете, можно запретить в конце видео Youtube показ похожих видеороликов. Но для этого нужно добавить к адресу в коде iframe ролика параметр — ?rel=0. Но как это сделать, ведь мы копируем адрес из адресной строки? Так скажу вам, что API Magnific Popup позволяет нам настраивать код так, как нам нужно. Я поковырялся в документации и немного дополнил код инициализации.
// Type Iframe - видео Youtube (или Vimeo), карты Гугл или другой контент в iframe
$('.popup-youtube').magnificPopup({
type: 'iframe',
iframe: {
patterns: {
youtube: {
index: 'youtube.com/', // String that detects type of video (in this case YouTube). Simply via url.indexOf(index).
id: 'v=', // String that splits URL in a two parts, second part should be %id%
// Or null - full URL will be returned
// Or a function that should return %id%, for example:
// id: function(url) { return 'parsed id'; }
src: '//www.youtube.com/embed/%id%?autoplay=1&rel=0' // Урл, который берется из кода iframe
}
}
}
});
Исходя из данного кода, видно, что мы создаем свой шаблон видео Youtube. В параметре «src» в конце добавляем параметр «rel=0» и все, теперь в конце видео не будет похожих роликов. Можете промотать видео до конца и посмотреть.
В модальных окнах Magnific можно подгружать контент асинхронно, посредством технологии Ajax. Например, на демо-сайте я загружу страницу какой либо статьи в модальном окне. Демо-сайт работает на Joomla.
<a class="simple-ajax-popup" href="/novosti/5-novost-1.html?tmpl=component">Загрузить страницу в мод. окне Ajax</a>
Это обычная ссылка на страницу статьи. Это всего лишь пример и я ставлю адрес статьи со своего сайта. Чтобы показать только контент, отбросив ненужные блоки (шапка сайта, сайдбар, подвал и т.д.) я добавлю в конец адреса параметр — ?tmpl=component.
Код инициализации:
// Тип Ajax - загрузка контента в модальном окне
$('.simple-ajax-popup').magnificPopup({
type: 'ajax'
});
В данном случае форма будет загружаться с типом контента «inline«. В этом случае вы сможете спросить — а чем она отличается от первого варианта, где мы показывали просто текст? Ведь вместо теста мы можем вставить код формы. Да, все правильно, вместо текста будет просто код формы с дополнительной опцией в инициализации. Данная опция будет ставить фокус на определенном поле при загрузке формы. А это в свою очередь удобство. Лично мне нравится, что при открытии, скажем, формы поиска фокус сразу идет на поле ввода ключевого запроса.
// Форма в модальном окне с фокусом на поле Имя
$('.popup-with-form').magnificPopup({
type: 'inline',
focus: '#name'
});
<a href="#form-popup" class="popup-with-form">Открыть форму в модальном окне</a>
<div id="form-popup" class="white-popup mfp-hide">
<form action="#">
<div><input id="name" class="inputbox" type="text" placeholder="Ваше имя" /></div>
<div><input id="email" class="inputbox" type="email" placeholder="Ваше e-mail" /></div>
<div><textarea name="mess" id="mess" class="inputbox" cols="30" rows="10" placeholder="Ваше сообщение"></textarea></div>
<div><input type="submit" value="Отправить"></div>
</form>
</div>
В данном случае при открытии формы фокус срабатывает на поле с id=»name» — Имя.
Чем данное окно отличается от предыдущих с типом inline? Практически ничем, за исключением того, что данное окно не закрывается по клику на затемненной области. Также скрыта кнопочка с крестиком. Для закрытия мы будет использовать другой объект. Таким образом можно создавать диалоговые окна на сайте.
// Диалоговое окно
$('.popup-modal').magnificPopup({
type: 'inline',
preloader: false,
modal: true
});
$(document).on('click', '.popup-modal-dismiss', function(e) {
e.preventDefault();
$.magnificPopup.close();
});
Здесь, как видим, используются дополнительные опции. О некоторых из них мы поговорим ниже.
<a class="popup-modal" href="#test-modal">Открыть модальное окно</a>
<div id="test-modal" class="white-popup mfp-hide">
<p style="text-align: right;"><a class="popup-modal-dismiss" href="#">Закрыть</a></p>
<h3>Диалоговое окно</h3>
<p>You won't be able to dismiss this by usual means (escape or
click button), but you can close it programatically based on
user choices or actions.</p>
</div>
Теперь давайте рассмотрим некоторые опции плагина Magnific Popup.
Тип — string (строка)
По умолчанию — empty
Данной опцией мы можем задать класс общему родительскому блоку всплываемого контента. Исходя из этого мы можем задать свое оформление конкретному окну. Также класс присваивается и блоку с затемненным фоном. Опять таки, можем задать цвет не черный, а скажем, белый. Здесь уже ваш полет фантазии расширяется.
Также, отталкиваясь от присваиваемого класса, мы можем задавать различные эффекты всплывания окна. Делается это все на CSS. Давайте зададим анимацию первому модальному окну, рассмотренного в данной статье выше. Это окно с текстом.
Создадим отдельную инициализацию с возможностью анимации.
// Модальное окно с эффектом ZoomIn
$('.popup-with-zoom-anim').magnificPopup({
type: 'inline',
removalDelay: 300,
mainClass: 'my-mfp-zoom-in'
});
Создадим правила анимации в CSS
/**
* Fade-zoom animation for first dialog
**/
/* start state */
.my-mfp-zoom-in .zoom-anim-dialog {
opacity: 0;
-webkit-transition: all 0.2s ease-in-out;
-moz-transition: all 0.2s ease-in-out;
-o-transition: all 0.2s ease-in-out;
transition: all 0.2s ease-in-out;
-webkit-transform: scale(0.8);
-moz-transform: scale(0.8);
-ms-transform: scale(0.8);
-o-transform: scale(0.8);
transform: scale(0.8);
}
/* animate in */
.my-mfp-zoom-in.mfp-ready .zoom-anim-dialog {
opacity: 1;
-webkit-transform: scale(1);
-moz-transform: scale(1);
-ms-transform: scale(1);
-o-transform: scale(1);
transform: scale(1);
}
/* animate out */
.my-mfp-zoom-in.mfp-removing .zoom-anim-dialog {
-webkit-transform: scale(0.8);
-moz-transform: scale(0.8);
-ms-transform: scale(0.8);
-o-transform: scale(0.8);
transform: scale(0.8);
opacity: 0;
}
/* Dark overlay, start state */
.my-mfp-zoom-in.mfp-bg {
opacity: 0;
-webkit-transition: opacity 0.3s ease-out;
-moz-transition: opacity 0.3s ease-out;
-o-transition: opacity 0.3s ease-out;
transition: opacity 0.3s ease-out;
}
/* animate in */
.my-mfp-zoom-in.mfp-ready.mfp-bg {
opacity: 0.8;
}
/* animate out */
.my-mfp-zoom-in.mfp-removing.mfp-bg {
opacity: 0;
}
/**
* Fade-move animation for second dialog
*/
/* at start */
.my-mfp-slide-bottom .zoom-anim-dialog {
opacity: 0;
-webkit-transition: all 0.2s ease-out;
-moz-transition: all 0.2s ease-out;
-o-transition: all 0.2s ease-out;
transition: all 0.2s ease-out;
-webkit-transform: translateY(-20px) perspective( 600px ) rotateX( 10deg );
-moz-transform: translateY(-20px) perspective( 600px ) rotateX( 10deg );
-ms-transform: translateY(-20px) perspective( 600px ) rotateX( 10deg );
-o-transform: translateY(-20px) perspective( 600px ) rotateX( 10deg );
transform: translateY(-20px) perspective( 600px ) rotateX( 10deg );
}
/* animate in */
.my-mfp-slide-bottom.mfp-ready .zoom-anim-dialog {
opacity: 1;
-webkit-transform: translateY(0) perspective( 600px ) rotateX( 0 );
-moz-transform: translateY(0) perspective( 600px ) rotateX( 0 );
-ms-transform: translateY(0) perspective( 600px ) rotateX( 0 );
-o-transform: translateY(0) perspective( 600px ) rotateX( 0 );
transform: translateY(0) perspective( 600px ) rotateX( 0 );
}
/* animate out */
.my-mfp-slide-bottom.mfp-removing .zoom-anim-dialog {
opacity: 0;
-webkit-transform: translateY(-10px) perspective( 600px ) rotateX( 10deg );
-moz-transform: translateY(-10px) perspective( 600px ) rotateX( 10deg );
-ms-transform: translateY(-10px) perspective( 600px ) rotateX( 10deg );
-o-transform: translateY(-10px) perspective( 600px ) rotateX( 10deg );
transform: translateY(-10px) perspective( 600px ) rotateX( 10deg );
}
/* Dark overlay, start state */
.my-mfp-slide-bottom.mfp-bg {
opacity: 0;
-webkit-transition: opacity 0.3s ease-out;
-moz-transition: opacity 0.3s ease-out;
-o-transition: opacity 0.3s ease-out;
transition: opacity 0.3s ease-out;
}
/* animate in */
.my-mfp-slide-bottom.mfp-ready.mfp-bg {
opacity: 0.8;
}
/* animate out */
.my-mfp-slide-bottom.mfp-removing.mfp-bg {
opacity: 0;
}
<p><a class="popup-with-zoom-anim" href="#text-popup-anim">Вызвать окно с текстом</a></p>
<div id="text-popup-anim" class="zoom-anim-dialog white-popup mfp-hide"> <p>С другой стороны постоянное информационно-пропагандистское обеспечение нашей деятельности позволяет оценить значение направлений прогрессивного развития.</p> </div>
Если заметите в коде инициализации мы использовали дополнительную опцию — removalDelay. Без данной опции анимация срабатывать не будет.
Тип — integer
По умолчанию — 0
Задержка удаления Popup из DOM. Значение соответствует миллисекундам.
Тип — boolean
По умолчанию — true
Индикатор текущего состояния. По умолчанию при загрузке контента выводится надпись — Loading… Если опция включена, она всегда присутствует в DOM, меняется только текст внутри него. В зависимости от состояния у блока меняется класс. В CSS мы можем задать разное оформление. Вот список классов:
/* Процесс загрузки */
.mfp-s-loading { }
/* Удачная загрузка */
.mfp-s-ready { }
/* Загрузка с ошибкой */
.mfp-s-error { }
Тип — boolean
По умолчанию — true
Если включено, скрипт добавляет кнопку с крестиком в контейнер popup окна. Если вам нужно, чтобы она была за пределами модального окна, то достаточно передать значение — false
closeBtnInside: false
Тип — boolean
По умолчанию — true
Закрывает модальное окно по клику на затемненной области.
Тип — boolean
По умолчанию — false
Если включено, выравнивает окно по верхнему краю, а не по центру. Выравнивание работает с помощью добавления класса — mfp-align-top.
Тип — integer
По умолчанию — null
Отключает действие, если максимальная ширина окна браузера равна заданному значению. Может принимать и функцию, которая должна вернуть правду или ложь.
disableOn: 768
или
disableOn: function() {
if( $(window).width() < 600 ) {
return false;
}
return true;
}
Это далеко не все опции плагина. Я выбрал лишь некоторые из них, которые сам использую. Если брать все во внимание, то статья получится слишком большой. Вы можете расширить этот список самостоятельно, если заглянете в документацию на официальном сайте.
Я надеюсь вы поняли каковы возможности Magnific Popup. Лично я сам еще не все возможности данного плагина изведал. Даже сейчас по ходу написания данной статьи я открыл для себя новые возможности Magnific.
Напоследок хочу дать вам ссылку на Codepen автора с некоторыми примерами Magnific Popap — http://codepen.io/collection/nLcqo/. Все, на этом и завершу.
Надеюсь вам данная статья пригодится. Всем спасибо за внимание.