Главная » Уроки » Интеграция контактной формы в модальное окно

Интеграция контактной формы в модальное окно

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

Обновлено: 31.10.2014

У нас есть вполне приличная контактная форма, сверстанная на чистом , как заделать работоспособное модальное , мы тоже разобрались, теперь остается эти два механизма объединить в единый инструмент. Вот как раз этим интересным занятием, мы сейчас и займемся, для начала же, можете посмотреть пример того, что у нас получится:
 
Контактная форма в модальном окне

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

HTML

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

  • href #?w=600—  указывает ширину окна,
  • rel – уникальный атрибут  окна,
  • class="poplight" – класс для показа всплывающего окна.

Собрав все атрибуты воедино получим следующий вид ссылки:

<a class="poplight" rel="popup_contact" href="#?w=600">Контакты</a>

Затем нам необходимо создать встроенную разметку для всплывающего окна. Разместить можно в любом месте страницы, ну например в нижней части содержания. Обратите внимание, что идентификатор всплывающего окна соответствует атрибуту rel тега <a></a>. Это и будет связывать ссылку и всплывающее окно вместе.

Чтоб не нагружать вас излишним копанием в коде всей конструкции, в разметку окна, сразу встроил html код контактной формы:

<div id="popup_contact" class="popup_block">
     <div class="note">
         <img src="images/form/email.jpg" alt="Контакты" style="float:left;margin:5px 10px 5px 0; " />
	 <h1>Уважаемые друзья!</h1>
         <p>
          Обращаю Ваше внимание, что пункты отмеченные звездочкой, обязательны для заполнения.
         </p>
     </div>
     <form id="form" action="/" method="post">	
	   <fieldset>
		   <p class="first">
		      <label for="name">Имя *</label>
		     <input type="text" name="name" id="name" size="30" />
		  </p>
		  <p>
		     <label for="email">Email *</label>
		    <input type="text" name="email" id="email" size="30" />
		 </p>
		 <p>
		   <label for="web">Вебсайт (не обязательно)</label>
		   <input type="text" name="web" id="web" size="30" />
		</p>			
	  </fieldset>
	  <fieldset>																			
	      <p>
		<label for="message">Сообщение:</label>
		<textarea name="message" id="message" cols="30" rows="10"></textarea>
	     </p>								
	 </fieldset>					
	<p class="submit"><button type="submit">Отправить</button></p>						
    </form>
</div>

Как вы видите всплывающее окно, это div — контейнер с идентификатором popup_contact, который соответствует атрибуту rel в активирующей ссылке.
Останавливаться на разметке контактной формы не буду, так как ее макет полностью идентичен форме, о которой рассказывал в статье: Стиль контактной формы CSS.
На ряду с формой, добавил небольшой информационный блок div id="note" с изображением и текстовой шелухой ( пояснением к форме). При неуемном желании всегда сможете изменить, или полностью исключить содержание этого блока из состава всплывающего окна.

CSS

Тихим сапом, без лишней суеты, подошли к стилям css, как для окошка, так и для формы. Со стилями сложностей возникнуть не должно, для придания «картине» ясности я прописал некоторые пояснения к селекторам. Важно ничего не напутать, да и не переусердствовать с экспериментами.

/*--Модальное окно--*/
.popup_block{
   position: fixed;
   top: 50%;
   left: 50%;
   z-index: 99999;
   display: none; /*--по умолчанию скрыт--*/
   float: left;
   -webkit-box-sizing: content-box;
   -moz-box-sizing: content-box; 
   box-sizing: content-box;
   padding: 15px;
   border: 10px solid #6e6e6e;
/*-- скругленные углы--*/
   -webkit-border-radius: 5px;
   -moz-border-radius: 5px;
   border-radius: 5px;
   background: #fff;
/*--тени для блока--*/
   -webkit-box-shadow: 0px 0px 20px #000;
   -moz-box-shadow: 0px 0px 20px #000;
   box-shadow: 0px 0px 20px #000;
   color: #000;
   font-size: .9em;
}
/*--Фиксированное позиционирование для тупого IE6--*/
*html #fade {
   position: absolute;
}
*html .popup_block {
   position: absolute;
}
/*--блок заголовка--*/
.note{
   margin:0 0 30px 0;
}
.note img{
   float:left;
   margin:5px 10px 5px 0;
   width: 100px;
   height: 100px;
}
.note h1{
   color: #008000;
   text-shadow: 0 1px 3px rgba(0,0,0,.3);
   font:24px Monotype Corsiva, Arial;      
}
/* формируем кнопку закрытия */
.close {
    position: absolute;
    top: -18px;
    right: -18px;
    width: 24px;
    height: 24px;
    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-weight: bold;
    line-height: 20px;
    -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);    
}
/* контактная форма */
#form{
    overflow: hidden;
    margin: 0 auto;
    padding-top: 10px;
/* устанавливаем необходимую ширину формы в зависимости от дизайна
 ** форма отлично растягивается */
    width: 100%;
    border: 1px solid #D3D3D3;
/* закругляем углы */
    border-radius:8px;
    background: none repeat scroll 0 0 #FFFFFF;
/* добавляем тени для блока*/
    box-shadow: 0 0 5px #CCCCCC, 1px 1px 0 #FFFFFF inset, -1px -1px 0 #FFFFFF inset, 0 0 15px #DDDDDD inset;
    text-align: left;
}
/* формируем элементы внутри формы */
#form fieldset{
    display:inline;
    float:left;
    margin:0;
    margin-left:26px;
    padding:0;
    width: 42%;
    border:none;	
}		 
#form p{
    margin:.5em 0;
}
/* подписи к полям ввода */	
#form label{
    display:block;
    margin-bottom:1px;
    color:#5B5B5B;
}	
#form input, #form textarea{
    padding:3px;
/* отключаем бордюры у инпутов и текстового поля */
    border: none;
/* закругляем углы полей ввода */
    -webkit-border-radius:.3em;
    -moz-border-radius:.3em;
    border-radius:.3em;		
    background-color: #F7F7F7;
/* добавляем внутренние тени у инпутов и текстового поля */
    box-shadow: inset 0 0 5px rgba(0,0,0,0.1), inset 0 1px 2px rgba(0,0,0,0.3);
    color: #5B5B5B;
    font:13px Trebuchet MS, Arial, Helvetica, Sans-Serif;
}
#form input {
/* устанавливаем ширину инпутов */
   width:90%;
}
/* изменяем оформление полей ввода при фокусе */
#form input:focus, #form textarea:focus {
  background: #F2F2F2;
  box-shadow: inset 0 0 5px rgba(0,0,0,0.2), inset 0 1px 2px rgba(0,0,0,0.4);
  color: #333;
}
#form textarea{
    overflow:auto;
    width:100%;
/* устанавливаем ширину текстового поля */
    height:120px;
}
/* формируем нижний сектор формы */					
#form p.submit{
    clear:both;
    margin:0;
    padding: 10px 25px 20px;
    text-align:right;
}
/* оформляем кнопку отправки */	
#form button{
/* устанавливаем необходимую ширину кнопки */
    border: solid 1px #2f96b4;
/* закругляем углы кнопки */
    border-radius: 5px;
    background-color: #49AFCD;
/* градиентная заливка для современных браузеров */	
    background-image:-moz-linear-gradient(center top , #5BC0DE, #2F96B4);
    background-image: -webkit-linear-gradient(center top, #5bc0de, #2f96b4);
    background-image: -ms-linear-gradient(#5bc0de, #2f96b4);
    background-image:-o-linear-gradient(center top , #5BC0DE, #2F96B4);
/* добавляем внешние тени */
    box-shadow: 0 1px 2px rgba(0,0,0,0.4);
    color:#fff;
    padding:0 12px;
    text-align:center;
    line-height:28px;
/* градиент для IE6-9 */
    filter: progid:DXImageTransform.Microsoft.Gradient(StartColorStr='#5BC0DE', EndColorStr='#2F96B4', GradientType=0); 
    cursor:pointer;
}
/* изменяем оформление кнопки при наведении */
#form button:hover {
    border-color: #2C8BA5;
    box-shadow: none;
}
/* изменяем оформление кнопки при нажатии */
#form button:active {
    border-bottom: 1px solid #5BC0DE;
    background-image:-moz-linear-gradient(#2F96B4, #5BC0DE); /* Firefox */
    background-image: -webkit-linear-gradient(#2F96B4, #5BC0DE); /* Chrome, Safari */
    background-image: -ms-linear-gradient(#2F96B4, #5BC0DE); /* IE-10 */
    background-image:-o-linear-gradient(#2F96B4, #5BC0DE); /* Opera */
/* добавляем внутренние тени */
    box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3) inset;
/* градиент для IE6-9 */
    filter: progid:DXImageTransform.Microsoft.Gradient(StartColorStr='#2F96B4', EndColorStr='#5BC0DE', GradientType=0);
}
/* конец формы */

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

Подключение JQuery

С разметкой, оформлением модального окна и контактной формы мы разобрались. Теперь, чтобы все это хозяйство заработало, необходимо воспользоваться магией JQuery, подключив плагин к документу. В начале документа между тегами <head>...</head>, или же в подвале страницы, перед закрывающем тегом </body> пропишите следующее:

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script src="js/dm-modal.js"></script>

На этом пожалуй и все, всплывающее окно с встроенной контактной формой готово. Все бы ничего, если бы не замшелый и убогий IEшка, с его патологической заторможенностью, в 6 и 7 версии браузера, даже с использованием фильтра, функция прозрачности слоя opacity не прокатывает. Ну да ладно, думается мне на IEшку можно и подзабить, жаль только пользователи, которые в извращенной форме подсажены на этот браузер, не увидят корректной работы всей конструкции.

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

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

Буду всем признателен, если поддержите проект — добавив блог в исключения AdBlock и поделитесь ссылкой на запись в своих соц-сетях:

Google Bookmarks News2.ru БобрДобр.ru RUmarkz Ваау! Memori.ru rucity.com МоёМесто.ru Mister Wong

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

127 комментариев
  1. Антон:

    Огромное СПАСИБО!

    Не первый раз пользуюсь!

    Ответить
  2. Артем:

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

    Ответить
    • driver:

      В комментариях выше есть ответы на все ваши вопросы.

      Ответить
  3. Андрей:

    Привет!

    Второй раз пользую,очень понравилась форма.

    Но вот какие возникли трудности:

    1.Из-за использования картинок с фиксированной шириной при ее сужении вид уже не тот. Т.е. даже элементарную форму логина, где не нужна большая ширина, уже не сделать. Приходится работать с фотошопом.

    2. То же самое с кнопкой отправки. Если надпись коротенькая, то с широкой формой смотрится негармонично

    Ответить
  4. driver:

    Андрей.

    Как саму форму так и кнопку можно легко сверстать и без изображений, используя новые стандарты CSS3 (border-radius, box-shadow, градиент и т.д.).

    Ответить
  5. Здравствуйте! подскажите плз:

    на сайте заказчика есть:

    1- Три различных шаблона

    2- Мини-навигация из трех ссылок (на одной из них и размещена ссылка на модальное окно), которые размещены на всех страницах сайта, при помощи блока и имеют динамические адреса.

    3- На сайте ЧПУ (site.ru/razdel/straniza)

    Форму я смог прикрутить, но она появляется только на главной странице... Пытался «играть с ссылками» — ни чего не вышло...

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

    Ответить
    • driver:

      Здравствуйте.

      Посмотрите id модальных окон, т.е. идентификатор окна с формой должен соответствовать rel="popup_contact" в ссылке, и конечно jQuery плагин должен подключаться к каждой странице.

      Ответить
      • Подскажите пожалуйста, возможно ли как то прописать относительные пути? Потому что когда в ссылку вставляю что то типа:

        <a class="poplight" rel="popup_contact" href="#?w=600">Контакты — ссылка для вывода окна...

        То окно не открывается, даже на той странице, на которой было настроено... Хотя теоретически, это то же самое, если бы я прописал http://site.ru/#?w=600 либо http://site.ru/categoria/#?w=600

        Как исправить эту ошибку? Заранее благодарен!

        Ответить
  6. ID окон прописан везде один и тот же (сам код модального окна и jQuery я разместил в компонентах, которые в свою очередь присутствует на всех страницах)

    В том то и беда, что я грешу скорей всего на пути прописанные тут:

    //Когда вы нажмете на ссылку с классом poplight и HREF начинается с a #

    $('a.poplight[href^=#]').click (function () {

    var popID = $(this).attr ('rel'); //Получить Popup Имя

    var popURL = $(this).attr ('href'); //Получить Popup HREF и определить размер

    Конечно я могу ошибаться...

    Ответить
  7. Почему то не обработалась у вас на сайте ссылка... Должна быть вида: «a class=»poplight" rel="popup_contact" href="знак?пхп get_site_url ();/>#?w=402">Контакты</aзнак

    Как то так

    Ответить
    • driver:

      Добрый вечер.

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

      атрибут href="#?w=600" выступает в качестве сигнала к обработчику, а не как привычный адрес.

      Что мешает вам на этих трех страницах прописать html каркас модального окна, коль из компонентов оно не срабатывает. Да и вообще, мне на уровне телепатии сложно что то подсказывать.

      Как вариант, присмотритесь к еще одной моей контактной форме. Выполнена она на CSS3 и работает как отдельное всплывающее окно: Тынц >>

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

      Ответить
      • Спасибо за ответ, постараюсь впредь точнее выражать свои мысли

        Ответить
      • Еще раз извиняюсь за свою невнимательность, модальное окно работает идеально!!! Сам просто накосячил- забыл на других страницах разместить вывод самого окна )))) Спасибо еще раз!

        Ответить
        • driver:

          Решение, оно всегда где то рядом. Рад, что у вас все получилось.

  8. Ласось:

    Всем привет.

    Отличный скрипт только валидации не хватает, буду очень признателен автору если подскажет как это сделать ).

    Ответить
    • driver:

      Здравствуйте!

      Никто и ничего не мешает найти готовую форму с валидацией, например на jQuery и запихнуть ее в модальное окно, как расписано в статье, или написать скрипт jQuery самому, примерно так: Тынц.

      Ответить
  9. Антон:

    Очень удобная форма, но не получается до конца настроить на шаблон. При нажатии на кнопку — всплывает серая форма, где ввод данных невозможен.

    Ссылка по кнопке — Program Management слева

    www.new.uspectech.ru/index_2.html

    Можете подсказать, как исправить?

    Ответить
    • driver:

      Антон. Измените в style.css значение свойства z-index для #fade например на 1.

      Ответить
  10. Не пойму, а где прописать адрес, куда письма отсылать?

    Ответить
  11. driver:

    Игорь.

    В комментариях есть ответы на ваш вопрос: Тынц >>

    Ответить
  12. Max:

    Здравствуете. Столкнулся с тем, что нужна форма с возможностью добавления файла и наличием дополнительных обязательных полей. И решил тоже сделать в модальном окне так вот не задача, если форма заполнена некорректно модальное окно после нажатия кнопки отправить закрывается и «с виду» для пользователя все хорошо, а данные из формы не передаются.Как можно вернуть пользователя к дальнейшему «правильному» заполнению полей формы. И возможно ли это вообще?

    Ответить
    • driver:

      Здравствуйте, Max.

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

      В сущности за меня всё уже ответили, спасибо Eli.

      Простейший пример:

      <script>
      $(document).ready(function() {
         $(".img_button").click(function(){
         		ver=true;
      		first_name=$("#first_name").val();
      		var p=/^[a-z0-9_.-]{3,35}$/i;
      		if(!p.test(first_name)){
      			 message_a="Некорректное имя";
      			 ver=false;
       
      		}
      		   email=$("#email").val();
      		   var p=/^[a-z0-9_.-]+@([a-z0-9-]+.)+[a-z]{2,4}$/i;
      		if(!p.test(email)){
      			message_a="The email is incorrect!";
      			ver=false;
      		}
       
      		message=$("#message").val();
      		var p=/^[a-z0-9_.-]{30,250}$/i;
                     if(!p.test(message)){
      			message_a="The message is incorrect or empty!";
      			ver=false;
      		}
      		if(ver){
      			return true;
      		}else{
      		    alert(message_a);
      			return false;
      		}		   
         });
      });
       
      </script>

      для полей с «обычным» именем пользователя, где разрешена кириллица и латиница (а также пробелы, числа и тире), возможна следующая проверка:

      name=$("#username").val();
      var p=/^[а-яА-ЯёЁa-zA-Z0-9 -]{5,35}$/i;
      if(!p.test(name)){
           alert("error");
      }
      Ответить
Присоединяйтесь к обсуждению!

Отправляя к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