Hover✨ Premium

Fluid X-Ray Reveal

Le curseur déclenche un masque CSS radial-gradient mis à jour en temps réel — une traînée de 22 cercles en fondu révèle progressivement une couche cachée sous la première. L'anneau et l'indicateur disparaissent dès le premier survol. Mouvement réduit géré : la couche cachée s'affiche d'emblée.

CSS MaskVanilla JSHover

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

Carte produit e-commerce Quelval — révélation du dos d'un t-shirt au survol — Fluid X-Ray Reveal exemple 1

① Carte produit e-commerce Quelval — révélation du dos d'un t-shirt au survol

QuandL'acheteur survole la zone d'image du produit pour faire apparaître progressivement le dos du vêtement sous son curseur.
PourquoiUn révélateur fluide est plus engageant qu'un simple bouton « voir le dos » : l'acheteur explore librement la surface de la zone.
RéglagesZone d'effet 232 px de haut dans une card ; .xr-scene en height: 232px; aspect-ratio: unset ; couches en background-image SVG URL-encodé.
Section hero plein écran Vellona Résidences — comparatif paysage de jour et de nuit — Fluid X-Ray Reveal exemple 2

② Section hero plein écran Vellona Résidences — comparatif paysage de jour et de nuit

QuandLe visiteur survole le fond avec un large rayon pour révéler progressivement la version nocturne sous la version diurne.
PourquoiUn révélateur radial plein écran valorise deux ambiances d'un même quartier (jour calme / nuit animée) en une seule zone interactive.
RéglagesRADIUS porté à 180 px pour une révélation plus large ; couches en dégradés CSS linéaires (ciel + silhouette de ville) ; navigation et texte hero en overlay pointer-events: none.
Portfolio photo Phelora — comparateur avant/après retouche sur un portrait — Fluid X-Ray Reveal exemple 3

③ Portfolio photo Phelora — comparateur avant/après retouche sur un portrait

QuandLe visiteur survole le portrait dans le portfolio pour révéler localement la version retouchée et évaluer la précision de l'intervention.
PourquoiUn révélateur ponctuel est plus subtil qu'un slider before/after classique : il laisse le visiteur explorer les zones d'intérêt à son rythme.
Réglages.xr-scene en width: 220px; height: 220px; aspect-ratio: unset ; RADIUS réduit à ~70 px pour une révélation précise.

Comment ça marche

La racine .fx-0776-root centre la scène .xr-scene[data-xr], dont l'attribut data-base renseigne le contenu de la couche visible (.xr-base) et data-xray celui de la couche cachée (.xr-xray). Les deux couches sont empilées en position: absolute; inset: 0 ; la couche cachée a un z-index supérieur et est masquée par son mask-image initial à rayon 0 hors écran.

Le script maintient une traînée de 22 points (trail) : à chaque trame, le point lissé (smooth) avance vers la position de souris par un LERP de 0,18. La vélocité locale détermine le rayon de chaque cercle (entre 66 et 220 px). La traînée est convertie en une série de radial-gradient(circle …) fusionnés par mask-composite: add, ce qui crée un masque fluide multi-cercles. L'opacité de chaque point de la traînée décroît de 0,02 par trame jusqu'à 0, puis le point est retiré.

Un anneau visuel (.xr-ring) et un indicateur (.xr-hint) guident l'utilisateur avant le premier survol ; ils disparaissent dès que le pointeur entre dans la scène. Sous prefers-reduced-motion: reduce, la couche cachée s'affiche intégralement sans boucle (xr-revealed). La scène répond à pointermove (souris et toucher via l'API Pointer Events).

Accessibilité

  • Mouvement réduit : sous prefers-reduced-motion: reduce, la classe xr-revealed est ajoutée immédiatement, le masque est retiré et la couche cachée s'affiche en entier sans boucle. L'indicateur et l'anneau sont masqués.
  • Toucher : l'effet utilise pointermove, qui couvre la souris, le stylet et le toucher. Sur un écran tactile, glisser le doigt dans la zone révèle la couche cachée. Sur Safari iOS (< 17), pointermove lors d'un toucher peut nécessiter un appui maintenu — à tester sur appareil réel.
  • Clavier : aucune interaction clavier n'est prévue. La couche cachée n'est pas accessible sans pointeur. Si les deux couches portent une information fonctionnelle, exposez le contenu des deux couches en texte alternatif (aria-label) ou en éléments visibles à côté.
  • Contenu des couches : les deux couches sont lues par les lecteurs d'écran dans l'ordre du HTML (base puis x-ray). Si les deux couches portent la même information (avant/après), indiquez le changement dans un texte accessible (aria-live).

Compatibilité navigateur

CSS mask-image avec mask-composite: add + WebkitMaskComposite: source-over + API Pointer Events + matchMedia, aucune dépendance. mask-composite: add disponible depuis Chrome 120, Firefox 53 et Safari 15.4 (avec préfixe -webkit-mask-composite: source-over pour les versions antérieures). Non mesuré dans Firefox et WebKit.

Chrome 120+✓ Complet (mesuré)
Firefox 53+✓ Complet (non mesuré, préfixe webkit géré)
Safari 15.4+✓ Complet (non mesuré, préfixe webkit géré)
Edge 120+✓ Complet (moteur Chromium)
Mobile iOS 15.4+✓ Complet (non mesuré)
Android Chrome 120+✓ Complet (mesuré sur Chromium)

Sans JavaScript, le masque reste à son état initial (rayon 0, couche cachée non visible). Sur Chrome < 120 et Firefox < 53, mask-composite: add n'est pas supporté : le masque multi-cercles n'est pas rendu ; seul le dernier cercle de la traînée est appliqué.

Le code

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

index.html — structure
<div class="fx-0776-root"><div class="xr-scene" data-xr="" data-base="🧑" data-xray="🧛"><div class="xr-layer xr-base">🧑</div><div class="xr-layer xr-xray">🧛</div><div class="xr-ring"></div><div class="xr-hint">Texte d'aide</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
Rayon du masque (JS — RADIUS = 110) 110 px 60 px pour un révélateur ponctuel et précis, 180 px pour un révélateur plus large.
Longueur de la traînée (JS — TRAIL = 22) 22 points 10 points pour une traînée courte et discrète, 35 pour un effet de pinceau plus persistant.
Vitesse d'effacement (JS — FADE = 0.02) 0,02 par trame 0,01 pour que la traînée disparaisse lentement, 0,05 pour qu'elle s'efface presque instantanément.
Contenu des couches (HTML — data-base et data-xray) Emojis 🧑 et 🧛 Passez des URLs d'images ou des chaînes HTML. Pour des images, ajoutez un background-image sur les couches .xr-base et .xr-xray en CSS et laissez data-base / data-xray vides.
Couleur de l'anneau et de l'indicateur (CSS — rgba(124, 255, 170, …)) Vert clair #7cffaa Remplacez par votre couleur primaire pour intégrer l'effet à votre charte graphique.

FAQ

Oui. Ajoutez un background-image, background-size: cover et background-position: center sur les couches .xr-base et .xr-xray en CSS, et laissez data-base / data-xray vides — le script ne modifie que le textContent de ces couches quand les attributs ne sont pas vides.
mask-composite: add est supporté depuis Chrome 120, Firefox 53 et Safari 15.4. Sur des versions antérieures, le masque n'applique que le dernier cercle de la traînée — l'effet est moins fluide mais reste fonctionnel.
Remplacez pointermove par pointerdown et retirez la mise à jour continue : ajoutez la classe xr-revealed au clic (scene.addEventListener('click', () => scene.classList.add('xr-revealed'))).