html
Основы

Формы ч. 2

HTML
Основы

Обновлено

12.09.2023

Просмотров

510

Время прочтения

80 мин.

Сложность

Видеоурок

Этот урок также доступен в видеоформате

Смотреть

<button>
— (с англ. button — кнопка) один из важнейших тегов для форм и для всего HTML. Является интерактивным, а потому не может быть вложен в другие интерактивные теги. Обладает предустановленными браузерными стилями, как правило серым фоном и чёрной границей, слегка закруглёнными углами. Также может иметь предустановленные стили для состояний :hover, :active.

Тег <button> не имеет какого-либо функционала по умолчанию, т.е. изначально в html документе это кнопка, которая ничего не делает.

                
<button>Привет, нажми меня скорее!</button>

Разработчики добавляют возможности кнопкам при помощи JavaScript. Кнопки могут открывать\закрывать модальные окна, запускать анимации, загружать списки товаров и т.д. В кнопку можно добавлять содержимое, и довольно часто это не только текст, а также иконки (как на сайте школы) и даже иногда целые div`ы с анимациями.

В урок по формам кнопки попали не случайно. Дело в том, что в HTML, помимо <input>, описанных в предыдущем уроке, есть ещё другие type, такие как button, submit, reset, image. Разумеется, они предназначались для использования внутри форм, однако в настоящее время не рекомендуются к использованию, поскольку <button> полностью заменяет все эти типы.

<input type="button" value="Привет, нажми меня скорее!" > — создаёт кнопку, полностью идентичную простому тегу <button>. Текст кнопки в таком случае указывается в атрибуте value. Значение данного элемента не передаётся вместе с данными формы. Этот тип не следует использовать в качестве кнопки, потому что он, как и любой другой инпут не может иметь содержимого. Это значит, что вы сможете создать при помощи него кнопку с текстом, но не сможете создать кнопку с иконкой. Вместо этого типа используйте <button>.

<input type="submit" value="Отправить форму" > — создаёт также кнопку, которая обладает уже функционалом отправки формы, если помещена в <form> или если связана с ней при помощи атрибута. Данная форма будет отправляться по клику на кнопку-input:

                
<form action="test.php" target="_blank" method="post" id="main-form"> <input type="submit" value="Отправить"> </form>

Не используется по той же самой причине — не может иметь содержимого, кроме текста. Заменяется полностью идентичным тегом <button type="submit" >, клик по которой будет отправлять форму:

                
<form action="test.php" target="_blank" method="post" id="main-form"> <button type="submit">Отправить</button> </form>

<input type="reset" value="Очистить форму" > — также предустановленная в браузере кнопка. Она очищает полностью форму, удаляя данные, которые ввёл пользователь. Не используется по той же указанной выше причине. Заменена идентичным тегом <button type="reset" >:

                
<form action="test.php" target="_blank" method="post" id="main-form"> <button type="submit">Отправить</button> <button type="reset">Очистить форму</button> </form>

<input type="image" > — создаёт кнопку-изображение, которая обладает функционалом type="submit". Осталась в HTML с тех времён, когда ещё не было тега <button> и когда создать изображение с функционалом отправки формы было очень непросто. Как видите, для подобных целей даже сделали отдельный type. В дополнение к данному тегу использовались атрибуты src, width, height, так что в старом виде submit мог выглядеть следующим образом (клик по кнопке-картинке отправлял форму):

                
<form action="test.php" target="_blank" method="post" id="main-form"> <input type="image" src="submit-icon.png" width="120" height="44"> </form>

По понятным причинам данный type не используется, а теперь используется <button type="submit" > с добавлением любой необходимой иконки, текста, анимации и пр.

              
<form action="test.php" target="_blank" method="post" id="main-form"> <button type="submit"> <img src="submit-icon.png" alt="" class="btn-icon"> Отправить форму </button> </form>

Повторимся, кнопки с соответствующими типами submit, reset обладают этим функционалом только в пределах тега <form>, либо если связаны с формой через атрибут form (описан в предыдущем уроке, применяется идентично и для <button>).

Помимо всех атрибутов, которые мы уже рассмотрели, есть ещё несколько весьма простых. По множеству упомянутых причин они могут применяться к <button type="submit" >.

formaction
— переопределяет значение атрибута action, указанное в <form>. Форма будет отправлена не на action.php, а на test.php:

              
<form action="https://babyfrontent.ru/lessons/action.php" target="_blank" method="post" id="main-form"> <p> <label for="username">Имя пользователя:</label> <input id="username" required type="text" name="username"> </p> <p> <label for="usertel">Телефон пользователя:</label> <input id="usertel" type="tel" name="usertel" pattern="[0-9]{3}-[0-9]{3}-[0-9]{4}" placeholder="333-333-4444"> </p> <button type="submit" formaction="https://babyfrontent.ru/lessons/test.php/">Отправить</button> </form>

formenctype, formmethod, formnovalidate, formtarget
— переопределяют значения соответствующих атрибутов <form>. Значения могут быть такие же, как и у соответствующих атрибутов.

              
<form action="https://babyfrontent.ru/lessons/action.php" target="_self" enctype="multipart/form-data" method="get" id="main-form"> <p> <label for="username">Имя пользователя:</label> <input id="username" required type="text" name="username"> </p> <p> <label for="usertel">Телефон пользователя:</label> <input id="usertel" type="tel" name="usertel" pattern="[0-9]{3}-[0-9]{3}-[0-9]{4}" placeholder="333-333-4444"> </p> <button type="submit" formaction="https://babyfrontent.ru/lessons/test.php/" formenctype="application/x-www-form-urlencoded" formmethod="post" formtarget="_blank" formnovalidate>Отправить</button> </form>

Данная форма будет отправлена на test.php, будет закодирована по стандартному алгоритму, метод будет post, результат отправки данных отобразится в новом окне, валидации не будет. Все эти опции определены в теге <form> и переопределены в <button type="submit" >.

Кнопки могут обладать ещё третим типом, это type="button". В таком случае кнопка не получает никакого особенного функционала, а ведёт себя также, как и кнопка вообще без указания type, даже если находится внутри <form>. В примере две кнопки будут одинаково ничего не делать, пока разработчик не укажет это при помощи JavaScript:

              
<button type="button">Привет, я кнопка!</button> <button>И я тоже!</button>

Для <button type="submit" > можно указывать атрибуты name, value, которые вам уже знакомы и которые работают схожим образом, как и для <input>. Это может быть использовано для того, чтобы создать несколько разных кнопок отправки формы и передавать в них разные значения, а на сервере в зависимости от этого производить различные операции с данными. Если привести другой пример, мы можем создать очень простую и вместе с тем очень эффективную форму-опросник всего из двух кнопок и вообще без каких-либо <input>:

              
<form action="https://babyfrontent.ru/lessons/test.php" method="post" target="_blank"> <p>Вам нравится школа BabyFrontent?</p> <button type="submit" name="review" value="good">Нравится</button> <button type="submit" name="review" value="very good">Очень нравится</button> </form>

Данные на сервере будут получены или «good», или «very good», в зависимости от того, на какую кнопку-submit нажал пользователь. Разумеется, вы можете создать не две, а три, четыре и более кнопок с разными значениями и так легко и просто собирать отзывы, проводить опросы и пр.

Также вы можете создать всего одну кнопку submit. Если не присваивать ей name, value, а для <form> указать например action="/contacts.html", то в результате мы получаем… обыкновенную ссылку!

              
<form action="contacts.html" method="post"> <button type="submit">Контакты</button> </form>

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

<textarea>
— (с англ. text area — область текста) элемент, аналогичный практически во всём <input type="text" >, за исключением в основном того, что это многострочный элемент. Как правило его мы используем для добавления пользователем комментариев, отзывов на товар, обращений в техническую поддержку и подобных случаях, т.е. когда одной строки, предоставляемой <input> нам недостаточно.

              
<form action="https://babyfrontent.ru/lessons/test.php" method="post"> <label for="message">Введите сообщение:</label><br> <textarea name="message" id="message" cols="30" rows="10">Кто-то уже ввёл сообщение до вас... </textarea> <br> <button type="submit">Отправить</button> </form>

Подобно <input>, тег принимает атрибуты name, id, и аналогично связывается с <label>. Особенные атрибуты это cols и rows, указывающие соответственно количество столбцов (символов в строке) и строк. Эти два атрибута обязательны по стандартам HTML, поэтому вы должны их указывать всегда, исходя из приблизительных размеров текста, который вероятно будет помещаться в это поле. Размер тега регулируется по-прежнему при помощи CSS, и это нормальная практика. Поэтому атрибуты cols, rows нужны скорее про запас и для соответствия стандартам.

Обратите внимание, что у <textarea> не может быть атрибута value. Если в случае с <input> мы указывали изначальное значение при помощи этого атрибута, в случае с <textarea> такое значение указывается непосредственно внутри тега.

Атрибуты autocomplete, autofocus, disabled, form, maxlength, minlength, spellcheck, placeholder, readonly, required доступны для <textarea>, правила для них действуют такие же, как и для <input>.

Вы могли обратить внимание на небольшой треугольник в правом нижнем углу элемента. Тег <textarea> пользователь может «растягивать», зажав этот треугольник мышкой. Эта опция поддерживается многими тегами, однако для <textarea> она предустановлена браузерами по умолчанию и не регулируется атрибутами. Она отключается\включается при помощи CSS правила resize. В некоторых случаях для <textarea> она действительно весьма эффективна. Например, если пользователь желает ввести большое сообщение, он может увеличить поле до удобных размеров.

Данный тег, подобно <input>, можно довольно гибко редактировать при помощи CSS, т.е. изменять его рамку, фон, добавлять тень, отступы и пр.

Несмотря на это, есть одна особенность, которая не позволяет нам изменять полностью всё в этом элементе — это его многострочность. Дело в том, что различные браузеры отображают введённый текст по-разному, некоторые начинают ввод сверху поля, некоторы снизу. Это поведение никак не переопределить, поэтому вам не следует экспериментировать со свойствами CSS, которые отвечают за вертикальную ориентацию текста.

<select>,<option>,<optgroup>
— (с англ. select — выбор, option — вариант, опция, option group — группа опций) — теги, позволяющие создать выпадающий список для формы с предустановленными вариантами. <select> является контейнером и главным тегом, принимающим значение и передающим данные на форму, разумеется при помощи атрибута name. <option> это вспомогательный тег и он не может использоваться отдельно от <select>. Хотя атрибут value мы указываем именно для <option>, получать и передавать это значение будет всё равно <select>. <optgroup> является не имеющим значения заголовком для <option>, которые сгруппированы по каким-либо критериям. Пример рабочей формы представлен ниже. Пожалуйста, рассмотрите его очень подробно:

              
<form action="https://babyfrontent.ru/lessons/test.php" method="post"> <label for="time">Выберите время для записи:</label><br> <select name="time" id="time"> <optgroup label="Утро"> <option value="6-00">Самое раннее</option> <option value="9-00" label="Обычное утро"></option> </optgroup> <optgroup disabled label="День"> <option value="12-00">Полдень</option> <option value="15-00">После обеда</option> </optgroup> <optgroup label="Вечер"> <option value="18-00">После работы</option> <option value="21-00">После заката</option> </optgroup> </select> <br> <button type="submit">Отправить</button> </form>

Контейнером, как уже было сказано, является <select>. Именно для него мы должны указывать name и id для связывания с <label>. Внутрь него мы помещаем <optgroup>, если нам нужны заголовки (текстом для заголовка служит содержимое атрибута label), а также <option> — варианты, доступные для выбора. У <optgroup> может быть всего два атрибута, это label, определяющий текст группы, а также disabled, отключающий ВСЮ данную группу. Учтите, что <optgroup> является элементом исключительно для визуальной группировки. Он никак не группирует данные и не связывает их для отправки на сервер!

Текст отдельной опции мы уже помещаем в сам тег <option> или в его атрибут label (но не одновременно туда и туда). В то же время значение, которое будет передаваться в форме на сервер, указываем в атрибуте value и, как видите, оно может отличаться от текста-содержимого. Когда пользователь выберет нужные ему <option>, данное значение будет присвоено тегу <select>, а в дальнейшем передано на сервер. При выборе опции соответствующий тег <option> получает булевый атрибут selected (хотя даже в инструментах разработчика вы этого не увидите, это действительно так и проверяется при помощи JavaScript). Также этот атрибут можно указывать изначально в html файле, в таком случае данная опция будет выбрана за пользователя уже при загрузке страницы.

              
<p>Вы уверены?</p> <select name="sure"> <option>Выберите ответ</option> <option value="true" selected>Уверен!</option> <option value="false">Не совсем...</option> </select>

В примере выше присутствуют три варианта, первый из которых не имеет значения и нужен для лучшей ориентации пользователя. Так довольно часто делают в <select> — оставляют первую опцию без значения, как подсказку. При этом вторая опция имеет атрибут selected, значит этот вариант ответа будет выбран изначально. Пользователь, разумеется, сможет изменить ответ и отправить на сервер подходящий.

Для <select> доступны атрибуты autocomplete, disabled, form, required, которые были рассмотрены для <input>.

Индивидуальными являются атрибуты multiple и size. Первый из них позволяет выбирать одновременно несколько опций. Size может быть указан только вместе с multiple и определяет, сколько опций будет показано в <select> одновременно. Чтобы множественный пример работал, выбирать опции нужно с зажатым Ctrl для Windows, Command для Mac:

              
<form action="https://babyfrontent.ru/lessons/test.php" method="get"> <label for="time">Выберите время для записи:</label><br> <select name="time[]" id="time" multiple size="4"> <option value="6-00">Самое раннее</option> <option value="9-00">Обычное утро</option> <option value="12-00">Полдень</option> <option value="15-00">После обеда</option> <option value="18-00">После работы</option> <option value="21-00">После заката</option> </select> <br> <button type="submit">Отправить</button> </form>

Обратите также внимание на то, что в случае с multiple мы должны указать name="time[]", чтобы значения сохранились в массив (объяснения в предыдущем уроке). Если этого не сделать, значение из последнего выбранного <option> перезапишет предыдущее. В итоге только одно значение попадёт на сервер.

Благодаря атрибуту size в теге отображается не одна опция, как прежде, а сразу четыре. Для множественного выбора это определённо удобнее.

Итак, подведём итог по тройке <select>,<option>,<optgroup>:
<select> является контейнером для двух других тегов, именно он определяет name для данных и передаёт выбранное среди <option> значение на сервер. Среди его атрибутов — autocomplete, disabled, form, required, работающие аналогично как и для <input>, а также атрибуты:

multiple — позволяет выбрать несколько опций
size — определяет, сколько опций будет одновременно видно для пользователя.

<option> является отдельным вариантом-опцией, содержащей значение и текст, который будет виден для пользователя на веб странице. При выборе опции значение передаётся в родительский <select>. Атрибуты:

disabled — отключает отдельную опцию
label — определяет текст, видимый для пользователя. Можно указывать текст прямо в теле тега вместо данного атрибута.
selected — указывает, что данная опция будет выбрана по умолчанию
value — содержит значение, которое будет передаваться на сервер, если данная опция выбрана

<optgroup> — не является опцией, служит контейнером и заголовком для нескольких опций. Атрибуты:

disabled — если указан, отключает ВСЮ группу опций.
label — определяет текст-заголовок для группы опций, этот текст будет виден пользователю

Последнее, но весьма важное, что хотелось бы сказать об этих элементах — в различных браузерах они могут отображаться по-разному. Ни один из них не может быть полностью стилизован при помощи CSS. Для собственной стилизации <select> разработчики создали библиотеки, работающие на основе JavaScript. Эти библиотеки анализируют указанный <select>, количество его <option> и создают соответствующие им копии из обыкновенных <div>, которые полностью стилизуются. Созданные элементы связываются при помощи JavaScript с нужным <select> и передают ему выбранное значение, которое затем благополучно отправляется на сервер.

Что касается мобильных устройств, здесь библиотеки для <select> могут вообще не использоваться, потому что мобильные браузеры при выборе опций активируют собственное меню. По замыслу разработчиков браузеров эти меню достаточно большие и контрастные, чтобы сделать выбор опции максимально удобным для пользователя:

Конечно, последнее слово за менеджером проекта\заказчиком, однако я считаю, что разработчики мобильных браузеров в данном вопросе правы. Usability и доступность важнее, чем внешний вид.

<datalist>
— (с англ. datalist — список данных) элемент, содержащий список предопределённых опций-подсказок для ввода данных в <input>.

              
<form action="https://babyfrontent.ru/lessons/test.php" method="post"> <label for="name">Ваше имя:</label><br> <input list="names" type="text" id="name" name="username"> <datalist id="names"> <option value="Борис">Борис</option> <option value="Мария">Мария</option> <option value="Шарик">Шарик</option> </datalist> <br> <button type="submit">Отправить</button> </form>

В отличие от <select>, где мы предоставляем список возможных вариантов, список <datalist> не является обязательным для выбора, а является предложением. В нём при помощи PHP можно указывать наиболее часто используемые варианты заполнения данного поля, тем самым повышая usability. Например, это могут быть самые популярные места для встречи на сервисе знакомств, или 4-5 самых рейтинговых мест вашего города на туристическом портале, и т.д.

Тег <datalist> использует уже знакомые нам опции, и они работают аналогично, как и для <select>, за исключением того, что нельзя использовать disabled опции, а также нельзя использовать <optgroup>. Такие опции и группы не будут отображены:

              
<input list="names" type="text" id="name" name="username"> <datalist id="names"> <option disabled>ИМЕНА</option> <option value="Борис">Борис</option> <option value="Мария">Мария</option> <option value="Шарик">Шарик</option> </datalist>
              
<input list="names" type="text" id="name" name="username"> <datalist id="names"> <optgroup label="ИМЕНА"> <option value="Борис">Борис</option> <option value="Мария">Мария</option> <option value="Шарик">Шарик</option> </optgroup> </datalist>

Однако вы можете поступить иначе, и это сработает:

              
<input list="names" type="text" id="name" name="username"> <datalist id="names"> <option>ИМЕНА</option> <option value="Борис">Борис</option> <option value="Мария">Мария</option> <option value="Шарик">Шарик</option> </datalist>

Хотя в некотором смысле первая опция «ИМЕНА» будет выглядеть как заголовок для находящихся ниже опций, я бы не рекомендовал пользоваться таким способом. Пользователь может выбрать в качестве данных первую опцию, которую вы добавили как заголовок, и тогда на сервер отправится значение «ИМЕНА». Уверен, это не то, чего вы ожидаете.

<datalist>, в общем-то, и не должен содержать много опций-вариантов. Большое количество предложенных имён может наоборот запутать пользователя и в результате не улучшить, а ухудшить usability. Используйте 3-5 подсказок, их можно разместить в списке и без всяких заголовков.

Как вы можете догадаться, сам по себе <datalist> скрыт на странице. Браузеры отображают его только при фокусе на поле ввода, связанном со списком при помощи атрибутов list и id. Обратите внимание на эти атрибуты в примерах выше. Для необходимого <input> мы указываем атрибут list, а в значении указываем идентификатор id того списка, с которым хотим связать этот <input>.

Данный тег также не может быть стилизован при помощи CSS и имеет различное отображение в разных браузерах. Для создания уникального стиля для него используйте специальные библиотеки, собственные <div> и JavaScript.

<output>
— (с англ. output — выход, выходные данные) является семантическим контейнером для данных, которые вебсайт получает от сервера или рассчитывает самостоятельно.

              
<p> Пользователей онлайн: <output id="users-online"></output> </p>

Помимо глобальных, может иметь собственные атрибуты:

for
— разделённый пробелами список идентификаторов id элементов, данные которых берутся для вычисления. В случае, если мы не отправляем данные на сервер, а всё рассчитываем тут же на странице при помощи JavaScript, для подсказки, откуда берутся значения, можно указать этот атрибут:

              
Ширина: <input type="number" id="width"><br> Длина: <input type="number" id="length"><br> Результат: <output id="square" for="width length"></output>

Логика взятия значений и вычисления описывается на JavaScript. Атрибут for не имеет к данным вычислениям никакого отношения, т.е. он является всего лишь подсказкой для нас и для других разработчиков, не более того. Вы можете проигнорировать его, а комментарии указать в том месте, где производятся вычисления JavaScript.

form, name
— работают аналогично, как и для <input>, т.е. form указывает на форму, которой принадлежит данный тег, а name определяет имя для тега. Поскольку данные из тега <output> не отправляются на сервер, даже если он находится внутри формы и обладает name и содержимым, использовать два этих атрибута не имеет смысла.

Используйте данный тег только для вывода данных, полученных с сервера или в результате вычислений JavaScript. Подробнее на странице тега в справочнике.

<fieldset>,<legend>
— (с англ. fieldset — группа полей, legend — легенда карты, надпись) теги, служащие для визуального разделения полей ввода в пределах формы и для создания заголовков.

              
<form action="https://babyfrontent.ru/lessons/test.php" method="post" target="_blank"> <fieldset> <legend>Ваш любимый цвет</legend> <input type="radio" id="black" name="color" value="black"> <label for="black">Черный</label><br/> <input type="radio" id="red" name="color" value="red"> <label for="red">Красный</label><br/> <input type="radio" id="green" name="color" value="green"> <label for="green">Зелёный</label> <br> <button type="submit">Отправить</button> </fieldset> </form>

<fieldset> обладает предопределёнными стилями, и обычно это чёрная граница шириной в 2 пикселя, небольшие внутренние отступы по сторонам. <legend> располагается на линии верхней границы и по умолчанию больше никак не стилизуется. Он может быть как однострочным, так и многострочным, если ширина формы не позволяет поместиться тексту в одну строку.

<fieldset> может иметь следующие атрибуты:

disabled
— отключает все элементы в пределах данной группы.

              
<form action="https://babyfrontent.ru/lessons/test.php" method="post" target="_blank"> <fieldset disabled> <legend>Ваш любимый цвет</legend> <input type="radio" id="black" name="color" value="black"> <label for="black">Черный</label><br/> <input type="radio" id="red" name="color" value="red"> <label for="red">Красный</label><br/> <input type="radio" id="green" name="color" value="green"> <label for="green">Зелёный</label> <br> <button type="submit">Отправить</button> </fieldset> </form>

form
— подобно случаю с <input> позволяет находящийся вне формы <fieldset> связать с любой из форм на веб странице, указав её идентификатор id в качестве значения

name
— определяет имя группы полей. Не отправляется на сервер вместе с данными формы, однако может использоваться в работе CSS, JavaScript.

Данные теги могут быть стилизованы различным образом, однако в случае, если вы захотите вынести <legend> с верхней границы <fieldset> в другое место, лучше воспользуйтесь другими тегами, например <p>,<span> и стилизуйте их нужным образом. Теги <fieldset> и <legend> являются всего лишь визуальными разделителем и заголовком, они не обладают дополнительным функционалом, не индексируются поисковыми роботами и пр. По этим причинам они легко могут заменяться для создания особенного внешнего вида формы привычными нам <div>, <span> и пр.

Домашнее задание к уроку

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

Необходимо очков: