Ombres portées SVG


<defs> et <filter>

Tous les filtres SVG sont définis dans un élément <defs>. L'élément <defs> est l'abréviation de définitions et contient la définition d'éléments spéciaux (tels que des filtres).

L'élément <filter> est utilisé pour définir un filtre SVG. L'élément <filter> a un attribut id obligatoire qui identifie le filtre. Le graphique pointe alors vers le filtre à utiliser.


SVG <feOffset>

Exemple 1

L'élément <feOffset> est utilisé pour créer des effets d'ombre portée. L'idée est de prendre un graphique SVG (image ou élément) et de le déplacer un peu dans le plan xy.

Le premier exemple décale un rectangle (avec <feOffset>), puis fusionne l'original au-dessus de l'image décalée (avec <feBlend>) :

feoffset

Voici le code SVG :

Exemple

<svg height="120" width="120">
  <defs>
    <filter id="f1" x="0" y="0" width="200%" height="200%">
      <feOffset result="offOut" in="SourceGraphic" dx="20" dy="20" />
      <feBlend in="SourceGraphic" in2="offOut" mode="normal" />
    </filter>
  </defs>
  <rect width="90" height="90" stroke="green" stroke-width="3"
  fill="yellow" filter="url(#f1)" />
</svg>

Explication du code :

  • L'attribut id de l'élément <filter> définit un nom unique pour le filtre
  • L'attribut filter de l'élément <rect> relie l'élément au filtre "f1"


Exemple 2

Maintenant, l'image décalée peut être floutée (avec <feGaussianBlur>) :

feoffset2

Voici le code SVG :

Exemple

<svg height="140" width="140">
  <defs>
    <filter id="f2" x="0" y="0" width="200%" height="200%">
      <feOffset result="offOut" in="SourceGraphic" dx="20" dy="20" />
      <feGaussianBlur result="blurOut" in="offOut" stdDeviation="10" />
      <feBlend in="SourceGraphic" in2="blurOut" mode="normal" />
    </filter>
  </defs>
  <rect width="90" height="90" stroke="green" stroke-width="3"
  fill="yellow" filter="url(#f2)" />
</svg>

Explication du code :

  • L'attribut stdDeviation de l'élément <feGaussianBlur> définit la quantité de flou

Exemple 3

Maintenant, rendez l'ombre noire :

feoffset3

Voici le code SVG :

Exemple

<svg height="140" width="140">
  <defs>
    <filter id="f3" x="0" y="0" width="200%" height="200%">
      <feOffset result="offOut" in="SourceAlpha" dx="20" dy="20" />
      <feGaussianBlur result="blurOut" in="offOut" stdDeviation="10" />
      <feBlend in="SourceGraphic" in2="blurOut" mode="normal" />
    </filter>
  </defs>
  <rect width="90" height="90" stroke="green" stroke-width="3"
  fill="yellow" filter="url(#f3)" />
</svg>

Explication du code :

  • L'attribut in de l'élément <feOffset> est changé en "SourceAlpha" qui utilise le canal Alpha pour le flou au lieu du pixel RGBA entier

Exemple 4

Maintenant, traitez l'ombre comme une couleur :

feoffset4

Voici le code SVG :

Exemple

<svg height="140" width="140">
  <defs>
    <filter id="f4" x="0" y="0" width="200%" height="200%">
      <feOffset result="offOut" in="SourceGraphic" dx="20" dy="20" />
      <feColorMatrix result="matrixOut" in="offOut" type="matrix"
      values="0.2 0 0 0 0 0 0.2 0 0 0 0 0 0.2 0 0 0 0 0 1 0" />
      <feGaussianBlur result="blurOut" in="matrixOut" stdDeviation="10" />
      <feBlend in="SourceGraphic" in2="blurOut" mode="normal" />
    </filter>
  </defs>
  <rect width="90" height="90" stroke="green" stroke-width="3"
  fill="yellow" filter="url(#f4)" />
</svg>

Explication du code :

  • Le filtre <feColorMatrix> est utilisé pour transformer les couleurs de l'image décalée plus près du noir. Les trois valeurs de '0.2' dans la matrice sont toutes multipliées par les canaux rouge, vert et bleu. Réduire leurs valeurs rapproche les couleurs du noir (le noir vaut 0)