Валидируем форму прямо в браузере. Без JavaScript, регистрации и смс.
Время чтения: меньше 5 мин
Кратко
Скопировать ссылку «Кратко» Скопировано
Псевдоклассы используются для стилизации полей формы, филдсетов, либо самой формы:
Пример
Скопировать ссылку «Пример» Скопировано
Я согласен с политикой обработки персональных данныхform>divclass="form-row">labelfor="first-name">Имя:label>inputtype="text"name="first-name"id="first-name"required>spanclass="validity-icon">span>div>divclass="form-row">labelfor="email">E-mail:label>inputtype="email"name="email"id="email">spanclass="validity-icon">span>div>divclass="form-row">label>inputtype="checkbox"name="agree"id="agree"required> Я согласен с политикой обработки персональных данных label>div>divclass="form-row">buttontype="submit">Отправитьbutton>div>form>
Часто на сайтах мы встречаем формы. Это могут быть формы регистрации или формы оплаты покупки в интернет-магазине. Некоторые поля ввода и другие элементы управления в этих формах могут иметь особые требования к заполнению. Например, какие-то поля ввода должны быть обязательно заполнены, какие-то — иметь определённый формат данных (к примеру, текст в поле с типом email должен содержать знак @ ).
Чтобы показать что поле ввода заполнено корректно к нему можно применить особые стили используя псевдокласс :valid . Аналогично, для некорректно заполненного поля мы можем применить особые стили используя псевдокласс :invalid .
В примере выше можно увидеть пару моментов:
Поле ввода имени и чекбокс обязательны к заполнению, но не заполнены, поэтому псевдокласс :invalid применяется к ним сразу же.
Поле ввода электронной почты необязательно к заполнению, поэтому к нему сразу же применён псевдокласс :valid .
Но если ввести в поле хотя бы один символ, браузер запускает проверку на корректность ввода email (из-за того, что мы указали type = «email» ) и применяет псевдокласс :invalid до тех пор, пока не будет введён корректный адрес электронной почты.
Также указанные псевдоклассы применяются и к самой форме, в которой находится инпут.
В примере выше можно увидеть, что при наличии филдсета к нему также будет применён соответствующий псевдокласс.
К любому селектору добавляем двоеточие и ключевое слово invalid или valid . Селектор должен указывать на интерактивный элемент ввода, у которого предусмотрены правила проверки, на форму или на филдсет. Например, абзац браузер не умеет проверять на правильность, а значит, селектор p : invalid будет бесполезен.
💡 Если в форме есть группа связанных радиокнопок ( ), то если хотя бы у одной есть атрибут required , псевдокласс :invalid будет применён ко всем радиокнопкам сразу.
💡 Псевдоклассы :invalid или :valid применяются и к самой форме, и к тегу , в зависимости от того, есть ли внутри ошибки, или все инпуты заполнены верно.
💡 В отличие от комплексной валидации формы, которая происходит при попытке её отправить, эти псевдоклассы работают в реальном времени и сохраняют свою актуальность даже во время ввода.
🛠 В настоящий момент стили для псевдокласса :invalid применяются к невалидному полю сразу же, что не всегда удобно. Было бы круто, если бы валидация включалась, только если пользователь начал что-то вводить, но, к сожалению, пока нет такой возможности «из коробки».
В будущих версиях спецификации CSS должен появиться псевдокласс :user — invalid , который задуман как раз для целей, описанных выше. То есть он будет применяться, например, к полю ввода только после того, как пользователь начал там что-то писать.
Но это пока перспективы, а что же можно сделать сейчас? В настоящий момент добиться похожего поведения можно только для полей ввода. При этом нужно выполнить два условия:
Валидация input с помощью HTML, JavaScript, а также стилизация верно и не верно заполненного поля ввода.
Валидация input с помощью HTML
Для этой задачи воспользуемся атрибутом pattern . При использовании такого подхода, обязательно нужно сообщить пользователю в каком формате необходимо вводить в данное конкретное поле (с помощью label и/или title ).
Демонстрация. После ввода нажмите enter , чтобы посмотреть как будет вести себя форма при попытке отправки её пользователем.
Для составления более сложных паттернов необходимо хорошо знать регулярные выражения.
Более сложный пример: валидация номера телефона.
Введите телефон в формате: +7 (777) 777-77-77 (Россия)
Введите телефон в формате: +375 (33) 333-33-33 (Беларусь)
Валидация input с помощью JavaScript
Теперь будем проверять правильность ввода с помощью JavaScript. С таким подходом можно более оперативно оповещать пользователя о неверном вводе. Повешаем на событие keyup функцию проверки правильности ввода
Первый аргумент метода replace() — это регулярное выражение (шаблон, по которому будем делать проверку), второй — пустая строка » «. Т.е. при соответствии заданного шаблона мы очищаем недопустимые символы.
d — только цифры;
^ — инверсия, т.е. получается ^d — не цифры;
/g — флаг глобальный поиск.
Т.о., пользователь не сможет ввести отличный от цифр символ.
Пример. Введите любое число:
Используя регулярные выражения можно задать абсолютно любой шаблон для input.
Стилизация верного и неверного поля ввода.
В основном комбинированием каких-то из этих трёх свойств мы оповещаем пользователя о возможности дальнейшей отправки формы.
Верный ввод при фокусе обязательного input:
НЕверный ввод при фокусе обязательного input
input:focus:required:invalid
Достаточно гибко можно стилизовать поля для ввода с помощью CSS.
Надеюсь, вам понравилась данная информация. Если вам интересна тема web-разработки, то можете следить за выходом новых статей в Telegram.
Статьи из данной категории:
Комментарии ( 5 )
Спасибо! Интересная статья. А не могли бы вы добавить как сделать маску при клике на поле, чтоб человек не делал пробелы и скобки, а просто вводил цифры номера телефона. Например: +7(___) ___-__-__ где вместо _ просто будут появляться введённые цифры.
Хорошая статья. А вот допустим такая задача, как проверить input на валидность при запрете вводить один ноль. То есть. условие для поиска type=»number» от 10 до 15 знаков. Все работает, кроме одного глюка. Поиск срабатывает если введен 0. А это неправильно, надо что бы условие поиска было строгим- «Количество чисел не меньше 10». Почему 0 проскакивает непонятно. Чем только не ограничивал-, pattern. min и тд. Ничего не поморгает, 0 все равно проходит. Подскажите в чем проблема. Как запретить ввод одного нуля? Заранее благодарен за помощь
Статья и правда хорошая, но есть недоработка. Пункт «Валидация input помощью JavaScript». Если ввести число, а потом любой символ — то удаляется вся строка. Чтобы этого избежать, стоит ставить input type text. Всё потому что number считает что символы в инпуте — пустая строка. А текст — нет.