/ marion.dev

Design web · CSS · SVG

Exploiter toute la puissance des filtres SVG pour la typographie

Transformer le moteur de rendu du navigateur en outil de composition graphique vectorielle grâce aux filtres SVG personnalisés.

FILTRES SVG

Au-delà des filtres CSS classiques

En intégration web, la propriété CSS filter est souvent associée à des ajustements basiques comme blur(), drop-shadow() ou grayscale(). Pourtant, en la couplant à la déclaration de filtres SVG personnalisés avec <filter>, le navigateur devient un véritable outil de composition graphique vectorielle.

L’un des cas d’usage les plus révélateurs concerne les titres massifs à contours complexes, difficiles à maîtriser avec les propriétés CSS standards.

Le problème de -webkit-text-stroke

Sur un titre où les lettres sont collées ou dont l’intérieur est transparent, le contour CSS échoue pour deux raisons.

Le dessin séquentiel

Chaque caractère et son contour sont dessinés séparément. Lors d’un chevauchement, la bordure d’une lettre peut recouvrir le corps de la précédente.

Le centrage du tracé

La moitié du contour entre dans le glyphe. Avec une opacité réduite, cette partie interne reste visible et dénature la couleur du texte.

Traiter le mot comme un masque global

La solution consiste à ne plus voir le texte comme une suite de lettres, mais comme une forme vectorielle unique. Le filtre intercepte le SourceGraphicavant son affichage et lui applique un pipeline de cinq primitives.

  1. 1feMorphology

    Dilate la silhouette globale du mot.

  2. 2feComposite · out

    Soustrait le texte original pour évider le centre.

  3. 3feFlood + composite

    Applique la couleur uniquement sur le contour.

  4. 4feComponentTransfer

    Règle indépendamment l’opacité du texte intérieur.

  5. 5feMerge

    Superpose le contour et le texte traité.

Étape 1

La dilatation avec feMorphology

L’opérateur dilate étend tous les pixels du texte vers l’extérieur selon la valeur de radius. Il produit une forme pleine, plus massive, dans laquelle les espaces entre les lettres chevauchées sont comblés.

Étape 2

La soustraction avec feComposite

L’opérateur out agit comme un emporte-pièce : il découpe le texte d’origine dans la forme élargie. Le centre disparaît réellement et laisse un contour pur, sans pixels susceptibles de déborder dans le glyphe.

Étape 3

La coloration du contour

feFlood crée une surface de couleur unie. Un second feComposite, cette fois avec l’opérateur in, confine cette couleur à l’intérieur de l’anneau créé à l’étape précédente.

Étape 4

Le traitement de l’intérieur

feComponentTransfer isole le texte d’origine pour modifier son canal alpha. Une pente de 0.3 réduit son opacité à 30 %, indépendamment du contour extérieur.

Étape 5

La fusion finale avec feMerge

Les deux couches sont empilées : d’abord le contour coloré, puis le texte ajusté. Le résultat est un mot unifié, entouré proprement, dont l’intérieur reste totalement indépendant.

Code source d’implémentation

Le filtre peut être déclaré une seule fois dans un SVG invisible, puis appliqué à n’importe quel élément HTML avec la propriété CSS filter.

HTML · Déclaration du filtre
<svg
  style="position: absolute; width: 0; height: 0; pointer-events: none;"
  aria-hidden="true"
>
  <filter
    id="hollow-stroke"
    x="-40%"
    y="-40%"
    width="180%"
    height="180%"
    color-interpolation-filters="sRGB"
  >
    <!-- Étape 1 : Élargissement global de la silhouette -->
    <feMorphology
      operator="dilate"
      radius="2"
      in="SourceGraphic"
      result="base-elargie"
    />

    <!-- Étape 2 : Évidage du centre par soustraction -->
    <feComposite
      in="base-elargie"
      in2="SourceGraphic"
      operator="out"
      result="contour-seul"
    />

    <!-- Étape 3 : Coloration du contour -->
    <feFlood flood-color="#7000FF" result="couleur-bordure" />
    <feComposite
      in="couleur-bordure"
      in2="contour-seul"
      operator="in"
      result="bordure-finale"
    />

    <!-- Étape 4 : Opacité du texte intérieur -->
    <feComponentTransfer in="SourceGraphic" result="fond-transparent">
      <feFuncA type="linear" slope="0.3" />
    </feComponentTransfer>

    <!-- Étape 5 : Fusion des calques -->
    <feMerge>
      <feMergeNode in="bordure-finale" />
      <feMergeNode in="fond-transparent" />
    </feMerge>
  </filter>
</svg>
CSS · Application
.titre-fusion {
  color: #7000FF;
  filter: url(#hollow-stroke);

  font-size: 140px;
  font-weight: 900;
  letter-spacing: -12px;
  line-height: 0.85;
}

Que peut-on créer d’autre ?

Effet gooey

Un flou gaussien associé à une matrice de couleur permet à plusieurs formes de se souder comme des gouttes de mercure.

Grain et textures organiques

feTurbulence génère du bruit de Perlin pour créer du grain, du papier rétro, de la réfraction ou du verre dépoli.

Déformation et distorsion

feDisplacementMap déplace les pixels à partir d’une texture pour produire des effets de glitch, d’ondulation ou d’encre.

Ombre portée interne

En combinant décalage, flou et composition, le filtre applique une ombre à l’intérieur d’une silhouette complexe.

Conclusion

Les filtres SVG constituent une passerelle puissante entre design graphique et intégration web. Leur logique demande une compréhension progressive des primitives de composition, mais le résultat reste vectoriel, accessible aux lecteurs d’écran et parfaitement adapté aux Design Systems modernes.

Voir les autres articles