Cómo hacer un textarea
<textarea> es un campo de texto de más de una línea: mensajes, comentarios, descripciones. rows fija su altura visible en líneas. Escribe unas líneas y pulsa Send:
Hay dos diferencias con <input>: un textarea necesita etiqueta de cierre, y su texto inicial va entre las etiquetas en lugar de en un atributo value. Su name se envía con el texto como valor, saltos de línea incluidos.
Atributos de textarea
| Atributo | Hace |
|---|---|
name | La clave con la que se envía el texto |
rows | Altura visible en líneas (2 por defecto) |
cols | Ancho visible en caracteres (20 por defecto); el width de CSS suele ser mejor |
placeholder | Una pista que se muestra mientras está vacío |
maxlength, minlength | Límites de longitud en caracteres |
required | No puede estar vacío |
readonly | Se puede seleccionar y copiar, no editar; se envía igualmente |
disabled | No se puede usar; no se envía |
wrap | soft (por defecto) o hard, ver más abajo |
spellcheck | true o false |
El texto por defecto va entre las etiquetas
Todo lo que hay entre <textarea> y </textarea> es el texto inicial, tal cual está escrito: espacios, tabulaciones y saltos de línea incluidos. Solo se ignora un salto de línea justo después de la etiqueta de apertura. Eso convierte la sangría en una trampa:
El segundo textarea empieza con cuatro espacios y termina con un salto de línea y dos espacios más, que el lector tiene que borrar. Escribe el texto por defecto pegado a las etiquetas.
El HTML dentro de un textarea no se interpreta; <b>hi</b> entre las etiquetas aparece como ese texto literal.
Ancho, redimensionado y crecimiento automático
Los navegadores permiten al lector arrastrar la esquina para redimensionar un textarea. resize de CSS lo limita, y width: 100% con box-sizing: border-box hace que ocupe exactamente su contenedor:
El último reinicia su altura y luego la fija en scrollHeight (la altura de su contenido y su padding) más sus bordes, con cada pulsación de tecla. Escribe varias líneas en él: nunca muestra una barra de desplazamiento. resize: vertical es el valor por defecto más amable: las respuestas largas tienen sitio, y nadie puede arrastrar el campo más ancho que el diseño.
Los navegadores basados en Chromium pueden hacer el crecimiento automático solo con CSS mediante field-sizing: content. Los navegadores que no lo admiten ignoran la línea y mantienen el tamaño normal, así que es seguro añadirlo, pero conserva el script si todos los lectores deben tener la caja que crece.
maxlength y un contador de caracteres
maxlength detiene la escritura en un número de caracteres. Por sí solo no avisa, así que el lector solo se da cuenta cuando deja de poder escribir. Un contador lo soluciona:
aria-describedby hace que los lectores de pantalla lean el contador junto con el campo, y aria-live="polite" anuncia sus cambios entre pulsaciones. maxlength solo lo impone el navegador, así que el servidor también tiene que comprobar la longitud.
Saltos de línea en el texto enviado
Los saltos de línea del lector se envían con el texto. En los datos enviados, cada uno se convierte en una pareja de retorno de carro y avance de línea (%0D%0A en un formulario codificado como URL), que es lo que esperan la mayoría de los servidores. Para mostrar después el texto en una página con sus saltos de línea, conviértelos en <br> al imprimirlos o da al elemento el estilo white-space: pre-line.
wrap="hard" (que necesita cols) va más allá: también inserta saltos de línea donde el texto se ajustaba visualmente, así que el servidor recibe líneas de no más de cols caracteres. El valor por defecto, wrap="soft", solo envía los saltos que escribió el lector.
Dar estilo a un textarea
Chrome y Firefox dan a los textareas una fuente monoespaciada de unos 13px, y por eso un textarea a menudo desentona. font: inherit lo arregla. Mantén un estilo de foco visible si cambias el borde:
El texto del placeholder debe tener un contraste legible; el gris claro que usan muchos diseños cuesta de leer. Y, como en todos los campos, el placeholder no es una etiqueta: desaparece en cuanto el lector escribe. Las etiquetas se explican en label en HTML.
Errores comunes
<textarea value="...">. No existe el atributovalue; pon el texto entre las etiquetas.- Sangrar el texto por defecto junto con el HTML. Los espacios pasan a formar parte del valor.
- Un
<textarea />con autocierre. No es un elemento vacío; sin</textarea>, el resto de la página queda dentro de él como texto. - Sin
font: inherit, así que el campo usa una fuente monoespaciada pequeña. resize: nonecon una altura fija pequeña. Las respuestas largas acaban en una caja diminuta con desplazamiento.- Confiar solo en
maxlength. Valida también la longitud en el servidor.
Preguntas frecuentes
¿Cómo se crea un textarea en HTML?
Escribe <textarea name="message" rows="4"></textarea> dentro de un formulario, con un <label>. A diferencia de <input>, tiene etiqueta de cierre, y lo que haya entre las etiquetas es el texto inicial.
¿Cómo pongo el valor por defecto de un textarea?
Pon el texto entre las etiquetas: <textarea name="bio">Hola</textarea>. Un textarea no tiene atributo value en HTML. En JavaScript, lee y asigna textarea.value.
¿Cómo evito que se pueda redimensionar un textarea?
Pon resize: none en el CSS. resize: vertical suele ser más amable: el lector puede hacerlo más alto para textos largos, pero no puede romper tu diseño arrastrándolo a lo ancho.
¿Cómo limito el número de caracteres de un textarea?
Añade maxlength="280". El navegador deja de aceptar texto al llegar a esa longitud. Muestra un contador al lado, actualizado en el evento input, para que el lector sepa cuánto espacio le queda, y comprueba también la longitud en el servidor.
¿Por qué mi textarea usa otra fuente?
Chrome y Firefox dan a los textareas una fuente monoespaciada de unos 13px por defecto. Añade font: inherit para que coincida con el resto de la página.