SVG slagschaduwen


<defs> en <filter>

Alle SVG-filters worden gedefinieerd binnen een <defs>-element. Het <defs>-element is een afkorting voor definities en bevat definitie van speciale elementen (zoals filters).

Het element <filter> wordt gebruikt om een ​​SVG-filter te definiëren. Het <filter>-element heeft een vereist id-attribuut dat het filter identificeert. De afbeelding wijst vervolgens naar het te gebruiken filter.


SVG <feOffset>

voorbeeld 1

Het element <feOffset> wordt gebruikt om slagschaduweffecten te creëren. Het idee is om een ​​SVG-afbeelding (afbeelding of element) te nemen en deze een klein beetje in het xy-vlak te verplaatsen.

Het eerste voorbeeld verschuift een rechthoek (met <feOffset>), en mengt vervolgens het origineel bovenop de offset-afbeelding (met <feBlend>):

compensatie

Hier is de SVG-code:

Voorbeeld

<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>

Code uitleg:

  • Het id attribuut van het <filter> element definieert een unieke naam voor het filter
  • Het filter attribuut van het <rect> element koppelt het element aan het "f1" filter


Voorbeeld 2

Nu kan de offset-afbeelding worden vervaagd (met <feGaussianBlur>):

feoffset2

Hier is de SVG-code:

Voorbeeld

<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>

Code uitleg:

  • Het kenmerk stdDeviation van het element <feGaussianBlur> definieert de mate van vervaging

Voorbeeld 3

Maak nu de schaduw zwart:

feoffset3

Hier is de SVG-code:

Voorbeeld

<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>

Code uitleg:

  • Het in-attribuut van het <feOffset>-element wordt gewijzigd in "SourceAlpha", dat het alfakanaal gebruikt voor de vervaging in plaats van de hele RGBA-pixel

Voorbeeld 4

Behandel nu de schaduw als een kleur:

feoffset4

Hier is de SVG-code:

Voorbeeld

<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>

Code uitleg:

  • Het <feColorMatrix>-filter wordt gebruikt om de kleuren in de offsetafbeelding dichter bij zwart te transformeren. De drie waarden van '0,2' in de matrix worden allemaal vermenigvuldigd met de rode, groene en blauwe kanalen. Door hun waarden te verlagen, komen de kleuren dichter bij zwart (zwart is 0)