Cartes✨ Premium

Image Zoom

Pur CSS — le survol déclenche un scale(1.15) sur l'image, confinée par overflow:hidden ; un scrim semi-transparent fade en parallèle.

CSSHoverImage

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. Cartes comprend 41 effets, dont 6 gratuits. Découvrir la catégorie →

3 exemples d'usage

Galerie éditoriale — Grille d'articles avec vignettes — Image Zoom exemple 1

① Galerie éditoriale — Grille d'articles avec vignettes

QuandUn blog ou magazine affiche ses articles en grille 3 colonnes, chaque carte combinant photo et titre.
PourquoiLe zoom discret signale que la carte est cliquable sans icône ni bordure ajoutée. Le scrim au survol renforce la lisibilité du titre en dark overlay.
Réglagesscale(1.12) pour un zoom subtil, transition 0.4s, scrim rgba(0,0,0,0.45) pour les photos lumineuses.
Catalogue produit — Carte e-commerce avec nom et prix — Image Zoom exemple 2

② Catalogue produit — Carte e-commerce avec nom et prix

QuandUne boutique affiche ses produits en tuiles portrait : photo plein cadre en haut, nom + prix en bas.
PourquoiLe zoom met le produit en valeur au survol et guide l'œil vers la photo sans JS ni librairie. Compatible avec tout CMS ou framework.
Réglagesscale(1.10), transition 0.6s ease-in-out pour un ressenti premium ; overlay masqué (supprimer .zoom-overlay) pour laisser le bloc prix visible.
Portfolio — Tuiles de projets en grille 2×2 — Image Zoom exemple 3

③ Portfolio — Tuiles de projets en grille 2×2

QuandUn portfolio ou une agence présente ses réalisations en 2×2, chaque tuile couvrant tout l'espace disponible.
PourquoiLe zoom crée un effet de profondeur et d'invitation. L'overlay affiche le nom du projet au survol — zero JS, zero layout reflow.
Réglagesscale(1.20) pour un effet dramatique sur de grandes cartes, overlay rgba(0,0,0,0.55) avec nom du projet en blanc centré, transition 0.5s.

Comment ça marche

L'effet repose sur un binôme CSS. La carte porte overflow:hidden : quand l'image grossit, elle déborde logiquement mais reste découpée aux bords du conteneur. Le survol (:hover img) applique transform:scale(1.15), animé par transition:transform .5s. Aucune modification de layout — la carte ne bouge pas, seul le pixel de l'image est mis à l'échelle.

Un calque overlay (.zoom-overlay) est positionné en absolute; inset:0 avec opacity:0 au repos. Au survol, il passe à opacity:1 via une transition indépendante (opacity .3s), plus rapide que le zoom — ce décalage de vitesse donne au fondu une impression de réactivité. Le fond rgba(0,0,0,0.3) et le texte centré sont entièrement dans le HTML, sans JS.

Aucun JavaScript n'est impliqué. L'effet s'applique à n'importe quel <img> avec object-fit:cover à l'intérieur d'un conteneur de dimensions fixes : changer la taille de la carte suffit, le zoom reste proportionnel.

Accessibilité

  • prefers-reduced-motion ABSENT : aucune règle @media (prefers-reduced-motion:reduce) dans le code — la transition transform .5s s'exécute même si l'OS signale la préférence de réduction. À ajouter manuellement : @media (prefers-reduced-motion:reduce) { .card-image-zoom img { transition:none } }.
  • :focus-within absent : le zoom ne se déclenche qu'au survol (:hover). Un utilisateur au clavier qui navigue jusqu'à la carte ne voit pas le zoom. Ajouter .card-image-zoom:focus-within img { transform:scale(1.15) } pour couvrir le clavier.
  • L'attribut alt est présent dans le code de démo (alt="Mountain") — à remplacer par une description réelle en production pour les lecteurs d'écran.
  • Contraste de l'overlay : fond rgba(0,0,0,0.3) + texte blanc — ratio ≈ 7:1 sur fond mi-noir, conforme WCAG AA.
  • La carte est un <div> sans role ni aria-label — si elle est cliquable (lien vers un article, un produit), utiliser un <a> natif ou ajouter role="button" et tabindex="0".

Compatibilité navigateur

Utilise uniquement CSS3 : transform, transition, overflow, object-fit. Aucune dépendance JS ni externe.

Chrome 45+✓ Complet
Firefox 41+✓ Complet
Safari 9+✓ Complet
Edge 18+✓ Complet
Mobile iOS✓ Touch partiel
Android Chrome✓ Complet

Sans support transition, le passage au survol est instantané mais fonctionnel. Sans object-fit (très anciens navigateurs), l'image peut se déformer — mitiger avec des dimensions width/height fixes sur l'élément <img>.

Le code

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

index.html — structure
<div class="card-demo card-image-zoom">
  <img src="votre-image.jpg" alt="Description de l'image">

  <!-- Facultatif : scrim + texte au survol -->
  <div class="zoom-overlay">
    <span>Texte facultatif</span>
  </div>
</div>
🔒 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
scale(1.15) 1.15 Facteur de zoom au survol. 1.08 = très subtil, 1.15 = standard, 1.25 = dramatique. Modifier dans la règle .card-image-zoom:hover img.
transition: transform .5s .5s Durée de l'animation de zoom. 0.3s = snappy, 0.5s = fluide, 0.8s = cinématique. Modifier dans .card-image-zoom img.
rgba(0,0,0,.3) .3 Opacité du fond du scrim au survol. 0 = invisible (supprimer le bloc overlay), 0.5 = bien visible. Modifier dans .zoom-overlay.
transition: opacity .3s .3s Durée du fondu du scrim, indépendante de la durée du zoom. Différencier les deux pour un effet de décalage temporel.
--radius-xl 1rem Variable CSS — rayon des coins de la carte. 0 = carré net, 0.5rem = léger, 1.5rem = très arrondi.
--bg-card #12121a Variable CSS — fond de la carte visible pendant le chargement de l'image ou si elle échoue à se charger.

FAQ

Non — il n'y a pas de variable CSS ni d'attribut data- exposé. La valeur scale(1.15) est une constante dans la règle .card-image-zoom:hover img. Modifiez-la directement dans votre feuille de style ou surchargez-la avec un sélecteur plus spécifique (.ma-carte.card-image-zoom:hover img { transform:scale(1.20) }).
Sur mobile, :hover se comporte différemment selon le navigateur : un tap peut déclencher l'état hover sur iOS Safari (persistant jusqu'au prochain tap ailleurs), mais pas de manière fiable sur Android Chrome. Pour un comportement cohérent en touch, complétez avec :focus-within ou ajoutez des listeners touchstart/touchend via JS.
Retirez le <div class="zoom-overlay"> du HTML — le zoom sur l'image fonctionne indépendamment de l'overlay. Vous pouvez aussi conserver le bloc et lui ajouter display:none dans votre CSS, puis le révéler dynamiquement par JS si besoin.