Popup - всплывающее окно

Понедельник, 16 Май 2011

 

Очень часто для компактности содержимого web страницы, а также для привлечения большего внимания к определенному контенту, будь то оригинальное изображение, форма авторизации или обратной связи, целесообразно размещать такой контент во всплывающем окне, так называемом PopUp окне.

 

Для реализации такого всплывающего окна PopUp, были написаны два простых скрипта под две javascript библиотеки: mootools и jquery. Версия mootools - 1.3.2. Версия jQuery - 1.5.2.

 

В этой статье опишу принцип работы скрипта и необходимых свойств CSS, манипулируя значениями которых, достигаются необходимые эффекты PopUp всплывающего окна.

 

И так, как обычно логика. Вызов PopUp обычно осуществляется после какихто действий пользователя, это может быть и просто загрузка страницы в браузер пользователя, и клик по ссылке или какому то объекту на странице. Но в данном примере остановимся на последнем варианте, то есть вызов PopUp окна, быдет осуществлятся после клика мыши по ссылке - событие click.

 

Для этого присваиваем ссылке атрибут ID, и по нему присваиваем этой ссылке событие click, по которому будет вызвана функция отображающая всплывающее PopUp окно.

 

С этим моментом думаю все понятно, теперь о том что будет отображатся и каким образом. Ну вопервых контент который должен отображатся во всплывающем PopUp окне не должен содержатся в самом javascript коде скрипта, так как это создает кучу проблем при использовании для отображении различного контента.

 

Также передавать HTML как параметр в функцию скрипта, тоже не очень удобно. Поэтому было принято решение передавать в параметре функции сам объект DOM который содержит нужный для отображения в PopUp окне контент. Также в функцию передается обьект которому будет назначено событие click по которому вызывается функция отображения PopUp окна.

 

Выглядит это следующим образом:

 

  •  
  • //This Mootools
  • <script type="text/javascript" src="js/mootools-core-1.3.2-full-nocompat-yc.js"></script>
  • <script type="text/javascript" src="js/popup.js"></script>
  • <script type="text/javascript">
  • window.addEvent('domready', function(){
  • PopUp($('obj'), $('trigg'));
  • });
  • </script>
  •  
  • //This jQuery
  • <script type="text/javascript" src="js/jquery-1.5.2.min.js"></script>
  • <script type="text/javascript" src="js/popup.js"></script>
  • <script type="text/javascript">
  • $(document).ready(function(){
  • PopUp($('#obj'), $('#trigg'));
  • });
  • </script>
  •  

 

А сам HTML для данного примера будет выглядеть так:

 

  •  
  • ...
  • <body>
  • <div class="wrapper">
  • <a id="trigg" href="javascript:void(0);">Показать POP-UP окно</a>
  •  
  • <!-- Из obj будет извлечен HTML и помещен в POP-UP -->
  • <div id="obj"><div class="sample"><p>Произвольный HTML код...</p></div></div>
  • <!-- X Из obj будет извлечен HTML и помещен в POP-UP -->
  •  
  • </div>
  • </body>
  • ...
  •  

 

Теперь описание самого скрипта и его функций. Описание будет для примера скрипта POP-UP на mootools, т.к оба варианта отличаются друг от друга, лишь синтаксисом характерным для этих библиотек.

 

И так при событии загрузки web страницы - событии domready, вызывается функция PopUp(obj,trig);, которой передаются в качестве входных параметров: ссылки на обьект содержащий HTML код для отображения в popup окне, и ссылку на объект DOM которому будет присвоено событие клик click.

 

Код скрипта POP-UP Mootools:

 

  •  
  • function PopUp(obj,trig){
  • var html = obj.get('html');
  • obj.destroy();
  • var body = $$('body')[0];
  •  
  • var HTML="<div id='popup'><span id='cancel'></span>"+html+"</div></div>";
  •  
  • var win = new Element('div', {id:'win', html:HTML});
  • win.inject(body);
  •  
  • function showWin(){
  • $('win').setStyles({display: 'block'});
  • $('popup').setStyles({
  • display:'block',
  • opacity:0,
  • top: window.getSize().y/2-$('popup').getSize().y/2+'px',
  • left: window.getSize().x/2-$('popup').getSize().x/2+'px'
  • });
  • $('popup').setStyle('opacity', 1);
  • }
  •  
  • if($(trig)){
  • $(trig).addEvent('click',function(){
  • showWin();
  • });
  • }
  •  
  • if($('cancel')){
  • $('cancel').addEvent('click', function(){
  • $('win').setStyle('display', 'none');
  • });
  • }
  •  
  • }
  •  

 

И так что же делает эта функция PopUp: послее ее вызова создается переменная var html;, которая будет содержать HTML код, переданного DOM объекта из первого входного параметра - obj. Получив нужный HTML для отображения в popup окне, удаляем объект DOM из документа, используя функцию destroy.

 

Далее создаеться переменная body, которая будет содержать ссылку на объект документа BODY, именно в BODY, будет помещен контейнер PopUp окна.

 

После этого создается переменная HTML - которая содержит сформированную HTML разметку popup окна, с помещенным в него содержимым из переменной html.

 

Следующим момент - как говорилось в начале статьи, PopUp - обычно используется для привлечения большего внимания пользователя, или же большей его концентрации на содержимом в PopUp окне. Поэтому для большей эффективности целесообразно затемнить остальной контент web страницы, для этого создается новый HTML элемент с идентификатором win, а также с помещенным в него HTML кодом popup окна. После чего этот объект помещается в BODY. Этот обьект будет перекрывать всю страницу а фоном будет установлен полупрозрачный PNG.

 

  •  
  • var win = new Element('div', {id:'win', html:HTML});
  • win.inject(body);
  •  

 

Далее по коду идет функция showWin(), но для начала опишу часть кода которая вызывает эту функцию, а также скрывает PopUp.

 

Код вызова PopUp и его сокрытие:

 

  •  
  • if($(trig)){
  • $(trig).addEvent('click',function(){
  • showWin();
  • });
  • }
  •  
  • if($('cancel')){
  • $('cancel').addEvent('click', function(){
  • $('win').setStyle('display', 'none');
  • });
  • }
  •  

 

И так сначало присваиваем событие клика по элементу из второго входного параметра функции, и при этом событии вызываем функцию которая отображает popup, а затем присваиваем событие клика по элементу с $('cancel'), который находится в контейнере popup окна, и при этом событии присваиваем CSS свойство display:none; элементу $('win'), тем самым скрывая PopUp.

 

Теперь описание функции showWin(), которая отображает контейнер $('win') и тем самым показывает Pop-UP окно.

 

  •  
  • function showWin(){
  • $('win').setStyles({display: 'block'});
  • $('popup').setStyles({
  • display:'block',
  • opacity:0,
  • top: window.getSize().y/2-$('popup').getSize().y/2+'px',
  • left: window.getSize().x/2-$('popup').getSize().x/2+'px'
  • });
  • $('popup').setStyle('opacity', 1);
  • }
  •  

 

И так, после установки display: block; контейнеру $('win');, затемняется весь контент на странице, а после этого, контейнеру $('popup'), устанавливаются определенные CSS свойства. Во первыых это display: block;, а затем сразу же полная прозрачность opacity:0, и уже после этого производится расчет размеров Pop-UP окна, для его правильного позиционирования по центру окна браузера. Это очень важный момент, потому что без display: block;, функция getSize() не может правильно вычислить размеры элемента.

 

После установки свойств top и left, вновь присваиваем значение opacity равное единице. Что касается самих расчетов то здесь все очень просто: вычисляем ширину окна браузера, делим ее пополам, и вычитаем от этого половину ширины самого Pop-UP окна, точно так-же вычисляем позицию top. Благодаря этому popup окно всегда отображается по центру окна браузера, вне зависимости от размеров как окна браузера так и самого блока $('popup').

 

Теперь описание CSS свойств.

 

CSS:

 

  •  
  • #win{
  • position:absolute;
  • z-index:2000;
  • top:0;
  • left:0;
  • background:url(img/win.png);
  • display:none;
  • height:100%;
  • width:100%;
  • }
  • #popup{
  • padding:0;
  • background:#FFFFFF;
  • position:fixed;
  • width:400px;
  • height:300px;
  • text-align:center;
  • z-index:3000;
  • }
  • #cancel{
  • display:block;
  • float:right;
  • width:15px;
  • height:15px;
  • background:url(img/close.gif) no-repeat;
  • cursor:pointer;
  • position:absolute;
  • top:4px;
  • right:4px;
  • }
  • #obj{display:none;}
  • .sample{padding:20px;}
  •  

 

Для #win - обязательно ширину и высоту в 100%, а также абсолютное позиционирование с top:0 и left:0, а также display:none.

 

Для #popup - обязательно position:fixed, если кто-то еще осуществляет поддержку IE6 в своих проектах, в этой статье вы найдете способ решения проблемы с position:fixed - Position:fixed

 

 

Для #obj - скрываем

 

На этом все, остальное на ваш вкус :)

 

Посмотреть пример для Mootools: PopUp Mootools.

Скачать пример для Mootools: PopUp Mootools.

 

Посмотреть пример для jQuery: PopUp Jquery.

Скачать пример для jQuery: PopUp Jqueryr.

 

PS. Читайте последние записи RSS Подписка на RSS

 

Метки:

Комментарии 

 
anonim Четверг, 19 Май 2011

Подскажите, пожалуйста, а как реализовать передачу переменной из основной в всплывающее окно в примере с jQuery??

 

 
 
anonim Суббота, 21 Май 2011

Хороший вопрос. Решение данной задачи покажу на примере передачи в качестве переменной в Pop_up, путь к картинке.

Сама переменная хранится в href ссылки, при клике по которой в функцию showWin передается значение href, к примеру #img/1.jpg.

HTML код следующий:

Код:<body> <div class="wrapper"> <a class="trigg" href="#img/1.jpg">Показать POP-UP окно (var = 1)</a> <a class="trigg" href="#img/2.jpg">Показать POP-UP окно (var = 2)</a> <a class="trigg" href="#img/3.jpg">Показать POP-UP окно (var = 3)</a> <!-- Из obj будет извлечен HTML и помещен в POP-UP --> <div id="obj"><div class="sample"><p>Произвольный HTML код...</p><img alt="" src="img/1.jpg"/></div></div> <!-- X Из obj будет извлечен HTML и помещен в POP-UP --> </div> </body>

Javascript меняется следующим образом:

1. Сылки клик по которым вызывает показ Pop-Up теперь имеют класс trigg, поэтому:
Код:<script type="text/javascript">$(document).ready(function(){ PopUp($('#obj'), $('.trigg'));});</script>

2. И теперь на все ссылки с этим класом вешаем события следующим образом:
Код:if($(trig)){$(trig).each(function(){ $(this).click(function(){ showWin($(this).attr('href').replace('#', '')); });});}

Здесь из ссылки по которой осуществлен клик, извлекается значение href и удаляется символ решетки, и при вызове функциия showWin получает чистый путь к изображению.

3. Далее функция showWin и как в ней полученная переменная используется:
Код:function showWin(Var){$('#win').css({display: 'block'});$('#popup').css({ display:'block', opacity:0, top: $(window).height()/2-$('#popup').height()/2+'px', left: $(window).width()/2-$('#popup').width()/2+'px'}); $('#popup img').attr('src', Var); $('#popup').css('opacity', 1); }

Здесь просто сменяем src у картинки в Pop-Up на полученное из href:
Код:...$('#popup img').attr('src', Var);...

Посмотреть новый пример: popup-2
Скачать новый пример: popup-2.zip

 

 
 
anonim Пятница, 10 Июнь 2011

Спасибо за скрипт, подобное искал. А подскажите, как в function PopUp(obj,trig) дописать чтобы при закрытии окна обновить так сказать родительское окно. В popup окне происходят какие-то действия (пользователь вводить данные в форму) и при закрытии окна необходимо обновить главное окно. Как расширить функцию PopUp чтобы инициировать обновление главного окна?
Заранее спасибо за помощь.

 

 
 
anonim Пятница, 10 Июнь 2011

Подскажите а как обновить родительское окно, когда закрываем popup?

 

 
 
anonim Пятница, 10 Июнь 2011

Скажите, пожалуйста, а как таким образом можно передать не ссылку к картинке, а html код. То есть, у меня на странице есть несколько ссылок, по которым надо в всплывающем окне показать разные формы? Заранее спасибо!

 

 
 
anonim Понедельник, 20 Июнь 2011

Элементарный вариант - сформировать массив с элементами содержащими код формы:

Код:var arrForm = ['<form>.1.</form>', '<form>.2.</form>', '<form>.3.</form>'];

В href ссылок указывать #0 #1 #2 - это будут индексы массива arrForm, и по клику по этим ссылкам передавать каждый элемент в функцию Pop-Up:

Код:if($(trig)){$(trig).each(function(){ $(this).click(function(){ showWin(arrForm[$(this).attr('href').replace('#', ''))]; });});}

 

 
 
anonim Понедельник, 20 Июнь 2011

По поводу обновления родительского окна:


if($('cancel')){
$('cancel').addEvent('click', function(){
$('win').setStyle('display', 'none');
window.location.reload();
});
}

 

 
 
anonim Вторник, 21 Июнь 2011

Большое спасибо, интересный у вас сайт, жаль нет e-mail подписки, намного удобнее)

 

 
 
anonim Суббота, 02 Июль 2011

Очень интересный пример - но sorry - я только начинаю в этом всём разбираться - подскажите как сделать загрузку popup-menu сразу при загрузке страницы ???

 

 
 
anonim Вторник, 05 Июль 2011

Вам нужно вызвать функцию function showWin() сразу вот так:


$(document).ready(function( ){
PopUp($('#obj'), $('#trigg'));
showWin();
});

 

 
 
anonim Пятница, 22 Июль 2011

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

 

 
 
anonim Понедельник, 08 Август 2011

Прошу прощения, но я не разобрался как сделать так, чтобы при открытии страницы открывалось окно. При клике работает, но мне не нужна эта ссылка, нужно чтобы при открытии страницы открывалось. Можете более детально разъяснить? Спасибо.

 

 
 
anonim Понедельник, 29 Август 2011

PopUp окно - это PopUp окно (маленькое окно, открывающиеся отдельно), а статья у Вас о эмуляции модальных окон. Да, так красивее и в большинстве случаев удобней, но это не как не связанно с PopUp окнами.

 

 
 
anonim Вторник, 27 Сентябрь 2011

Для PopUp Jqueryr исправлен баг в popup.js, обнаружен лишний закрывающий тег </div> :

Код:var HTML="<div id='popup'><span id='cancel'></span>"+html+"&lt;/div&gt;</div>";

Исправлено на:
Код:var HTML="<div id='popup'><span id='cancel'></span>"+html+"</div>";

Этот баг был замечен в IE7 - окно не появлялось, иногда IE выручает :)

 

 
 
anonim Среда, 12 Октябрь 2011

Подскажите как поменять фон затемнения?
Спасибо!

 

 
 
anonim Среда, 12 Октябрь 2011

Для фона затемнения используется полупрозрачное изображение PNG, лежит оно в папке
"img/win.png", замените его на свое изображение с таким же именем файла и все.

 

 
 
anonim Вторник, 25 Октябрь 2011

Для #win в css лучше прописать position: fixed, а не absolute, потому что при absolute при прокрутке окна возникает проблема))

 

 
 
anonim Вторник, 08 Ноябрь 2011

Как расширить popup-окно? Ибо картинка, которую надо показать - значительно больше его. И получается что она съезжает при показе.

 

 
 
anonim Среда, 09 Ноябрь 2011

Давно искала эту информацию, спасибо.

 

 
 
anonim Четверг, 10 Ноябрь 2011

Sergei>>>
В CSS укажите нужную вам ширину окна

 

 
 
Vixent Среда, 23 Ноябрь 2011

Этот пример хорош, но не универсален.
Нужно предусмотреть возможность по разным ссылкам выводить разное содержимое в POPUP...
Например, к одной ссылке - popup с картинкой, к другой - popup с текстом, а к третьей - и то и другое...
Само собой есть море lighbox'ов, но всё-таки.

 

 
 
cleverscript Суббота, 26 Ноябрь 2011

Да знаю скрипт вышел далеко не универсальным, поэтому в следующей статье будет представлен новый вариант, в котором возможно будет в окне выводить все что угодно как в http://fancybox.net

 

 
 
OverKings Понедельник, 16 Январь 2012

+1 к предыдущему комменту

 

 
 
webser Четверг, 26 Январь 2012

Мне тоже нужно открывать окно автоматически при загрузке страницы, но и еще с задержкой.
Автоматический вывод попробовал сделать, поставил
$(document).ready(function( ){
PopUp($('#obj'), $('#trigg'));
showWin();
});
в скрипт - НЕ работает. И как сделать задержку?
Я начинающий и по-этому прощу выложить такой вариант готоваым для его понимания. Заранее спасибо

 

 
 
webser Четверг, 26 Январь 2012

попробовал сделать автоматическое открытие окна заменой функции :
$(document).ready(function( ){
PopUp($('#obj'), $('#trigg'));
showWin();
});
НЕ работает. Можно дать готовый пример открытия окна при загрузке страницы для разбора. И хорошо бы еще и управляемую задержку в открытии сделать.
Заранее спасибо...

 

 
 
Елена Вторник, 21 Февраль 2012

Да, такой блог однозначно надо раскручивать сильнее - что б как можно больше людей о нем узнали

 

 
 
cleverscript Четверг, 23 Февраль 2012

Елена, продвигаю блог в силу своих возможностей, опыта и свободного времени, если у вас есть предложения буду рад обсудить, мейл в футере.

 

 
 
Ev Среда, 29 Февраль 2012

Помогите пожалуйста. Мне нужна форма чтобы и текст разный был и картинки разные были. К примеру когда кликаем на обложку с игрой. Вылазило окно с информацией о игре и скринПробовал массивами но чтото не получается.Выложите плиз готовый пример

 

 
 
cleverscript Понедельник, 19 Март 2012

Ev, попробуйте этот плагин highslide

 

 
 
Александр Суббота, 24 Март 2012

Ребята скрипт классный. Хочу использовать его для интернет магазина. подскажите как сделать так : Есть страница на которой изображен товар и его индификационный номер. нажимаем кнопку ЗАКАЗАТЬ > выскакивает окно в котором уже введен номер товара и форма для заполнениея данных. кто может сделайте плиз исходник я в самих функциях ничего не понимаю

 

 
 
cleverscript Среда, 28 Март 2012

Александр, вам нужно сюда вставлять нужную разметку HTML формы с id в input


<div id="obj"><div class="sample"><p>Произвольный HTML код...</p></div></div>

 

 
 
Павел Среда, 18 Апрель 2012

у меня картинка находится таблице, картинка изменяется при наведении на неё курсором


, пытался приделать pop окно ничего невыходит

 

 
 
Павел Среда, 18 Апрель 2012

хотел писоединить это окно к карнинке которая находится в таблице и анимирована


проблема в том что все на сайте смещается !!!!!!!!!!!!!!!

 

 
 
Валентин Вторник, 15 Май 2012

Подскажите пожалуйста, а как сделать, что бы при нажатии вне дива sample, т.е. в фоне, при нажатии поп ап окно, так же закрывалось.

 

 
 
Валентин Среда, 16 Май 2012

Подскажите как сделать, что бы закрывалось окно при нажатии на фон?

 

 

Добавить комментарий