Spec-Zone.ru › CSS

`: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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API