Главная » Уроки » Модальные всплывающие окна с помощью CSS3 без Javascript

Модальные всплывающие окна с помощью CSS3 без Javascript

Модальные всплывающие окна с помощью CSS3 без Javascript

В очередной раз обращаюсь к теме создания модальных(всплывающих) окон. В последнее время меня все больше интересуют, различные техники исполнения всплывающих окон, без использования javascript, плагинов jQuery и т.д. Больший интерес вызывает возможность применения чистых стилей и неисчерпаемого потенциала новых функций .
Основываясь на разработках некоторых уважаемых буржуинов, они в этом плане ребята ушлые, получаются неплохие результаты, в плане создания модальных окон с помощью CSS3. Задача, в первую очередь состоит в том, чтобы добиться более-менее устойчивой кросбраузерности конечного результата, ну и конечно же, с наименьшими потерями, уменьшить общее количество кода, как в HTML так и в CSS, дабы облегчить жизнь многострадальным труженикам сайтостроения.
Что получается в итоге, у меня в этом плане на сегодняшний день, мы с вами и посмотрим, а заодно, и научимся делать всплывающие модальные окна с помощью «магии» CSS3.

Обновлено: 03.01.2017

 
Модальное окно с помощью CSS3
 
Для начала, все те кого заинтересовала эта тема, можете взглянуть на пример работы модальных окон в различных вариантах и скачать исходники:

Не стоит воспринимать данный урок, как руководство к действию, так как на этом этапе удалось добиться уверенной поддержки лишь современными браузерами ( IE 9+, Firefox, Safari, Opera, Chrome ). С оглядкой на то, что древние версии браузера IE еще достаточно популярены среди пользователей, рекомендую рассматривать эту статью в виде некоего эксперимента, демонстрации возможностей CSS3.

Хорошо, теперь перейдем непосредственно к самой раскладке html кода и стилевого формирования нашего модального окна с помощью css3 )))

 

Шаг 1. HTML

Во-первых, давайте создадим основную разметку HTML. Как вы можете видеть, базовая конструкция довольно простая, если рассматривать именно html-разметку модальных окон и кнопок(ссылок), для их активации. Каждое модальное окошко, представляет из себя ничто иное, как стандартный контейнер <div>, с определенным содержание внутри и кнопкой «Закрыть», сформированной исключительно средствами css.

Далее приведу пример базовой html-разметки всплывающих окон и ссылок активации:

 

<!-- Ссылки на вызов модальных окон-->
 <a href="#win1" class="button button-green">Открыть окно 1</a>
 <a href="#win2" class="button button-red">Открыть окно 2</a>
 <a href="#win3" class="button button-blue">Видео в окне 3</a>
 <a href="#win4" class="button button-orange">Фото в окне 4</a>
<!-- Вызов окна через миниатюру изображения -->
<a href="#win5"><img title="" src="img/realism_lrg.jpg" width="150" height="150" alt="" /></a>
<!-- Модальное окно №1 -->
   <a href="#x" class="overlay" id="win1"></a>
   <div class="popup">
     Здесь вы можете разместить любое содержание, текст с картинками или видео! 
    <a class="close"title="Закрыть" href="#close"></a>
    </div>
<!-- Модальное окно №2 -->
    <a href="#x" class="overlay" id="win2"></a>
    <div class="popup">
     Здесь вы можете разместить любое содержание, текст с картинками или видео! 
    <a class="close" title="Закрыть" href="#close"></a>
    </div>
<!-- Модальное окно №3 -->
        <a href="#x" class="overlay" id="win3"></a>
        <div class="popup">
<h2>Заголовок</h2>
      Здесь вставляете видео своё или с любого стороннего ресурса, YouTube, Vimeo и т.д.(iframe, embed)...
        <a class="close" title="Закрыть" href="page.html" onclick="return false"></a><!-- Выключение видео при закрытии окна -->
        </div>
<!-- Модальное окно №4 -->
<a href="#x" class="overlay" id="win4"></a>
        <div class="popup">
<img class="is-image" src="ваша-картинка.jpg" alt="" />
        <a class="close" title="Закрыть" href="#close"></a>
        </div>
<!-- Модальное окно №5 -->
        <a href="#x" class="overlay" id="win5"></a>
        <div class="popup">
<img class="is-image" src="ваша-картинка.jpg" alt="" />
<a class="close" title="Закрыть" href="#close"></a>
        </div>

 
В вышеприведенном примере кода, для наглядности, в контейнерах модальных окон прописал краткие пояснения. Вам остается по аналогии, в div-контейнер всплывающего окна, поместить любое свое содержание, будь то простой текст, картинки или видео с любого стороннего ресурса, YouTube, Vimeo и т.д. Ссылки на вызов модальных окон, можете сделать текстовыми, или же оформить их в виде замечательных, градиентных кнопок, как в примере.
 

Шаг 2. CSS

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

/* Базовые стили слоя затемнения и модального окна  */
.overlay {
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
    z-index: 10;
    display: none;
/* фон затемнения */
    background-color: rgba(0, 0, 0, 0.65);
    position: fixed; /* фиксированное поцизионирование */
    cursor: default; /* тип курсара */
}
/* активируем слой затемнения */
.overlay:target {
    display: block;
}
/* стили модального окна */
.popup {
    top: -100%;
    right: 0;
    left: 50%;
    font-size: 14px;
    z-index: 20;
    margin: 0;
    width: 85%;
    min-width: 320px;
    max-width: 600px;
/* фиксированное позиционирование, окно стабильно при прокрутке */
    position: fixed;
    padding: 15px;
    border: 1px solid #383838;
    background: #fefefe;
/* скругление углов */
    -webkit-border-radius: 4px;
    -moz-border-radius: 4px;
    -ms-border-radius: 4px;
    border-radius: 4px;
    font: 14px/18px 'Tahoma', Arial, sans-serif;
/* внешняя тень */
    -webkit-box-shadow: 0 15px 20px rgba(0,0,0,.22),0 19px 60px rgba(0,0,0,.3);
    -moz-box-shadow: 0 15px 20px rgba(0,0,0,.22),0 19px 60px rgba(0,0,0,.3);
    -ms-box-shadow: 0 15px 20px rgba(0,0,0,.22),0 19px 60px rgba(0,0,0,.3);
    box-shadow: 0 15px 20px rgba(0,0,0,.22),0 19px 60px rgba(0,0,0,.3);
    -webkit-transform: translate(-50%, -500%);
    -ms-transform: translate(-50%, -500%);
    -o-transform: translate(-50%, -500%);
    transform: translate(-50%, -500%);
    -webkit-transition: -webkit-transform 0.6s ease-out;
    -moz-transition: -moz-transform 0.6s ease-out;
    -o-transition: -o-transform 0.6s ease-out;
    transition: transform 0.6s ease-out;
}
/* активируем модальный блок */
.overlay:target+.popup {
    -webkit-transform: translate(-50%, 0);
    -ms-transform: translate(-50%, 0);
    -o-transform: translate(-50%, 0);
    transform: translate(-50%, 0);
    top: 20%;
}
/* формируем кнопку закрытия */
.close {
    top: -10px;
    right: -10px;
    width: 20px;
    height: 20px;
    position: absolute;
    padding: 0;
    border: 2px solid #ccc;
    -webkit-border-radius: 15px;
    -moz-border-radius: 15px;
    -ms-border-radius: 15px;
    -o-border-radius: 15px;
    border-radius: 15px;
    background-color: rgba(61, 61, 61, 0.8);
    -webkit-box-shadow: 0px 0px 10px #000;
    -moz-box-shadow: 0px 0px 10px #000;
    box-shadow: 0px 0px 10px #000;
    text-align: center;
    text-decoration: none;
    font: 13px/20px 'Tahoma', Arial, sans-serif;
    font-weight: bold;
    -webkit-transition: all ease .8s;
    -moz-transition: all ease .8s;
    -ms-transition: all ease .8s;
    -o-transition: all ease .8s;
    transition: all ease .8s;
}
.close:before {
    color: rgba(255, 255, 255, 0.9);
    content: "X";
    text-shadow: 0 -1px rgba(0, 0, 0, 0.9);
    font-size: 12px;
}
.close:hover {
    background-color: rgba(252, 20, 0, 0.8);
    -webkit-transform: rotate(360deg);
    -moz-transform: rotate(360deg);
    -ms-transform: rotate(360deg);
    -o-transform: rotate(360deg);
    transform: rotate(360deg);    
}
/* изображения внутри окна */
.popup img {
    width: 100%;
    height: auto;
}
/* миниатюры слева/справа */
.pic-left, 
.pic-right {
    width: 25%;
    height: auto;
}
.pic-left {
    float: left;
    margin: 5px 15px 5px 0;
}
.pic-right {
    float: right;
    margin: 5px 0 5px 15px;
}
/* элементы м-медиа, фреймы */
.popup embed, 
.popup iframe {
    top: 0;
    right: 0;
    bottom: 0; 
    left: 0; 
    display:block;
    margin: auto;
    min-width: 320px;
    max-width: 600px;
    width: 100%;
}
.popup h2 { /* заголовок 2 */
    margin: 0;
    color: #008000;
    padding: 5px 0px 10px;
    text-align: left;
    text-shadow: 1px 1px 3px #adadad;
    font-weight: 500;
    font-size: 1.4em;
    font-family: 'Tahoma', Arial, sans-serif;
    line-height: 1.3;
}
/* параграфы */
.popup p {margin: 0; padding: 5px 0}

 
Как видите, дорогие друзья, всё довольно таки просто и никакой лишней мешанины. Если всё проделаете правильно, то получите в свой арсенал инструментов, замечательное , в котором сможете разместить любой контент, будь то текстовое содержание, фотографии, различные формы регистрации и обратной связи, или же видеоролики из любого стороннего источника. Экспериментируйте с параметрами, видоизменяйте окно, как вашей душе угодно. По возможности, делитесь в комментариях своими наработками, или же возникшими вдруг проблемами.
 
За основу были взяты материалы с различных буржуинских источников, безжалостно перелопачены, переработаны и собраны в более-менее стройную конструкцию, все мануалы по теме и не упомню, так что ......

Заключение:

Часто, даже очень часто мне задают вопрос, как же правильно останавливать воспроизведение видео при закрытии мод. окна. При закрытии модального окна, проигрывание видеоролика в демо останавливается. В демо использовал событие onclick, для кнопки закрытия окна, указав в ссылке адрес демо-страницы, т.е. страницы, на которой расположено окно с видео:

<a class="close" title="Закрыть" href="demo.html" onclick="demo.html(); return false;"></a>

Можно просто использовать ссылку с пустым атрибутом href="", в обоих случаях происходит перезагрузка страницы и соответственно закрывается, и окно, и останавливается видео, костыль ещё тот конечно, но другого более действенного и валидного решения, без подключения javascript, на данный момент у меня нет.

В обновлении к статье Модальный блок видео на CSS3 расписал способ остановки видео с подключением в работу jQuery и YouTube JavaScript Player API. Видимо стоит продублировать и здесь.

Метод отлично срабатывает для встроенного видео с YouTube. В первую очередь, вам понадобится подключить библиотеку jQuery (если таковая у вас отсутствует), например, с сервиса Google Code:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>

Затем подключаете YouTube JavaScript Player API:

<script type="text/javascript" src="http://www.youtube.com/player_api"></script>

С помощью API JavaScript, вы сможете управлять проигрывателем Chromeless Player и встроенным проигрывателем YouTube с помощью javaScript кода. Для нашего модального блока с встроенным видео, исполняемый js будет таким:

<script>
        var player;
        function onYouTubePlayerAPIReady() {
        player = new YT.Player('player');
        }
 
        $('#stop').click(function(){
        player.stopVideo()
        })
    </script>

Далее, фрейму(iframe) с видео, необходимо присвоить идентификатор, пусть это будет id="player".

<iframe id="player" width="853" height="480" src="https://www.youtube.com/embed/1IrR7l9pGF0" frameborder="0" allowfullscreen=""></iframe>

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

<a href="#close" id="stop" title="Закрыть" class="close"></a>

При клике по кнопке с id="stop" будет вызвана функция player.stopVideo (), окно закроется и воспроизведение видео остановится.
Однако следует понимать, что для других видео-сервисов и танцы с бубнами будут другими))). Хотя всегда есть выбор — это использовать готовые специализированные плагины.

С Уважением, Андрей .

Буду признателен, если поделитесь ссылкой на запись в своих соц-сетях:

Вы можете оставить отзыв, подписаться на обновленияОбновления блога по RSSRSS или Обновления блога на TwitterTwitter !

389 комментариев
  1. Вячеслав:

    сори нашел!!!!

    Ответить
  2. Вячеслав:

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

    Ответить
    • driver:

      Чем же я вам помогу не видя пациента? )))

      Ответить
      • как отправить тебе код?? у меня фигня получаеться??

        Ответить
      • сайт lc-zarnica.ru

        Ответить
        • driver:

          Разбираюсь с вашей кнопкой и прокруткой, в ближайшее время отпишусь. Код страницы в комменты упихивать нестоит))))

        • driver:

          По поводу полосы прокрутки я уже пояснял в комментариях: См. Здесь

        • driver:

          Теперь по кнопке.

          В Html:

          <!-- Блок с кнопкой на вызов модальных окон-->
          <div style="text-align:center">
             <a href="#win2" class="button button-orange" rel="nofollow">Правила и техника безопасности</a>
           </div>

          В CSS:

            /*------ button ------*/
          .button {
            position: relative;
            display: inline-block;
            padding: 10px 20px;
            font: 20px/32px 'Tahoma', Arial, sans-serif;
            color: whitesmoke;
            text-align: center;
            text-decoration: none;
            text-shadow: 0 -1px rgba(0, 0, 0, 0.4);
            background-clip: padding-box;
            border: 1px solid;
            border-radius: 3px;
            cursor: pointer;
            -moz-box-shadow: inset 0 1px rgba(255, 255, 255, 0.1), inset 0 0 0 1px rgba(255, 255, 255, 0.08), 0 1px 2px rgba(0, 0, 0, 0.25);
            -webkit-box-shadow: inset 0 1px rgba(255, 255, 255, 0.1), inset 0 0 0 1px rgba(255, 255, 255, 0.08), 0 1px 2px rgba(0, 0, 0, 0.25);
            box-shadow: inset 0 1px rgba(255, 255, 255, 0.1), inset 0 0 0 1px rgba(255, 255, 255, 0.08), 0 1px 2px rgba(0, 0, 0, 0.25);
          }
          .button:hover {
          text-decoration: none;
          }
          .button:before {
            content: '';
            position: absolute;
            top: 0;
            bottom: 0;
            left: 0;
            right: 0;
            pointer-events: none;
            background-image: -webkit-radial-gradient(center top, farthest-corner, rgba(255, 255, 255, 0.08), rgba(255, 255, 255, 0));
            background-image: -moz-radial-gradient(center top, farthest-corner, rgba(255, 255, 255, 0.08), rgba(255, 255, 255, 0));
            background-image: -o-radial-gradient(center top, farthest-corner, rgba(255, 255, 255, 0.08), rgba(255, 255, 255, 0));
            background-image: radial-gradient(center top, farthest-corner, rgba(255, 255, 255, 0.08), rgba(255, 255, 255, 0));
          }
          .button:hover:before {
            background-image: -webkit-radial-gradient(farthest-corner, rgba(255, 255, 255, 0.18), rgba(255, 255, 255, 0.03));
            background-image: -moz-radial-gradient(farthest-corner, rgba(255, 255, 255, 0.18), rgba(255, 255, 255, 0.03));
            background-image: -o-radial-gradient(farthest-corner, rgba(255, 255, 255, 0.18), rgba(255, 255, 255, 0.03));
            background-image: radial-gradient(farthest-corner, rgba(255, 255, 255, 0.18), rgba(255, 255, 255, 0.03));
          }
          .button:active {
            -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.2);
            box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.2);
          }
          .button:active:before {
            content: none;
          }
           
          /*orange */
           .button-orange {
            background: #f4902a;
            border-color: #df770c #df770c #c76a0a;
            background-image: -webkit-linear-gradient(top, #f69f47, #f4902a 66%, #f38617);
            background-image: -moz-linear-gradient(top, #f69f47, #f4902a 66%, #f38617);
            background-image: -o-linear-gradient(top, #f69f47, #f4902a 66%, #f38617);
            background-image: linear-gradient(to bottom, #f69f47, #f4902a 66%, #f38617);
          }
          .button:hover{
            text-decoration:none;
            }
          .button-orange:active {
            background: #f4902a;
            border-color: #c76a0a #df770c #df770c;
          }

          Получится следующее: Тынц>>

        • driver:

          И ещё, найдите в my.css селектор

          .popup p, .popup div { margin-bottom: 10px; } и добавьте свойство line-height: 18px;, текст внутри окна будет лучше визуально воспринимаемым.

      • Спасибо большое!!!!!!!!

        Ответить
  3. Александр:

    Спасибо!

    Очень доходчиво и понятно. Получилось с первого раза!)

    Ответить
  4. Спасибо! Просто и понятно! Здорово!

    Ответить
  5. Мейлис:

    попробовал ваш метод, как только заменяю на свой текст модальные окна больше не появляются при нажатии, в чем может быть проблема?

    Ответить
    • driver:

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

      Ответить
  6. Семен:

    Добрый день, подскажите пожалуйста, как сделать так, чтобы это окно само пропадало через 5 секунд после появления?(Автоматически закрывалось)

    Ответить
  7. alesd:

    Добрый день! Вставил данный код+ css в шаблон вордпресс, экран затемняется, окно не выводит. Пожалуйста подскажите в чем может быть причина?

    Ответить
  8. alesd:

    Не подскажите как в wp можно прикрутить выпадающее окно к одному из пунктов меню? Есть раздел онлайн-трансляция, при нажатии на который нужно, что бы выводилось всплывающее окно.

    Ответить
    • driver:

      пропишите в href нужного вам пункта, id соответствующий идентификатору модального окна, например вот так:

      <a href="#win1"  rel="nofollow">Онлайн-трансляция</a>

      rel="nofollow" не пишите, это у меня плагин все ссылки в комментах кроет))))

      Ответить
  9. alesd:

    Ниже приведен код с файла header.php , вставил в него строку li a href="#win3" rel="#win3">ОТВ online , не срабатывает.

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

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

    Не подскажите пожалуйста, какие еще могут быть варианты решения данной задачи?

    div id="cats"

    ul

    li a href="/" title="« class=»active">Новости /li

    li a href="#" rel="toggle[categories]« title=»">Программы /li

    li a href="#" rel="toggle[archives]« title=»">Архивы

    li a href="#win3" rel="#win3">ОТВ online

    'custom-menu' , 'container' => '' , 'fallback_cb'=> 'custom_menu' , 'depth' => 1 ) ); }

    else

    { custom_menu (); }

    ?>

    li a href="#" rel="toggle[search]« title=»">Поиск

    /ul

    /div

    /div

    div id="categories"

    ul class="mcol2"

    Ответить
  10. Роман:

    Driver огромное спасибо!)) Я счастлив!!!

    Ответить
  11. А можно пример того как при нажатии кнопки в форме всплывало окно того что идет загрузка файла допучтим?

    Ответить
  12. Игорь:

    Добрый день. Спасибо за замечательную статью, очень помогла. Но не все так радужно, мне нужна ваша помощь. Я использовал попап на своем сайте (www.formprint.ru) для формы заказа (при нажатии на кнопку «заказать») В окне заказа 3D печати (formprint.ru/#win1) у меня есть спойлер с ценами.Как мне сделать так, чтобы при раскрывании спойлера увеличивалась высота попапа? А то получается, что у меня информация, после открытия спойлера, уходит за пределы формы. Буду очень признателен, если уделите время моей проблеме. Спасибо

    Ответить
    • driver:

      Здравствуйте, Игорь. Вы, для модального окна прописали фиксированные размеры ширины и высоты непосредственно в div-е:

      <div class="popup" style="width:370px; height:570px;">

      Достаточно указать значение auto для height и всё должно быть в порядке.

      И ещё, увеличьте ширину окна примерно до 400px, тогда фон уведомлений об ошибках при заполнении форм не буде наезжать на края окна и всё будет выглядеть эстетичней:

      <div class="popup" style="width:400px; height:auto;">

      Проделайте это для всех используемых у вас на сайте модальных окон содержащих форму заказа.

      Удачи!

      Ответить
      • Игорь:

        Спасибо за ответ, но когда я делаю height auto, у меня попап не умещается на страницу и получается, что информация в конце все равно не доступна и выглядит не эстетично, т.к. попап обрезанный получается. Что с этим можно сделать?

        Ответить
        • driver:

          Как вариант добавить окну возможность прокручиваться вместе с содержимым страницы при просмотре на экранах небольшого размера, для этого необходимо изменить позиционирование окна с фиксированного position: fixed; на абсолютное position: absolute;

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

Присоединяйтесь к обсуждению!

Отправляя кoммeнтapий, Вы автоматически принимаете правила кoммeнтиpoвaния на этом блоге.

Правила кoммeнтиpoвaния на блоге Dobrovoimaster:

  1. Во избежание захламления спамом, первый кoммeнтapий всегда проходит премодерацию.
  2. В поле "Ваш сайт" лучше указывать ссылку на главную страницу вашего сайта/блога. Ссылки на прочую веб-лабуду (в том числе блоги/сплоги, созданные не для людей) будут удалены.
  3. Не используйте в качестве имени комментатора слоганы/названия сайтов, рекламные фразы, ключевые и т.п. слова. В случае несоблюдения этого условия, имя изменяю на свое усмотрение. Просьба указывать нормальное имя или ник.
  4. Скорее всего, что не информативный и короткий кoммeнтapий вида "Спасибо!", "Интересная статья", будет удален. Исключение составляют знакомые автору блога комментаторы.
  5. Комментарии не по теме безжалостно удаляются.

Подписаться не комментируя

Обновления комментариев по RSS RSS комментариев к этой записи »
Рейтинг@Mail.ru