<Blog author="salteadorneo" />

<!-- Cristian Adán - Full stack developer -->

SVG adaptables a temas claro y oscuro

SVG adaptables a temas claro y oscuro

#web #svg #favicon #css

Los SVG son una excelente opción para crear iconos adaptables a temas claro y oscuro. En este artículo, te mostraré cómo puedes crear un favicon SVG que cambie de color en función del tema claro u oscuro del sistema operativo del usuario.

Cómo detectar el tema claro y oscuro del sistema operativo

Para detectar si el usuario prefiere un tema claro u oscuro en su sistema operativo, puedes utilizar la pseudo-clase prefers-color-scheme de CSS. Esta pseudo-clase permite aplicar estilos en función del tema claro u oscuro del sistema operativo del usuario.

Aquí tienes un ejemplo de un SVG que cambia de color en función del tema claro u oscuro:

Tema claroTema oscuro

Aquí tienes el código SVG del ejemplo anterior:

<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 -960 960 960">
    <path d="M182-200q-51 0-79-35.5T82-322l42-300q9-60 53.5-99T282-760h396q60 0 104.5 39t53.5 99l42 300q7 51-21 86.5T778-200q-21 0-39-7.5T706-230l-90-90H344l-90 90q-15 15-33 22.5t-39 7.5Zm16-86 114-114h336l114 114q2 2 16 6 11 0 17.5-6.5T800-304l-44-308q-4-29-26-48.5T678-680H282q-30 0-52 19.5T204-612l-44 308q-2 11 4.5 17.5T182-280q2 0 16-6Zm482-154q17 0 28.5-11.5T720-480q0-17-11.5-28.5T680-520q-17 0-28.5 11.5T640-480q0 17 11.5 28.5T680-440Zm-80-120q17 0 28.5-11.5T640-600q0-17-11.5-28.5T600-640q-17 0-28.5 11.5T560-600q0 17 11.5 28.5T600-560ZM310-440h60v-70h70v-60h-70v-70h-60v70h-70v60h70v70Zm170-40Z"/>
    <style>
        path { fill: #000; }
        @media (prefers-color-scheme: dark) {
            path { fill: #FFF; }
        }
    </style>
</svg>

Cómo crear un favicon SVG adaptable

Puedes usar el código SVG anterior para crear un favicon adaptable a temas claro y oscuro. Solo tienes que añadir el código SVG en la etiqueta <head> de tu página web:

<link rel="icon" type="image/svg+xml" href="favicon.svg">

Un buen ejemplo de uso es el favicon SVG de Astro.

Tema claroTema oscuro

Modifican solamente el fill de g en el SVG original. Aquí tienes el código SVG del ejemplo anterior:

<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 128 128">
  <g>
    <path d="M47.7 107.1c-5.5-5-7.2-15.7-4.9-23.4 4 4.9 9.6 6.4 15.4 7.3 8.9 1.3 17.6.8 25.9-3.2l2.8-1.7a18 18 0 0 1-7.2 20l-5.5 3.8c-5.6 3.8-7.2 8.2-5 14.7l.2.7a14 14 0 0 1-6.6-5.6 15.8 15.8 0 0 1-2.6-8.6c0-1.5 0-3-.2-4.5-.5-3.7-2.2-5.3-5.5-5.4-3.3-.1-5.9 2-6.6 5.2l-.2.7Z" />
    <path d="M16 82.4s16.5-8 33-8l12.4-38.3c.5-2 1.8-3.2 3.3-3.2 1.6 0 3 1.3 3.4 3.2l12.4 38.3c19.6 0 33 8 33 8l-28-76c-.8-2.3-2.2-3.7-4-3.7H48c-1.8 0-3.1 1.4-4 3.7l-28 76Z" />
  </g>
  <path fill="url(#a)" d="M47.7 107.1c-5.5-5-7.2-15.7-4.9-23.4 4 4.9 9.6 6.4 15.4 7.3 8.9 1.3 17.6.8 25.9-3.2l2.8-1.7a18 18 0 0 1-7.2 20l-5.5 3.8c-5.6 3.8-7.2 8.2-5 14.7l.2.7a14 14 0 0 1-6.6-5.6 15.8 15.8 0 0 1-2.6-8.6c0-1.5 0-3-.2-4.5-.5-3.7-2.2-5.3-5.5-5.4-3.3-.1-5.9 2-6.6 5.2l-.2.7Z" />
  <defs>
    <linearGradient id="a" x1="64.7" x2="77.4" y1="119.2" y2="77.4" gradientUnits="userSpaceOnUse">
      <stop stop-color="#D83333" />
      <stop offset="1" stop-color="#F041FF" />
    </linearGradient>
  </defs>
  <style>
    g {
      fill: #000;
    }
    @media (prefers-color-scheme: dark) {
      g {
        fill: #FFF;
      }
    }
  </style>
</svg>
¡Comparte!