Menu

Textarea в HTML: rows, resize, maxlength и начальный текст

Как сделать многострочное текстовое поле через <textarea>: rows и cols, текст по умолчанию между тегами, изменение размера и автоматический рост, maxlength со счетчиком символов, переносы строк в отправленном тексте и оформление.

На этой странице есть исполняемые редакторы: меняйте, запускайте и сразу видите результат.

Как сделать textarea

<textarea> это текстовое поле на несколько строк: сообщения, комментарии, описания. rows задает его видимую высоту в строках. Напишите несколько строк и нажмите Send:

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

Атрибуты textarea

АтрибутЧто делает
nameКлюч, под которым отправляется текст
rowsВидимая высота в строках (по умолчанию 2)
colsВидимая ширина в символах (по умолчанию 20); обычно лучше CSS width
placeholderПодсказка, видимая, пока поле пустое
maxlength, minlengthОграничения длины в символах
requiredПоле не должно быть пустым
readonlyТекст можно выделить и скопировать, но не редактировать; все равно отправляется
disabledПолем нельзя пользоваться; не отправляется
wrapsoft (по умолчанию) или hard, см. ниже
spellchecktrue или false

Текст по умолчанию пишется между тегами

Все, что между <textarea> и </textarea>, это начальный текст точно в том виде, как написан: вместе с пробелами, табуляциями и переносами строк. Игнорируется только один перенос строки сразу после открывающего тега. Из-за этого отступы становятся ловушкой:

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

HTML внутри textarea не отображается как разметка; <b>hi</b> между тегами показывается как этот буквальный текст.

Ширина, изменение размера и автоматический рост

Браузеры позволяют читателю менять размер textarea, потянув за угол. CSS resize это ограничивает, а width: 100% вместе с box-sizing: border-box заставляет поле точно заполнить контейнер:

Последнее поле при каждом нажатии клавиши сбрасывает высоту, а затем задает ее равной scrollHeight (высота содержимого и внутренних отступов) плюс рамки. Напишите в него несколько строк: полоса прокрутки так и не появится. resize: vertical это самый удобный вариант по умолчанию: длинные ответы получают место, и никто не может растянуть поле шире раскладки.

Браузеры на Chromium умеют автоматически увеличивать высоту одним CSS через field-sizing: content. Браузеры без поддержки игнорируют эту строку и сохраняют обычный размер, поэтому ее безопасно добавлять, но оставьте скрипт, если растущее поле должно быть у всех читателей.

maxlength и счетчик символов

maxlength останавливает ввод на заданном количестве символов. Сам по себе он не предупреждает, поэтому читатель замечает ограничение, только когда ввод перестает работать. Счетчик это исправляет:

aria-describedby заставляет программы чтения с экрана зачитывать счетчик вместе с полем, а aria-live="polite" объявляет его изменения между нажатиями клавиш. maxlength соблюдается только браузером, поэтому сервер тоже должен проверять длину.

Переносы строк в отправленном тексте

Переносы строк, сделанные читателем, отправляются вместе с текстом. В отправленных данных каждый становится парой «возврат каретки и перевод строки» (%0D%0A в форме, закодированной для URL), и это то, что ожидает большинство серверов. Чтобы позже показать текст на странице с переносами, либо преобразуйте их в <br> при выводе, либо задайте элементу white-space: pre-line.

wrap="hard" (ему нужен cols) идет дальше: он также вставляет переносы строк там, где текст визуально перенесся, так что сервер получает строки не длиннее cols символов. Значение по умолчанию, wrap="soft", отправляет только переносы, которые ввел читатель.

Оформление textarea

Chrome и Firefox дают textarea моноширинный шрифт размером около 13px, поэтому textarea часто выглядит чужеродно. font: inherit это исправляет. Если меняете рамку, сохраните видимый стиль фокуса:

Текст placeholder должен быть достаточно контрастным для чтения; светло-серый, который используют многие дизайны, читается с трудом. И, как у любого поля, placeholder не является подписью: он исчезает, как только читатель начинает печатать. Подписи описаны на странице label в HTML.

Частые ошибки

  • <textarea value="...">. Атрибута value нет; пишите текст между тегами.
  • Текст по умолчанию с отступами, как у остального HTML. Пробелы становятся частью значения.
  • Самозакрывающийся <textarea />. Это не пустой элемент; без </textarea> вся оставшаяся страница проглатывается в него как текст.
  • Нет font: inherit, и поле использует мелкий моноширинный шрифт.
  • resize: none с маленькой фиксированной высотой. Длинные ответы оказываются в крошечном поле с прокруткой.
  • Только maxlength. Проверяйте длину и на сервере.

Часто задаваемые вопросы

Как сделать textarea в HTML?

Напишите <textarea name="message" rows="4"></textarea> внутри формы, с <label>. В отличие от <input>, у него есть закрывающий тег, и все, что между тегами, это начальный текст.

Как задать значение textarea по умолчанию?

Напишите текст между тегами: <textarea name="bio">Hello</textarea>. Атрибута value у textarea в HTML нет. В JavaScript читайте и задавайте textarea.value.

Как запретить изменение размера textarea?

Задайте в CSS resize: none. Обычно удобнее resize: vertical: читатель по-прежнему может сделать поле выше для длинного текста, но не сломает раскладку, растянув его в ширину.

Как ограничить количество символов в textarea?

Добавьте maxlength="280". На этой длине браузер перестает принимать ввод. Покажите рядом счетчик, который обновляется по событию input, чтобы читатель знал, сколько места осталось, и проверяйте длину также на сервере.

Почему у textarea другой шрифт?

Chrome и Firefox по умолчанию дают textarea моноширинный шрифт размером около 13px. Добавьте font: inherit, чтобы он совпадал с остальной страницей.

Coddy programming languages illustration

Учитесь программировать с Coddy

НАЧАТЬ