SVG✨ Premium

Moving Mask

Un halo doux qui suit la souris, le doigt ou les flèches du clavier et laisse voir, à travers un masque radial, le calque caché sous la surface.

JSMaskMouse

Mis à jour le

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

3 exemples d'usage

Jeu « Trouve le hibou » : une lampe torche dans la forêt de nuit — Moving Mask exemple 1

① Jeu « Trouve le hibou » : une lampe torche dans la forêt de nuit

QuandLa page jeunesse d'un parc naturel, rubrique des veillées : à gauche la consigne et le compteur, à droite une forêt plongée dans le noir. Le halo éclaire les sapins, le chêne et, si l'on cherche bien, le hibou caché dans le feuillage.
PourquoiLe jeu tient tout entier dans le comportement de l'effet : on ne voit que ce que la lampe éclaire. Au doigt sur tablette, l'enfant promène la lumière comme une vraie torche ; au clavier, les flèches font le même travail.
RéglagesDeux dessins de même géométrie avec .mvm-media : forêt de nuit dans .mvm-front, forêt éclairée (avec le hibou) dans .mvm-layer. --mvm-w:100%, --mvm-h:100%, --mvm-radius:86px, --mvm-front:#081120, --mvm-layer:#1d3352. Le compteur qui passe à 1 / 1 est un petit script de la page qui compare la position du halo à celle du hibou.
Coulisses d'un ébéniste : le plan d'atelier apparaît sous la photo du buffet — Moving Mask exemple 2

② Coulisses d'un ébéniste : le plan d'atelier apparaît sous la photo du buffet

QuandLa page « Nos coulisses » d'une ébénisterie : un bandeau pleine largeur montre un buffet en noyer dans un intérieur. Là où passe la souris, le dessin technique au 1/20 apparaît en bleu, cotes comprises, comme si l'on soulevait un coin de la photo.
PourquoiLe visiteur découvre que le meuble fini et le plan sont la même chose, au même endroit : le halo relie l'objet à sa fabrication sans ajouter une deuxième image à faire défiler.
RéglagesPhoto et plan en SVG .mvm-media, même cadrage. --mvm-w:100%, --mvm-h:202px, --mvm-corner:0 (bandeau à bords francs), --mvm-radius:112px pour un halo assez large pour lire les cotes, --mvm-layer:#1d4f89.
Bouton « Découvrir la collection » parcouru par un halo lumineux — Moving Mask exemple 3

③ Bouton « Découvrir la collection » parcouru par un halo lumineux

QuandLe haut de page d'une marque de vestes de pluie : accroche, sous-titre et un bouton en forme de pilule. Sous la souris, une tache jaune-orangé glisse le long du bouton et éclaire le libellé.
PourquoiUn bouton qui réagit à la position exacte du pointeur attire l'œil sans animation permanente : la page reste calme tant qu'on ne s'en approche pas.
Réglages.mvm-zone posée sur le lien <a> (pas de tabindex), libellé répété dans le calque avec aria-hidden="true". 270 × 54 px, --mvm-corner:27px, --mvm-radius:58px, --mvm-front:#173653, --mvm-layer:linear-gradient(100deg,#ffd23f,#ff8c42), --mvm-layer-color:#1a1206, --mvm-front-y:center, --mvm-front-pad:0, --mvm-touch:auto (le doigt garde le défilement de la page).

Comment ça marche

La zone .mvm-zone contient deux couches : .mvm-front, la surface visible, et .mvm-layer, le calque caché, posé par-dessus. Ce calque n'est visible qu'à travers mask-image: radial-gradient(circle var(--mvm-radius) at var(--mvm-x) var(--mvm-y), #000, transparent) (avec sa version -webkit-) : opaque au centre du halo, il s'efface progressivement jusqu'au bord du rayon, 60 px par défaut. On obtient l'effet d'une lampe torche plutôt qu'un trou net.

Au repos, le halo est éteint (calque à opacité 0) : seule la surface se lit. Quand la souris entre, le script place le centre du halo sous le pointeur, en pourcentage de la zone, et ajoute la classe .mvm-on : le calque apparaît en 0,25 s et le halo suit ensuite chaque mouvement sans retard. Il s'éteint quand la souris sort. Les deux couches acceptent votre contenu : texte, ou image et SVG avec la classe .mvm-media, qui couvre toute la couche — c'est ainsi qu'on fait apparaître une photo ou un plan sous une autre image.

Au doigt, le halo s'allume là où le doigt se pose, le suit pendant le glissé et s'éteint quand il se lève ; pour cela la zone bloque le défilement de la page (touch-action: none, réglable par --mvm-touch). Au clavier, la zone (tabindex="0") allume le halo au focus et le déplace avec les flèches : 5 % de la zone par appui, 15 % avec Maj.

Chaque zone garde sa propre position, posée en style sur elle : plusieurs zones dans une racine ou plusieurs copies de l'effet fonctionnent séparément. Rien n'est ajouté sur window.

Accessibilité

  • Clavier : Tab allume le halo (contour #c4b5fd), les flèches le promènent, Maj + flèche avance plus vite. Les flèches ne font défiler la page que lorsque le focus n'est pas sur la zone.
  • Lecteurs d'écran : le masque ne cache rien aux technologies d'assistance : le texte des deux couches est lu. Si le calque répète la surface (bouton au libellé doublé), ajoutez aria-hidden="true" sur .mvm-layer. Un jeu qui repose sur la vue (trouver un objet) doit proposer son propre équivalent textuel.
  • Mouvement réduit : sous prefers-reduced-motion: reduce, le fondu d'allumage disparaît. Le halo reste attaché au geste de l'utilisateur, qui est l'interaction elle-même.
  • Toucher : doigt posé = halo allumé, doigt levé = halo éteint. Sur une grande zone dans une page qui défile, mettez --mvm-touch: pan-y : le défilement vertical reste possible, au prix d'un halo qui ne suit plus le doigt pendant ce défilement.

Compatibilité navigateur

Mesuré dans Chromium 151, Firefox 153 et le WebKit 26.5 de Playwright : 0 erreur ; la 2e copie de la page réagit seule ; focus clavier et flèches ; doigt posé puis glissé (événements de pointeur tactiles) ; aucune animation en mouvement réduit ; rien qui déborde à 390 px. :focus-visible fixe les versions minimales ; le masque est aussi écrit avec le préfixe -webkit-, nécessaire à Chrome avant la version 120.

Chrome 86+✓ Complet (mesuré)
Firefox 85+✓ Complet (mesuré)
Safari 15.4+✓ Complet (mesuré dans le WebKit de Playwright)
Edge 86+✓ Complet (moteur Chromium)
Safari iOS 15.4+✓ Doigt vérifié en émulation, pas sur un appareil réel
Chrome Android 86+✓ Complet (moteur Chromium, doigt vérifié en émulation)

Plus ancien : souris et doigt fonctionnent dans les versions plus anciennes qui ont la propriété inset (Chrome 87, Firefox 66, Safari 14.1 : versions où arrive la propriété inset qui superpose les faces) ; seul l'allumage au focus clavier manque. Sans JavaScript, le halo ne s'allume plus et seule la surface est visible.

Le code

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

index.html — structure
<div class="fx-0625-root">
  <div class="mvm-zone" tabindex="0">
    <span class="mvm-front">Bougez la souris</span>
    <div class="mvm-layer">
      <span>Caché !</span>
    </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
--mvm-w et --mvm-h 280px et 180px Taille de la zone (largeur bornée par le conteneur).
--mvm-corner 1rem Arrondi des coins de la zone.
--mvm-radius 60px Rayon du halo. Le calque est opaque au centre et s'efface jusqu'à ce rayon.
--mvm-front et --mvm-front-color linear-gradient(135deg,#1e1e2e,#2d2d44) et #9a9aa2 Fond et texte de la surface visible.
--mvm-front-y et --mvm-front-pad flex-end et 0 1rem 1rem Place du texte de la surface : en bas par défaut, pour ne pas se superposer au texte caché ; center et 0 pour un bouton.
--mvm-layer et --mvm-layer-color linear-gradient(135deg,#6366f1,#8b5cf6,#d946ef) et #fff Fond et texte du calque révélé par le halo.
--mvm-touch none Valeur de touch-action sur la zone. none : le doigt promène le halo. pan-y ou auto : le doigt fait défiler la page.
--mvm-bg et --mvm-min-h #0a0a0f et 300px Fond et hauteur minimale de la racine.
Classe .mvm-media — Sur une image, un SVG ou une vidéo d'une couche : le média la couvre entièrement, le texte éventuel passe au-dessus.

FAQ

Mettez la première dans .mvm-front et la seconde dans .mvm-layer, chacune en <img class="mvm-media"> avec le même cadrage. Le halo laisse alors voir la seconde image à l'endroit exact du pointeur.
Sur la zone elle-même, oui par défaut : c'est ce qui permet au doigt de promener le halo. Pour une grande zone dans une page longue, passez --mvm-touch à pan-y : la page défile, et le halo s'allume encore là où le doigt se pose.
Pour qu'il ne se mélange pas au texte du calque quand le halo passe au centre : le dégradé du masque est doux, les deux textes se superposaient. Remettez-le au centre avec --mvm-front-y:center si votre calque n'a pas de texte, ou pour un bouton dont le calque répète le libellé.