Skip to content

Latest commit

 

History

History
109 lines (62 loc) · 7.5 KB

09. Формы в ХТМЛ.md

File metadata and controls

109 lines (62 loc) · 7.5 KB

Формы в ХТМЛ

Блеск и нищета форм в ХТМЛ

В вебе очень много форм — зайдите на любой сайт, точно найдёте хотя бы один инпут. Сегодня мы поговорим о том, как строить формы — это не очень-то и легко, на самом деле: ведь нужно не забывать про a11y.

Самый базовый элемент, в котором находятся другие контролы — инпуты, чекбоксы, селекты, кнопки.

Давайте разберём частые и непонятные атрибуты, остальные — посмотрите на cssreference.

action — адрес

В экшен мы указываем адрес, куда отправится форма. Обычно это адрес ХТТП-ресурса, который сможет принять запрос (помните второй урок?). Например, если у вас форма поиска, то, скорее всего, у сервера будет ресурс /search (но это не факт!).

method

ХТТП-метод, который принимает запрос: гет или пост. Уточняйте у своего бэкэндера.

enctype

Если расшифровывать, encoding type — формат, в котором нужно передать данные. Уточняйте у бэкэндера.

Значения:

  • enctype="application/x-www-form-urlencoded" — дефолт,
  • enctype="text/plain" — чистый текст, используется редко,
  • enctype="multipart/form-data" — для загрузки файлов.

Селект это выпадающий список со значениями, которые указаны через option.

iframe: https://jsfiddle.net/4f4pcku7/embedded/result,html

Про option в value

У option есть атрибут value — это то, что используется как данные при отправке формы. Между тегами может быть написано всё что угодно, но уйдёт значение из value.

Про стилизацию селектов

Хочу уточнить, что селекты рисуются системой — поэтому они в разных системах выглядят по-разному. Можно ли их стилизовать? Увы, нет — вы не сможете застилизовать открытый список, но сможете сам селект, если предварительно сбросите стиль через appearance.

Не забывайте про поддержку браузеров! Работает далеко не во всех, а в тех, что работает — нужны вендорные префиксы -moz- и -webkit-.

Как стилизовать тогда без этого свойства? Через позиционирование и opacity: вы скрываете сам селект, а под него (через z-index) кладёте застилизованный элемент (например, кнопку).

Кнопки! Ну тут всё просто: можно задать тип через type: либо submit, либо reset — в первом случае нажатие на кнопки отправит данные на сервер, во втором — сбросит.

По-умолчанию стоит submit, поэтому будьте осторожны — можно случайно заставить кнопку сброса отправлять данные, если забудете проставить тип.

Большое поле ввода.

iframe: https://jsfiddle.net/6mpozguc/embedded/result,html/

Обязательное поле name — имя контрола, нужно, чтобы разграничивать на сервере одни данные от других (вы же не отправите имя как фамилию, верно?). Кстати, к селекту тоже относится — каждому контролу, с которым взаимодействует пользователь, нужно задавать name.

Самый богатый контрол из всех форм. Дело в том, что он может вести себя абсолютно по-разному только благодаря атрибуту type: text, password, email, number будут вести себя как обычный инпут ввода, но на мобильных девайсах будет заметна разница: клавиатура будет меняться у email и number. Ну и, конечно же, нужно будет соблюдать формат: от email будет ожидание что там емейл, а в number нельзя будет ввести текст.

type="checkbox"

Чекбокс это контролы, которые можно выбрать несколько раз.

iframe: https://jsfiddle.net/puurw9ow/2/embedded/result,html/

type="radio"

Чем радио отличается от чекбокса? Тем, что из радио под одним name можно выбрать только одно значение.

iframe: https://jsfiddle.net/puurw9ow/3/embedded/result,html/

Кстати, как я сделал так, чтобы при клике на текст выбиралось значение?

Через label! Тег лейбл либо обрамляет элемент:

<label>
  <input name="js-library" value="react" type="radio">
  Реакт
</label>

либо работает через атрибут for и связывается с контролом через id:

<input id="js-library-react" name="js-library" value="react" type="radio">
<label for="js-library-react">Реакт</label>

Итог

Давайте запомним правила:

  • всегда должен быть тег form при работе с формами,
  • нужно не забывать про name,
  • в ХТМЛ есть разные контролы — от чекбоксов до текстареи,
  • не забывайте про label — не просто воткнуть его на страницу, а обрамить им контрол либо использовать через атрибуты for и id.

Задание

Задания не будет, потому что самая богатая форма уже сделана на htmlreference.