Bookmark Toggle
Signet à encoche qui se remplit d'indigo avec un rebond élastique quand on le touche, et libellé qui passe de « Sauvegarder » à « Sauvegardé ! ».
Mis à jour le
Cet effet fait partie d'Effect.Labs — 840 effets vanilla, une partie gratuite, une partie premium. Utilitaires comprend 43 effets, dont 3 gratuits. Découvrir la catégorie →
3 exemples d'usage



Comment ça marche
Le signet est dessiné en SVG : un rectangle aux coins du haut arrondis, fendu en V en bas. Le signet et son libellé sont dans le même <button> : toute la zone se clique.
Au clic, à la touche Entrée ou Espace, aria-pressed passe à true. Le signet se remplit d'indigo (#6366f1), s'enfonce puis rebondit (0,4 s, cubic-bezier(.68,-.55,.265,1.55)) et reste agrandi à 110 % ; le libellé prend le texte de data-bmk-on et la couleur #818cf8. Un nouveau clic remet le gris et le libellé de départ. Le rebond ne joue qu'après un clic, jamais au chargement d'un signet déjà sauvegardé.
La couleur du libellé vient du CSS (--bmk-label, --bmk-label-on), donc se change sans toucher au JavaScript. L'état de départ se lit dans aria-pressed, et chaque bascule envoie l'événement fx0743:change (detail.saved) depuis la racine, pour enregistrer le favori côté serveur.
Accessibilité
- Nom et état : le bouton garde un nom fixe (
aria-label="Sauvegarder") et dit son état pararia-pressed: « Sauvegarder, bouton bascule, activé ». Le libellé visible, qui change, est masqué aux lecteurs d'écran pour ne pas être lu deux fois. - Clavier : vrai
<button>, Entrée et Espace, anneau lavande autour du signet et du libellé au focus clavier. - Contraste : signet éteint
#70708cà 3,6:1 sur le fond ; libellé sauvegardé#818cf8à 5,7:1. - Mouvement réduit : le signet change de couleur sur place, sans rebond ni transition.
Compatibilité navigateur
SVG en ligne, CSS et 1,7 Ko de JavaScript sans dépendance. Mesuré dans Chromium 151, Firefox 153 et WebKit 26.5 (Playwright) : code collé deux fois (chaque signet bascule seul), clic, Espace au clavier, toucher à 390 px, mouvement réduit, 0 erreur, aucun nom ajouté sur window.
Sans JavaScript, le signet gris et son libellé s'affichent mais ne basculent pas. L'anneau de focus demande :focus-visible (Chrome 86, Firefox 85, Safari 15.4) ; dans les navigateurs plus anciens, tout fonctionne sans anneau.
Le code
Structure HTML à coller dans votre page (le CSS + JS sont inclus avec votre achat) :
<div class="fx-0743-root">
<div class="bmk-demo">
<button type="button" class="bmk-btn" aria-pressed="false" aria-label="Sauvegarder" data-bmk-on="Sauvegardé !">
<svg class="bmk-icon" viewBox="0 0 30 40" aria-hidden="true"><path d="M4 0h22a4 4 0 0 1 4 4v36L15 28 0 40V4a4 4 0 0 1 4-4z"></path></svg>
<span class="bmk-label" aria-hidden="true">Sauvegarder</span>
</button>
</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éfaut | Effet |
|---|---|---|
Libellés (HTML — texte de .bmk-label et data-bmk-on) |
« Sauvegarder » · « Sauvegardé ! » | Texte au repos et une fois sauvegardé ; gardez l'aria-label du bouton accordé au premier. |
Déjà sauvegardé (HTML — aria-pressed="true") |
false |
Affiche un favori existant, sans rebond au chargement. |
Taille du signet (CSS — --bmk-size) |
30 px (hauteur 40 px) | La hauteur suit toujours le rapport 4/3. |
Couleurs du signet (CSS — --bmk-off, --bmk-on) |
#70708c · #6366f1 |
Gardez au moins 3:1 avec votre fond pour le signet éteint. |
Libellé (CSS — --bmk-label, --bmk-label-on, --bmk-label-size, --bmk-gap) |
blanc à 60 % · #818cf8 · .9rem · 20 px |
Couleurs et taille du texte, écart avec le signet. |
Cadre (CSS — --bmk-height, --bmk-page, --bmk-panel, --bmk-pad) |
300 px · #0a0a0f · #1a1a2e · 20 px |
0 et transparent pour le poser dans une ligne ou une carte. |
Serveur (JS — événement fx0743:change) |
— | detail.saved vaut true ou false à chaque clic : enregistrez ou retirez le favori. |
FAQ
<span class="bmk-label"> ; le bouton garde son aria-label, donc reste nommé. Prévoyez alors une zone de clic d'au moins 24 px, par exemple avec --bmk-size: 24px.aria-pressed="true" pour les éléments qu'il a déjà gardés : le script affiche alors le signet plein et le libellé data-bmk-on, sans jouer le rebond.