Sombras paralelas SVG


<defs> y <filtro>

Todos los filtros SVG se definen dentro de un elemento <defs>. El elemento <defs> es la abreviatura de definiciones y contiene definiciones de elementos especiales (como filtros).

El elemento <filter> se utiliza para definir un filtro SVG. El elemento <filter> tiene un atributo de id obligatorio que identifica el filtro. El gráfico luego apunta al filtro a usar.


SVG <feOffset>

Ejemplo 1

El elemento <feOffset> se utiliza para crear efectos de sombra paralela. La idea es tomar un gráfico SVG (imagen o elemento) y moverlo un poco en el plano xy.

El primer ejemplo compensa un rectángulo (con <feOffset>), luego fusiona el original sobre la imagen compensada (con <feBlend>):

feoffset

Aquí está el código SVG:

Ejemplo

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

Explicación del código:

  • El atributo id del elemento <filter> define un nombre único para el filtro
  • El atributo de filtro del elemento <rect> vincula el elemento al filtro "f1"


Ejemplo 2

Ahora, la imagen desplazada se puede desenfocar (con <feGaussianBlur>):

feoffset2

Aquí está el código SVG:

Ejemplo

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

Explicación del código:

  • El atributo stdDeviation del elemento <feGaussianBlur> define la cantidad de desenfoque

Ejemplo 3

Ahora, haz la sombra negra:

feoffset3

Aquí está el código SVG:

Ejemplo

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

Explicación del código:

  • El atributo de entrada del elemento <feOffset> se cambia a "SourceAlpha", que usa el canal alfa para el desenfoque en lugar de todo el píxel RGBA

Ejemplo 4

Ahora, trata la sombra como un color:

feoffset4

Aquí está el código SVG:

Ejemplo

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

Explicación del código:

  • El filtro <feColorMatrix> se utiliza para transformar los colores de la imagen desplazada más cerca del negro. Los tres valores de '0.2' en la matriz se multiplican por los canales rojo, verde y azul. Reducir sus valores acerca los colores al negro (el negro es 0)