Como fazer uma textarea
<textarea> é um campo de texto para mais de uma linha: mensagens, comentários, descrições. rows define a altura visível em linhas. Digite algumas linhas e aperte Send:
Duas coisas são diferentes do <input>: uma textarea precisa de tag de fechamento, e o seu texto inicial fica entre as tags em vez de num atributo value. O seu name é enviado com o texto como valor, quebras de linha incluídas.
Atributos da textarea
| Atributo | Faz |
|---|---|
name | A chave com que o texto é enviado |
rows | Altura visível em linhas (padrão 2) |
cols | Largura visível em caracteres (padrão 20); width no CSS costuma ser melhor |
placeholder | Uma dica mostrada enquanto está vazia |
maxlength, minlength | Limites de tamanho em caracteres |
required | Não pode ficar vazia |
readonly | Pode ser selecionada e copiada, não editada; ainda é enviada |
disabled | Não pode ser usada; não é enviada |
wrap | soft (padrão) ou hard, veja abaixo |
spellcheck | true ou false |
O texto padrão vai entre as tags
Tudo o que fica entre <textarea> e </textarea> é o texto inicial, exatamente como está escrito: espaços, tabs e quebras de linha incluídos. Só uma quebra de linha logo depois da tag de abertura é ignorada. Isso transforma a indentação numa armadilha:
A segunda textarea começa com quatro espaços e termina com uma quebra de linha e mais dois espaços, e o usuário precisa apagar tudo isso. Escreva o texto padrão encostado nas tags.
HTML dentro de uma textarea não é renderizado; <b>hi</b> entre as tags aparece como esse texto literal.
Largura, redimensionamento e altura automática
Os navegadores deixam o usuário arrastar o canto para redimensionar uma textarea. O CSS resize limita isso, e width: 100% com box-sizing: border-box faz ela preencher o contêiner exatamente:
A última zera a altura e depois a define como scrollHeight (a altura do conteúdo e do padding) mais as bordas, a cada tecla. Digite várias linhas nela: ela nunca mostra barra de rolagem. resize: vertical é o padrão mais amigável: respostas longas ganham espaço, e ninguém consegue arrastar o campo para além da largura do layout.
Navegadores Chromium conseguem fazer a altura automática só com CSS usando field-sizing: content. Navegadores sem suporte ignoram a linha e mantêm o tamanho normal, então é seguro adicionar, mas mantenha o script se todo usuário deve ter a caixa que cresce.
maxlength e um contador de caracteres
maxlength para a digitação num número de caracteres. Sozinho ele não dá nenhum aviso, então o usuário só percebe quando a digitação para de funcionar. Um contador resolve isso:
aria-describedby faz os leitores de tela lerem o contador junto com o campo, e aria-live="polite" anuncia as mudanças nele entre as teclas. maxlength só é garantido pelo navegador, então o servidor também precisa verificar o tamanho.
Quebras de linha no texto enviado
As quebras de linha do usuário são enviadas com o texto. Nos dados enviados, cada uma vira um par de retorno de carro e avanço de linha (%0D%0A num formulário codificado para URL), que é o que a maioria dos servidores espera. Para mostrar o texto numa página depois com as quebras de linha, converta-as em <br> na saída ou estilize o elemento com white-space: pre-line.
wrap="hard" (que precisa de cols) vai além: ele também insere quebras de linha onde o texto quebrou visualmente, então o servidor recebe linhas com no máximo cols caracteres. O padrão, wrap="soft", envia só as quebras que o usuário digitou.
Estilizando uma textarea
Chrome e Firefox dão às textareas uma fonte monoespaçada com cerca de 13px, e é por isso que uma textarea muitas vezes parece fora do lugar. font: inherit resolve. Mantenha um estilo de foco visível se você mudar a borda:
O texto do placeholder deve ter um contraste legível; o cinza claro que muitos designs usam é difícil de ler. E, como em todo campo, o placeholder não é um label: ele some assim que o usuário digita. Os labels estão em label no HTML.
Erros comuns
<textarea value="...">. Não existe atributovalue; coloque o texto entre as tags.- Indentar o texto padrão junto com o HTML. Os espaços viram parte do valor.
- Uma
<textarea />auto fechada. Não é um elemento vazio; sem</textarea>, o resto da página é engolido por ela como texto. - Nenhum
font: inherit, então o campo usa uma fonte monoespaçada pequena. resize: nonecom uma altura fixa pequena. Respostas longas acabam numa caixinha com rolagem.- Contar só com
maxlength. Valide o tamanho no servidor também.
Perguntas frequentes
Como criar uma textarea no HTML?
Escreva <textarea name="message" rows="4"></textarea> dentro de um formulário, com um <label>. Ao contrário do <input>, ela tem tag de fechamento, e tudo o que fica entre as tags é o texto inicial.
Como definir o valor padrão de uma textarea?
Coloque o texto entre as tags: <textarea name="bio">Hello</textarea>. Uma textarea não tem atributo value no HTML. No JavaScript, leia e defina textarea.value.
Como impedir que uma textarea seja redimensionada?
Defina resize: none no CSS. resize: vertical costuma ser mais amigável: o usuário ainda consegue deixá-la mais alta para textos longos, mas não quebra o seu layout arrastando para os lados.
Como limitar o número de caracteres de uma textarea?
Adicione maxlength="280". O navegador para de aceitar texto nesse tamanho. Mostre um contador ao lado, atualizado no evento input, para o usuário saber quanto espaço ainda tem, e verifique o tamanho no servidor também.
Por que minha textarea usa uma fonte diferente?
Chrome e Firefox dão às textareas uma fonte monoespaçada com cerca de 13px por padrão. Adicione font: inherit para que ela combine com o resto da página.