Кратко
СкопированоПсевдоклассы используются для стилизации полей формы, филдсетов, либо самой формы:
:invalidдля заполнений с ошибкой;:validдля верных заполнений.
Пример
Скопировано
<form> <div class="form-row"> <label for="first-name">Имя:</label> <input type="text" name="first-name" id="first-name" required> <span class="validity-icon"></span> </div> <div class="form-row"> <label for="email">E-mail:</label> <input type="email" name="email" id="email"> <span class="validity-icon"></span> </div> <div class="form-row"> <label> <input type="checkbox" name="agree" id="agree" required> Я согласен с политикой обработки персональных данных </label> </div> <div class="form-row"> <button type="submit">Отправить</button> </div></form>
<form>
<div class="form-row">
<label for="first-name">Имя:</label>
<input type="text" name="first-name" id="first-name" required>
<span class="validity-icon"></span>
</div>
<div class="form-row">
<label for="email">E-mail:</label>
<input type="email" name="email" id="email">
<span class="validity-icon"></span>
</div>
<div class="form-row">
<label>
<input type="checkbox" name="agree" id="agree" required>
Я согласен с политикой обработки персональных данных
</label>
</div>
<div class="form-row">
<button type="submit">Отправить</button>
</div>
</form>
input:invalid { border: 2px solid red;}input:invalid + .validity-icon::before { content: '✖'; color: red;}input:valid + .validity-icon::before { content: '✓'; color: green;}[type="checkbox"]:invalid { outline: 2px solid red; outline-offset: 2px;}
input:invalid {
border: 2px solid red;
}
input:invalid + .validity-icon::before {
content: '✖';
color: red;
}
input:valid + .validity-icon::before {
content: '✓';
color: green;
}
[type="checkbox"]:invalid {
outline: 2px solid red;
outline-offset: 2px;
}
Как понять
СкопированоЧасто на сайтах мы встречаем формы. Это могут быть формы регистрации или формы оплаты покупки в интернет-магазине. Некоторые поля ввода и другие элементы управления в этих формах могут иметь особые требования к заполнению. Например, какие-то поля ввода должны быть обязательно заполнены, какие-то — иметь определённый формат данных (к примеру, текст в поле с типом email должен содержать знак @).
Чтобы показать что поле ввода заполнено корректно к нему можно применить особые стили используя псевдокласс :valid. Аналогично, для некорректно заполненного поля мы можем применить особые стили используя псевдокласс :invalid.
В примере выше можно увидеть пару моментов:
- Поле ввода имени и чекбокс обязательны к заполнению, но не заполнены, поэтому псевдокласс
:invalidприменяется к ним сразу же. - Поле ввода электронной почты необязательно к заполнению, поэтому к нему сразу же применён псевдокласс
:valid.
Но если ввести в поле хотя бы один символ, браузер запускает проверку на корректность ввода email (из-за того, что мы указали type) и применяет псевдокласс :invalid до тех пор, пока не будет введён корректный адрес электронной почты.
Также указанные псевдоклассы применяются и к самой форме, в которой находится инпут.
В примере выше можно увидеть, что при наличии филдсета к нему также будет применён соответствующий псевдокласс.
form:invalid { border-color: red;}form:valid { border-color: green;}fieldset:invalid { border-color: red;}fieldset:valid { border-color: green;}
form:invalid {
border-color: red;
}
form:valid {
border-color: green;
}
fieldset:invalid {
border-color: red;
}
fieldset:valid {
border-color: green;
}
Как пишется
СкопированоК любому селектору добавляем двоеточие и ключевое слово invalid или valid. Селектор должен указывать на интерактивный элемент ввода, у которого предусмотрены правила проверки, на форму или на филдсет. Например, абзац браузер не умеет проверять на правильность, а значит, селектор p будет бесполезен.
Например, так выглядит селектор по классу:
.element:invalid { color: red;}.element:valid { color: green;}
.element:invalid {
color: red;
}
.element:valid {
color: green;
}
Подсказки
Скопировано💡 Если в форме есть группа связанных радиокнопок (<input type), то если хотя бы у одной есть атрибут required, псевдокласс :invalid будет применён ко всем радиокнопкам сразу.
💡 Псевдоклассы :invalid или :valid применяются и к самой форме, и к тегу <fieldset>, в зависимости от того, есть ли внутри ошибки, или все инпуты заполнены верно.
💡 В отличие от комплексной валидации формы, которая происходит при попытке её отправить, эти псевдоклассы работают в реальном времени и сохраняют свою актуальность даже во время ввода.
На практике
Скопированосоветует
Скопировано🛠 В настоящий момент стили для псевдокласса :invalid применяются к невалидному полю сразу же, что не всегда удобно. Было бы круто, если бы валидация включалась, только если пользователь начал что-то вводить, но, к сожалению, пока нет такой возможности «из коробки».
В будущих версиях спецификации CSS должен появиться псевдокласс :user, который задуман как раз для целей, описанных выше. То есть он будет применяться, например, к полю ввода только после того, как пользователь начал там что-то писать.
Но это пока перспективы, а что же можно сделать сейчас? В настоящий момент добиться похожего поведения можно только для полей ввода. При этом нужно выполнить два условия:
- добавить атрибут
placeholder; - использовать псевдокласс
:placeholder.- shown
<form> <div class="form-row"> <label for="first-name">Имя:</label> <input type="text" name="first-name" id="first-name" placeholder="Например, Пётр" required> <span class="validity-icon"></span> </div> <div class="form-row"> <label for="email">E-mail:</label> <input type="email" name="email" id="email" placeholder="Например, mymail@gmail.com" > <span class="validity-icon"></span> </div> <div class="form-row"> <button type="submit">Отправить</button> </div></form>
<form>
<div class="form-row">
<label for="first-name">Имя:</label>
<input
type="text"
name="first-name"
id="first-name"
placeholder="Например, Пётр"
required>
<span class="validity-icon"></span>
</div>
<div class="form-row">
<label for="email">E-mail:</label>
<input
type="email"
name="email"
id="email"
placeholder="Например, mymail@gmail.com"
>
<span class="validity-icon"></span>
</div>
<div class="form-row">
<button type="submit">Отправить</button>
</div>
</form>
input:invalid { border: 2px solid red;}input:invalid:placeholder-shown { border-color: black;}input:invalid:placeholder-shown + .validity-icon::before,input:valid:placeholder-shown + .validity-icon::before { visibility: hidden;}
input:invalid {
border: 2px solid red;
}
input:invalid:placeholder-shown {
border-color: black;
}
input:invalid:placeholder-shown + .validity-icon::before,
input:valid:placeholder-shown + .validity-icon::before {
visibility: hidden;
}