Rellenos y trazos en SVG – atributos y ejemplos

El relleno y el trazo son las dos operaciones de pintura básicas en SVG. Las formas, paths y textos pueden usar fill para la pintura interior y stroke para el contorno. Ambos pueden aplicarse como atributos de presentación, por ejemplo fill="red", o dentro del atributo CSS style.

Este artículo explica cómo funcionan fill y stroke en SVG, aclara la diferencia entre propiedades y atributos, y muestra formas prácticas de controlar color, opacidad, ancho de línea, extremos, uniones y patrones de guiones.

En este artículo aprenderás a:

  • Usar fill para pintar el interior de formas, paths y texto SVG.
  • Usar stroke y stroke-width para dibujar contornos.
  • Controlar extremos de trazo, uniones, patrones de guiones y opacidad.
  • Elegir entre atributos de presentación y estilos CSS en línea.
  • Evitar errores comunes de fill y stroke, como el relleno negro predeterminado o trazos invisibles.

Modelo de pintura SVG – fill y stroke

Cuando se renderiza una forma SVG, la pintura ocurre en dos pasos:

  1. Primero se aplica el fill, que pinta el interior de la forma.
  2. Después se aplica el stroke, que pinta el contorno centrado sobre el path de la forma.

Tanto el relleno como el trazo son opcionales:

Para especificar colores SVG, puedes usar nombres de color, valores HEX, valores RGB, currentColor, gradientes o patrones. Los ejemplos siguientes muestran varias formas de escribir valores de fill y stroke en marcado SVG.

Propiedades y atributos en SVG

En SVG, fill y stroke se definen como propiedades CSS, pero pueden aplicarse de distintas formas.

ConceptoEjemplo
Propiedad CSSfill, stroke, stroke-width
Atributo de presentaciónfill="red" stroke="#00ff00" stroke-width="2"
CSS en líneastyle="fill:red; stroke:#00ff00; stroke-width:2"

En este artículo:

Usa atributos de presentación para marcado SVG simple y CSS en línea cuando varias propiedades de estilo deban permanecer juntas en el mismo elemento. Ambas formas son habituales en archivos SVG.

Cómo usar fill y stroke en SVG

  1. Elige el elemento SVG que debe pintarse, como <path>, <rect>, <circle>, <polyline> o <text>.
  2. Define fill para pintar el interior, o usa fill="none" cuando solo deba verse el contorno.
  3. Define stroke para establecer el color del contorno.
  4. Define stroke-width para hacer visible el contorno y controlar su grosor.
  5. Añade stroke-linecap, stroke-linejoin o stroke-dasharray cuando el contorno necesite una forma o patrón específico.
  6. Usa fill-opacity y stroke-opacity cuando el relleno y el trazo necesiten valores de transparencia separados.

SVG Fill

La propiedad fill define cómo se pinta el interior de una forma o texto. Se aplica a formas SVG como <rect>, <circle>, <path> y elementos de texto. Si fill no se especifica, el valor predeterminado es black.

ValorDescripciónEjemplo
valor de colorRellena la forma con un color sólidofill="red"
noneDesactiva el rellenofill="none"
url(#id)Usa un servidor de pintura (gradiente o patrón)fill="url(#gradient1)"
currentColorUsa el color de texto actualfill="currentColor"

El ejemplo siguiente compara un path con fill="none" y el mismo path sin un relleno explícito ( two-paths.svg):

1<svg height="400" width="800" xmlns="http://www.w3.org/2000/svg">
2    <path d="M 10 100 Q 25 10 180 100 T 250 100 T 300 100 T 390 130" stroke="red" stroke-width="3" fill="none" />
3    <path d="M 10 100 Q 25 10 180 100 T 250 100 T 300 100 T 390 130" stroke="red" stroke-width="3" transform="translate(0 125)" />
4</svg>

Dos paths SVG comparan fill none y el relleno negro predeterminado

SVG Stroke

La propiedad stroke define la pintura usada para el contorno de una forma. A diferencia de fill, stroke está desactivado de forma predeterminada. El trazo se centra sobre el path de la forma y se extiende por igual hacia dentro y hacia fuera.

Color y ancho del trazo

PropiedadDescripciónEjemplo
strokeDefine el color del trazostroke="red"
stroke-widthControla el grosor del trazostroke-width="5"

Valores de stroke-linecap

En cualquier línea se puede definir la forma de sus extremos. La propiedad stroke-linecap define cómo se renderizan los extremos de una línea SVG y tiene tres valores posibles:

ValorAspecto
buttBorde plano que termina exactamente en el punto final del path.
squareBorde plano que se extiende medio stroke-width más allá del punto final.
roundExtremo semicircular cuyo radio equivale a la mitad del stroke-width.

El efecto se aprecia cuando la línea tiene un stroke-width visible. El ejemplo siguiente muestra cómo stroke-width y stroke-linecap definen el grosor del trazo y la forma del extremo ( lines.svg).

 1<svg height="200" width="800" xmlns="http://www.w3.org/2000/svg">
 2  <g stroke="grey">
 3    <path stroke-width="3" d="M 5 20 l 215 0" />
 4    <path stroke-width="15" d="M 5 60 l 215 0" />
 5    <path stroke-width="30" d="M 5 100 l 215 0" />
 6  </g>
 7 <g stroke="grey" stroke-width="30">
 8    <path stroke-linecap="butt" d="M 300 20 l 215 0" />
 9    <path stroke-linecap="round" d="M 300 60 l 215 0" />
10    <path stroke-linecap="square" d="M 300 100 l 215 0" />
11  </g>
12  <g stroke="orange" stroke-width="2">
13    <line x1="300" y1="20" x2="515" y2="20" />
14    <path d="M 300 60 l 215 0" />
15    <path d="M 300 100 l 215 0" />
16  </g>
17</svg>

En el ejemplo, el elemento <g> define propiedades compartidas, como stroke y stroke-width, para varios paths hijos.

Dos conjuntos de líneas SVG con diferentes valores de ancho y propiedades stroke-linecap

En el ejemplo anterior, las líneas guía naranjas muestran los paths originales, y los trazos grises muestran cómo el ancho del trazo y los extremos cambian el resultado renderizado.

Valores de stroke-linejoin

La propiedad stroke-linejoin controla la forma de las esquinas donde se unen dos segmentos de trazo. Puede usar tres valores comunes:

ValorDescripción
miterExtiende los bordes exteriores hasta formar una esquina (predeterminado).
roundRedondea la esquina con un radio de la mitad del ancho del trazo.
bevelCorta la esquina y crea un borde plano.

El siguiente ejemplo ilustra los valores de stroke-linejoin ( linejoin.svg):

 1<svg width="300" height="300" xmlns="http://www.w3.org/2000/svg">
 2    <g stroke-width="20" fill="none">
 3        <polyline points="40 60 80 20 120 60 160 20 200 60 240 20" stroke="grey" stroke-linecap="butt"  stroke-linejoin="miter" />
 4        <polyline points="40 140 80 100 120 140 160 100 200 140 240 100" stroke="#CD5C5C" stroke-linecap="round" stroke-linejoin="round" />
 5        <polyline points="40 220 80 180 120 220 160 180 200 220 240 180" stroke="black"  stroke-linecap="square" stroke-linejoin="bevel" />
 6    </g>
 7    <g fill="none" stroke="orange" stroke-width="2">
 8        <polyline points="40 60 80 20 120 60 160 20 200 60 240 20" />
 9        <polyline points="40 140 80 100 120 140 160 100 200 140 240 100" />
10        <polyline points="40 220 80 180 120 220 160 180 200 220 240 180" />
11    </g>
12</svg>

Tres polilíneas con diferentes propiedades stroke-linejoin

La línea naranja muestra la polilínea original, mientras que el contorno coloreado más ancho muestra el trazo renderizado alrededor de ella.

Puntos y guiones – stroke-dasharray

Todas las propiedades de trazo SVG pueden aplicarse a cualquier tipo de línea, texto y contornos de elementos como círculos o rectángulos. La propiedad stroke-dasharray convierte un trazo sólido en una secuencia de guion y espacio. El atributo acepta una lista de números que definen longitudes alternas de guiones y espacios en unidades de usuario, normalmente píxeles.

1stroke-dasharray="10 5"   /* guion 10, espacio 5 */
2stroke-dasharray="20 10 5"/* guion 20, espacio 10, guion 5, luego se repite */
PropiedadDescripción
stroke-dasharrayDefine el patrón de guiones y espacios
stroke-dashoffsetDesplaza el patrón de guiones

Ejemplo de uso de stroke-dasharray ( dasharray.svg):

1<svg width="400" height="300" xmlns="http://www.w3.org/2000/svg">
2    <line x1="20" y1="30" x2="400" y2="30" style="stroke:rgb(112, 128, 144); fill:none; stroke-width:10; stroke-dasharray:10 5;" />
3    <line x1="20" y1="80" x2="400" y2="80" style="stroke:olive; fill:none; stroke-width: 20; stroke-dasharray: 20 10 5;" />
4    <path d="M 10 200 Q 50 100 150 200 T 230 200 T 300 200 T 390 200" stroke="#FF8C00" stroke-width="8" fill="none" stroke-linecap="round" stroke-dasharray="15 10 2 8" />
5</svg>

Para las líneas gris y naranja, el patrón de guiones usa un número par de valores: cada par representa longitud del guion y longitud del espacio. Si la lista tiene un número impar de valores, SVG repite la lista para formar un patrón par. Por ejemplo, 20 10 5 se convierte en 20 10 5 20 10 5, como muestra la línea oliva.

Tres paths con diferentes propiedades stroke-dasharray

Puedes experimentar con el atributo stroke-dasharray. Con trazos SVG y formas simples se pueden lograr efectos llamativos ( dasharray-example.svg):

 1<svg height="600" width="600" xmlns="http://www.w3.org/2000/svg">
 2    <g fill="none">
 3        <circle cx="100" cy="100" r="40" stroke="red" stroke-width="55" stroke-dasharray="4,2" />
 4        <circle cx="100" cy="100" r="30" stroke="grey" stroke-width="45" stroke-dasharray="5,2" transform="translate(120,40)" />
 5        <circle cx="100" cy="100" r="35" stroke="orange" stroke-width="45" stroke-dasharray="9,3" transform="translate(30,130)" />
 6		<circle cx="100" cy="100" r="20" stroke="pink" stroke-linecap="round" stroke-width="20" stroke-dasharray="10,15" transform="translate(380,120)" />
 7        <rect x="320" y="100" width="100" height="100" stroke="DarkCyan" stroke-width="55" stroke-dasharray="7 7 3 2" />
 8        <text x="200" y="300" font-family="arial" font-size="60" stroke="#000080" stroke-width="3" stroke-dasharray="2 1">I love SVG!</text>
 9    </g>
10</svg>

Círculo, rectángulo y texto con diferentes patrones stroke-dasharray

Atributos adicionales de pintura SVG

AtributoPropósitoEjemplo
fill-opacityValor de 0 transparente a 1 opacofill-opacity="0.6"
fill-ruleDetermina cómo se rellenan formas complejas. Opciones: nonzero predeterminado o evenodd.fill-rule="evenodd"
stroke-opacityValor de 0 transparente a 1 opacostroke-opacity="0.6"
stroke-miterlimitControla la longitud máxima de una unión miter. Valores mayores que 1.stroke-miterlimit="4"
stroke-dashoffsetDesplaza el inicio de un patrón de guiones a lo largo del path.stroke-dashoffset="5"

Estos atributos pueden combinarse con los anteriores para lograr un control visual preciso.

FAQ – Fill y stroke en SVG

¿Cómo hago que un path aparezca solo como contorno, sin relleno?

Define fill="none". Esto elimina la pintura interior y mantiene visible el trazo. Usa stroke y stroke-width para controlar el contorno.

¿Cuál es la diferencia entre fill y stroke en SVG?

fill pinta el interior de una forma, path o texto. stroke pinta el contorno a lo largo del borde del elemento o path. Una forma puede usar ambos al mismo tiempo.

¿Por qué stroke-dasharray se ve irregular en paths curvos?

Las longitudes de los guiones se miden a lo largo de la longitud del path. Las curvas pueden hacer que los segmentos parezcan visualmente irregulares. Ajusta los valores de guion y espacio o usa stroke-dashoffset para afinar el patrón.

¿Cuándo debo usar stroke-linecap="round" y cuándo stroke-linejoin="round"?

stroke-linecap afecta los extremos de subpaths abiertos, mientras que stroke-linejoin afecta las esquinas donde se unen dos segmentos. Usa round en ambos cuando los extremos y las esquinas deban verse suavizados.

¿Se pueden usar gradientes para fill y stroke?

Sí. Los gradientes y patrones se aplican con fill="url(#id)" o stroke="url(#id)", donde id apunta a una definición de gradiente o patrón.

Errores comunes y soluciones

ProblemaCausaSolución
La forma aparece negra aunque esperabas otro resultadoSe omitió fill o quedó con su valor predeterminadoAñade fill="none" o un color válido, por ejemplo fill="#00ff00".
Faltan guiones en una línea curvaLos valores de stroke-dasharray son demasiado pequeños para la longitud de la curvaAumenta las longitudes de guion y espacio o usa stroke-dashoffset para reposicionar.
Los extremos del trazo parecen recortadosNo se definió stroke-linecap al usar trazos gruesosUsa stroke-linecap="square" o round para un renderizado correcto de los extremos.
Las uniones miter crean picos demasiado largosÁngulos agudos usan stroke-linejoin="miter" con un límite altoReduce stroke-miterlimit o usa stroke-linejoin="round" o bevel.
La opacidad afecta a fill y stroke sin quererSe usa opacity en lugar de fill-opacity / stroke-opacitySustituye opacity por fill-opacity y/o stroke-opacity.

Recetas rápidas

Hoja rápida de fill y stroke

ObjetivoCódigo SVG
Desactivar rellenofill="none"
Color de relleno sólidofill="orange"
Relleno semitransparentefill-opacity="0.5"
Activar trazostroke="black"
Contorno más gruesostroke-width="4"
Trazo discontinuostroke-dasharray="10 5"
Extremos redondeadosstroke-linecap="round"

Ejemplos prácticos

1. Relleno sólido y trazo simple

1<svg width="120" height="120" xmlns="http://www.w3.org/2000/svg">
2  <circle cx="60" cy="60" r="50" fill="#4CAF50" stroke="#026802" stroke-width="4"/>
3</svg>

2. Línea discontinua con desplazamiento

1<svg width="200" height="40" xmlns="http://www.w3.org/2000/svg">
2  <line x1="10" y1="20" x2="190" y2="20" stroke="#ff6600" stroke-width="8" stroke-dasharray="15 5" stroke-dashoffset="7"/>
3</svg>

Trazo discontinuo con extremos redondeados

1<line x1="10" y1="40" x2="140" y2="40"
2      stroke="black"
3      stroke-width="4"
4      stroke-dasharray="10 6"
5      stroke-linecap="round" />

Especificación y recursos relacionados