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
| Atrybut | Działanie |
|---|---|
name | Klucz, pod którym wysyłany jest tekst |
rows | Widoczna wysokość w liniach (domyślnie 2) |
cols | Widoczna szerokość w znakach (domyślnie 20); zwykle lepsze jest width w CSS |
placeholder | Podpowiedź widoczna, gdy pole jest puste |
maxlength, minlength | Limity długości w znakach |
required | Nie może być puste |
readonly | Można zaznaczyć i skopiować, ale nie edytować; nadal jest wysyłane |
disabled | Nie da się go użyć; nie jest wysyłane |
wrap | soft (domyślnie) albo hard, zobacz niżej |
spellcheck | true 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 atrybutuvalue; 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: nonez 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.