- Денис Горелов
- CSS и CSS3
- Просмотров: 0
Contact Form | Эффект плавающего текста в фокусе на CSS и jquery
Привет друзья с вами Денис, и для вас я подготовили выпуск по анимированной контактной форме с эффектом плавающего текста в фокусе. Возможно, встречали подобные формы в сети, но точно не в таком исполнении.
В уроке покажу несколько фишек, разберем как вставить иконку с сайта fontawesome, при наведение сделаем плавное анимированное, где форма немного приподнимается, а по щелчку полностью выдвигается в верх, повторный клик ее убирает, а когда курсор в фокусе поля, то текст перемещается на верх тем самым освобождая поле для заполнения. Так же разберем, как на HTML5 сделать начальный уровень валидации перед отправкой формы.
И так, приступим к написанию кода.
Создаем каркас формы
Создаем файл стилей и index в котором подключаем css, затем ниже описываем каркас формы.
<head> <meta charset="UTF-8"> <title>Контактная форма с эффектом</title> <link rel="stylesheet" href="style.css" type="text/css"> </head>
Делаем обертку с классом .dws-wrapper что бы вы могли легко вставить форму на свои проекты, в нутрии его создаем блок с классом .dws-container при помощи которого в дальнейшем будем проводить позиционирования блока в низу экрана.
В нем вставим заголовок h3 с текстом «Задать вопрос» и за ним форму, присвоим ей класс .formBox.
Сама форма простая, строка будет состоять из описания label, и поля Input. Каждую такую строку оборачиваем в отдельный блок, блоку присвоим класс .inputBox, label с классом .inputText, input с класс .userInput, все это поможет в дальнейшем придать этим полям индивидуальное оформление.
<wrapper> <div class="dws-wrapper"> <div class="dws-container"> <h3>Задать вопрос</h3> <form class="formBox"> <div class="inputBox"> <label class="labelText">Ваше имя:</label> <input class="userInput" type="text" name="name"> </div> </form> </div> </div> </wrapper>
Таких блоков делаем пять штук, и меняем у них текстовое содержимое. Последнее поле input размещаем первым и установим у него checkbox, у label меняем класс и описание.
Внизу добавляем кнопку с классом .button.
<form class="formBox"> <div class="inputBox"> <label class="labelText">Ваше имя:</label> <input class="userInput" type="text" name="name"> </div> <div class="inputBox"> <label class="labelText">E-mail:</label> <input class="userInput" type="text" name="name"> </div> <div class="inputBox"> <label class="labelText">Номер телефона:</label> <input class="userInput" type="text" name="name"> </div> <div class="inputBox"> <label class="labelText">Сообщение:</label> <input class="userInput" type="text" name="name"> </div> <div class="inputBox"> <input type="checkbox"> <label>Я согласен на обработку моих <a href="#">персональных данных</a></label> </div> <input type="submit" value="Отправить" class="button"> </form>
Как видите, стараюсь присваивать элементам, если у них планируется другое оформление. В принципе каркас формы готов, валидацию ее сделаем позже, а теперь давайте приступим к описанию самих стилей.
Описываем стили формы
Переходим в файл CSS, для body сбрасываю отступы и установлю шрифт Arial.
body { margin: 0; padding: 0; font-family: Arial, sans-serif; }
Для удобства позиционирую форму посередине, отбираю класс .dws-wrapper который мы присваивали для этих целей, и при помощи transform размещаем форму посередине экрана.
.dws-wrapper { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); }
Зададим обводку блока, что бы видеть его границы и хочу сказать, данная манипуляция не обязательна, просто как по мне, так удобнее работать, видя границы пространства, которое занимает блок.
.dws-container { outline: 1px solid orange; }
Оформляем поля формы в CSS
Для того что бы отслеживать прозрачность элементов, добавим на задний фон любое изображение.
background-image: url("img/ep_naturalwhite.png");
Затем для формы сделаем внутренние отступы в 30 пик, задаем обводку в 4 пик бордового цвета, и задний фон сделаем белого цвета.
.formBox { padding: 30px; border: 4px solid #8a36a5; background: #fff; }
Далее оформляем шапку формы, отбираем класс .dws-container h3, задаем блоку бордовый цвет background: #8a36a5;, шрифт делаем белый и центруем его посередине. Выравниваем кнопку по середине блока, и увеличим шрифт до 24 пик. Внутренние отступы сверху и снизу по 10 пик, закругляем верхние углы, ширину укажем в процентах 85% от ширины родителя, при наведении отобразим курсор.
.dws-container h3 { background: #8a36a5; color: #ffffff; text-align: center; margin: 0 auto; font-size: 24px; padding: 10px 0; border-radius: 8px 8px 0 0; width: 85%; cursor: pointer; }
Оформляем внешний вида label и input
Начинаем оформление с их родителя, отбираю класс .inputBox и выделяю границы блока, при помощи outline: 1px solid orange;. Сбросим внешние отступы и зададим их только снизу в 20 пик.
.inputBox { outline: 1px solid orange; margin: 0 0 20px; }
Затем приступим к оформлению внутренних элементов. Начнем с блока label с текстовым содержанием. Отбираем класс .inputText, увеличим шрифт до 20 пик., и делаем его немного светлее color: #a5a5a5;.
.labelText { font-size: 18px; color: #a5a5a5; }
Теперь задача расположить данный текст в области input и оформить поля для ввода.
Отбираем все input, для этого поможет класса .userInput который до этого присваивали, ширину установим в 100%, и добавим outline, посмотрим тем самым границы полей.
Текст увеличим на 20 пик., задаем ему цвет немного посветлее color: #575454;. и если скроем outline, то в фокусе появляется область выделения, она нам не нужна и для этого что бы ее убрать outline пропишем в none. Скрываем обводку border: none;, а для нижней черты задаем подчеркивание в 1 пик. border-bottom: 1px solid #a5a5a5;,
.userInput { width: 100%; height: 50px; font-size: 20px; color: #575454; outline: none; border: none; border-bottom: 1px solid #a5a5a5; }
Теперь займемся самим текстом и с позиционируем его в input на место области ввода. То-есть, до момента ввода, текст будет расположен в самом поле инпут.
Для этого добавляем родителю .inputBox, position: relative, а блок с классом .inputText позиционируем абсолютно, тем самым при помощи line-height текст опустим ниже.
.inputBox { position: relative; margin: 0 0 20px; } .labelText { position: absolute; line-height: 55px; font-size: 18px; color: #a5a5a5; }
Описываем стиль, когда курсор в фокусе
Добавим отдельный класс .focus для блока с классом .inputBox, и за счет этого класса, который будет добавляться и удалятся мы сделаем плавное подымать и опускать текста при помощи transform.
<div class="inputBox focus">
Для элементов в фокусе (.focus .labelTex) пишем данный стиль. За счет transform: translateY(-30px), подымаем текст по оси Y, уменьшаем его размер до 14 пик., и меняем цвет на фиолетовый.
.focus .labelText { transform: translateY(-30px); font-size: 14px; color: #b33edc; }
Что бы сделать анимированный плавный переход, присвоим блоку с классом .labelText, transition в пол секунды.
color: #a5a5a5; transition: .5s; }
Когда стиль класса .focus описан, теперь стоит задача добавить его к блоку с классом .inputBox, у которого на этот момент курсор будет находиться в фокусе. Для примера, если его уберем, текст плавно опускается, добавляем, подымается.
Для того что бы добавить класс родителю по щелчку области input, задействуем библиотеку Jquery. Можно написать это и при помощи других методов, но в данном случае это самый короткий, который реализуется в несколько строк.
Переходим на сайт Jquery, копируем ссылку и подключаем библиотеку в области head.
<script src="https://code.jquery.com/jquery-3.2.1.js"></script>
В нижней части открываем, тег script и пишем следующее выражение, если класс .userInput в фокусе, тогда выполняем данную функцию. При помощи метода parent() находим родителя верхнего уровня, а это блок с классом .inputBox, он является родителем и добавляем для него класс .focus при помощи метода addClass().
<script> $(".userInput").focus(function () { $(this).parent().addClass("focus"); }) </script>
Я думаю, многие из вас с этой конструкцией знакомы, и особое внимание тут не заостряем.
Проверяем результат, и как видим все срабатывает за исключением того, что клик не можем сделать в области расположения текста. Если добавить для текущего блока label outline, мы увидим его границы, и как раз в этой области, клик не срабатывает.
Все это происходит из-за того что текстом позиционировали на область input, соответственно он на переднем плане и заграждает поле для ввода.
Эта задача легко решается путем прописывания position: relative; для input, теперь они находятся на переднем плане, и остается сделать их прозрачность, для того чтобы появился текст, добавляем background: transparent;.
.userInput { width: 100%; height: 45px; font-size: 20px; color: #575454; outline: none; border: none; border-bottom: 1px solid #a5a5a5; position: relative; background: transparent; }
Теперь, когда курсор в фокусе, получили данную анимацию.
Затем остается удалить класс у родителя, когда элемент теряет фокус. Для этого воспользуемся событием blur(). Которое запустит функцию, где мы проверяем по условию, если поле пустое, тогда у первого родителя добавленный класс .focus удаляем.
Запомните данную конструкцию, так как в практике вы с ней еще не раз столкнетесь, и буде задействовать в свих проектах.
<script> $(".userInput").focus(function () { $(this).parent().addClass("focus"); }).blur(function () { if ($(this).val() === '') { $(this).parent().removeClass("focus"); } }) </script>
Проверяем полученный результат.
Обводку можно убрать, для блока с формой добавим фиксированную ширину в 350 пик, и при помощи overflow: hidden; скроем все за ее пределами.
.dws-container { width: 350px; overflow: hidden; }
Теперь оформим и обработаем поля для проверки на валидацию.
Валидация форм в HTML5
Добавляем для первого поля соответствующий type и name, и для проверки введенных в него данных добавим атрибут required который по умолчанию у нас всегда выключен.
<input type="text" name="name" class="userInput" required>
Сейчас нет возможности нажать кнопку отправить, у нас перекрывает область с соглашением. Для него присвоим отдельный класс .personalDoc. Затем проверяем результат валидации.
Переходим к следующему полю, и так как это email прописываем для него соответствующие type и name, прописывает атрибут required для проверки введенных поля.
<input type="email" name="email" class="userInput" required>
Для input с телефоном, добавляем type и name, и дополнительно дописываем регулярное выражение pattern="\d+" где проверяем на ввод чисел.
<input type="tel" name="phone" class="userInput" required pattern="\d+">
Для текстового поля изменим inpyt на textarea и добавим класс .userInput.
<textarea class="userInput" name="message" required></textarea>
Checkbox укажем, что поле обязательное для заполнения при помощи required.
<input type="checkbox" name="" required>
Оформляем соглашение в CSS
Отбираем поле textarea.userInput, делаем высоту в 100 пик, и делаем верхние отступы в 10 пик. что бы набираемый текст не сливался с текстом из label.
textarea.userInput { height: 100px; margin-top: 12px; }
У текста с соглашением, изменим цвет и ссылку на серый цвет.
.personalDoc, .personalDoc a { color: #858585; }
А при наведении на ссылку, уберем подчеркивание и цвет заменим на фиолетовый.
.personalDoc a:hover { text-decoration: none; color: #b33edc; }
Оформляем кнопку в CSS
Для, оформления кнопки, отбираем ее класс .button, затем меняем цвет кнопки, текст делаем белым, ширину задаем в процентах, высоту в 35 пик., увеличим шрифт до 18 пик и уберем обводку. Зададим отступы с верху и расположим кнопку с левой стороны. Добавим курсор и поменяем цвет ссылки по наведению, делаем кнопку немного ярче. Для плавности изменения цвета добавим классу .button, transition в пол секунды.
.button { background: #8a36a5; color: #ffffff; width: 45%; height: 35px; font-size: 18px; border: none; margin-top: 10px; margin-left: 55%; cursor: pointer; transition: .5s; } .button:hover { background: #b33edc; }
Добавляем иконку
С оформлением кнопки закончили, и теперь займемся к добавлению иконки к заголовку. Для этого подключим шрифты при помощи CDN с сайта font-awesome.
<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet">
На сайте, отберем наш вариант иконки, копируем код и вставим его в заголовке.
<h3><i class="fa fa-question-circle"></i>Задать вопрос</h3>
Переходим в стили и позиционируем иконку абсолютно родителя, задаем отступы сверху и слева, увеличим ее до 40 пик.
h3 i { position: absolute; top: 7px; left: 40px; font-size: 40px!important; }
Анимируем появление формы
И последнее что нам остается сделать, это скрыть полностью весь блок кроме верхней части за пределами экрана. Для этого нужно зафиксировать блок в правой нижней части экрана, где по клику на заголовок, плавно выдвигается форму снизу вверх, а по второму клику нужно ее плавно свернуть.
В данном варианте можно воспользоваться Jquery и при помощи его отловить клик, а далее анимировать, но для разнообразии покажу, как это можно реализовать при помощи CSS3, где задействуем checkbox.
И так, допишем немного структуру формы, добавим перед блоком с классом .dws-container еще один Input c атрибутом checkbox. Пропишем для него идентификатор id="dws-form" и зададим класс .toggleForm.
<input type="checkbox" name="toggle" id="dws-form" class="toggleForm">
Первая из задач, нужно сделать, так что бы по нажатию на кнопку «Задать вопрос», активировался чекбокс, а по второму нажатию активация снималась.
Для этого пропишем заголовку в место h3 тег label и воспользуемся атрибутом for которому передадим id input, добавим дополнительный класс для его оформления.
<label for="dws-form" class="toggleForm"><i class="fa fa-question-circle"></i>Задать вопрос</label>
Проверяем и видим что, по нажатию на заголовок, активируется чекбокс и остается дописать ему стили при данных событиях.
В стилях находим, где задавали оформление для заголовка, меняем .dws-container h3 на .toggleForm, делаем его блочным элементом display: block;. Для иконки меняем h3 i на класс .toggleForm I и немного подкорректируем стили.
Отступы сверху делаем в 18 пик, убираем приоритет увеличения шрифта.
.toggleForm { display: block; background: #8a36a5; color: #ffffff; text-align: center; margin: 0 auto; font-size: 24px; padding: 10px 0; border-radius: 8px 8px 0 0; width: 85%; cursor: pointer; } .toggleForm i { position: absolute; top: 18px; left: 40px; font-size: 40px; }
Делаем плавную анимацию появления
Закомментируем стили при помощи, которых центровали блок. Добавляем классу .dws-container, position: fixed; при помои которого закрепляем форму в определенной области экрана и далее задаем отступы, снизу устанавливаем в ноль, а справой стороны в 10%.
Съехала немного иконка, вернем ее в начальное положение, изменим верхние отступы на 7 пик.
Далее при помощи трансформации по оси Y transform: translateY(516px); , опусти форму за пределы экрана.
.dws-container { position: fixed; bottom: 0; right: 10%; width: 350px; overflow: hidden; transform: translateY(516px); transition: .5s ease; }
Добавляем стиль при наведении на кнопку, что бы форма немного приподнялась.
.dws-container:hover { transform: translateY(510px); }
Добавляем плавность анимации при помощи transition: .5s ease;
Далее, отлавливаем клик, если чекбокс заполнен, для блок с классом .dws-container променяем следующий стиль, при помощи трансформации возвращаем форму в нулевое положение.
.toggleForm:checked ~ .dws-container { transform: translateY(0); }
В завершении скрываем чекбокс, для этого приписываем для него display: none;.
.toggleForm[type="checkbox"]{ display: none; }
В итоге получили симпатичную форму с различными эффектами.
Теперь вы узнали, как делаются различные эффекты, и как видите все довольно легко и просто реализуется. На базе данного урока сделайте свой пример, и поделись им в комментариях.
Урок подготовил Горелов Денис.
Оставить комментарий:
Отзывы
Отзывов нет.
Написать отзыв
5 предыдущих видео
CSS эффект при наведении на картинку / Img Hover Effects Просмотров:(0)Animation на CSS / Анимированная кнопка с пульсирующем эффектом на CSS3 Просмотров:(0)
Кнопка с анимацией для сайта на CSS Просмотров:(0)
Media queries CSS / Адаптации страниц Просмотров:(0)
МОБИЛЬНАЯ ВЕРСИЯ горизонтального меню | Адаптируем меню на чистом CSS Просмотров:(0)
Выбирай свою тему, и мы напишем когда выйдет по ней очередное видео.