Saltar al contenido

Sombras proyectadas en SVG

Descripción de los filtros SVG

Todos los filtros SVG se definen dentro de un <defs> elemento. El elemento <defs> es la abreviatura de "definiciones". Contiene la definición de elementos específicos como los filtros. El elemento <filter> define un filtro SVG. Este elemento tiene un atributo id (obligatorio) que identifica el filtro.

Para crear sombras proyectadas, utiliza el elemento <feOffset>. Necesitarás tomar un gráfico SVG y moverlo en el plano xy.

Ejemplo del elemento SVG <feOffset>:

Sombras proyectadas en SVG

html
<!DOCTYPE html>
<html>
  <head>
    <title>Title of the document</title>
  </head>
  <body>
    <svg width="150" height="150">
      <defs>
        <filter id="filter" x="0" y="0" width="150%" height="150%">
          <feOffset result="offOut" in="SourceGraphic" dx="30" dy="30" />
          <feBlend in="SourceGraphic" in2="offOut" mode="normal" />
        </filter>
      </defs>
      <rect width="110" height="110" stroke="purple" stroke-width="5" fill="pink" 
            filter="url(#filter)" /> 
      Sorry, your browser doesn't support inline SVG.
    </svg>
  </body>
</html>

En el ejemplo mencionado anteriormente, el atributo id del elemento <filter> especifica un nombre único para el filtro, y el atributo filter del elemento <rect> vincula el elemento al filtro "filter".

Ejemplo del elemento SVG <feGaussianBlur>:

Sombras proyectadas en SVG

html
<!DOCTYPE html>
<html>
  <head>
    <title>Title of the document</title>
  </head>
  <body>
    <svg width="200" height="200">
      <defs>
        <filter id="filter" x="0" y="0" width="250%" height="250%">
          <feOffset result="offOut" in="SourceGraphic" dx="30" dy="30" />
          <feGaussianBlur result="blurOut" in="offOut" stdDeviation="10" />
          <feBlend in="SourceGraphic" in2="blurOut" mode="normal" />
        </filter>
      </defs>
      <rect width="150" height="150" stroke="coral" stroke-width="5" fill="pink" 
            filter="url(#filter)" /> 
      Sorry, your browser doesn't support inline SVG.
    </svg>
  </body>
</html>

Aquí, es posible desenfocar la imagen desplazada con el elemento <feGaussianBlur>. El atributo stdDeviation de este elemento especifica la cantidad de desenfoque.

En el siguiente ejemplo, el atributo in del elemento <feOffset> se cambia a "SourceAlpha". Utiliza el canal Alfa para aplicar el desenfoque en lugar de a todo el píxel RGBA.

Ejemplo de colorización de la sombra:

Sombras proyectadas en SVG

html
<!DOCTYPE html>
<html>
  <head>
    <title>Title of the document</title>
  </head>
  <body>
    <svg height="200" width="200">
      <defs>
        <filter id="filter" x="0" y="0" width="150%" height="150%">
          <feOffset result="offOut" in="SourceAlpha" dx="15" dy="15" />
          <feGaussianBlur result="blurOut" in="offOut" stdDeviation="8" />
          <feBlend in="SourceGraphic" in2="blurOut" mode="normal" />
        </filter>
      </defs>
      <rect width="120" height="120" stroke="purple" stroke-width="5" fill="pink" 
            filter="url(#filter)" /> 
       Sorry, your browser doesn't support inline SVG.
    </svg>
  </body>
</html>

Para transformar los colores en la imagen desplazada, utiliza el elemento <feColorMatrix>.

Ejemplo del elemento <feColorMatrix>:

Sombras proyectadas en SVG

html
<!DOCTYPE html>
<html>
  <head>
    <title>Title of the document</title>
  </head>
  <body>
    <svg height="200" width="200">
      <defs>
        <filter id="filter" x="0" y="0" width="150%" height="150%">
          <feOffset result="offOut" in="SourceGraphic" dx="25" dy="25" />
          <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="9" />
          <feBlend in="SourceGraphic" in2="blurOut" mode="normal" />
        </filter>
      </defs>
      <rect width="150" height="150" stroke="purple" stroke-width="5" fill="lightblue" 
            filter="url(#filter)" /> 
       Sorry, your browser doesn't support inline SVG.
    </svg>
  </body>
</html>

Práctica

¿Qué enseña el artículo 'Sombras proyectadas en SVG' de W3Docs?

¿Te resulta útil?

Vista previa dual-run — compárala con las rutas Symfony en producción.