Hover✨ Premium

Copy to Clipboard

Bouton copier-coller avec confirmation visuelle : l'icône copie laisse place à une coche verte pendant 2 secondes, via classe CSS pilotée par JavaScript.

CSSJSClipboard

Mis à jour le

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

3 exemples d'usage

Bloc de code dans une documentation API — portail développeur d'un service de paiement en ligne — Copy to Clipboard exemple 1

① Bloc de code dans une documentation API — portail développeur d'un service de paiement en ligne

QuandChaque exemple de code (curl, Python, PHP) affiche un bouton copier dans son coin supérieur droit ; au clic, l'icône passe en coche verte pendant 2 secondes.
PourquoiUne confirmation visuelle sur le bouton élimine le doute « mon clic a-t-il fonctionné » dans une documentation technique — sans quoi le développeur copie parfois deux fois le même snippet.
RéglagesBouton 32×32 px, fond sombre (#1e1e2e), coche couleur primaire de la marque. Le texte à copier est dans .mi-copy-code ; remplacez son contenu par la valeur à copier.
Copie d'un numéro de référence de commande — confirmation de commande d'une boutique de matériaux de construction — Copy to Clipboard exemple 2

② Copie d'un numéro de référence de commande — confirmation de commande d'une boutique de matériaux de construction

QuandLa référence « CMD-2026-00847 » s'affiche avec un bouton copier ; la coche confirme que la référence est dans le presse-papiers pour le suivi de livraison.
PourquoiUn feedback immédiat est critique pour ce type d'action : sans lui, le client copie parfois la référence plusieurs fois par doute, ou recharge la page pour s'assurer de n'avoir pas raté l'opération.
RéglagesBouton 36×36 px. Fond clair, icône grise au repos, coche verte à la confirmation. L'infobulle « Copié ! » est repositionnée en dessous du bouton (modifier top en bottom dans .mi-tooltip).
Partage d'un code de parrainage — espace parrainage d'une application de financement participatif immobilier — Copy to Clipboard exemple 3

③ Partage d'un code de parrainage — espace parrainage d'une application de financement participatif immobilier

QuandLe code « INVEST23 » s'affiche avec un bouton copier ; la transition icône→coche encourage le partage immédiat.
PourquoiUn feedback de copie expressif pousse l'utilisateur à partager son lien tout de suite après la confirmation — un micro-moment de satisfaction qui réduit l'abandon de l'étape de partage.
RéglagesBouton 36×36 px sur fond de carte. Couleur de coche personnalisée (variable CSS --check-color). Le texte peut être masqué en lecture avec letter-spacing: 0.25em sur .mi-copy-code pour un aspect « code secret ».

Comment ça marche

Le cadre .fx-0369-root peut apparaître autant de fois que nécessaire sur la même page : le script identifie chaque instance par document.querySelectorAll('.fx-0369-root') et isole ses boutons à l'intérieur. Aucun id global n'est utilisé ; deux blocs de code côte à côte fonctionnent indépendamment.

Au clic sur .mi-copy-btn, le script lit le contenu de .mi-copy-code (le texte visible dans le bloc) et le copie dans le presse-papiers. Sur un contexte sécurisé (HTTPS ou localhost), il utilise navigator.clipboard.writeText(). Sur HTTP, il bascule sur document.execCommand('copy'). Si les deux échouent — presse-papiers refusé, contexte non sécurisé sans fallback — aucune confirmation n'est affichée : la coche n'apparaît que si la copie a réellement fonctionné.

La confirmation passe par la classe CSS .copied ajoutée à la racine : les icônes copie et check et l'infobulle « Copié ! » sont toutes pilotées par transition CSS (opacity, transform), sans manipulation du DOM. La classe est retirée après 2 secondes via setTimeout. Sous prefers-reduced-motion: reduce, toutes les transitions sont supprimées ; la coche apparaît et disparaît sans animation.

Accessibilité

  • Mouvement réduit : sous prefers-reduced-motion: reduce, les transitions CSS sont annulées (transition: none !important) ; la coche verte s'affiche sans animation et reste 2 s avant de disparaître instantanément.
  • Focus clavier : le bouton .mi-copy-btn est un élément <button> natif, activable par Tab puis Entrée ou Espace. Il porte un aria-label="Copier" lisible par les lecteurs d'écran. Le contour :focus-visible est visible.
  • Annonce de confirmation : l'infobulle porte role="status" aria-live="polite" ; quand le texte « Copié ! » s'y inscrit, les lecteurs d'écran l'annoncent sans interrompre la lecture en cours.
  • Contexte sécurisé : l'API navigator.clipboard n'est disponible qu'en HTTPS ou sur localhost. Sur HTTP, le fallback execCommand est tenté. Si les deux méthodes échouent, un message « Échec » s'affiche dans l'infobulle (aria-live="polite") — jamais « Copié ! » si rien n'a été copié.

Compatibilité navigateur

CSS transitions + 1,2 Ko de JavaScript, aucune dépendance. L'API navigator.clipboard est disponible depuis Chrome 66, Firefox 63 et Safari 13.1 en contexte sécurisé (HTTPS). Le fallback execCommand('copy') couvre les navigateurs plus anciens mais est déprécié depuis Chrome 117 et absent de Safari 17+. Mesuré dans Chromium 151, Firefox 153 et WebKit 26 : confirmation visuelle et annonce vocale correctes dans les trois.

Chrome 66+✓ Complet (Clipboard API)
Firefox 63+✓ Complet (Clipboard API)
Safari 13.1+✓ Complet (Clipboard API)
Edge 79+✓ Complet (Clipboard API)
Mobile iOS 13.4+✓ Complet
Android Chrome 66+✓ Complet

Sans JavaScript, le bouton s'affiche mais ne copie rien et ne montre aucune confirmation. Sur HTTP (hors localhost), le fallback execCommand est tenté ; s'il échoue, aucune confirmation n'est affichée — le bouton reste silencieusement inactif. Sur les navigateurs qui bloquent le presse-papiers sans permission explicite, le comportement est identique.

Le code

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

index.html — structure
<div class="fx-0369-root">
  <div class="mi-copy-scene">
    <div class="mi-copy-box">
      <span class="mi-copy-code">Votre texte à copier</span>
      <button class="mi-copy-btn" aria-label="Copier">
        <span class="mi-copy-icon-copy" aria-hidden="true"><!-- SVG copie --></span>
        <span class="mi-copy-icon-check" aria-hidden="true"><!-- SVG coche --></span>
        <span role="status" aria-live="polite" class="mi-tooltip">Copié !</span>
      </button>
    </div>
  </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
Texte à copier (HTML — contenu de .mi-copy-code) "npm install effect.labs" Remplacez par n'importe quelle chaîne ; le script lit le textContent au moment du clic. Vous pouvez aussi alimenter ce span par JavaScript avant d'injecter l'effet dans la page.
Durée de confirmation (JS — setTimeout(..., 2000)) 2000 ms Diminuez à 1200 ms pour un retour rapide, augmentez à 3000 ms pour laisser le temps à l'utilisateur de lire l'infobulle.
Couleur de confirmation (CSS — .fx-0369-root.copied .mi-copy-btn) #4ade80 (vert) Remplacez par la couleur primaire de votre marque. La valeur s'applique à l'icône check et à la bordure du bouton au moment de la confirmation.
Texte de l'infobulle (HTML — .mi-tooltip) "Copié !" Remplacez par « Lien copié », « Code copié » ou tout autre libellé contextuel. Le contenu est annoncé par les lecteurs d'écran via aria-live.
Visibilité du texte (CSS — .mi-copy-code) texte visible Ajoutez display: none pour masquer le texte et n'afficher que le bouton (cas d'usage : bouton copier sur une icône ou une image).

FAQ

Non. L'API navigator.clipboard n'est disponible qu'en HTTPS (ou sur localhost). Sur HTTP, le script tente le fallback execCommand('copy'), déprécié depuis Chrome 117 et absent de Safari 17+. Pour que la copie fonctionne partout, passez votre site en HTTPS — ce qui est recommandé de toute façon pour la sécurité.
Oui. Le script lit root.querySelector('.mi-copy-code').textContent au clic. Si vous voulez copier une valeur différente (URL, token, ID complet non tronqué), stockez-la dans data-copy sur .mi-copy-code et modifiez le script pour lire el.dataset.copy || el.textContent.
L'effet est conçu pour un bouton par instance .fx-0369-root. Pour plusieurs boutons dans le même bloc, dupliquez la racine autant de fois que nécessaire — chaque instance est indépendante — ou adaptez le script pour parcourir plusieurs .mi-copy-btn à l'intérieur d'une seule racine.