Атрибут type в HTML: что это и какие бывают значения

Атрибут type уточняет, что именно записано в теге: какое поле создать, что сделает кнопка, как читать скрипт, какой нумерацией вывести список. Единого смысла у него нет: действие и допустимые значения зависят от тега, в котором он прописан. Чаще всего type встречается у <input>, <button>, <script>, <link> и <ol>.

Что такое атрибут type в HTML

Слово type переводится как «тип», и в каждом теге оно отвечает за своё. У <input> атрибут выбирает вид поля (текст, пароль, флажок, дата), у <button> действие при нажатии, у <script> способ обработки содержимого, у <ol> стиль номеров. У <link>, <source>, <embed> и <object> в type записывают MIME-тип файла: это условное название вида файла, например text/css для стилей или image/png для картинки.

Записывают type одинаково везде: в открывающем теге, значение в кавычках. Регистр букв не важен, поэтому type="EMAIL" и type="email" браузер понимает одинаково. Ниже четыре примера type, и результат у каждого свой.

HTML
<input type="checkbox">
<input type="color" value="#2f6fde">
<ol type="I">
  <li>Первый пункт</li>
  <li>Второй пункт</li>
</ol>
<form>
  <input value="Текст">
  <button type="reset">Очистить</button>
</form>
Результат

Каждая карточка показывает запись и результат. Последнюю проверьте сами: измените текст и нажмите кнопку, поле вернётся к исходному.

Для каких тегов нужен атрибут type

В стандарте HTML type есть у девяти тегов. Значения у каждого свои, и пользоваться ими нужно по правилам именно этого тега. В таблице собрано, что задаёт type и как его записать.

ТегЧто задаёт typeДопустимые значенияПример записи
<input>Вид поля ввода22 значения, по умолчанию text (раздел ниже)<input type="email" name="mail">
<button>Действие кнопкиsubmit (по умолчанию), reset, button<button type="button">Открыть</button>
<ol>Стиль номеров списка1 (по умолчанию), a, A, i, I<ol type="I">
<script>Вид содержимогоне указан или JavaScript, module, importmap, speculationrules; любое другое значение делает тег блоком данных<script type="module" src="app.js"></script>
<link>MIME-тип файла по адресу из hreftext/css для стилей, image/png для значка сайта<link rel="stylesheet" type="text/css" href="style.css">
<source>MIME-тип файлаimage/webp, video/mp4, audio/mpeg<source type="image/webp" srcset="photo.webp">
<a>Подсказка о типе файла по ссылкеMIME-тип, например application/pdf<a href="price.pdf" type="application/pdf">Прайс</a>
<embed>MIME-тип встраиваемого файлаapplication/pdf<embed type="application/pdf" src="doc.pdf">
<object>MIME-тип встраиваемого файлаapplication/pdf<object type="application/pdf" data="doc.pdf"></object>

У <select>, <textarea>, <label>, <img> и остальных тегов атрибута type в стандарте нет, браузер его не использует. Многострочное поле создаёт тег <textarea>, выпадающий список тег <select>, и записывать для них type="textarea" не нужно.

Значения атрибута type у input: все типы полей

Начинать с тега <input> удобнее всего: у него больше всего значений, ровно 22. Выберите любое в списке. Кадр создаёт настоящее поле, показывает запись и коротко объясняет, чем этот вид отличается от остальных.

HTML
<input type="text" name="name">
<input type="email" name="mail">
<input type="date" name="birthday">
Результат

В списке все 22 значения. Под полем показана запись и описание выбранного вида.

Все значения собраны в таблице вместе с записью, которую можно скопировать. Описания учитывают, чем вид поля отличается от обычного текстового.

ЗначениеЧто создаётПример записи
textОднострочное текстовое поле. Так браузер читает поле, если type не указан.<input type="text">
passwordПоле для пароля: символы скрыты точками. В форму текст уходит как есть, без шифрования.<input type="password">
emailПоле для адреса почты. При отправке формы браузер проверяет, что в тексте есть @, а на телефоне показывает клавиатуру с этим знаком.<input type="email">
telПоле для телефона. Формат браузер не проверяет, зато на телефоне открывается цифровая клавиатура.<input type="tel">
urlПоле для адреса сайта. Браузер проверяет, что адрес начинается с такой части, как https://.<input type="url">
searchПоле поиска. Выглядит как текстовое, а в некоторых браузерах в нём появляется крестик очистки.<input type="search">
numberПоле для числа со стрелками. Принимает только число, границы задают атрибуты min и max.<input type="number" min="1" max="10">
rangeПолзунок. Если value не указан, ползунок находится посередине, и в форму уходит число 50.<input type="range" min="0" max="100">
colorВыбор цвета. Значение всегда записывается как #rrggbb, по умолчанию это #000000.<input type="color">
dateВыбор даты: день, месяц и год. В форму значение уходит в виде 2026-10-11.<input type="date">
datetime-localВыбор даты и времени без часового пояса.<input type="datetime-local">
monthВыбор месяца и года.<input type="month">
weekВыбор номера недели и года.<input type="week">
timeВвод времени: часы и минуты.<input type="time">
checkboxФлажок: можно отметить или снять. Если value не прописан, в форму уходит слово on.<input type="checkbox" name="agree">
radioПереключатель. Поля с одинаковым name образуют группу, в которой отмечено только одно.<input type="radio" name="pay" value="card">
fileКнопка выбора файла. Значение скриптом задать нельзя, его выбирает только пользователь.<input type="file">
hiddenСкрытое поле: на странице его не видно, но значение уходит вместе с формой.<input type="hidden" name="id" value="25">
imageКартинка, которая работает как кнопка отправки формы. Нужны атрибуты src и alt.<input type="image" src="go.png" alt="Найти">
submitКнопка отправки формы.<input type="submit">
resetКнопка, которая возвращает все поля формы к начальным значениям.<input type="reset">
buttonКнопка без действия по умолчанию: что она делает, решает скрипт.<input type="button">

Выбирайте самое точное значение. Поле с type="email" вместо type="text" даёт проверку адреса и нужную клавиатуру на телефоне без единой строки скрипта. Подробный разбор видов полей есть в уроке «Поля ввода: input и его типы».

Что будет, если атрибут type не указан или написан неверно

Если type нет, он пустой или содержит неизвестное слово, браузер не показывает ошибку, а создаёт обычное текстовое поле. Поэтому опечатка в слове email остаётся незамеченной, пока вы не проверите форму. Кадр ниже читает свойство type у каждого поля и показывает, как браузер понял запись.

HTML
<input>
<input type="EMAIL">
<input type=" email">
<input type="emial">
<input type="datetime">
<input type="textarea">
<input type="">
Результат

Красным выделены записи, которые браузер заменил на text: их шесть из семи. Только EMAIL понят как email, регистр букв значения не меняет.

Из этого следуют три правила. Регистр букв не важен. Пробелы по краям значение не очищают, поэтому " email" и "email" разные записи. Слов, которых нет в стандарте, например datetime, string, integer, boolean, textarea или select, браузер не знает и всегда создаёт текстовое поле: вместо datetime нужно писать datetime-local.

Как изменить type у input через JavaScript

Атрибут type можно менять скриптом: свойство type у поля читает и меняет значение атрибута. Классический пример - кнопка «Показать пароль», которая переключает поле между password и text.

Показать и скрыть пароль

HTML и JavaScript
<input id="pw" type="password" value="Qwerty-2026">
<button id="tg" type="button">Показать</button>

<script>
const pw = document.getElementById('pw');
document.getElementById('tg').addEventListener('click', () => {
  pw.type = pw.type === 'password' ? 'text' : 'password';
});
</script>
Результат

Нажмите кнопку: текст в поле остаётся прежним, меняется только его вид и значение type под полем.

Что происходит с текстом при смене type

Меняя type у заполненного поля, помните: новое значение может не принять старый текст. Если в поле написано abc и вы переключите его на number, браузер очистит поле, потому что слово не является числом. Обратно текст уже не вернётся. У type="file" значение скриптом вообще нельзя задать: такая попытка вызывает ошибку.

JavaScript
const f = document.getElementById('f');
f.value = 'abc';
f.type = 'number';  // f.value теперь пустая строка
f.type = 'text';    // f.value по-прежнему пустая строка
Результат

Нажмите «type = number»: поле очистится, а возврат к text текст не восстановит. Вернуть abc можно последней кнопкой.

Атрибут type у button: submit, reset и button

У тега <button> три значения. Если type не прописан, работает submit: кнопка внутри <form> отправляет форму. Из-за этого забытый type - частая причина того, что страница «сама перезагружается» после нажатия кнопки, которая должна была только запустить скрипт.

ЗначениеЧто делает кнопка в формеПример записи
submitОтправляет форму. Это значение по умолчанию.<button type="submit">Отправить</button>
resetВозвращает все поля формы к начальным значениям.<button type="reset">Очистить</button>
buttonСама ничего не делает, нужна для скрипта.<button type="button">Открыть меню</button>
HTML
<form>
  <input value="Привет">
  <button>Без type</button>
  <button type="button">type=button</button>
  <button type="reset">type=reset</button>
  <button type="submit">type=submit</button>
</form>
Результат

Измените текст и нажмите каждую кнопку. «Без type» и submit отправляют форму (счётчик растёт), button не делает ничего, а reset возвращает в поле слово «Привет».

Пустое или неверное значение читается как submit, как и отсутствие атрибута. Вне формы кнопка ничего не отправляет, но её можно привязать к форме атрибутом form. Аналогично работает и <input type="submit">: подробности и сравнение с <button> есть в уроке «Кнопки: button vs input type=submit».

Атрибут type у script: module, importmap и блок данных

В теге <script> атрибут type сообщает браузеру, что находится внутри: код, который нужно выполнить, или данные, которые трогать не нужно. Для обычного скрипта type не нужен вообще: без него браузер и так читает содержимое как JavaScript, а запись type="text/javascript" считается лишней.

ЗначениеЧто делает браузерПример записи
не указан, пустая строка или JavaScript MIME-типВыполняет как обычный скрипт.<script src="app.js"></script>
moduleВыполняет как модуль: внутри можно писать import и export. Загрузка откладывается сама, поэтому defer и charset не нужны.<script type="module" src="app.js"></script>
importmapЧитает JSON с таблицей: какому названию модуля в import соответствует какой файл.<script type="importmap">{"imports": {"lib": "/lib.js"}}</script>
speculationrulesЧитает JSON с правилами предзагрузки страниц. Работает не во всех браузерах.<script type="speculationrules">{"prefetch": []}</script>
любое другое значение: application/json, text/plain, text/templateНе выполняет. Тег становится блоком данных, а атрибут src игнорируется.<script type="application/json" id="cfg">{"n": 42}</script>
HTML
<script>window.a = 1</script>
<script type="text/javascript">window.b = 1</script>
<script type="module">window.c = 1</script>
<script type="application/json">{"n": 42}</script>
<script type="text/plain">window.e = 1</script>
Результат

Нажмите «Добавить» в каждой строке. Скрипты без type, с text/javascript и module выполнились, а json и plain нет. Данные из json при этом читаются: они остаются в теге.

Блок данных удобен, чтобы передать странице настройки: JSON из такого тега читается через textContent, как в кадре выше. По той же причине не работает скрипт с type="text/babel", если на странице не подключена библиотека, которая его ищет: для браузера это просто данные. Адрес внешнего скрипта задаёт атрибут src.

Атрибут type у ol: нумерация буквами и римскими цифрами

У тега <ol> type выбирает, чем нумеровать пункты: цифрами, буквами или римскими цифрами. Значений пять, и любое другое слово браузер заменяет обычными цифрами.

ЗначениеНумерацияПример записи
11, 2, 3 (по умолчанию)<ol type="1">
aa, b, c<ol type="a">
AA, B, C<ol type="A">
ii, ii, iii<ol type="i">
II, II, III<ol type="I">
HTML
<ol type="A" start="5">
  <li>Заготовка</li>
  <li>Проверка</li>
  <li>Публикация</li>
</ol>
Результат

Выберите type и укажите start: меняются и запись, и список. Значение z список не принимает и показывает цифры. С буквами start=27 даёт нумерацию aa, ab, ac.

Если буквы или римские цифры нужны только для внешнего вида, оформляйте список CSS-свойством list-style-type со значениями upper-roman и lower-alpha. Атрибут type лучше оставить для случаев, когда номер важен как часть смысла: например, на пункт ссылаются в тексте словами «см. пункт B».

type у link, source, a, embed и object: MIME-тип файла

У этих тегов в type записывают MIME-тип файла. Формат всегда один: «вид/подвид», например text/css, image/webp, video/mp4 или application/pdf.

link: файл стилей с неверным type не применится

У тега <link> type нужен не всегда: для стилей его можно не писать, браузер и так считает файл стилями. Но если вы его прописали, значение должно быть верным. Слово, которое не означает CSS, заставляет браузер пропустить файл. Как записывать сам тип подключаемого файла, показывает атрибут rel.

HTML
<link rel="stylesheet" type="text/css" href="style.css">
<link rel="stylesheet" href="style.css">
<link rel="stylesheet" type="text/stylesheet" href="style.css">
Результат

Зелёный фон дают подключённые стили. Запись type="text/stylesheet" ошибочна: такого MIME-типа нет, и файл не применился.

source: браузер выбирает первый подходящий тип

Внутри <picture>, <video> и <audio> теги <source> перечисляют файлы разных форматов, а type позволяет браузеру пропустить формат, который он не умеет показывать, и даже не скачивать такой файл. Выбирается первый подходящий вариант, а запасной выход - обычный <img>.

HTML
<picture>
  <source type="image/webp" srcset="photo.webp">
  <source type="image/png" srcset="photo.png">
  <img src="photo.jpg" alt="Фото">
</picture>
Результат

В первой карточке тип image/x-nope браузер не поддерживает: источник пропущен, показан запасной зелёный файл. Во второй image/png подходит, поэтому взят красный файл.

a, embed и object

У <a> type - только подсказка о том, какой файл находится по адресу. Браузер ничего не блокирует: ссылка откроется как обычно, даже если тип указан неверно. У <embed> и <object> MIME-тип важнее: по нему браузер понимает, чем показывать встроенный файл. Если тип <object> не подходит, браузер показывает запасное содержимое внутри тега.

HTML
<a href="price.pdf" type="application/pdf">Прайс-лист (PDF)</a>
<embed type="application/pdf" src="price.pdf">
<object type="image/x-nope" data="photo.png">
  <img src="photo.jpg" alt="Фото">
</object>
Результат

В первой карточке type подходит, и показан файл из data. Во второй тип image/x-nope не поддерживается, поэтому показано содержимое внутри тега.

Устаревший атрибут type: ul, li, style, menu, area

У пяти тегов type раньше был, а теперь считается устаревшим. Браузеры многое из этого по-прежнему понимают, но писать такой код не нужно. В таблице указано, что делал атрибут и чем его заменить.

ТегЧто делал typeЧем заменитьСтатус
<ul>Вид маркера: disc, circle или squareCSS-свойство list-style-typeустарел
<li>Вид маркера одного пунктаCSS-свойство list-style-type у liустарел
<style>Вид стилей, обычно text/cssНичего не писать: без type браузер читает содержимое как CSSустарел
<menu>Вид меню: контекстное или панель инструментовНичем: сейчас тег menu работает как обычный списокустарел
<area>Тип документа по адресу из hrefНичего не писать, подсказка не нужнаустарел
HTML
<ul type="square">
  <li>Первый пункт</li>
  <li>Второй пункт</li>
</ul>

<ul style="list-style-type: square">
  <li>Первый пункт</li>
  <li>Второй пункт</li>
</ul>
Результат

Оба списка выглядят одинаково: браузеры пока понимают устаревший type, но записывать его не нужно.

Частые ошибки с атрибутом type

Большинство проблем с type не вызывают ошибок в консоли, поэтому их находят только по странному поведению. Вот самые частые случаи.

ОшибкаЧто происходитКак исправить
<button>Открыть</button> без type внутри формыНажатие отправляет форму, страница перезагружаетсяПрописать type="button"
type="emial" с опечаткойБраузер молча создаёт текстовое поле, адрес не проверяетсяИсправить слово по таблице значений
type=" email" с пробеломПробел не отбрасывается, поле становится textУбрать пробел
type="textarea" или type="select" у inputПолучается обычное текстовое полеИспользовать теги textarea и select
type="datetime"Такого значения нет, поле становится textЗаписать datetime-local
type="number" для телефона, индекса или номера картыПоле принимает только число, и такие данные неудобно вводитьИспользовать tel или text
Переключить заполненное поле на numberТекст, который не является числом, пропадает без возвратаСохранить значение в переменную до смены type
Задать value у type="file" скриптомСкрипт получает ошибкуФайл выбирает только пользователь
type="text/javascript" у каждого scriptРаботает, но запись лишняяУбрать type
type="application/json" у скрипта с кодомКод не выполняется: тег стал блоком данныхУбрать type или записать module
type="text/stylesheet" у linkФайл стилей не применяетсяУбрать type или записать text/css
type="module" вместе с deferМодуль и так загружается с откладыванием, defer ничего не меняетОставить только type="module"
type у ul и liАтрибут устарелCSS-свойство list-style-type
<a type="application/pdf"> как защита от другого файлаЭто подсказка: ничего не проверяется и не блокируетсяПроверять тип файла на сервере

Шпаргалка по атрибуту type

Если нужно быстро вспомнить, что прописать, смотрите сюда. Столбец «Тег» ведёт на отдельную страницу справочника.

Что нужноЧто прописатьТег
Поле для почты<input type="email"><input>
Поле для пароля<input type="password"><input>
Флажок и переключательtype="checkbox" и type="radio"<input>
Выбор даты<input type="date"><input>
Кнопка отправки формы<button type="submit"><button>
Кнопка, которая только запускает скрипт<button type="button"><button>
Модуль JavaScript<script type="module" src="app.js"></script><script>
Данные в странице<script type="application/json"><script>
Нумерация римскими цифрами<ol type="I"><ol>
Запасной формат картинки<source type="image/webp" srcset="a.webp"><source>
Файл стилей<link rel="stylesheet" href="style.css"> (type не нужен)<link>
Категория
Поделиться в социальных сетях

Отправить комментарий

0 Комментарии

Отправить комментарий (0)

#buttons=(Хорошо) #days=(20)

Мы используем файлы cookie для улучшения работы сайта. Подробнее
Хорошо
×