Formulaires✨ Premium

Character Counter

Zone de texte à hauteur fixe avec un compteur « n / 150 » logé dans son coin bas droit, ambre à 80 % de la limite, rouge quand elle est atteinte.

JSCounterTextarea

Mis à jour le

Cet effet fait partie d'Effect.Labs — 840 effets vanilla, une partie gratuite, une partie premium. Formulaires comprend 20 effets, dont 2 gratuits. Découvrir la catégorie →

3 exemples d'usage

SMS de rappel dans le back-office d'un cabinet — la limite d'un message — Character Counter exemple 1

① SMS de rappel dans le back-office d'un cabinet — la limite d'un message

QuandLa secrétaire rédige le rappel envoyé la veille du rendez-vous ; le compteur sur 160 passe à l'ambre en approchant de la fin du SMS.
PourquoiAu-delà de 160 caractères, un SMS est facturé double : le compteur posé dans la zone rappelle la contrainte sans qu'on quitte le texte des yeux.
Réglagesmaxlength="160" (ambre à 128), thème clair sarcelle (--chct-field:#fff, --chct-border:#c5dcdc, --chct-focus:#0f766e, --chct-warning:#b45309), --chct-min-height:118px, --chct-width:100%. Frappe pilotée par la scène.
Outil de support — un modèle de réponse inséré d'un clic — Character Counter exemple 2

② Outil de support — un modèle de réponse inséré d'un clic

QuandL'agent clique sur le modèle « Délai de livraison » : le texte arrive d'un coup et le compteur passe à l'ambre, 135 sur 150.
PourquoiAprès une insertion, on ne sait pas combien de place il reste pour personnaliser : la couleur le dit avant même qu'on commence à retoucher.
RéglagesThème sombre (--chct-field:#191c2b, --chct-border:#33384f, --chct-focus:#818cf8), limite livrée de 150, --chct-min-height:128px. Le bouton de modèle appartient à la scène : il écrit la valeur puis déclenche input, ce que l'effet écoute.
Question au conférencier pendant un webinaire — une petite zone dans le panneau latéral — Character Counter exemple 3

③ Question au conférencier pendant un webinaire — une petite zone dans le panneau latéral

QuandUn spectateur touche la zone et tape sa question ; avec une limite de 45, le compteur passe à l'ambre dès 36 caractères.
PourquoiUne limite basse garde les questions courtes et lisibles par l'animateur en direct ; le compteur dans le coin ne prend aucune place dans un panneau étroit.
Réglagesmaxlength="45", --chct-min-height:112px pour que la question entière tienne au-dessus du compteur, accent vert (--chct-focus:#22c55e). Le rond du toucher appartient à la scène.

Comment ça marche

Le compteur est un <span> placé en absolu dans le coin bas droit du bloc, au-dessus de la marge intérieure basse de la zone (30 px réservés). À chaque événement input, le script écrit « longueur / maximum », le maximum venant de l'attribut maxlength (150 livré) ; changer cet attribut suffit pour un SMS à 160 ou une question à 45.

À 80 % du maximum (120 sur 150), le compteur prend la classe is-warning, ambre ; à la limite, is-limit, rouge. La zone garde sa hauteur (100 px minimum) : l'utilisateur peut l'agrandir verticalement avec la poignée (resize: vertical), sinon le texte défile.

La balise <textarea> est vide dans le HTML livré : le placeholder s'affiche et le compteur part de 0 (gardez les deux balises collées si vous la retouchez). Aucun identifiant fixe : deux zones dans la même page se comptent séparément, et le champ porte un name envoyé avec le formulaire.

Accessibilité

  • Étiquette : « Message » dans un <label> masqué visuellement, à renommer selon l'usage.
  • Compteur relié : aria-describedby pointe vers le compteur, lu en arrivant dans la zone.
  • Annonces mesurées : une zone aria-live="polite" parle au passage dans l'ambre (« Plus que 30 caractères ») puis à la limite, jamais à chaque touche.
  • Mouvement : aucune animation hormis le changement de couleur de la bordure au focus.
  • Limite : si le texte dépasse la hauteur visible, ses dernières lignes peuvent passer sous le compteur. Prévoyez une hauteur (--chct-min-height) qui contient la limite entière.

Compatibilité navigateur

1,8 Ko de JavaScript, CSS à variables. Mesuré le 08/11/2026 dans Chromium, Firefox et WebKit (Playwright) : valeur de départ vide, placeholder affiché, « 1 / 150 » après une touche, 150 / 150 en rouge après un collage trop long, deux copies indépendantes, toucher à 390 px, aucune erreur. Seuil fixé par NodeList.forEach (Chrome 51, Firefox 50, Safari 10, d'après @mdn/browser-compat-data).

Chrome 51+✓ Complet (mesuré)
Firefox 50+✓ Complet (mesuré)
Safari 10+✓ Complet (mesuré dans WebKit)
Edge 79+✓ Complet (moteur Chromium)
iOS Safari 10+✓ Non vérifié sur appareil réel ; la poignée de redimensionnement n'existe pas sur iOS
Android Chrome 51+✓ Complet (moteur Chromium)

Sans JavaScript, le compteur reste sur « 0 / 150 » mais le navigateur applique toujours maxlength.

Le code

Structure HTML à coller dans votre page (le CSS + JS sont inclus avec votre achat) :

index.html — structure
<div class="fx-0299-root">
  <div class="chct-group">
    <label class="chct-field">
      <span class="chct-sr">Message</span>
      <textarea class="chct-input" name="message" placeholder="Tapez votre message..." maxlength="150"></textarea>
    </label>
    <span class="chct-count">0 / 150</span>
    <span class="chct-sr chct-status" aria-live="polite"></span>
    <span class="chct-words" hidden>
      <span data-msg="warning">Plus que {n} caractères</span>
      <span data-msg="limit">Limite de {max} caractères atteinte</span>
    </span>
  </div>
</div>

Paiement unique, sans abonnement — le code est à toi pour toujours

Personnaliser

Options passées à l'API ou attributs data-* :

Option / propriétéDéfautEffet
Limite (HTML — maxlength sur la zone) 150 Le texte du compteur et les seuils suivent ; mettez aussi la bonne valeur dans le texte initial de .chct-count pour l'affichage sans JavaScript.
Seuil ambre (JS — max * 0.8) 80 % 0.9 pour ne prévenir que dans les derniers 10 %.
Couleurs du compteur (CSS — --chct-muted, --chct-warning, --chct-limit sur .fx-0299-root) #a1a1aa · #f59e0b · #ef4444 Sur fond clair : #6b7280, #b45309, #dc2626.
Hauteur (CSS — --chct-min-height) 100px Choisissez une hauteur qui contient la limite entière, pour que le texte ne glisse pas sous le compteur.
Champ (CSS — --chct-field, --chct-border, --chct-focus, --chct-text) transparent · indigo à 30 % · #6366f1 · #fff Fond, bordure au repos et au focus, couleur du texte.
Largeur et cadre (CSS — --chct-width, --chct-bg, --chct-root-min-height) 280px · #0a0a0f · 300px Dans une page : --chct-width:100%; --chct-bg:transparent; --chct-root-min-height:0.
Messages annoncés (HTML — .chct-words) « Plus que {n} caractères » · « Limite de {max} caractères atteinte » {n} = caractères restants, {max} = limite.

FAQ

Ici la zone garde sa hauteur et le compteur vit à l'intérieur, dans le coin : utile quand la place est comptée (panneau, carte) et que la mise en page ne doit pas bouger. L'autre zone pousse le contenu vers le bas à mesure qu'on écrit, avec le compteur dessous.
Après un reset du formulaire, oui, automatiquement. Après une valeur posée par script, déclenchez textarea.dispatchEvent(new Event('input', {bubbles: true})) : c'est ce que fait le bouton de modèle dans l'exemple du support.
Le compteur lit value.length, comme maxlength : un émoji courant compte pour 2, certains pour davantage. Compteur et limite restent donc d'accord entre eux, mais pas forcément avec le décompte d'un opérateur SMS.