Валидация
В SIMAI Framework с помощью модификаторов можно костомизировать элементы форм при валидации
Как это работает
Вот как проверка формы работает:
- Проверка формы HTML осуществляется с помощью двух псевдоклассов CSS,
:invalid
и:valid
. Он применяется к элементам<input>
,<select>
и<textarea>
- SimaiFramework ограничивает стили
:invalid
и:valid
родительским модификаторомwas-validated
, обычно применяемым к<form>
. В противном случае любое обязательное поле без значения отображается как недействительное при загрузке страницы. Таким образом, вы можете выбрать, когда их активировать (обычно после попытки отправки формы) - Чтобы сбросить внешний вид формы (например, в случае динамической отправки формы с использованием AJAX), снова удалите модификатор
was-validated
из<form>
после отправки. - В качестве запасного варианта можно использовать класса
is-invalid
иis-valid
вместо псевдоклассов для проверки на стороне сервера. Для них не требуется родительский класс с проверкойwas
. -
Из-за ограничений в том, как работает CSS, мы не можем (в настоящее время)
применять стили к
<label>
, который стоит перед элементом управления формой в DOM, без помощи пользовательского JavaScript. - Все современные браузеры поддерживают API проверки ограничений, набор методов JavaScript для проверки элементов управления формы.
- Сообщения обратной связи могут использовать настройки браузера по умолчанию (разные для каждого браузера и не настраиваемые с помощью CSS) или наши пользовательские стили обратной связи с дополнительными HTML и CSS.
-
Вы можете предоставить настраиваемые сообщения о
проверке с помощью
setCustomValidity
в JavaScript.
Имея это в виду, рассмотрите следующие демонстрации для наших пользовательских стилей проверки формы, необязательных классов на стороне сервера и значений по умолчанию для браузера.
Пользовательские стили
Для настраиваемых сообщений проверки формы вам необходимо добавить логический атрибут novalidate
к вашему <form>
. Это отключает всплывающие подсказки браузера по умолчанию, но по-прежнему предоставляет доступ к API проверки формы в JavaScript. Попробуйте отправить форму ниже; наш JavaScript перехватит кнопку отправки и передаст вам отзыв. При попытке отправки вы увидите стили :invalid
и :valid
, примененные к вашим элементам управления формой.
Пользовательские стили отзывов применяют настраиваемые цвета, границы, стили фокуса и фоновые значки, чтобы лучше передавать отзывы. Фоновые значки для <select>
доступны только с form-select
, но не с form-control
.
<form class="grid grid-col-12 gap-1 needs-validation" novalidate>
<div class="col-span-4">
<label for="validationCustom01" class="inline-block m-bottom-1/3">Имя</label>
<input type="text" class="w-full block weight-4 appearance-none transition bg-origin-padding p-top-1/3 p-bottom-1/3 p-right-1/2 p-left-1/2 text-1 radius-1/3 color-on-surface bg-surface-0 border-1 border-surface-lowest" id="validationCustom01" value="Иван" required>
<div class="hidden w-full m-top-1/3 text-1/2 string-1/3 color-green">
Хорошо выглядит!
</div>
</div>
<div class="col-span-4">
<label for="validationCustom02" class="inline-block m-bottom-1/3">Фамилия</label>
<input type="text" class="w-full block weight-4 appearance-none transition bg-origin-padding p-top-1/3 p-bottom-1/3 p-right-1/2 p-left-1/2 text-1 radius-1/3 color-on-surface bg-surface-0 border-1 border-surface-lowest" id="validationCustom02" value="Сидоров" required>
<div class="hidden w-full m-top-1/3 text-1/2 string-1/3 color-green">
Хорошо выглядит!
</div>
</div>
<div class="col-span-4">
<label for="validationCustomUsername" class="inline-block m-bottom-1/3">Имя пользователя</label>
<div class="flex flex-wrap items-cross-stretch w-full">
<span class="flex items-cross-center color-on-surface bg-surface-2 border-top-1 border-bottom-1 border-surface-container p-top-1/3 p-bottom-1/3 p-right-1/2 p-left-1/2 text-1 radius-left-1/3 border-left-1" id="inputGroupPrepend">@</span>
<input type="text" class="w-px grow shrink basis-auto block weight-4 appearance-none transition bg-origin-padding border-top-1 border-bottom-1 border-surface-container color-on-surface bg-surface-0 p-top-1/3 p-bottom-1/3 p-right-1/2 p-left-1/2 text-1 radius-right-1/3 border-right-1" id="validationCustomUsername" aria-describedby="inputGroupPrepend" required>
<div class="hidden w-full m-top-1/3 text-1/2 string-1/3 color-red">
Пожалуйста, выберите имя пользователя.
</div>
</div>
</div>
<div class="col-span-5">
<label for="validationCustom03" class="inline-block m-bottom-1/3">Город</label>
<input type="text" class="w-full block weight-4 appearance-none transition bg-origin-padding p-top-1/3 p-bottom-1/3 p-right-1/2 p-left-1/2 text-1 radius-1/3 color-on-surface bg-surface-0 border-1 border-surface-lowest" id="validationCustom03" required>
<div class="hidden w-full m-top-1/3 text-1/2 string-1/3 color-red">
Укажите действительный город.
</div>
</div>
<div class="col-span-4">
<label for="validationCustom04" class="inline-block m-bottom-1/3">Страна</label>
<select class="w-full block weight-4 appearance-none transition p-top-1/3 p-bottom-1/3 p-right-1/2 p-left-1/2 text-1 radius-1/3 color-on-surface bg-surface-0 border-1 border-surface-lowest bg-origin-padding bg-arrow-down bg-right-b2 bg-repeat-none" id="validationCustom04" required>
<option selected disabled value="">Выберите...</option>
<option>...</option>
</select>
<div class="hidden w-full m-top-1/3 text-1/2 string-1/3 color-red">
Пожалуйста, выберите существующую страну
</div>
</div>
<div class="col-span-3">
<label for="validationCustom05" class="inline-block m-bottom-1/3">Индекс</label>
<input type="text" class="w-full block weight-4 appearance-none transition bg-origin-padding p-top-1/3 p-bottom-1/3 p-right-1/2 p-left-1/2 text-1 radius-1/3 color-on-surface bg-surface-0 border-1 border-surface-lowest" id="validationCustom05" required>
<div class="hidden w-full m-top-1/3 text-1/2 string-1/3 color-red">
Пожалуйста, выберите существующий индекс.
</div>
</div>
<div class="col-span-12">
<div class="flex items-cross-center flex-wrap">
<input class="m-0 w-b6 h-b6 radius-1/3 border-1 appearance-none t-inherit string-inherit bg-surface-0 border-surface-lowest bg-contain bg-repeat-none bg-center checked:bg-green checked:b-green checked:bg-check indeterminate:bg-dash indeterminate:b-blue indeterminate:bg-green" type="checkbox" value="" id="invalidCheck" required>
<label class="inline-block m-left-1/3 color-inherit string-none" for="invalidCheck">
Согласен с условиями
</label>
<div class="hidden w-full m-top-1/3 text-1/2 string-1/3 color-red">
Вы должны согласиться перед отправкой
</div>
</div>
</div>
<div class="col-span-12">
<button class="p-right-1 p-left-1 p-top-1/3 p-bottom-1/3 bg-error hover:bg-surface-0 border-1 border-error transition-all text-1 radius-1/3 color-on-surface-inverse hover:color-on-surface cursor-pointer" type="submit">Отправить форму</button>
</div>
</form>
Проверка по умолчанию на стороне браузера
Не заинтересованы в настраиваемых сообщениях обратной связи проверки или написании JavaScript для изменения поведения формы? Все хорошо, вы можете использовать настройки браузера по умолчанию. Попробуйте отправить форму ниже. В зависимости от вашего браузера и ОС вы увидите немного другой стиль обратной связи.
Хотя эти стили обратной связи нельзя настроить с помощью CSS, вы все равно можете настроить текст обратной связи с помощью JavaScript.
<form class="grid grid-col-12 gap-1">
<div class="col-span-4">
<label for="validationDefault01" class="inline-block m-bottom-1/3">Имя</label>
<input type="text" class="w-full block weight-4 appearance-none transition bg-origin-padding p-top-1/3 p-bottom-1/3 p-right-1/2 p-left-1/2 text-1 radius-1/3 color-on-surface bg-surface-0 border-1 border-surface-lowest" id="validationDefault01" value="Иван" required>
</div>
<div class="col-span-4">
<label for="validationDefault02" class="inline-block m-bottom-1/3">Фамилия</label>
<input type="text" class="w-full block weight-4 appearance-none transition bg-origin-padding p-top-1/3 p-bottom-1/3 p-right-1/2 p-left-1/2 text-1 radius-1/3 color-on-surface bg-surface-0 border-1 border-surface-lowest" id="validationDefault02" value="Сидоров" required>
</div>
<div class="col-span-4">
<label for="validationDefaultUsername" class="inline-block m-bottom-1/3">Имя пользователя</label>
<div class="flex flex-wrap items-cross-stretch w-full">
<span class="flex items-cross-center color-on-surface bg-surface-2 border-top-1 border-bottom-1 border-surface-container p-top-1/3 p-bottom-1/3 p-right-1/2 p-left-1/2 text-1 radius-left-1/3 border-left-1" id="inputGroupPrepend2">@</span>
<input type="text" class="w-px grow shrink basis-auto block weight-4 appearance-none transition bg-origin-padding border-top-1 border-bottom-1 border-surface-container color-on-surface bg-surface-0 p-top-1/3 p-bottom-1/3 p-right-1/2 p-left-1/2 text-1 radius-right-1/3 border-right-1" id="validationDefaultUsername" aria-describedby="inputGroupPrepend2" required>
</div>
</div>
<div class="col-span-6">
<label for="validationDefault03" class="inline-block m-bottom-1/3">Город</label>
<input type="text" class="w-full block weight-4 appearance-none transition bg-origin-padding p-top-1/3 p-bottom-1/3 p-right-1/2 p-left-1/2 text-1 radius-1/3 color-on-surface bg-surface-0 border-1 border-surface-lowest" id="validationDefault03" required>
</div>
<div class="col-span-3">
<label for="validationDefault04" class="inline-block m-bottom-1/3">Страна</label>
<select class="w-full block weight-4 appearance-none transition p-top-1/3 p-bottom-1/3 p-right-1/2 p-left-1/2 text-1 radius-1/3 color-on-surface bg-surface-0 border-1 border-surface-lowest bg-origin-padding bg-arrow-down bg-right-b2 bg-repeat-none" id="validationDefault04" required>
<option selected disabled value="">Выберите...</option>
<option>...</option>
</select>
</div>
<div class="col-span-3">
<label for="validationDefault05" class="inline-block m-bottom-1/3">Индекс</label>
<input type="text" class="w-full block weight-4 appearance-none transition bg-origin-padding p-top-1/3 p-bottom-1/3 p-right-1/2 p-left-1/2 text-1 radius-1/3 color-on-surface bg-surface-0 border-1 border-surface-lowest" id="validationDefault05" required>
</div>
<div class="col-span-12">
<div class="flex items-cross-center flex-wrap">
<input class="m-0 w-b6 h-b6 radius-1/3 border-1 appearance-none t-inherit string-inherit bg-surface-0 border-surface-lowest bg-contain bg-repeat-none bg-center checked:bg-green checked:b-green checked:bg-check indeterminate:bg-dash indeterminate:b-blue indeterminate:bg-green" type="checkbox" value="" id="invalidCheck2" required>
<label class="inline-block m-left-1/3 color-inherit string-none" for="invalidCheck2">
Согласен с условиями
</label>
</div>
</div>
<div class="col-span-12">
<button class="p-right-1 p-left-1 p-top-1/3 p-bottom-1/3 bg-error hover:bg-surface-0 border-1 border-error transition-all text-1 radius-1/3 color-on-surface-inverse hover:color-on-surface cursor-pointer" type="submit">Отправить форму</button>
</div>
</form>
Проверка на стороне сервера
Мы рекомендуем использовать проверку на стороне клиента, но если вам требуется проверка на стороне сервера, вы можете указать недопустимые и действительные поля формы с помощью is-invalid
и is-valid
. Обратите внимание, что invalid-feedback
также поддерживается этими классами.
<form class="grid grid-col-12 gap-1">
<div class="col-span-4">
<label for="validationServer01" class="inline-block m-bottom-1/3">Имя</label>
<input type="text" class="w-full block weight-4 appearance-none transition bg-origin-padding p-top-1/3 p-bottom-1/3 p-right-1/2 p-left-1/2 text-1 radius-1/3 color-on-surface bg-surface-0 border-1 border-surface-lowest valid:b-green valid:bg-check valid:pr-c8 bg-repeat-none bg-right-b6 bg-size-b4 valid:hidden+block" id="validationServer01" value="Иван" required>
<div class="hidden w-full m-top-1/3 text-1/2 string-1/3 color-green">
Правильно!
</div>
</div>
<div class="col-span-4">
<label for="validationServer02" class="inline-block m-bottom-1/3">Фамилия</label>
<input type="text" class="w-full block weight-4 appearance-none transition bg-origin-padding p-top-1/3 p-bottom-1/3 p-right-1/2 p-left-1/2 text-1 radius-1/3 color-on-surface bg-surface-0 border-1 border-surface-lowest valid:b-green valid:bg-check valid:pr-c8 bg-repeat-none bg-right-b6 bg-size-b4 valid:hidden+block" id="validationServer02" value="Сидоров" required>
<div class="hidden w-full m-top-1/3 text-1/2 string-1/3 color-green">
Правильно!
</div>
</div>
<div class="col-span-4">
<label for="validationServerUsername" class="inline-block m-bottom-1/3">Имя пользователя</label>
<div class="flex flex-wrap items-cross-stretch w-full">
<span class="flex items-cross-center color-on-surface bg-surface-2 border-top-1 border-bottom-1 border-surface-container p-top-1/3 p-bottom-1/3 p-right-1/2 p-left-1/2 text-1 radius-left-1/3 border-left-1" id="inputGroupPrepend3">@</span>
<input type="text" class="w-px grow shrink basis-auto block weight-4 appearance-none transition bg-origin-padding border-1 border-surface-container invalid:bg-warning-circle invalid:b-red p-right-1 bg-repeat-none bg-right-b6 bg-size-c0 invalid:hidden+block radius-right-1/3" id="validationServerUsername" aria-describedby="inputGroupPrepend3 validationServerUsernameFeedback" required>
<div id="validationServerUsernameFeedback" class="hidden w-full m-top-1/3 text-1/2 string-1/3 color-red">
Пожалуйста, введите имя пользователя.
</div>
</div>
</div>
<div class="col-span-6">
<label for="validationServer03" class="inline-block m-bottom-1/3">Город</label>
<input type="text" class="w-full block weight-4 appearance-none transition bg-origin-padding p-top-1/3 p-bottom-1/3 p-right-1/2 p-left-1/2 text-1 radius-1/3 color-on-surface bg-surface-0 border-1 border-surface-lowest invalid:bg-warning-circle invalid:b-red p-right-1 bg-repeat-none bg-right-b6 bg-size-c0 invalid:hidden+block" id="validationServer03" aria-describedby="validationServer03Feedback" required>
<div id="validationServer03Feedback" class="hidden w-full m-top-1/3 text-1/2 string-1/3 color-red">
Пожалуйста, введите город.
</div>
</div>
<div class="col-span-3">
<label for="validationServer04" class="inline-block m-bottom-1/3">Страна</label>
<select class="w-full block weight-4 appearance-none transition p-top-1/3 p-bottom-1/3 p-right-1/2 p-left-1/2 text-1 radius-1/3 color-on-surface bg-surface-0 border-1 border-surface-lowest bg-origin-padding bg-arrow-down bg-right-b2 bg-repeat-none invalid:bg-warning-circle invalid:b-red p-right-1 bg-repeat-none bg-right-b6 bg-size-c0 invalid:hidden+block valid:b-green valid:bg-check valid:pr-c8 bg-repeat-none bg-right-b6 bg-size-b4" id="validationServer04" aria-describedby="validationServer04Feedback" required>
<option selected disabled value="">Выберите...</option>
<option>...</option>
</select>
<div id="validationServer04Feedback" class="hidden w-full m-top-1/3 text-1/2 string-1/3 color-red">
Выберите страну из списка.
</div>
</div>
<div class="col-span-3">
<label for="validationServer05" class="inline-block m-bottom-1/3">Индекс</label>
<input type="text" class="w-full block weight-4 appearance-none transition bg-origin-padding p-top-1/3 p-bottom-1/3 p-right-1/2 p-left-1/2 text-1 radius-1/3 color-on-surface bg-surface-0 border-1 border-surface-lowest invalid:bg-warning-circle invalid:b-red p-right-1 bg-repeat-none bg-right-b6 bg-size-c0 invalid:hidden+block" id="validationServer05" aria-describedby="validationServer05Feedback" required>
<div id="validationServer05Feedback" class="hidden w-full m-top-1/3 text-1/2 string-1/3 color-red">
Пожалуйста, введите индекс.
</div>
</div>
<div class="col-span-12">
<div class="flex items-cross-center flex-wrap">
<input class="m-0 w-b6 h-b6 radius-1/3 border-1 appearance-none t-inherit string-inherit bg-surface-0 border-surface-lowest bg-contain bg-repeat-none bg-center checked:bg-green checked:b-green checked:bg-check indeterminate:bg-dash indeterminate:b-blue indeterminate:bg-green invalid:hidden~block invalid:b-red invalid:c-inherit~c-red valid:c-inherit~c-green valid:b-green valid:c-green" type="checkbox" value="" id="invalidCheck3" aria-describedby="invalidCheck3Feedback" required>
<label class="inline-block m-left-1/3 color-inherit string-none" for="invalidCheck3">
Согласен с условиями
</label>
<div id="invalidCheck3Feedback" class="hidden w-full m-top-1/3 text-1/2 string-1/3 color-red">
Вы должны согласиться перед отправкой.
</div>
</div>
</div>
<div class="col-span-12">
<button class="p-right-1 p-left-1 p-top-1/3 p-bottom-1/3 bg-error hover:bg-surface-0 border-1 border-error transition-all text-1 radius-1/3 color-on-surface-inverse hover:color-on-surface cursor-pointer" type="submit">Отправить форму</button>
</div>
</form>
Поддерживаемые элементы форм
Стили проверки доступны для следующих элементов управления и компонентов формы:
-
<input>
и<textarea>
с модификаторомform-control
(включая до одногоform-control
в группах ввода) -
<select>
с модификаторомform-select
-
модификатор
form-check
<form>
<div class="m-bottom-1">
<label for="validationTextarea" class="inline-block m-bottom-1/3">Текстовое поле</label>
<textarea class="w-full block weight-4 appearance-none transition bg-origin-padding p-top-1/3 p-bottom-1/3 p-right-1/2 p-left-1/2 text-1 radius-1/3 color-on-surface bg-surface-0 border-1 border-surface-lowest invalid:bg-warning-circle invalid:b-red p-right-1 bg-repeat-none bg-right-b6 bg-size-c0 invalid:hidden+block" id="validationTextarea" placeholder="Обязательное поле" required></textarea>
<div class="hidden w-full m-top-1/3 text-1/2 string-1/3 color-red">
Пожалуйста, введите сообщение в текстовое поле
</div>
</div>
<div class="flex items-cross-center flex-wrap m-bottom-1">
<input type="checkbox" class="m-0 w-b6 h-b6 radius-1/3 border-1 appearance-none t-inherit string-inherit bg-surface-0 border-surface-lowest bg-contain bg-repeat-none bg-center checked:bg-green checked:b-green checked:bg-check indeterminate:bg-dash indeterminate:b-blue indeterminate:bg-green invalid:hidden~block invalid:b-red invalid:c-inherit~c-red valid:c-inherit~c-green valid:b-green valid:c-green" id="validationFormCheck1" required>
<label class="inline-block m-left-1/3 color-inherit string-none" for="validationFormCheck1">Установите флажок</label>
<div class="hidden w-full m-top-1/3 text-1/2 string-1/3 color-red">
Пример неправильного введенного текста
</div>
</div>
<div class="flex items-cross-center flex-wrap m-bottom-1/3">
<input type="radio" class="m-0 w-b6 h-b6 radius-1/3 border-1 appearance-none t-inherit string-inherit bg-surface-0 border-surface-lowest bg-contain bg-repeat-none bg-center checked:bg-green checked:b-green checked:bg-circle invalid:hidden~block invalid:b-red invalid:c-inherit~c-red valid:c-inherit~c-green valid:b-green valid:c-green radius-full" id="validationFormCheck2" name="radio-stacked" required>
<label class="inline-block m-left-1/3 color-inherit string-none" for="validationFormCheck2">Включите радиокнопку</label>
</div>
<div class="flex items-cross-center flex-wrap m-bottom-1">
<input type="radio" class="m-0 w-b6 h-b6 radius-1/3 border-1 appearance-none t-inherit string-inherit bg-surface-0 border-surface-lowest bg-contain bg-repeat-none bg-center checked:bg-green checked:b-green checked:bg-circle invalid:hidden~block invalid:b-red invalid:c-inherit~c-red valid:c-inherit~c-green valid:b-green valid:c-green radius-full" id="validationFormCheck3" name="radio-stacked" required>
<label class="inline-block m-left-1/3 color-inherit string-none" for="validationFormCheck3">Или переключите на эту радиокнопку</label>
<div class="hidden w-full m-top-1/3 text-1/2 string-1/3 color-red">
Еще один пример неправильного ввода текста
</div>
</div>
<div class="m-bottom-1">
<select class="w-full block weight-4 appearance-none transition p-top-1/3 p-bottom-1/3 p-right-1/2 p-left-1/2 text-1 radius-1/3 color-on-surface bg-surface-0 border-1 border-surface-lowest bg-origin-padding bg-arrow-down bg-right-b2 bg-repeat-none invalid:bg-warning-circle invalid:b-red p-right-1 bg-repeat-none bg-right-b6 bg-size-c0 invalid:hidden+block valid:b-green valid:bg-check valid:pr-c8 bg-repeat-none bg-right-b6 bg-size-b4" required aria-label="select example">
<option value="">Раскрывающийся список</option>
<option value="1">Один</option>
<option value="2">Два</option>
<option value="3">Три</option>
</select>
<div class="hidden w-full m-top-1/3 text-1/2 string-1/3 color-red">
Пример неправильного выбора
</div>
</div>
<div class="m-bottom-1">
<input type="file" class="w-full block weight-4 appearance-none transition bg-origin-padding p-top-1/3 p-bottom-1/3 p-right-1/2 p-left-1/2 text-1 radius-1/3 color-on-surface bg-surface-0 border-1 border-surface-lowest file-selector-button:font-inherit file-selector-button:t-inherit file-selector-button:bg-surface-2 file-selector-button:c-inherit file-selector-button:b-end-1 file-selector-button:b-inherit file-selector-button:b-solid file-selector-button:r-0 file-selector-button:b-0 file-selector-button:pointer-event-none file-selector-button:m-end-2 file-selector-button:-my-1 file-selector-button:-mx-2 file-selector-button:p-top-1/3 p-bottom-1/3 file-selector-button:p-right-1/2 p-left-1/2 cursor-pointer hover:file-selector-button:bg-surface-1 file-selector-button:transition invalid:bg-warning-circle invalid:b-red p-right-1 bg-repeat-none bg-right-b6 bg-size-c0 invalid:hidden+block" aria-label="Пример выбора файла" required>
<div class="hidden w-full m-top-1/3 text-1/2 string-1/3 color-red">
Пример ввода неверного файла
</div>
</div>
<div class="m-bottom-1">
<button class="p-right-1 p-left-1 p-top-1/3 p-bottom-1/3 bg-error hover:bg-surface-0 border-1 border-error transition-all text-1 radius-1/3 color-on-surface-inverse hover:color-on-surface cursor-pointer" type="submit" disabled>Отправить форму</button>
</div>
</form>
Адаптивность
Для установки адаптивности элементов формы, начиная с определенного размера области просмотра, добавьте префикс контрольной точки (sm
, md
, lg
, xl
) через двоеточие (:
) к любому модификатору.
Для получения дополнительной информации об адаптивности ознакомьтесь с документацией.