Новые возможности css4

Псевдокласс :invalid

Проверка на стороне сервера

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

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

Чтобы обойти проблему с радиусами границ, необходимо применять дополнительный класс.

Как это работает

Вот как проверка формы работает с Bootstrap:

  • Проверка HTML-формы применяется через два псевдокласса CSS, и . Это применимо к элементам , и .
  • Bootstrap переносит стили и в родительский класс , обычно применяемый к . В противном случае любое обязательное поле без значения будет отображаться как недопустимое при загрузке страницы. Таким образом, Вы можете выбрать, когда их активировать (обычно после попытки отправки формы).
  • Чтобы сбросить внешний вид формы (например, в случае отправки динамической формы с использованием Ajax), удалите класс из снова после отправки.
  • Как резервный вариант, классы и можно использовать вместо псевдоклассов при . Они не требуют родительского класса .
  • Благодаря ограничениям, заложенным в самой природе CSS, нельзя (по крайней мере, сегодня) применять стили к элементу , который в DOM расположен перед элементами контроля формы, без использования JavaScript.
  • Все современные браузеры поддерживают – серию методов JavaScript для валидации органов контроля форм.
  • В сообщениях обратной связи могут использоваться (разные для каждого браузера и нестандартные с помощью CSS) или наши пользовательские стили обратной связи с дополнительным HTML и CSS.
  • Вы можете предоставлять настраиваемые сообщения о действительности с помощью в JavaScript.

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

CSS по стандартам

  • !important
  • @charset
  • @font-face
  • @import
  • @keyframes
  • @media
  • CSS свойства
    • по алфавиту
    • по категориям
    • все
    • CSS1
    • CSS2
    • CSS3
    • animation
    • animation-delay
    • animation-direction
    • animation-duration
    • animation-iteration-count
    • animation-name
    • animation-play-state
    • animation-timing-function
    • appearance
    • azimuth
    • backface-visibility
    • background
    • background-attachment
    • background-clip
    • background-color
    • background-image
    • background-origin
    • background-position
    • background-repeat
    • background-size
    • border
    • border-bottom
    • border-bottom-color
    • border-bottom-left-radius
    • border-bottom-right-radius
    • border-bottom-style
    • border-bottom-width
    • border-collapse
    • border-color
    • border-image
    • border-image-outset
    • border-image-repeat
    • border-image-slice
    • border-image-source
    • border-image-width
    • border-left
    • border-left-color
    • border-left-style
    • border-left-width
    • border-radius
    • border-right
    • border-right-color
    • border-right-style
    • border-right-width
    • border-spacing
    • border-style
    • border-top
    • border-top-color
    • border-top-left-radius
    • border-top-right-radius
    • border-top-style
    • border-top-width
    • border-width
    • bottom
    • box-shadow
    • box-sizing
    • break-after
    • break-before
    • break-inside
    • caption-side
    • clear
    • clip
    • color
    • column-count
    • column-gap
    • column-rule
    • column-rule-color
    • column-rule-style
    • column-rule-width
    • column-span
    • column-width
    • columns
    • content
    • counter-increment
    • counter-reset
    • cue
    • cue-after
    • cue-before
    • cursor
    • direction
    • display
    • elevation
    • empty-cells
    • float
    • font
    • font-family
    • font-size
    • font-size-adjust
    • font-stretch
    • font-style
    • font-variant
    • font-weight
    • height
    • left
    • letter-spacing
    • line-height
    • list-style
    • list-style-image
    • list-style-position
    • list-style-type
    • margin
    • margin-bottom
    • margin-left
    • margin-right
    • margin-top
    • marquee-direction
    • marquee-play-count
    • marquee-speed
    • marquee-style
    • max-height
    • max-width
    • min-height
    • min-width
    • nav-down
    • nav-index
    • nav-left
    • nav-right
    • nav-up
    • opacity
    • orphans
    • outline
    • outline-color
    • outline-offset
    • outline-style
    • outline-width
    • overflow
    • overflow-x
    • overflow-y
    • padding
    • padding-bottom
    • padding-left
    • padding-right
    • padding-top
    • page-break-after
    • page-break-before
    • page-break-inside
    • pause
    • pause-after
    • pause-before
    • pitch
    • pitch-range
    • play-during
    • position
    • quotes
    • resize
    • richness
    • right
    • speak
    • speak-header
    • speak-numeral
    • speak-punctuation
    • speech-rate
    • src
    • stress
    • table-layout
    • text-align
    • text-decoration
    • text-indent
    • text-overflow
    • text-shadow
    • text-transform
    • top
    • transition
    • transition-delay
    • transition-duration
    • transition-property
    • transition-timing-function
    • unicode-bidi
    • unicode-range
    • vertical-align
    • visibility
    • voice-family
    • volume
    • white-space
    • widows
    • width
    • word-spacing
    • word-wrap
    • z-index
  • Комментарии в CSS
  • Псевдоклассы
    • :active
    • :checked
    • :default
    • :disabled
    • :empty
    • :enabled
    • :first-child
    • :first-of-type
    • :focus
    • :hover
    • :in-range
    • :invalid
    • :lang
    • :last-child
    • :last-of-type
    • :link
    • :not
    • :nth-child
    • :nth-last-child
    • :nth-last-of-type
    • :nth-of-type
    • :only-child
    • :only-of-type
    • :optional
    • :out-of-range
    • :read-only
    • :read-write
    • :required
    • :root
    • :target
    • :valid
    • :visited
  • Псевдоэлементы
    • :after
    • :before
    • :first-letter
    • :first-line

The problem with pattern

The attribute is wonderful because it lets you accept a regular expression. This regular expression lets you validate the input with anything you can think of.

But… the regular expression must match the text completely. If the text doesn’t get matched completely, the input gets invalidated.

This created the problem I mentioned above. (Reminder of the problem: If a user enters a whitespace first, the input becomes invalid).

I couldn’t find a regular expression that worked for all use-cases that I thought of. If you want to try your hand at creating a regular expression that I need, I’d be more than welcome to receive the help!

Here are the use-cases:

(Then again, I might be overthinking it… ).

Стиль проверки CSS

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

селектор описание
:focus поле с фокусом
:focus-within элемент содержит поле с фокусом (да, это родительский селектор!)
:focus-visible элемент имеет фокус из-за навигации с клавиатуры, поэтому необходимо кольцо фокусировки или более очевидный стиль
:required поле с requiredатрибутом
:optional поле без requiredатрибута
:valid поле, прошедшее проверку
:invalid поле, которое не прошло проверку
:user-valid поле, прошедшее проверку после взаимодействия с ним пользователя (только Firefox)
:user-invalid поле, которое не прошло проверку после того, как пользователь взаимодействовал с ним (только Firefox)
:in-range значение находится в пределах диапазона на входе numberилиrange
:out-of-range значение вне допустимого диапазона на входе numberилиrange
:disabled поле с disabledатрибутом
:enabled поле без disabledатрибута
:read-only поле с read-onlyатрибутом
:read-write: поле без read-onlyатрибута
:checked установленный флажок или переключатель
:indeterminate неопределенный флажок или радио-состояние, например, когда все переключатели не отмечены
:default кнопка отправки по умолчанию или изображение

Вы можете стилизовать placeholderтекст ввода с помощью ::placeholderпсевдоэлемента:

Указанные выше селекторы имеют одинаковую специфику, поэтому порядок может иметь значение. Рассмотрим этот пример:

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

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

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

Form Finesse

Формы являются основой всех веб-приложений, и разработчики тратят много времени на манипулирование пользовательским вводом. Хорошо поддерживается проверка ограничений: браузеры могут обрабатывать большинство проверок и отображать соответствующие параметры ввода.

Рекомендации:

  • По возможности используйте стандартные типы ввода HTML. Набор min, max, step, minlength, maxlength, pattern, required, inputmode, и autocompleteатрибуты по мере необходимости.
  • При необходимости используйте немного JavaScript, чтобы включить настраиваемую проверку и сообщения.
  • Для более сложных полей постепенно улучшайте стандартные входные данные.

Наконец: забудьте про Internet Explorer!

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

Подсвечивайте верно заполненные поля

Дайте пользователю знать, что поле было заполнено верно. Браузер может предоставить нам эту информацию по CSS-псевдоклассу :valid.

SCSS
form {
  > input,
  > input,
  > input {
 
    // покажите успех!
    &:valid {
      background: url(images/check.svg);
      background-size: 20px;
      background-repeat: no-repeat;
      background-position: 20px 20px;
      // продолжаем прятать label
      & + label {
        opacity: 0;
      }
    }
  }
 }
}

<input type=”email” id=”email” name=”email” required>

Это поле является обязательным для заполнения и вводимая информация будет проверяться на соответствие адресу электронной почты. Давайте улучшим UX:

  1. Сообщим пользователю о требуемом формате, когда фокус находится в поле ввода
  2. Напомним ему, если введенные данные не будут валидными

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

Проверяем заполнено поле или нет

Мы хотим провернуть фокус с :valid и :invalid, но мы не хотим опережать события и считать поле невалидным до того, как оно было заполнено.

Есть ли CSS-селектор для проверки пустоты поля? Вообще-то нет! Вы можете подумать на :empty, но ошибетесь. Этот псевдокласс предназначен для проверки ситуаций когда элемент <p></p> не содержит в себе ничего. Поля ввода и так пусты по умолчанию.

Трюк в том, чтобы проверить поле на видимость атрибута placeholder:

CSS
input:not(:placeholder-shown) { }

Мы не использовали плейсхолдер в нашем примере, но это правило сработает, если мы зададим значение из одного пробела:

<input placeholder=” “>

:placeholder-shown супер полезен для нас! Это в целом секретный селектор, позволяющий проверить, есть ли в поле значение или нет.

IE и Firefox пока  его, что немного осложняет задачу. Обычно спасителем является новая функция @supports, но…

CSS
/* Это не сработает */
@supports (input:placeholder-shown) {
  input:not(:placeholder-shown) {
  }
}

Вы не можете использовать @supports для селекторов, только для свойства/значения (например @supports (display: flex)).

Проверить плейсхолдер при помощи JavaScript довольно легко:

JavaScript
var i = document.createElement(‘input’);
if (‘placeholder’ in i) { }

Но это не кажется самым простым способом имитации :placeholder-shown. Поэтому…возможно, просто стоит подождать поддержки всеми браузерами.

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

SCSS
form {
  > div {
 
    > input,
    > input,
    > input {
 
      // Когда поле ввода…
      // 1. НЕ пустое
      // 2. НЕ в фокусе
      // 3. НЕ валидно
      &:invalid:not(:focus):not(:placeholder-shown) {
        // Покажем напоминание
        background: pink;
        & + label {
          opacity: 0;
        }
      }
 
    // Когда в невалидное поле устанавливается фокус (и оно по прежнему не пустое)
    &:invalid:focus:not(:placeholder-shown) {
      // Покажем более настойчивое напоминание 
      & ~ .requirements {
        max-height: 200px;
        padding: 0 30px 20px 50px;
      }
    }
  }
 
  // <input> ~
  // <label> ~ 
  // <div class=”requirements”>
  .requirements {
    padding: 0 30px 0 50px;
    color: #999;
    max-height: 0;
    transition: 0.28s;
    overflow: hidden;
    color: red;
    font-style: italic;
  }
 }
}

Вы можете создать более сильную проверку

Вот статья об этом. Скажем, вы хотите проверку пароля по параметрам:

  • Состоит из 6 символов
  • Содержит хотя бы одну прописную букву
  • Содержит хотя бы одну строчную букву
  • Содержит хотя бы одну цифру

Вы можете это сделать следующим образом:

<input pattern=”(?=.*\d)(?=.*)(?=.*).{6,}” type=”password” id=”password” name=”password” required placeholder=” “>

Демо

Я оставил в этом примере :placeholder-shown, так что в Firefox и IE может работать не очень хорошо. Это просто пример! Не стесняйтесь брать по частям или менять под свои нужды.

See the Pen
Form with a bunch of HTML5 Validation and CSS3 Help by Chris Coyier (@chriscoyier)
on CodePen.

Проверка поля HTML5

Современные браузеры, поддерживающие HTML5, могут проверять поля без JavaScript. Атрибут устанавливает ограничения и может изменять пользовательский интерфейс стандартного поля :

Тип Описание
button кнопка без поведения по умолчанию
checkbox флажок или переключатель
color выбор цвета
date выбор даты для года, месяца и дня
datetime-local выбор даты и времени
email вводе email
file выбор файла
hidden скрытое поле
image кнопка, которая отображает изображение заданное в атрибуте
month выбор месяца и года
number ввод номера
password ввод пароля (скрытый текст)
radio радио кнопка
range ползунок
reset сбрасывает все поля формы до значений по умолчанию
search поле поиска
submit кнопка отправки формы
tel телефонный номер
text текстовый ввод
time выбор времени (без временной зоны)
url ввод URL
week выбор номера недели и года

Если вы не указываете или используете неподдерживаемый атрибут, браузер назначает полю тип . Это должно позволить пользователю вводит данные в старых браузерах, даже если это не может быть проверено автоматически.

Другие атрибуты управления ограничениями включают:

Атрибут Описание
accept тип загружаемого файла
alt атрибут для изображения
autocomplete подсказка автодополнения
autofocus поле фокуса
capture метод захвата мультимедиа
checked отмеченный checkbox или radio
disabled отключённое поле — оно не проверяется и не отправляется
form связать с формой, используя указанный id
formaction URL для отправки (submit и button)
inputmode подсказка типа данных (none, text, tel, url, email, numeric, decimal, search)
list id
max максимальное значение
maxlength максимальная длинна строки
min минимальное значение
minlength минимальная длинна строки
name имя элемента управления (отправляется на сервер)
pattern регулярное выражение шаблона проверки поля, напр. + одна и больше цифр от 1 до 3
placeholder текст-заполнитель для пустого поля
readonly Поле не может редактироваться — оно проверяется и отправляется
required обязательное поле
size размер элемента управления, обычно переопределяется в CSS
spellcheck устанавливается true или false для проверки орфографии
src URL изображения
step шаг увеличения значения в number и/или range
value начальное значение

Интерфейс

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

Используйте самый очевидный тип , но будьте осторожны с особыми случаями, такими как кредитные карты. Это числовые значения, но ролик мыши и курсорные клавиши бесполезны. Лучше использовать стандартный ввод :

Браузер может предлагать такие функции, как съёмка камерой или подтверждение по SMS, когда встречает тип .

Встроенная проверка/валидация

Браузер гарантирует, что значение соответствует ограничениям атрибутов , , , , , , , и :

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

    1. атрибут в , или
    1. атрибут в кнопку отправки формы

$ Специальные ограничения

&

Атрибуты позволяют ограничить длину ввода с двух сторон для текстовых полей.
Это поле будет не валидным (), если в нем меньше 4 символов:

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

&

Для некоторых не текстовых полей можно ограничить максимальное и минимальное значение с помощью атрибутов . Например:

Для контроля значения относительно заданных лимитов существуют и
.
Эти псевдоклассы применяются только к элементам с заданным диапазоном ограничений. При отсутствии такого
ограничения элемент не может быть ни «в зоне допустимых значений», ни «вне диапазона».

В этом примере инпут будет красным, если значение меньше 10 (включительно) или больше 20 (включительно), в
остальных случаях (в том числе при пустом значении) он будет зеленым:

Но! Чтобы не тыкать в пользователя сообщениями о правильности заполнения формы, пока
он
ничего не сделал, стили для почти никогда не пишут.

Invalidating the input

We don’t want to use because we’ll kickstart the input with an invalid state. (When the input is empty, it’s already invalid).

This is where Chris Coyier swooped in to the rescue with ” Form Validation UX in HTML and CSS“.

In the article, Chris talks about a pseudo-class. It can be used to check whether a placeholder is shown.

The idea is:

  1. You add a placeholder to your input
  2. If the placeholder is hidden, it means the user typed something into the field
  3. Proceed with validation (or invalidation)

Here’s the CSS (simplified version. For the complete version, check out Chris’s article)

Since I had both validation AND invalidation styles, I had to ensure the valid styles came after the invalid styles.

Here’s a demo for you to play with:

See the Pen
Pure CSS Empty validation
by Zell Liew (@zellwk) on
CodePen.

Note: Edge doesn’t support , so it’s probably not a good idea to use it in production yet. There’s no good way to detect this feature.

Now back to the problem I couldn’t resolve.

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

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

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

CSS

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

Псевдосостояния формы

Еще один важный случай использования псевдоклассов — это формы.Мы уже рассмотрели состояния , которые также можно использовать для элементов формы.

Но есть еще несколько, которые мы можем использовать:

& .

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

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

Допустим, у нас есть кнопка, которая отключена, пока пользователь не заполнит все поля.Это отличный способ показать пользователю, что она еще не действительна.

Вход в полноэкранный режимВыход из полноэкранного режима

Вы можете увидеть разницу в следующем CodePen.

&

Псевдоклассы checked и indeterminate помогут стилизовать флажки и радиокнопки.

Класс checked срабатывает, если элемент включен, а класс indeterminate забавен тем, что предназначен для небинарных состояний.

Что это вообще значит?Флажок может быть включен/выключен, но есть редкие случаи, когда он не может быть ни тем, ни другим. Именно в таких случаях и работает indeterminate.

Как мы можем стилизовать состояние ?

Войти в полноэкранный режимВыйти из полноэкранного режима

Я использую здесь box-shadow, так как это одна из тех вещей в представлении, которые хорошо работают для проверенных состояний.

Если вы планируете стилизовать флажок дальше, то лучше выбрать пользовательский флажок.

Что касается , то здесь не стоит вдаваться в подробности, так как это настолько нишевое использование.

На CSS-tricks есть отличная статья об этом, если вы хотите получить больше информации.

Попробуйте его в этом CodePen.

Ранее я посвятил более подробную статью псевдоклассу CSS .

С его помощью можно указать, в каких полях отображается плагин.

Вход в полноэкранный режимВыйти из полноэкранного режима

В результате получается следующее:

, , &

Это классы валидации, и их можно использовать для демонстрации поля, которое не является валидным.

Давайте воспользуемся полем электронной почты. Его проще всего показать как в недействительном, так и в действительном состоянии.

Мы можем добавить красную/зеленую рамку и тень в зависимости от состояния валидации следующим образом:

Войти в полноэкранный режимВыход из полноэкранного режима

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

Вход в полноэкранный режимВыход из полноэкранного режима

Вы также можете попробовать этот вариант, но выберите число от 1 до 10 (это диапазон для ввода числа).

&

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

Вход в полноэкранный режимВыйти из полноэкранного режима

Это придаст всем обязательным полям оранжевый фон.

Спасибо, что прочитали, и давайте общаться!

Спасибо, что читаете мой блог. Не стесняйтесь подписаться на мою рассылку по электронной почте и подключайтесь на Facebook или Twitter.

Restrict with CSS #

To not show the valid/invalid states without user interaction we can use CSS. In general there are two ways of doing this.

:focus #

The first approach is to only trigger :valid / :invalid when a form element has focus.

This way the user first have to interact with the page to get a different styling. This comes with other issues though, as once the user moves to another form element the previous one will lose the validation styling.

:placeholder-shown #

The other approach is to use the :placeholder-shown pseudo class.

This way, elements only get marked as invalid when the placeholder is not shown. We can enhance this further by only using :invalid when the form element is not focused.

When you hear placeholder, you may think »placeholders are bad for accessibility and shouldn’t be used« and this is true to some point, as you should never replace a real label element with a placeholder text and should avoid placeholder text in most cases, but we don’t need any text for placeholder to get this working, all we need is

That said, in some cases this may still be confusing for users, but it is probably the best approach we have.

Понравилась статья? Поделиться с друзьями:
Setup Pro
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: