SVG✨ Premium

Image Mask Text

Une image qui ne se voit qu'à travers les lettres d'un titre et glisse lentement dedans : votre photo dans une variable CSS, le texte reste du vrai texte.

CSSBlendText

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

Nom d'une île en très grand, la mer dans les lettres — agence de croisières — Image Mask Text exemple 1

① Nom d'une île en très grand, la mer dans les lettres — agence de croisières

QuandLe haut de la page d'une escale : navigation, « Escale de 3 jours · mer Égée », puis « OMBRISA » sur toute la largeur, rempli d'une vue de l'île et de la mer. En bas, date de départ, nombre de nuits, prix et bouton « Réserver ».
PourquoiLe nom du lieu et sa photo deviennent une seule image : on lit la destination et on la voit en même temps, sans bandeau photo séparé. Le glissement vertical fait passer le regard du ciel à la plage puis à la mer.
Réglages--imt-size:104px, --imt-width:100%, --imt-min-h:0px, --imt-card:transparent, --imt-page:transparent, --imt-height:0px ; trajet --imt-from:50% 35% → --imt-to:50% 78% en --imt-speed:7s ; --imt-image = illustration SVG de l'île (photo en production).
Prénom rempli du motif choisi — étiquette de cartable personnalisée — Image Mask Text exemple 2

② Prénom rempli du motif choisi — étiquette de cartable personnalisée

QuandLe configurateur d'une boutique de cartables : à gauche l'étiquette « Ce cartable appartient à Léonie », à droite le champ prénom et quatre motifs (rayures, pois, vagues, damier). Chaque clic sur un motif remplit le prénom de ce motif ; tant que personne ne clique, la scène les fait défiler.
PourquoiL'aperçu montre le produit tel qu'il sera imprimé : le motif dans les lettres, pas en vignette à côté. Changer d'image se résume à changer une variable, sans recharger ni redessiner le texte.
Réglages--imt-size:66px, --imt-width:100%, --imt-card:transparent ; le script de la scène fait root.style.setProperty('--imt-image', …) avec l'image du bouton cliqué (motifs SVG en data URI), boutons aria-pressed.
Chiffre « 1 200 » rempli par une forêt — rapport annuel d'une association — Image Mask Text exemple 3

③ Chiffre « 1 200 » rempli par une forêt — rapport annuel d'une association

QuandLa page 4 du rapport d'une association de reboisement : « Arbres plantés », puis « 1 200 » en 92 px rempli par une forêt, aligné à gauche, avec sa phrase d'explication ; à droite, trois indicateurs en barres (reprise, surface, essences).
PourquoiLe chiffre clé du rapport porte aussi son sujet : on lit une quantité et on voit des arbres. Sur papier clair, les verts profonds de la forêt donnent un contraste franc, sans couleur ajoutée.
Réglages--imt-size:92px, alignement à gauche (justify-content:flex-start sur la racine, text-align:left sur le texte, dans le CSS de la scène) ; trajet diagonal --imt-from:30% 30% → --imt-to:70% 90%, --imt-speed:10s ; forêt dessinée en SVG.

Comment ça marche

Le titre .imt-text reçoit l'image en fond (background-image:var(--imt-image)), cadrée en cover sur la boîte du texte. background-clip:text (avec sa version -webkit-) découpe ce fond à la forme exacte des lettres, et -webkit-text-fill-color:transparent efface le remplissage normal : on ne voit plus que l'image, là où il y a des lettres.

L'animation imtGlide déplace la position du fond de --imt-from (50 % 10 %) à --imt-to (50 % 90 %) en 8 s, puis revient (alternate, ease-in-out) : comme une caméra qui descend lentement le long de la photo. En cadrage cover, l'image dépasse de la boîte dans un seul sens ; pour un titre large, c'est la hauteur, d'où le trajet vertical par défaut.

Votre image se donne dans le HTML, sur la racine : style="--imt-image:url('photo.jpg')". Sans réglage, un coucher de soleil sur la mer dessiné en SVG (intégré au CSS, aucun fichier) remplit le texte. Le texte est en graisse 900 à 4rem (Inter si elle est disponible, sinon la police système), posé au centre d'une carte sombre de 280 × 180 px que les variables --imt-card, --imt-width et --imt-min-h font disparaître ou s'étirer. CSS seul, aucun JavaScript.

Accessibilité

  • Texte réel : le titre reste un <h2> (ou tout autre élément avec la classe imt-text) : lu par les lecteurs d'écran, sélectionnable, indexé. L'image n'est qu'un fond : si elle porte une information, dites-la aussi dans le texte voisin.
  • Contraste : la lisibilité dépend des couleurs de la photo sous les lettres. Une zone de ciel pâle sur fond clair, ou une ombre sur fond sombre, efface des morceaux de lettres. Choisissez le trajet --imt-from/--imt-to pour rester dans une zone contrastée, et une police très épaisse.
  • Mouvement réduit : avec prefers-reduced-motion: reduce, l'animation est retirée et l'image se fixe au centre (50% 50%).
  • Repli : si background-clip:text n'était pas pris en charge, le texte s'afficherait en violet clair (color:#c9a3f5) au lieu de disparaître.

Compatibilité navigateur

background-clip:text (préfixé -webkit- pour Chrome avant 120 et Safari avant 14), -webkit-text-fill-color, variables CSS dans @keyframes, image SVG en data URI. Mesuré dans Chromium, Firefox et WebKit (Playwright) : image visible dans les lettres et seulement dans les lettres (masquer le titre retire les pixels colorés), glissement, deux copies, arrêt en mouvement réduit, 390 px. Le remplissage par l'image marche dans des versions plus anciennes (Chrome 49, Firefox 49, Safari 9.1) ; les versions ci-dessous respectent aussi le mouvement réduit.

Chrome 74+✓ Complet (mesuré)
Firefox 63+✓ Complet (mesuré)
Safari 10.1+✓ Complet (mesuré dans WebKit)
Edge 79+✓ Complet (moteur Chromium)
Safari iOS 10.3+✓ Moteur WebKit, non vérifié sur appareil réel
Chrome Android 74+✓ Complet (moteur Chromium)

Sans prise en charge du découpage, le texte reste lisible en violet clair. Si l'image ne charge pas, le titre devient transparent : gardez l'image de votre titre principal sur le même domaine que la page.

Le code

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

index.html — structure
<div class="fx-0621-root">
  <div class="imt-card">
    <h2 class="imt-text">MASK</h2>
  </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
Image (CSS — --imt-image) coucher de soleil sur la mer (SVG intégré) url('photo.jpg') sur la racine, dans le HTML (style) ou votre CSS. Une photo contrastée et lumineuse donne les lettres les plus lisibles.
Taille du texte (CSS — --imt-size) 4rem Plus le texte est grand et épais, plus on reconnaît l'image.
Cadrage (CSS — --imt-fit) cover Taille du fond. 160% auto agrandit l'image et donne de la marge pour un trajet horizontal.
Trajet du glissement (CSS — --imt-from, --imt-to) 50% 10% → 50% 90% Positions de départ et d'arrivée de l'image, en aller-retour. Deux valeurs égales arrêtent le mouvement sur ce cadrage.
Durée d'un aller (CSS — --imt-speed) 8s Plus long = mouvement plus discret ; en dessous de 4 s, l'image défile vite derrière le texte.
Carte (CSS — --imt-card, --imt-width, --imt-min-h) #12121a / 280px / 180px transparent, 100% et 0px retirent la carte : le titre se pose directement dans votre mise en page.
Fond et hauteur du bloc (CSS — --imt-page, --imt-height) #0a0a0f / 300px transparent et 0px pour intégrer l'effet dans une section existante.

FAQ

Sur la racine : <div class="fx-0621-root" style="--imt-image:url('ile.jpg')">. L'image est cadrée en cover sur la boîte du texte : une photo de 1 200 px de large suffit pour un titre de pleine largeur. Préférez une image sur votre propre domaine, chargée vite : tant qu'elle n'est pas là, le titre est transparent.
Elles tombent sur une zone de la photo de la même couleur que le fond autour (ciel blanc sur page blanche, ombre sur page noire). Déplacez le trajet avec --imt-from et --imt-to vers une zone contrastée, ou changez --imt-card pour une carte de couleur opposée.
Oui : racine.style.setProperty('--imt-image', 'url(motif.png)') remplace l'image instantanément, sans toucher au texte. Pour faire suivre un aperçu à un vrai bouton, lisez son image avec getComputedStyle(bouton).backgroundImage et passez-la telle quelle.