`:valid` псевдокласс CSS
Базовая совместимость Широко доступно
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и во многих версиях браузеров. Она доступна во всех браузерах с июля 2015 года.
:valid CSS — это псевдокласс, который соответствует любому элементу <input> или другому элементу <form>, содержимое которого успешно проходит проверку. Это позволяет легко задать допустимым полям внешний вид, который поможет пользователю убедиться, что данные введены в правильном формате.
Попробуйте
label {
display: block;
margin-top: 1em;
}
input:valid {
background-color: ivory;
border: none;
outline: 2px solid deepskyblue;
border-radius: 5px;
accent-color: gold;
}
<form>
<label for="email">Email Address:</label>
<input id="email" name="email" type="email" value="na@me@example.com" />
<label for="secret">Secret Code: (lower case letters)</label>
<input id="secret" name="secret" type="text" value="test" pattern="[a-z]+" />
<label for="age">Your age: (18+)</label>
<input id="age" name="age" type="number" value="5" min="18" />
<label
><input name="tos" type="checkbox" required checked /> - Do you agree to
ToS?</label
>
</form>
Синтаксис
:valid {
/* ... */
}
Доступность
Зелёный цвет часто используется для обозначения допустимого ввода. Люди с некоторыми видами дальтонизма не смогут определить состояние поля ввода, если оно не сопровождается дополнительным индикатором, который передаёт смысл не только с помощью цвета. Обычно для этого используют поясняющий текст и/или значок.
- MDN: объяснения к руководству по WCAG, пункт 1.4
-
[Понимание критерия успеха 1.4.1 W3C: «Понимание WCAG 2.0»](https://www.w3.org/TR/UNDERSTANDING-WCAG20/visual-audio-contrast-without-color.html)
Примеры
Обозначение допустимых и недопустимых полей формы
В этом примере мы добавляем дополнительные элементы <span> для отображения содержимого, указывающего на допустимые или недопустимые данные:
<form>
<fieldset>
<legend>Feedback form</legend>
<p>Required fields are labeled with "required".</p>
<div>
<label for="fname">First name: </label>
<input id="fname" name="fname" type="text" required />
<span></span>
</div>
<div>
<label for="lname">Last name: </label>
<input id="lname" name="lname" type="text" required />
<span></span>
</div>
<div>
<label for="email">
Email address (include if you want a response):
</label>
<input id="email" name="email" type="email" />
<span></span>
</div>
<div><button>Submit</button></div>
</fieldset>
</form>
Для отображения этих индикаторов мы используем следующий CSS:
body {
font-family: sans-serif;
margin: 20px auto;
max-width: 460px;
}
fieldset {
padding: 10px 30px 0;
}
legend {
color: white;
background: black;
padding: 5px 10px;
}
fieldset > div {
margin-bottom: 20px;
display: flex;
flex-flow: row wrap;
}
button,
label,
input {
display: block;
font-family: inherit;
margin: 0;
box-sizing: border-box;
width: 100%;
padding: 5px;
height: 30px;
}
input {
box-shadow: inset 1px 1px 3px #cccccc;
border-radius: 5px;
}
input:hover,
input:focus {
background-color: #eeeeee;
}
input:required + span::after {
font-size: 0.7rem;
position: absolute;
content: "required";
color: white;
background-color: black;
padding: 5px 10px;
top: -26px;
left: -70px;
}
button {
width: 60%;
margin: 0 auto;
}
input + span {
position: relative;
}
input + span::before {
position: absolute;
right: -20px;
top: 5px;
}
input:invalid {
border: 2px solid red;
}
input:invalid + span::before {
content: "✖";
color: red;
}
input:valid + span::before {
content: "✓";
color: green;
}
Мы задаём для <span>s значение position: relative, чтобы позиционировать сгенерированное содержимое относительно них. Затем мы абсолютно позиционируем разное сгенерированное содержимое в зависимости от того, допустимы данные формы или нет: соответственно зелёную галочку или красный крестик. Чтобы дополнительно подчеркнуть недопустимость данных, мы также добавили полям ввода толстую красную рамку, когда их значения недопустимы.
Примечание: Для добавления этих меток мы использовали ::before, поскольку для меток «обязательное поле» уже использовали ::after.
Попробуйте сами:
Обратите внимание, что обязательные текстовые поля считаются недопустимыми, если они пусты, и допустимыми, если в них что-то введено. Поле для электронной почты, напротив, считается допустимым, если оно пустое, поскольку оно не обязательное, и недопустимым, если в нём указано что-то, не являющееся корректным адресом электронной почты.
Спецификации
| Спецификация |
|---|
| HTML # selector-valid |
| Селекторы уровня 4 # valid-pseudo |
Совместимость с браузерами
| Компьютеры | Мобильные устройства | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome для Android | Firefox для Android | Opera для Android | Safari для iOS | Samsung Internet | WebView для Android | WebView для iOS | |
valid |
10 |
12 |
4 |
10 |
5 |
18 |
4 |
10.1 |
5 |
1.0 |
37 |
5 |
form |
40 |
79 |
13 |
27 |
9 |
40 |
14 |
27 |
9 |
4.0 |
40 |
9 |
См. также
- Другие псевдоклассы, связанные с проверкой данных:
:required,:optional,:invalid - Проверка данных формы
- Доступ к состоянию допустимости из JavaScript
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Selectors/:valid