Menu

Textarea w HTML: rows, resize, maxlength i tekst domyślny

Jak zrobić wielowierszowe pole tekstowe z <textarea>: rows i cols, tekst domyślny między znacznikami, zmiana rozmiaru i automatyczne rośnięcie, maxlength z licznikiem znaków, podziały linii w wysłanym tekście i stylowanie.

Na tej stronie są działające edytory: edytuj, uruchamiaj i od razu zobacz wynik.

Jak zrobić textarea

<textarea> to pole tekstowe na więcej niż jedną linię: wiadomości, komentarze, opisy. rows ustawia jego widoczną wysokość w liniach. Wpisz kilka linii i naciśnij Send:

Dwie rzeczy różnią się od <input>: textarea wymaga znacznika zamykającego, a jej tekst początkowy trafia między znaczniki, a nie do atrybutu value. Jej name jest wysyłany z tekstem jako wartością, łącznie z podziałami linii.

Atrybuty textarea

AtrybutDziałanie
nameKlucz, pod którym wysyłany jest tekst
rowsWidoczna wysokość w liniach (domyślnie 2)
colsWidoczna szerokość w znakach (domyślnie 20); zwykle lepsze jest width w CSS
placeholderPodpowiedź widoczna, gdy pole jest puste
maxlength, minlengthLimity długości w znakach
requiredNie może być puste
readonlyMożna zaznaczyć i skopiować, ale nie edytować; nadal jest wysyłane
disabledNie da się go użyć; nie jest wysyłane
wrapsoft (domyślnie) albo hard, zobacz niżej
spellchecktrue albo false

Tekst domyślny trafia między znaczniki

Wszystko między <textarea> a </textarea> to tekst początkowy, dokładnie tak, jak został zapisany: łącznie ze spacjami, tabulatorami i podziałami linii. Ignorowany jest tylko jeden podział linii bezpośrednio po znaczniku otwierającym. Przez to wcięcia są pułapką:

Druga textarea zaczyna się od czterech spacji i kończy podziałem linii oraz dwiema kolejnymi spacjami, a czytelnik musi to wszystko usunąć. Pisz tekst domyślny tuż przy znacznikach.

HTML wewnątrz textarea nie jest renderowany; <b>hi</b> między znacznikami wyświetla się jako dosłowny tekst.

Szerokość, zmiana rozmiaru i automatyczne rośnięcie

Przeglądarki pozwalają czytelnikowi zmieniać rozmiar textarea przez przeciąganie rogu. CSS resize to ogranicza, a width: 100% z box-sizing: border-box sprawia, że pole dokładnie wypełnia kontener:

Ostatnia resetuje swoją wysokość, a potem przy każdym naciśnięciu klawisza ustawia ją na scrollHeight (wysokość treści i paddingu) plus obramowanie. Wpisz do niej kilka linii: nigdy nie pokaże paska przewijania. resize: vertical to najprzyjaźniejsza wartość domyślna: długie odpowiedzi dostają miejsce, a nikt nie może rozciągnąć pola szerzej niż układ.

Przeglądarki oparte na Chromium potrafią zrobić automatyczne rośnięcie w samym CSS przez field-sizing: content. Przeglądarki bez tej obsługi ignorują tę linię i zachowują zwykły rozmiar, więc można ją bezpiecznie dodać, ale zostaw skrypt, jeśli rosnące pole ma dostać każdy czytelnik.

maxlength i licznik znaków

maxlength blokuje wpisywanie po określonej liczbie znaków. Sam w sobie nie daje żadnego ostrzeżenia, więc czytelnik zauważa go dopiero wtedy, gdy pisanie przestaje działać. Licznik to naprawia:

aria-describedby sprawia, że czytniki ekranu czytają licznik razem z polem, a aria-live="polite" ogłasza jego zmiany między naciśnięciami klawiszy. maxlength egzekwuje tylko przeglądarka, więc serwer też musi sprawdzać długość.

Podziały linii w wysłanym tekście

Podziały linii wpisane przez czytelnika są wysyłane razem z tekstem. W wysłanych danych każdy z nich staje się parą znaków powrotu karetki i nowej linii (%0D%0A w formularzu zakodowanym jak URL), czego oczekuje większość serwerów. Żeby później pokazać tekst na stronie z podziałami linii, zamień je na <br> przy wyświetlaniu albo nadaj elementowi white-space: pre-line.

wrap="hard" (wymaga cols) idzie dalej: wstawia podziały linii także tam, gdzie tekst zawinął się wizualnie, więc serwer dostaje linie nie dłuższe niż cols znaków. Domyślne wrap="soft" wysyła tylko podziały wpisane przez czytelnika.

Stylowanie textarea

Chrome i Firefox dają polom textarea czcionkę o stałej szerokości, około 13px, dlatego textarea często nie pasuje do reszty strony. font: inherit to naprawia. Jeśli zmieniasz obramowanie, zostaw widoczny styl fokusu:

Tekst placeholdera powinien mieć czytelny kontrast; jasnoszary kolor z wielu projektów trudno odczytać. I jak w każdym polu, placeholder nie jest etykietą: znika, gdy tylko czytelnik zacznie pisać. Etykiety opisuje strona label w HTML.

Częste błędy

  • <textarea value="...">. Nie ma atrybutu value; umieść tekst między znacznikami.
  • Wcinanie tekstu domyślnego razem z HTML. Spacje stają się częścią wartości.
  • Samozamykająca się <textarea />. To nie jest element pusty; bez </textarea> reszta strony zostaje w niej połknięta jako tekst.
  • Brak font: inherit, więc pole używa małej czcionki o stałej szerokości.
  • resize: none z małą stałą wysokością. Długie odpowiedzi lądują w malutkim przewijanym polu.
  • Poleganie wyłącznie na maxlength. Sprawdzaj długość także na serwerze.

Najczęściej zadawane pytania

Jak utworzyć textarea w HTML?

Napisz <textarea name="message" rows="4"></textarea> wewnątrz formularza, z elementem <label>. W odróżnieniu od <input> ma znacznik zamykający, a wszystko między znacznikami to tekst początkowy.

Jak ustawić domyślną wartość textarea?

Umieść tekst między znacznikami: <textarea name="bio">Hello</textarea>. Textarea nie ma w HTML atrybutu value. W JavaScript odczytuj i ustawiaj textarea.value.

Jak zablokować zmianę rozmiaru textarea?

Ustaw resize: none w CSS. Zwykle przyjaźniejsze jest resize: vertical: czytelnik nadal może powiększyć pole w pionie dla długiego tekstu, ale nie zepsuje układu, rozciągając je wszerz.

Jak ograniczyć liczbę znaków w textarea?

Dodaj maxlength="280". Przeglądarka przestaje przyjmować tekst po osiągnięciu tej długości. Pokaż obok licznik aktualizowany przy zdarzeniu input, żeby czytelnik wiedział, ile miejsca zostało, i sprawdzaj długość również na serwerze.

Dlaczego moja textarea używa innej czcionki?

Chrome i Firefox domyślnie dają polom textarea czcionkę o stałej szerokości, około 13px. Dodaj font: inherit, żeby dopasować ją do reszty strony.

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ