Решения по стилизации формы. Стилизация input, button, а так же решения для select и input type="file"
Одним из главных элементов на странице являются формы и их оформление довольно тонкий момент при создании сайта. Одни из основных тегов формы — input, label, button, textarea и select.
Важно: всем тегам формы необходимо задать атрибут value, его значение отправляется на сервер.
В данной статье мы рассмотрим: как стилизовать форму и все ее элементы при помощи CSS и jQuery. Приступим.
Создадим с вами обыкновенную форму:
Вот так он выглядит в HTML
Важно: тег input всегда должен иметь обязательный атрибут — type, с его него, мы говорим нашей форме, что она будет делать — hidden (скрытое поле), radio (переключатель), chekbox (чекбос), text (текст) или file (загрузка файла)
Что бы оформить обычный input jQuery не нужен. Важно запомнить, бразуеры плохо обрабатывают высоту у input, поэтому при ее стилизации стоит отталкиваться от размера вашего шрифта, который используется на странице и для красоты добавим padding(отступ)
input {
width: 300px;
font-size: 13px;
padding: 6px 0 4px 10px;
border: 1px solid #cecece;
background: #F6F6f6;
border-radius: 8px;
}
В HTML он выглядит так:
стандартно textarea имеет следующие параметры:
устраним эти пустяки, для этого пропишем следующее:
textarea {
/* = Убираем скролл */
overflow: auto;
/* = Убираем увеличение */
resize: none;
width: 300px;
height: 50px;
/* = Добавим фон, рамку, отступ*/
background: #f6f6f6;
border: 1px solid #cecece;
border-radius: 8px 0 0 0;
padding: 8px 0 8px 10px;
}
Готово. Наше поле с текстом стало более красивым. Но мы с вами идем дальше и переходим к radio.
в HTML он выглядит так:
Важно: чтоб radio переключались между собой, необходимо задать группе одинаковый name
Бытует мнение что input не поддается стилизации в CSS, развеем этот миф.
В CSS будем использовать checked, before, а так же + для обращения к соседним селекторам.
/* = стилизуем текст */
label {
font-size: 16px;
font-weight: 700;
cursor: pointer;
}
/* = скрываем input */
input {
display: none;
}
/* = стилизуем кнопку, которая работает вместе с input */
.stlradio {
display: inline-block;
border: 2px solid #b2b1b1;
width: 16px;
height: 16px;
position: relative;
vertical-align: middle;
box-sizing: border-box;
margin-right: 4px;
border-radius: 300px;
background-color:#ffffff;
}
/* = делаем скрытую точку в нашем div */
.stlradio:before {
content: '';
background: #1c1e25;
width: 8px;
height: 8px;
opacity: 0;
transition: 0.3s;
position: absolute;
top: 2px;
left: 2px;
border-radius: 300px;
}
/* = включаем точку если input активен */
input:checked + .stlradio:before {
opacity: 1;
}
В итоге мы получаем вот такой результат
в HTML он выглядит так:
Для стилизации checkbox будем использовать такие же манипуляции, как и с radio
Отличается CSS checkbox от radio только отсутствием border-radius
/* = стилизуем текст */
label {
font-size: 16px;
font-weight: 700;
cursor: pointer;
}
/* = скрываем input */
input {
display: none;
}
/* = стилизуем кнопку, которая работает вместе с input */
.stlchek {
display: inline-block;
border: 2px solid #b2b1b1;
width: 16px;
height: 16px;
position: relative;
vertical-align: middle;
box-sizing: border-box;
margin-right: 4px;
}
/* = делаем скрытый квадратик в нашем div */
.stlchek:before {
content: '';
background: #1c1e25;
width: 8px;
height: 8px;
opacity: 0;
transition: 0.3s;
position: absolute;
top: 2px;
left: 2px;
}
/* = включаем квадратик если input активен */
input:checked + .stlchek:before {
opacity: 1;
}
В итоге мы получаем вот такой результат
Обычно, select описывается в HTML документе так:
А мы сделаем ход конем и стилизовать бедуем небольшим скриптом, а поможет нам в этом обыкновенный список. Он выпадает при нажатии кнопку, а при нажатии на пункт из списка его значение копируется в первоначальную кнопку по которой нажимали и в input hidden.
Приступим. Разметка HTML:
Стилизуем всё это добро
/* = Select */
.slct {
display: block;
border-radius: 5px;
border: 1px solid #cecece;
background-color: transparent;
text-decoration: none;
width: 285px;
padding: 10px 15px 10px 10px;
color: #fff;
background-position: 290px -145px;
/*
Супер финт обрезаем текст
чтобы не вылезал за рамку
*/
overflow: hidden;
white-space:nowrap;
text-overflow: ellipsis;
-o-text-overflow: ellipsis;
}
.slct.active {
border-radius: 5px 5px 0 0;
border-bottom: none;
}
.drop {
margin: 0;
padding: 0;
width: 310px;
border: 1px solid #cecece;
border-top: none;
display: none;
position: absolute;
background: #fff;
}
.drop li {
list-style: none;
border-top: 1px dotted #e8e8e8;
cursor: pointer;
display: block;
padding: 4px 15px 4px 25px;
background-position: 10px -119px;
}
.drop li a {
color: #444;
}
.drop li:hover {
background-color: #e8e8e8;
}
.drop li:hover a {
color: #222;
}
собственно сам код скрипта для нашего селекта
// Select
$('.slct').click(function(){
/* Заносим выпадающий список в переменную */
var dropBlock = $(this).parent().find('.drop');
/* Делаем проверку: Если выпадающий блок скрыт то делаем его видимым*/
if( dropBlock.is(':hidden') ) {
dropBlock.slideDown();
/* Выделяем ссылку открывающую select */
$(this).addClass('active');
/* Работаем с событием клика по элементам выпадающего списка */
$('.drop').find('li').click(function(){
/* Заносим в переменную HTML код элемента
списка по которому кликнули */
var selectResult = $(this).find('a').data('znach');
var selectResultName = $(this).find('a').html();
/* Находим наш скрытый инпут и передаем в него
значение из переменной selectResult */
$(this).parent().parent().find('input').val(selectResult);
/* Передаем значение переменной selectResult в ссылку которая
открывает наш выпадающий список и удаляем активность */
$(this).parent().parent().find('.slct').removeClass('active').html(selectResultName);
/* Скрываем выпадающий блок */
dropBlock.slideUp();
});
/* Продолжаем проверку: Если выпадающий блок не скрыт то скрываем его */
} else {
$(this).removeClass('active');
dropBlock.slideUp();
}
/* Предотвращаем обычное поведение ссылки при клике */
return false;
});
Выглядеть будет это так:
type=file отображает на странице кнопку, с помощью которой можно выбрать файл. И блок в котором мы видим сам выбранный файл. Давайте рассмотрим стилизацию input file.
Создаем разметку следующего характера
/* = File Load */
/* Стили для контейнера */
.file-load-block {
width: 310px;
height: 35px;
overflow: hidden;
position: relative;
}
/* работаем с инпутом который конкретно file */
.file-load-block input[type=file] {
/* делаем кроссбраузерную прозрачность */
opacity: 0;
filter: alpha(opacity=0);
/* Позиционируем абсолютно отсносительно контейнера по правому краю */
position: absolute;
top: 0;
right: 0;
/*
Задаем высоту и делаем шрифт огромным
для того чтобы кнопка "обзор" занимала все пространство контейнера
*/
height: 35px;
font-size: 600px;
/* Ставим наш инпут поверх всего содержимого */
z-index: 2;
cursor: pointer;
width: auto;
}
/* Стилизируем инпут и кнопку которые под загрузчиком */
.file-load-block input[type=text] {
z-index: 1;
width: 206px;
padding-right: 10px;
white-space: nowrap;
text-overflow: ellipsis;
border: 1px solid #ccc;
background: #fff;
color: #000;
-o-text-overflow: ellipsis;
padding: 5px 15px;
border-radius: 5px;
}
.file-load-block button {
position: absolute;
right: 0;
top: 0px;
width: 90px;
height: 28px;
border: 1px solid #ccc;
background: #fff;
color: #666;
border-radius: 5px;
box-shadow: inset 0 2px 2px #ccc;
}
.file-load-block .button-hover {
box-shadow: 0 0 2px #ccc;
}
Здесь я воспользовался небольшим хаком) обычный input делаем невидимым с помощью opacity. И задаем шрифт большого размера, наша кнопка станет большой и закроет весь container.
Под input который выводит загрузочный popup, расположим input. Он будет выводить название файла, который загружаем на сервер и кнопку выбора файла.
Добавим немного script’a. Он будет показывать название нашего файла, который прикрепили, добавим hover для кнопки когда input получает фокус:
// = Load
// отслеживаем изменение инпута file
$('#file').change(function(){
// Если файл прикрепили то заносим значение value в переменную
var fileResult = $(this).val();
// И дальше передаем значение в инпут который под загрузчиком
$(this).parent().find('.fileLoad').find('input').val(fileResult);
});
/* Добавляем новый класс кнопке если инпут файл получил фокус */
$('#file').hover(function(){
$(this).parent().find('button').addClass('button-hover');
}, function(){
$(this).parent().find('button').removeClass('button-hover');
});
В итоге мы получаем:
Иногда требуется сброс для формы.
Создаем разметку.
Накинем стилей
/* = Reset Form */
.reset-form button {
width: 90px;
height: 28px;
border: 1px solid #ccc;
background: #fff;
color: #666;
border-radius: 5px;
box-shadow: inset 0 2px 2px #ccc;
cursor: pointer;
}
.reset-form button:hover {
box-shadow: 0 0 2px #ccc;
}
.reset-form button:active {
margin-top: 1px;
margin-bottom: -1px;
zoom: 1;
}
Для чего jQuery?
Например, мы отправили форму и автоматически заполнили ее опять через PHP. Нажимая на стандартную кнопку reset у нас, она не сработает. А если использовать скрипт, то форма успешно очистится
//Reset form
// Вешаем событие клика по кнопке сброса
$('.reset-form').click(function() {
// Устанавливаем пустое значение в атрибут value для всех инпутов
$('.customForm').find('input').val('');
// Убираем атрибут checked и класс активности у чекбоксов
$('.customForm').find('input:checked').removeAttr('checked');
$('.customForm').find('.check').removeClass('active');
// Убираем класс активности у радио переключателей
$('.customForm').find('.radio').removeClass('active');
// Устанавливаем пустое значение в атрибут value для всех textarea
$('.customForm').find('textarea').val('');
// И для открывалки селекта возвращаем начальное значение
$('.customForm').find('.slct').html('Выберите Ваше лучшее качество:');
return false
});
Важно: не рекомендую использовать input type=submit. Потому что его нельзя стилизовать картинками, блоками, иконками. Используйте button
Благодаря атрибуту type=submit, он сообщает о том что при нажатии на button данные формы передадутся на сервер.
В HTML он добавляется так
Поднакинем стиля
.submit {
cursor: pointer;
border: 1px solid #cecece;
background: #f6f6f6;
box-shadow: inset 0px 20px 20px #ffffff;
border-radius: 8px;
padding: 8px 14px;
width: 120px;
}
.submit:hover {
box-shadow: inset 0px -20px 20px #ffffff;
}
.submit:active {
margin-top: 1px;
margin-bottom: -1px;
zoom: 1;
}
.submit:focus
{
outline:none;
}
В итоге мы получаем: