Patrones en trazos

El atributo stroke-dasharray de SVG


Existen una serie de atributos SVG llamdos stroke-dasharray y stroke-dashoffset, que nos permiten definir patrones en el trazado de figuras y formas, de modo que luego, incluso, podemos llegar a animarlas.

Estas propiedades son muy potentes y vamos a ver algunos ejemplos de como trabajar con ellas. Las propiedades son las siguientes:

Atributo Descripción
stroke-dasharray Define un patrón de trazado discontinuo (trazo y espacio).
stroke-dashoffset Define un desplazamiento al stroke-dasharray asociado.

Veamos cada una por separado.

El atributo stroke-dasharray

Este atributo nos permite crear un patrón de trazo a partir de una imagen o forma. Por ejemplo, observa este ejemplo, donde aún no hemos aplicado el atributo stroke-dasharray. Observa la forma del trazo:

<svg viewBox="0 0 30 30" height="250">
  <path d="M5 3 L25 3 L25 22 L15 18 L5 22" />
  <text x="3" y="27" font-size="3">sin stroke-dasharray</text>
</svg>
svg {
  background: #aaa;
}
path {
  stroke: black;
  stroke-width: 2px;
  fill: none;
}

Como puedes ver, el trazo es continuo, del mismo color, y al no tener stroke-dasharray definido, aún no se puede ver ningún patron en el trazo.

Vamos a aplicarle un stroke-dasharray para ver como quedaría:

<svg viewBox="0 0 30 30" height="250">
  <path d="M5 3 L25 3 L25 22 L15 18 L5 22" stroke-dasharray="3 1" />
  <text x="13" y="27" font-size="3">3 1</text>
</svg>
svg {
  background: #aaa;
}
path {
  stroke: black;
  stroke-width: 2px;
  fill: none;
}

Observa que ahora tenemos una línea de trazo discontinua. Esto ocurre porque hemos establecido el valor 3 1 al atributo stroke-dasharray, por lo que el navegador va a establecerle un trazo donde hay un primer fragmento de 3 unidades de tamaño trazado, seguido de un fragmento de 1 unidad de tamaño sin trazar, y este patrón se repetirá de forma infinita.

Obsera el siguiente ejemplo, donde utilizamos los patrones 3 3 (mismo tamaño para fragmento con trazo y sin trazo), 6 3 2 1 y 9 2. Observa como quedaría cada uno de ellos:

<svg viewBox="0 0 30 30" height="250">
  <path d="M5 3 L25 3 L25 22 L15 18 L5 22" stroke-dasharray="3 3" />
  <text x="13" y="27" font-size="3">3 3</text>
</svg>

<svg viewBox="0 0 30 30" height="250">
  <path d="M5 3 L25 3 L25 22 L15 18 L5 22" stroke-dasharray="6 3 2 1" />
  <text x="10" y="27" font-size="3">6 3 2 1</text>
</svg>

<svg viewBox="0 0 30 30" height="250">
  <path d="M5 3 L25 3 L25 22 L15 18 L5 22" stroke-dasharray="9 2" />
  <text x="13" y="27" font-size="3">8 2</text>
</svg>

Piensa que podemos utilizar fragmentos con tamaños muy variables para luego desplazarlos y modificarlos, como veremos en el siguiente apartado.

El atributo stroke-dashoffset

El atributo stroke-dashoffset se puede utilizar conjuntamente al atributo anterior, y es muy útil, sobre todo, para animar los trazos de una figura o forma. Básicamente, el atributo stroke-dashoffset establece un desplazamiento al principio del trazo, haciendo que el inicio del trazo discontinuo comience el número de píxeles más tarde que se indique.

<svg viewBox="0 0 30 30" height="250">
  <path d="M5 5 L25 5 L25 25 L15 20 L5 25" stroke-dasharray="3 3" stroke-dashoffset="3">
</svg>

<fieldset>
  <legend>Propiedad stroke-dashoffset:</legend>
  <input type="range" min="-20" max="20" step="1" value="3">
  <output>1</output>
</fieldset>
const paths = document.querySelectorAll("path");
const input = document.querySelector("input");
input.addEventListener("input", () => {
  input.nextElementSibling.value = input.value;
  paths.forEach(path => path.setAttribute("stroke-dashoffset", input.value));
});
svg {
  background: #aaa;
}
path {
  stroke: black;
  stroke-width: 2px;
  fill: none;
}

Esto puede ser especialmente interesante si tienes un primero y/o segundo fragmento lo suficientemente grande, como para que el desplazamiento de la impresión de que se está dibujando el trazo, en lugar de moviéndose. Observa este ejemplo donde se muestra este comportamiento, moviendo desde -64 hasta 0.

<svg viewBox="0 0 30 30" height="250">
  <path d="M5 5 L25 5 L25 25 L15 20 L5 25" stroke-dasharray="100 9000" stroke-dashoffset="0">
</svg>

<fieldset>
  <legend>Propiedad stroke-dashoffset:</legend>
  <input type="range" min="-64" max="0" step="1" value="-64">
  <output>-64</output>
</fieldset>
const paths = document.querySelectorAll("path");
const input = document.querySelector("input");
input.addEventListener("input", () => {
  input.nextElementSibling.value = input.value;
  paths.forEach(path => path.setAttribute("stroke-dashoffset", input.value));
});
svg {
  background: #aaa;
}
path {
  stroke: black;
  stroke-width: 2px;
  fill: none;
}

¿Quién soy yo?

Soy Manz, vivo en Tenerife (España) y soy streamer partner en Twitch y profesor. Me apasiona el universo de la programación web, el diseño y desarrollo web y la tecnología en general. Aunque soy full-stack, mi pasión es el front-end, la terminal y crear cosas divertidas y locas.

Puedes encontrar más sobre mi en Manz.dev