jQuery

индекс
283,92

SimpleModal — простые модальные окна

Обзор плагина SimpleModal, его глюков, избавление от глючности, позиционирование по центру экрана и прочие удобства. Вообще я публиковал статью в своем блоге:«SimpleModal — простые модальные окна», но подумал что и хабраюзерам может быть интересно про это узнать. А так же советую взглянуть на более новую статью «Модальные окна на jQuery blockUI». Не все же с лайтбоксами играться.

Начинаем использовать


Данные плагина:

Выглядит это дело вот так:



Для того чтобы плагин заработал его надо подключить:
<script src=«jquery.simplemodal.js» type=«text/javascript»></script>

А так же указать стили для овереля (серой области), контейнера (собственно окно) и кнопки закрыть.

#modalOverlay {
background-color:#000; /* Тут выбираем цвет затемнения */
cursor:wait; /* Курсор при наведении на затемненную область */
filter: alpha(opacity=80); /* Интенсивность затемнения */
height: 100%;
}

#modalContainer {
height:auto;  /* Для растягивания по высоте */
width:300px;
left:50%; /*в купе с margin-left, которая равна минус половине ширины центруют по горизонтали*/
top:50%;  /*центрует по вертикали, вместе с margin-top, если задать высоту*/
margin-left:-150px;
/* margin-top: -70px; */
background-color:#fff;
border:3px solid #ccc;
padding: 10px;

a.modalCloseImg {
background:url(x.png) no-repeat;
width:25px; /* Положение отличается от тех, что в примере. Мне кажется так удобнее */
height:29px;
display:inline;
z-index:3200;
position:absolute;
top:0px;
right:0px;
cursor:pointer;
}



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

Вот так это выглядит в Опере

Однако это решается довольно просто. На страницу необходимо добавить стиль
#helper {
position: absolute;
top: 0px;
left: 0px;
width: 100%;
height: 100%;
z-index: -10;
}


И в любом месте страницы вставляем:
<div id="helper"></div>

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

Делаем удобное оповещение


Сначала добьемся, чтобы окно было посередине страницы. В своем примере я ограничил ширину 300px, а вот высота может меняться. CSS свойство top:50% действительно опускает окно до середины страницы, однако само модальное окно идет как раз ниже середины. Если бы мы указали высоту в пикселях, например 150px, то могли бы поднять окно над центром с помощью margin-top: -75px. Но окно будет резиновым, а мы для этого воспользуемся еще одним плагином: Dimensions. Данные плагина:

Этот плагин дает нам возможность измерить высоту окна, соответственно и вычислить половину высоты и поднять на это количество пикселей окно над центром веб-страницы.
<script type="text/javascript" src="jquery.dimensions.js"></script>

Подключили. Теперь открываем редактором файл плагина Simplemodal (jquery.simplemodal.js), да-да, будем исправлять плагин. Если наши версии совпадают, то на строке 294 будет функция open. Идем в самый ее конец, сразу после this.bindEvents(); и до закрывающей фигурной скобки ставим
<pre name="code" class="js">
$('#modalContainer').css('margin-top',-$('#modalContainer').outerHeight()/2-50);
</pre>

Я специально отнял от высоты еще 50 пикселей, мне кажется это добавляет удобства. Но вы можете поэкспериментировать. Осталось совсем немного. Добавляем где-нибудь в конце страницы
<div id="message" style="display: none; text-align: center;">
<div id="messageText">текст модального окна</div><br /><br />
<input type='button' value='Ok' class='modalClose' style='height: 30px; width: 60px;'/>
</div>
Заметьте, кнопка имеет class='modalClose'. Вы можете создать в диве любой другой объект с этим классом — клик по нему будет закрывать окно. Все, приготовления закончены. Осталось его только использовать. Например так:
<script type="text/javascript">
$(document).ready( function() {
$('#messageText').html('Это наше окошко!');
$('#message').modal();
});
</script>

И при загрузке страницы увидим

Наше модальное окно!

Ура, у нас все получилось.

Демо: посмотреть
_________
Текст подготовлен в ХабраРедакторе
Source code was highlighted with Source Code Highlighter.
+35
30 ноября 2008, 15:12
100

комментарии (22)

+2
Assargin #
У Вас тут опечаточка небольшая вкралась (наверно):

>> И в любом месте страницы вставляем:
>> </div id=«helper»>

И насчет dimensions: мне как-то для оповещений больше по душе пришелся jgrowl
0
CharnaD #
спасибо, это и правда опечатка. я просто нечаянно подсветил код с blockquote><code, и потом их вручную доставал оттуда. а про тот слеш забыл)

jgrowl тоже неплох, но мне кажется они все равно оповещаю чуть-чуть по-разному
0
psylosss #
Спасибо за наводку по jgrowl! То что я искал. Только, мне кажется, у него минус есть: его не очень-то и заметно. Это субъективно.
+1
Assargin #
Насколько помню, он неплохо кастомизируется css'ом))
+1
DYPA #
мне больше в свое время понравилась эта библиотека dev.iceburg.net/jquery/jqModal/#examples
0
vietnamese #
LightBox2 — не в пример лучше вашего SimpleModal. Проверено!
0
vietnamese #
Сорри, ступил )))
Лайтбокс же только для галлерей…
0
deerua #
Поверх флеша работает?
0
dals #
«Поверх флеша», в принципе, решаемо. Как в Linux-, так и в Windows-версиях браузеров. По крайней мере, для Firefox 3.0.4 (и для Opera 9.6x) — обновление флеш-плагина и прописывание в тегах
embedded и object свойств.
Если, конечно, вы этот вопрос имели задать :)
+1
psylosss #
Если честно, мне больше facebox нравится.
+2
akzhan #
Начиная с версии 1.2.6, плагина jquery.dimensions инкорпорирован в jquery, его не нужно подключать.
вроде как :)

p.s.: jgrowl хорош.
0
McDEN #
спасибо, пригодится
0
bO_oblik #
Я писал о плагине для создания легких модальных окон.

Тоже, кстати, на jQuery.
0
CharnaD #
а я там откамментил)
–3
FeoOne #
Имхо модальные окна проще сделать без фреймворков
+1
p00h #
Очень удобно, спасибо!
0
ozlev #
Для Оперы я пользовал вот такую функцию:
где dialog — это тот самый $('#modalContainer')…
function closeOpera(dialog) {
dialog.data.fadeOut('fast',function() {
dialog.container.slideUp('fast',function() {
dialog.overlay.fadeOut('fast', function () {
$.modal.close();}); }); });}
Кстати она существует в примерах на сайте plug-in-а…
0
without_brain #
Зачем нужны такие плагины, которые нужно править руками и костыли подставлять чтобы работало?
+1
Uznick #
0
stn #
В IE, как только тронешь окошко, оно скачет как вошь.
0
marazmiki #
В демке под IE6 появляются скроллбары при открытом модальном окошке: оверлей не помещается в родителей :(
В остальном (не считая, конечно, IE 5.5-) всё отлично.

Спасибо :)
0
SCT #

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.