Открыть меню    

Формы HTML5: CSS

html5 css формы Эта статья будет второй в серии из трех о формах HTML5. В ней будет рассмотрено стилевой оформление полей, а если точнее – псевдоклассы, позволяющие акцентировать внимание на поле при разных состояниях. Напомню, что первая статья была посвящена основам разметки, ознакомиться с ней можно - Формы HTML5: Разметка, modernizr.

Удаляем стили по умолчанию

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

Удалить стили по умолчанию можно с помощью объявления appearance: none; (xiper.net: webkit-appearance ) и необходимых префиксов. Так как данное свойство удаляет и специальные стили (в chrome, к примеру, это checkboxes и кнопки), применять его следует с осмотрительностью: только когда это необходимо, и тестировать на как можно большем количестве браузеров. Пример:

CSS

input[type="text"],
input[type="email"],
input[type="tel"],
input[type="number"],
textarea {
  -webkit-appearance: none;
  -moz-appearance: none;
  -ms-appearance: none;
  appearance: none;
  outline: 0;
  box-shadow: none;
}

Заметьте, что сброс стилей применяется и для outline и к box-shadow. Тем самым были удалены невзрачная синяя тень выступающая при focus на поле и стиль с ошибкой (как правило это красное обрамление / outline) для всех браузеров.

:focus

:focus задает стили для используемого (в данный момент) поля (или, другими словами, для элемента получающего фокус); поддержка осуществляется начиная CSS2.1, пример:

CSS

input:focus,
textarea:focus,
select:focus {
  background-color: #eef;
}

:checked

:checked стили применяются для checked (отмечены галочкой) checkboxes (флажков) или для radio buttons (кнопок/переключателей), пример:

HTML

<input type="checkbox" name="test" />
<label for="test">check me</label>

CSS

input:checked ~ label {
    font-weight: bold;
}

Используется родственный селектор

Селектора :unchecked не существует, да он и не нужен: достаточно создать стиль по умолчанию, затем внесите изменения, когда элемент становится :checked (активирован). В качестве альтернативы можно использовать :not(:checked).

:indeterminate

Хотя :indeterminate и упоминается в спецификации, формально его там пока нет. Согласно спецификации, :indeterminate описывает состояние либо флажка (checkbox), либо переключателя (radio button), которые, в свою очередь, “и выбраны, и не выбраны”.

Важно отметить, что стили применяются только в том случае, когда свойство флажка .indeterminate задается через JavaScript, пример:

document.getElementById("mycheckbox").indeterminate = true;

Свойство .checked, которое может быть либо true, либо false, остается неизменным.

Используется :indeterminate редко, но в отдельных ситуациях без него не обойтись. Так, например, имея список флажков (checkboxes), можно создать флажок(сheckbox) “checkall”. Тогда при клике на флажке “checkall” вы сможете поставить или снять выделение со всех флажков разом. Но, если отметить несколько флажков, флажок “checkall” может перейти в неопределенное (ndeterminate) состояние.

:required

:required применяет стили к любому input, у которого есть атрибут required. Оно Говорит о том, что поле должно быть заполнено до отправки формы на сервер.

:optional

:optional применяет стили к любому полю ввода, у которого отсутствует атрибут required. Целесообразность его добавления вызывает вопросы: разве :not(:required) выполняет не ту же функцию?

:valid

:valid применяет стили к любому полю ввода, у которого данные валидны.

:invalid

:invalid или :not(:valid)) применяет стили к полю ввода, у которого имеются недостоверные данные.

CSS

input:invalid {
    border-color: #900;
}

:in-range (поля типа number и range)

:in-range позволяет выбирать поля типа number и range, значения которых находятся в пределах min и max, а сами атрибуты примыкают к значению step. Очевидно, что ползунок едва ли может оказаться вне диапазона, но...

:out-of-range (поля типа number и range)

:out-of-range применяется к тем полям типа number и range , чьи значения недостоверны.

:disabled

К полям ввода с атрибутом disabled могут быть применены псевдоклассы :disabled, пример:

CSS

input:disabled {
    color: #ccc;
    background-color: #eee;
}

Надо помнить, что отключенные (disabled) поля валидацию не проходят; их данные серверу не передаются. Стили для таких псевдоклассов, как :required и :invalid, однако, применены будут.

:enabled

По аналогии, не отключенные поля можно выбрать с помощью :enabled (или :not(:disabled)). Селектор является стилем input по умолчанию, поэтому применяется он довольно редко.

:read-only

К полям ввода c атрибутом read-only применяется псевдокласс :read-only. Помните, поля «только для чтения» проходят валидацию и передаются серверу, менять их значения пользователь, однако, не может.

:read-write

Стандартные поля read-write выбираются посредством :read-write (или :not(:read-only)).Применяется этот селектор не часто.

:default (только кнопки или поля ввода)

Селектор :default применяет стили к стоящей по умолчанию кнопке отправки формы.

Стиль для текста заполнителя (placeholder)

Стиль текста атрибута placeholder можно менять, используя псевдо-элемент ::placeholder с вендорными префиксами, пример:

CSS


input::-webkit-input-placeholder { color: #ccc; }
input::-moz-placeholder { color: #ccc; }
input:-ms-input-placeholder { color: #ccc; }
input::placeholder { color: #ccc; }

Специфичность CSS

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

CSS

input:invalid { color: red; }
input:enabled { color: black; }

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

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

Всплывающий блок (bubble) от валидации

При вводе данных первое ошибочное значение выделяется при помощи всплывающего блока.

Всплывающий блок (bubble) с валидацией

Каждый девайс и браузер имеет свой дизайн для такого блока-пузыря. Нестандартные модификации CSS разрешены только в браузерах Webkit/Blink.

CSS

::-webkit-validation-bubble { ... }
::-webkit-validation-bubble-arrow { ... }
::-webkit-validation-bubble-message { ... }
::-webkit-validation-bubble-arrow-clipper { ... }

Поддержка браузерами.

В целом основные селекторы и стили поддерживаются всеми современными браузерами, начиная с IE10 и выше. Некоторые второстепенные селекторы, как, например, in-range, поддерживаются в данный момент только Webkit/Blink. На более старых реализована поддержка :focus, но при использовании чего-то более сложного придется обратиться за помощью к JavaScript.

Создание удобных форм

Стили выше применяются мгновенно. Пример:

CSS

input:invalid {
    border-color: #900;
}

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

Лично я предпочитаю, чтобы ошибки показывались при отправке формы или при смене фокуса у невалидного поля. Браузерами такая реализация не предусмотрена, поэтому придется обратиться к JavaScript. HTML5 проверка ограничений (constraint validation)API имеет все необходимые инструменты для решения поставленной задачи:

  • приостанавливаем валидацию до момента использования формы
  • используем свои сообщения об ошибках
  • подменяем не поддерживающие типы input
  • обеспечиваем альтернативы и валидацию для старых браузеров
  • создаем более удобные формы

Развернутое описание этих действий в третьей и заключительной статье в серии о формах HTML5.

источник

Комментарии к статье