Menu

Box-shadow en CSS: sintaxis, spread, inset y ejemplos

box-shadow dibuja sombras alrededor de la caja de un elemento. Aprende los cinco valores (x, y, desenfoque, expansión, color), las sombras inset, cómo apilar varias sombras para una profundidad realista, los anillos de foco hechos con spread y los errores que hacen que las sombras se vean sucias.

Esta página incluye editores ejecutables: edita, ejecuta y ve el resultado al instante.

Cómo funciona box-shadow

box-shadow pinta una sombra alrededor de la caja de borde de un elemento. Sigue border-radius, no ocupa espacio en el layout y necesita al menos dos valores: cuánto moverla en horizontal y en vertical.

La sintaxis

box-shadow: [inset] <offset-x> <offset-y> [<blur>] [<spread>] [<color>];
ValorSignificadoPor defecto
insetDibuja la sombra dentro de la caja, como una zona hundidaFuera
offset-xPositivo mueve a la derecha, negativo a la izquierdaObligatorio
offset-yPositivo mueve hacia abajo, negativo hacia arribaObligatorio
blurQué tan suave es el borde; no puede ser negativo0 (un borde nítido)
spreadAgranda (positivo) o encoge (negativo) la sombra0
colorCualquier color; un negro semitransparente suele verse mejorEl color del texto

La cantidad de longitudes decide su significado: dos son los desplazamientos, tres agregan el desenfoque y cuatro agregan el spread. Pruébalo:

Prueba 0 0 0 4px #f59e0b (un anillo), inset 0 0 12px #2563eb y -8px -8px 0 #16a34a.

Spread: anillos y sombras de un solo lado

El spread cambia el tamaño de la sombra antes de desenfocarla. De ahí salen dos patrones:

  • Un anillo: sin desplazamiento, sin desenfoque, solo spread. A diferencia de un borde, no cambia el tamaño del elemento, así que es un buen indicador de foco (:focus-visible { box-shadow: 0 0 0 3px #2563eb; }).
  • Un anillo con separación: apila un spread blanco debajo de uno de color más grande.
  • Un solo lado: mueve la sombra hacia abajo y achícala con un spread negativo, para que solo asome por abajo.

Sombras en capas para una profundidad realista

Las sombras reales tienen una parte oscura y nítida cerca del objeto y una parte suave y tenue más lejos. Dos o tres capas lo imitan mucho mejor que un solo desenfoque grande:

La primera sombra de la lista se pinta encima. Usa para las sombras un negro semitransparente o un tono oscuro del fondo, nunca un gris puro, para que oscurezcan lo que haya debajo.

Sombras inset

inset dibuja la sombra dentro de la caja de padding, como si la superficie estuviera hundida. Queda bien en inputs de texto, zonas rebajadas y botones presionados:

input {
  box-shadow: inset 0 1px 3px rgb(0 0 0 / 20%);
}
button:active {
  box-shadow: inset 0 3px 6px rgb(0 0 0 / 30%);
}

Una sombra inset se dibuja encima del fondo pero debajo del contenido. Las sombras que siguen la forma de las letras en lugar de la caja son text-shadow.

Errores comunes

  • Sombras negras puras y totalmente opacas. Parecen un contorno oscuro. Usa un alfa del 10% al 30%.
  • Un solo desenfoque enorme para dar profundidad. Apila una sombra pequeña y nítida con una grande y suave.
  • Una sombra cortada en el borde. Un ancestro con overflow: hidden la recorta; agrega padding al ancestro o mueve la regla de overflow.
  • Desenfoque negativo. Es inválido y se ignora toda la declaración.
  • Animar box-shadow en muchos elementos. Se vuelve a pintar en cada fotograma. En páginas pesadas, anima la opacity de un pseudoelemento que lleve la sombra más grande.

Preguntas frecuentes

¿Cuál es la sintaxis de box-shadow?

box-shadow: offset-x offset-y blur spread color;, por ejemplo box-shadow: 0 4px 12px 0 rgb(0 0 0 / 15%);. Solo los dos desplazamientos son obligatorios; agrega inset para dibujar la sombra dentro de la caja.

¿Qué hace spread en box-shadow?

Agranda (positivo) o encoge (negativo) la sombra antes de desenfocarla. Una sombra sin desplazamiento, sin desenfoque y con un spread de 3px es un anillo sólido de 3px alrededor del elemento.

¿Cómo pongo una sombra solo abajo?

Desplázala hacia abajo y achícala con un spread negativo para que desaparezcan los lados: box-shadow: 0 8px 6px -6px rgb(0 0 0 / 40%);.

¿box-shadow afecta el layout?

No. Una sombra no ocupa espacio ni mueve otros elementos, y por eso es una buena forma de agregar un anillo de foco o un efecto de elevación en hover sin que se mueva el layout. Puede quedar recortada por un overflow: hidden de un ancestro.

¿Puedo tener varias sombras box-shadow?

Sí, sepáralas con comas. La primera sombra se dibuja encima. Apilar una sombra pequeña y nítida con una grande y suave se ve más natural que una sola sombra grande.

Coddy programming languages illustration

Aprende a programar con Coddy

COMENZAR