Boutons✨ Premium

Slide Reveal Icon

Une flèche cachée dans un span de largeur 0 ; au survol, sa max-width passe à 24 px, son opacité à 1 et un espace de 8 px s'ouvre — le bouton s'élargit de ≈ 18 px vers la droite en 300 ms, CSS seul.

CSSHoverIcon

Vous aurez accès à la démo interactive avec un compte gratuit.

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

3 exemples d'usage

Explorer les destinations — landing d'un site de voyage — Slide Reveal Icon exemple 1

① Explorer les destinations — landing d'un site de voyage

QuandHero photographique ou dégradé : accroche, sous-titre, un bouton d'entrée.
PourquoiLa flèche qui se déplie promet un déplacement : c'est le bouton « partir » par excellence. Le vert évoque le voyage responsable ; assombri, il tient le contraste. Sur un hero, l'élargissement de 18 px ne dérange rien.
RéglagesTexte 16 px, padding: 17px 24px 17px 36px, dégradé #065f46 → #047857, flèche en SVG 18 px (max-width: 26px).
Lire la suite — carte d'article — Slide Reveal Icon exemple 2

② Lire la suite — carte d'article

QuandGrille d'articles : image, titre, extrait, un bouton de lecture aligné à gauche dans chaque carte.
PourquoiLa flèche qui apparaît au survol indique une navigation (on quitte la grille) sans encombrer la carte au repos. Aligné à gauche, le bouton grandit vers la droite dans l'espace libre : aucun voisin déplacé.
RéglagesBouton compact (padding: 10px 14px 10px 18px, 13,5 px), gap: 6px au survol, border-radius: 8px, durée .25s.
Continuer — étape d'un assistant de configuration — Slide Reveal Icon exemple 3

③ Continuer — étape d'un assistant de configuration

QuandAssistant en plusieurs étapes : indicateur de progression, un champ ou un choix, boutons Retour et Continuer.
PourquoiLa flèche vers la droite est le pictogramme naturel de « suivant » ; la faire apparaître au survol garde le bouton sobre tant qu'on ne l'a pas choisi. Placez-le à droite de la ligne, il grandit vers la marge.
Réglagespadding: 13px 20px 13px 26px, 14,5 px, icône (U+2192, plus fine que ➔), max-width: 20px, dégradé sombre pour le contraste.

Comment ça marche

.btn-icon-reveal est un bouton en display: inline-flex; align-items: center avec gap: 0 et un padding-right: 20px plus court que le gauche (32 px hérités de .demo-btn). Son libellé est un nœud texte, l'icône un <span class="btn-icon">➔</span> placé après. Fond linear-gradient(135deg, #059669, #10b981), texte blanc, transition: .3s sur toutes les propriétés.

Au repos, .btn-icon est replié : max-width: 0; overflow: hidden; opacity: 0. Il occupe zéro pixel de largeur et le gap: 0 ne laisse aucun espace entre le texte et lui : le bouton paraît n'avoir qu'un libellé, légèrement décentré vers la droite (20 px de padding contre 32).

Au :hover, trois valeurs changent en .3s : max-width: 24px et opacity: 1 sur l'icône, gap: 8px et padding-right: 16px sur le bouton. Mesuré dans Chromium : la flèche ➔ mesure 14,3 px à 16 px de police, donc le bouton passe de 119,6 à 137,9 px — +8 (gap) +14,3 (icône) −4 (padding) = +18,3 px. Le max-width de 24 px n'est qu'un plafond : la largeur réelle est celle du glyphe.

max-width, gap et padding sont des propriétés de mise en page : le bouton grandit vraiment et pousse ce qui le suit (ou se recentre s'il est centré). L'icône apparaît en glissant depuis la gauche parce que son conteneur s'ouvre de gauche à droite — il n'y a aucun transform.

Accessibilité

  • Contraste insuffisant dans la version fournie : texte blanc sur le dégradé #059669 → #10b981 = 3,8:1 et 2,5:1, sous le seuil AA de 4,5:1 — la moitié claire tombe même sous 3:1. Passez à linear-gradient(135deg, #065f46, #047857) (7,7:1 et 5,5:1).
  • Lecteurs d'écran : la flèche est un caractère texte (, U+2794) et fait partie du nom accessible — annoncée « flèche large vers la droite » après le libellé par VoiceOver. Le HTML fourni ne la masque pas : ajoutez aria-hidden="true" sur .btn-icon.
  • prefers-reduced-motion absent du code : l'élargissement de 18 px en 300 ms est un mouvement de mise en page qui déplace les voisins. Ajoutez @media (prefers-reduced-motion: reduce) { .btn-icon-reveal, .btn-icon-reveal .btn-icon { transition: none } } — l'icône apparaît d'un coup.
  • Clavier : pas de :hover à la navigation Tab. Dupliquez les deux règles de survol sous .btn-icon-reveal:focus-visible et .btn-icon-reveal:focus-visible .btn-icon. L'outline natif n'est pas retiré et suit l'élargissement.
  • Tactile : sur iOS l'état déployé reste collé après un tap ; la flèche demeure visible jusqu'au toucher suivant (@media (hover: hover)). Sans survol, l'icône n'est jamais vue sur mobile : elle ne doit porter aucune information. Cible ≈ 50 px de haut, au-dessus du minimum de 44 px.

Compatibilité navigateur

Requiert display: inline-flex avec la propriété gap sur un conteneur flex, et les transitions de max-width, gap, padding et opacity. Aucun JavaScript, zéro dépendance.

Chrome 84+✓ Complet
Firefox 63+✓ Complet
Safari 14.1+✓ Complet
Edge 84+✓ Complet
Mobile iOS 14.5+✓ Statique (pas de survol)
Android Chrome✓ Statique (pas de survol)

Sans gap sur flex (Safari avant 14.1, Chrome avant 84), l'icône apparaît collée au texte, sans les 8 px d'espace ; tout le reste fonctionne. Sans transitions, la flèche et l'élargissement surgissent d'un coup au survol.

Le code

Structure HTML à coller dans votre page (CSS + JS disponibles avec un compte premium) :

index.html — structure
🔒 Débloquer le code complet — à partir de 2,99 € le 1er mois

HTML + CSS + JS complet, prêt à coller — avec des centaines d'effets premium.

Personnaliser

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

Option / propriétéDéfautEffet
max-width (CSS — :hover .btn-icon) 24px Plafond de largeur de l'icône déployée. Alignez-le sur la largeur réelle du glyphe ou du SVG (14 px pour ➔ à 16 px) : une valeur trop grande allonge la transition sans rien montrer.
gap (CSS — .btn-icon-reveal 0 / :hover 8px) 0 → 8px Espace texte–icône. Son ouverture fait partie de l'élargissement ; 4px resserre, 12px détache la flèche du mot.
padding-right (CSS — .btn-icon-reveal 20px / :hover 16px) 20 → 16px Compensation partielle de l'élargissement (−4 px). Mettez 12px pour absorber davantage, ou égalisez avec le padding gauche au repos pour un libellé centré.
transition (CSS — .btn-icon-reveal et .btn-icon) .3s Durée du déploiement. .2s = vif ; .45s = lent, l'élargissement se voit alors comme un mouvement à part entière.
opacity (CSS — .btn-icon 0 / :hover 1) 0 → 1 Fondu de l'icône pendant l'ouverture. Retirez la transition d'opacité pour une flèche nette qui « sort » du bord, ou combinez avec transform: translateX(-4px) → 0 pour un glissement.
Icône (HTML — span.btn-icon) ➔ (U+2794) Le glyphe dépend de la police et du système (parfois rendu en émoji coloré). Un SVG inline de 16 × 16 px avec fill: currentColor est identique partout — donnez-lui width: 16px; flex: none.
background (CSS — .btn-icon-reveal) linear-gradient(135deg, #059669, #10b981) Couleur du bouton. Pour un contraste AA avec le texte blanc : #065f46 → #047857.

FAQ

C'est le comportement du code : max-width, gap et padding changent la largeur de mise en page, +18 px environ. Trois solutions. Placer le bouton en fin de ligne (aligné à droite) ou dans un conteneur plus large que lui : il grandit dans le vide. Réserver la place dès le repos : .btn-icon { max-width: 24px; opacity: 0; transform: translateX(-8px) } et gap: 8px fixes, puis n'animer que opacity et transform au survol — la flèche glisse en place sans changer la largeur. Ou fixer min-width au bouton à sa largeur déployée.
(U+2794) est un caractère du bloc Dingbats : sa forme vient de la police de repli du système, et certains navigateurs mobiles le rendent en émoji coloré. Remplacez-le par un SVG inline : <svg class="btn-icon" width="16" height="16" viewBox="0 0 16 16" aria-hidden="true"><path d="M2 8h10M8 4l4 4-4 4" stroke="currentColor" stroke-width="2" fill="none"/></svg>, en gardant les règles .btn-icon (max-width, overflow: hidden, opacity) et en ajoutant flex: none pour qu'il ne se comprime pas.
Placez le span.btn-icon avant le libellé dans le HTML et inversez les paddings : padding-left: 20px au repos, 16px au survol, padding-right: 32px fixe. Le conteneur s'ouvre toujours de gauche à droite (max-width croît depuis le bord gauche du span), donc l'icône semble se dérouler vers le texte. Pour un déroulement inverse, ajoutez direction: rtl sur le span seul.