Comment faire un textarea
<textarea> est un champ de texte sur plus d'une ligne : messages, commentaires, descriptions. rows fixe sa hauteur visible en lignes. Tapez quelques lignes et appuyez sur Send :
Deux choses diffèrent de <input> : un textarea a besoin d'une balise fermante, et son texte de départ se place entre les balises au lieu d'un attribut value. Son name est envoyé avec le texte comme valeur, retours à la ligne compris.
Les attributs du textarea
| Attribut | Rôle |
|---|---|
name | La clé sous laquelle le texte est envoyé |
rows | Hauteur visible en lignes (2 par défaut) |
cols | Largeur visible en caractères (20 par défaut) ; la width CSS est généralement préférable |
placeholder | Une indication affichée tant qu'il est vide |
maxlength, minlength | Limites de longueur en caractères |
required | Ne doit pas être vide |
readonly | Peut être sélectionné et copié, pas modifié ; toujours envoyé |
disabled | Inutilisable ; pas envoyé |
wrap | soft (par défaut) ou hard, voir plus bas |
spellcheck | true ou false |
Le texte par défaut va entre les balises
Tout ce qui se trouve entre <textarea> et </textarea> est le texte de départ, exactement tel qu'il est écrit : espaces, tabulations et retours à la ligne compris. Seul un retour à la ligne placé juste après la balise ouvrante est ignoré. Cela fait de l'indentation un piège :
Le second textarea commence par quatre espaces et finit par un retour à la ligne et deux espaces de plus, que le lecteur doit tous supprimer. Écrivez le texte par défaut collé aux balises.
Le HTML à l'intérieur d'un textarea n'est pas interprété ; <b>hi</b> entre les balises s'affiche tel quel.
Largeur, redimensionnement et hauteur automatique
Les navigateurs laissent le lecteur tirer le coin pour redimensionner un textarea. La propriété CSS resize limite cela, et width: 100% avec box-sizing: border-box lui fait remplir exactement son conteneur :
Le dernier réinitialise sa hauteur puis la règle sur scrollHeight (la hauteur de son contenu et de son padding) plus ses bordures, à chaque frappe. Tapez plusieurs lignes dedans : il n'affiche jamais de barre de défilement. resize: vertical est la valeur par défaut la plus agréable : les longues réponses ont de la place, et personne ne peut élargir le champ au-delà de la mise en page.
Les navigateurs basés sur Chromium savent faire l'agrandissement automatique en CSS seul avec field-sizing: content. Les navigateurs qui ne le prennent pas en charge ignorent la ligne et gardent la taille normale, donc vous pouvez l'ajouter sans risque, mais gardez le script si chaque lecteur doit avoir le champ qui s'agrandit.
maxlength et un compteur de caractères
maxlength arrête la saisie à un nombre de caractères. Seul, il ne prévient pas, donc le lecteur ne s'en aperçoit que lorsque la frappe cesse de fonctionner. Un compteur règle cela :
aria-describedby fait lire le compteur par les lecteurs d'écran avec le champ, et aria-live="polite" annonce ses changements entre les frappes. maxlength n'est imposé que par le navigateur, donc le serveur doit aussi vérifier la longueur.
Les retours à la ligne dans le texte envoyé
Les retours à la ligne du lecteur sont envoyés avec le texte. Dans les données envoyées, chacun devient une paire retour chariot et saut de ligne (%0D%0A dans un formulaire encodé pour l'URL), ce qu'attendent la plupart des serveurs. Pour afficher plus tard le texte sur une page avec ses retours à la ligne, convertissez-les en <br> à l'affichage ou stylisez l'élément avec white-space: pre-line.
wrap="hard" (qui a besoin de cols) va plus loin : il insère aussi des retours à la ligne là où le texte a été coupé visuellement, donc le serveur reçoit des lignes d'au plus cols caractères. La valeur par défaut, wrap="soft", n'envoie que les retours à la ligne tapés par le lecteur.
Styliser un textarea
Chrome et Firefox donnent aux textareas une police à chasse fixe d'environ 13px, ce qui explique qu'un textarea paraisse souvent déplacé. font: inherit corrige cela. Gardez un style de focus visible si vous changez la bordure :
Le texte du placeholder doit avoir un contraste lisible ; le gris clair que beaucoup de designs utilisent est difficile à lire. Et, comme sur tous les champs, le placeholder n'est pas un label : il disparaît dès que le lecteur tape. Les labels sont présentés dans label HTML.
Erreurs fréquentes
<textarea value="...">. Il n'existe pas d'attributvalue; placez le texte entre les balises.- Indenter le texte par défaut en même temps que le HTML. Les espaces font partie de la valeur.
- Un
<textarea />auto-fermant. Ce n'est pas un élément vide ; sans</textarea>, le reste de la page est avalé dedans comme du texte. - Pas de
font: inherit, si bien que le champ utilise une petite police à chasse fixe. resize: noneavec une petite hauteur fixe. Les longues réponses finissent dans une minuscule boîte qui défile.- Compter uniquement sur
maxlength. Validez aussi la longueur sur le serveur.
Questions fréquentes
Comment créer un textarea en HTML ?
Écrivez <textarea name="message" rows="4"></textarea> dans un formulaire, avec un <label>. Contrairement à <input>, il a une balise fermante, et tout ce qui se trouve entre les balises est le texte de départ.
Comment définir la valeur par défaut d'un textarea ?
Placez le texte entre les balises : <textarea name="bio">Hello</textarea>. Un textarea n'a pas d'attribut value en HTML. En JavaScript, lisez et définissez textarea.value.
Comment empêcher le redimensionnement d'un textarea ?
Définissez resize: none en CSS. resize: vertical est généralement plus agréable : le lecteur peut toujours l'agrandir en hauteur pour un long texte, mais ne peut pas casser votre mise en page en l'élargissant.
Comment limiter le nombre de caractères d'un textarea ?
Ajoutez maxlength="280". Le navigateur cesse d'accepter la saisie à cette longueur. Affichez à côté un compteur, mis à jour sur l'événement input, pour que le lecteur sache combien de place il lui reste, et vérifiez aussi la longueur sur le serveur.
Pourquoi mon textarea utilise une autre police ?
Chrome et Firefox donnent par défaut aux textareas une police à chasse fixe d'environ 13px. Ajoutez font: inherit pour l'accorder au reste de la page.