- Зміст статті
- розмітка
- напівпрозорий фон
- скрипти jQuery
- Розширений функціонал - центрування вікна по центру сторінки
- підсумки
На багатьох сайтах в Мережі можна зустріти так звані спливаючі вікна (англ. Popup). Таким вікнам легко знайти застосування - це всілякі форми зворотного зв'язку, реєстрації, кошики, реклама чого-небудь і т.д. і т.п. У цій статті займемося реалізацією спливаючого вікна на простому прикладі.
демо
Зміст статті
- розмітка
- напівпрозорий фон
- скрипти jQuery
Останнє оновлення - 24.06.2013.
розмітка
Для прикладу я взяв нескладний макет. Ви також можете знайти будь-які інші варіанти, набравши в Гуглі або щось в цьому роді, ну або намалювати свій варіант, якщо ви хоч трохи дизайнер. Це не важливо.
Так як вікно у нас буде просте, зверстаємо його звичайним HTML (хоча можна зробити динамічно через JS / jQuery). Моє віконце складається з заголовка, тексту і двох кнопок, HTML-код такий:
<Div id = "popup" class = "popup"> <h2 class = "popup-title"> Are You Sure? </ H2> <div class = "popup-content"> <p class = "popup-warning" > Lorem Ipsum is simply dummy text of the printing and typesetting industry. </ p> <div class = "popup-choice"> <button id = "btn-yes" class = "btn-yes"> Yes </ button> <button id = "btn-no" class = "btn-no"> no </ button> </ div> </ div> <div class = "btn-close"> </ div> </ div>На мій погляд непогана розмітка - використовуються семантичного елементи і класи, ідентифікатори додані для роботи зі скриптами. Якщо не планується підтримка браузерів Internet Explorer нижче 8-ої версії, <div class = "btn-close"> </ div> можна замінити псевдоелементи: after /: before.
Додамо трохи стилів CSS для нашого вікна:
![](/wp-content/uploads/2020/02/uk-splivauce-vikno-na-html-css-jquery-1.png)
По відношенню до старих браузерам Internet Explorer можна застосувати принцип graceful degradation.
напівпрозорий фон
Приступимо до створення затемнює напівпрозорого фону на всю сторінку. Згодом організуємо його поява разом зі спливаючих вікном - це буде виглядати дуже ефектно.
Додамо в кінець документа перед закриває тегом </ body> порожній елемент <div> з id і class:
<Div id = "hide-layout" class = "hide-layout"> </ div>Растянем його на всю ширину і висоту документа, додамо прозорість, фіксоване позиціонування і великий z-index для перекриття всіх елементів на сторінці - більший z-index повинен бути тільки у спливаючому вікні:
.hide-layout {background: # 000; / * Фон * / bottom: 0; / * Координата знизу * / filter: progid: DXImageTransform.Microsoft.Alpha (opacity = 50); / * Прозорість для IE * / height: 100%; / * Висота на всю сторінку * / opacity: 0.5; / * Прозорість шару * / position: fixed; / * Фіксуємо елемент на сторінці * / top: 0; / * Координата зверху * / width: 100%; / * Ширина на всю сторінку * / z-index: 998; / * Z-index для перекриття інших елементів * /}Зверніть увагу на те що одним з ключових властивостей тут є position: fixed, щоб темний фон прокручувався при Скролл сторінки. Тому такий спосіб не буде працювати в IE6 - він це властивість не підтримує і доведеться звертатися за допомогою до JS. Але ж ми вже залишили в спокої цей браузер, вірно?
І ще момент - кросбраузерності прозорість далі я реалізую через jQ, в IE був виявлений невеликий недолік при показі прихованого блоку.
Результат виконаної роботи, поки без скриптів:
Дивіться приклад
скрипти jQuery
базовий функціонал
Давайте наведемо в дію наше вікно, реалізуємо його спливання при настанні якої-небудь події, наприклад при натисканні миші. Додамо в документ текст, при кліці на який буде з'являтися вікно:
Чому я не використовую тег посилання <a> в даному випадку? Тому що використання нейтрального елемента грамотніше, докладніше читайте тут -.
Почнемо скріптовать наше спливаюче вікно:
<! - підключили jQuery -> <script src = "https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"> </ script> <script> $ ( function () {// тут наступний код ...}) </ script>Спершу приховуємо вікно і додамо кросбраузерності прозорість контейнера з фоном:
$ ( '# Popup'). Hide (); $ ( '# Hide-layout'). Css ({opacity: .5});Звичайно можна приховати необхідні елементи CSS-властивість display: none, але при вимкненому JS ми не зможемо відкрити вікно. Хоча все залежить від поставленого завдання.
Для зручності користувача можна додати в розмітку повідомлення тим, у кого вимкнений JS, щось на зразок цього:
<! - повідомляємо користувачеві -> <noscript> Для коректної роботи сторінки включите JavaScript в настройках браузера </ noscript>Примітка: а шар з фоном все-таки приховуємо через CSS, інакше при вимкненому JavaScript він все перекриє.
Наступний крок - повісимо обробники на подію click елементам # click-me для показу вікна і # btn-close, # hide-layout, відповідно для приховування. Скористаємося готовими методами fadeIn / fadeOut:
$ ( '# Click-me'). Click (function () {$ ( '# hide-layout, #popup'). FadeIn (300); // плавно показуємо вікно / фон}) $ ( '# btn-close , # hide-layout '). click (function () {$ (' # hide-layout, #popup '). fadeOut (300); // плавно приховуємо вікно / фон})Також необхідно повісити обробники на кнопки вибору, при кліці виробляємо якусь дію, після виконання знову приховуємо вікно:
// повісили обробники на кнопки $ ( '# btn-yes, # btn-no'). Click (function () {alert ( 'Виконали якась агресивна дія, потім приховуємо вікно ...'); $ ( '# hide -layout, #popup '). fadeOut (300);})Як бачите, з використанням jQuery все стає просто до неподобства. Навіть ваша бабуся розбере цей код.
Розширений функціонал - центрування вікна по центру сторінки
Тепер все працює як треба, але зробимо ще дещо, а саме центруємо вікно посередині сторінки на jQ. Знову ж можна обійтися звичайним CSS, але JS / jQuery дозволяє зробити все гнучкіше - динамічно вирахуємо розміри вікна і елемента і підставимо потрібні координати, оформивши все це простенької функцією:
// функція приймає елемент, який необхідно центрувати function alignCenter (elem) {elem.css ({// призначення координат left і top left: ($ (window) .width () - elem.width ()) / 2 + 'px ', top: ($ (window) .height () - elem.height ()) / 2 +' px '})}Особливої уваги заслуговують значення координат left і top, в яких ми виссчітиваем ширину / висоту вікна браузера, віднімаємо від неї ширину / висоту прийнятого елемента і ділимо отримані значення на два - це і буде центр сторінки. Як параметр функції додамо елемент #popup. Залишилося внести зміни в код - викличемо функцію на початку скрипта, а також повісимо її на обробник resize (зміна розмірів вікна) об'єкта window, щоб віконце завжди знаходилося по центру. Повний код:
$ (Function () {$ ( '# popup'). Hide (); // приховали фон і спливаюче вікно $ ( '# hide-layout'). Css ({opacity: .5}); // кросбраузерності прозорість alignCenter ($ ( '# popup')); // центрованої вікно $ (window) .resize (function () {alignCenter ($ ( '# popup')); // центрування при ресайз вікна}) $ ( '# click- me '). click (function () {$ (' # hide-layout, #popup '). fadeIn (300); // плавно відкриваємо}) $ (' # btn-close, # hide-layout '). click (function () {$ ( '# hide-layout, #popup'). fadeOut (300); // плавно приховуємо}) $ ( '# btn-yes, # btn-no'). click (function () { alert ( 'Виконали якась агресивна дія, потім приховуємо вікно ...'); // зробили щось ... $ ( '# hide-layout, #popup'). fadeOut (300); // приховали}) // функція центрування function alignCenter (elem) {elem.css ({left: ($ (window) .width () - elem.width ()) / 2 + 'px', // получа м координату центру по ширині top: ($ (window) .height () - elem.height ()) / 2 + 'px' // отримуємо координату центру по висоті})}})підсумки
перевірено
- Internet Explorer 7 +
- Opera
- Firefox
- Chrome
- Safari
оновлення 24.06.2013
Як зауважив читачів для спливаючого вікна не був врахований скролінг документа. Щоб змусити переміщатися наше віконце вгору-вниз при прокручуванні, потрібно просто додати елементу .popup властивість position: fixed.
Дякую користувачам Андрій і ebragim.
Але ж ми вже залишили в спокої цей браузер, вірно?