Guía de bordes en CSS: tipos, trucos, transparentes, internos y múltiples bordes

- Andrés Cruz - EN In english

Guía de bordes en CSS: tipos, trucos, transparentes, internos y múltiples bordes

Los bordes en CSS son propiedades fundamentales que puedes aplicar a prácticamente cualquier elemento HTML: arriba, abajo, a los lados, con distintos estilos y grosores. En esta guía completa cubrimos todo lo que necesitas saber: desde cómo usar border-width, border-style y border-color, hasta técnicas avanzadas como múltiples bordes con box-shadow, bordes transparentes con rgba() + background-clip, y bordes internos que no afectan el layout. Si quieres repasar cómo ajustar imágenes con CSS sin deformarlas, échale un vistazo a la propiedad object-fit en CSS.

Con la propiedad border es posible definir el color, el grosor y el estilo de cada uno de los 4 lados que conforman la caja de un elemento. Veamos cada sub-propiedad:

border-width

Define la anchura del borde. Se puede controlar lado a lado mediante las siguientes propiedades individuales:

  • border-top-width
  • border-right-width
  • border-bottom-width
  • border-left-width

Cada propiedad se explica sola: recibe cualquier unidad de medida válida en CSS (px, em, rem, etc.).

Si quieres establecer todos los bordes de golpe, usa el shorthand:

  • border-width

Acepta de uno a cuatro valores, siguiendo el mismo patrón de top right bottom left que otras propiedades de caja en CSS:

border-width: 4px 5px 6px 7px;
  • top: borde superior 4px
  • right: borde derecho 5px
  • bottom: borde inferior 6px
  • left: borde izquierdo 7px
border-width: 4px 5px 6px;
  • top: borde superior 4px
  • right y left: bordes derecho e izquierdo 5px
  • bottom: borde inferior 6px
border-width: 4px 5px;
  • top y bottom: bordes superior e inferior 4px
  • right y left: bordes derecho e izquierdo 5px
border-width: 4px;
  • Todos los bordes: 4px

border-style

Define el estilo visual del borde. Los valores disponibles son:

  • solid — línea continua, el más usado
  • dashed — línea de guiones
  • dotted — línea de puntos
  • double — doble línea sólida
  • groove — efecto de ranura tridimensional
  • ridge — efecto de cresta tridimensional (inverso de groove)
  • inset — borde con apariencia hundida
  • outset — borde con apariencia elevada

También es posible definirlos lado a lado con las propiedades individuales:

  • border-top-style
  • border-right-style
  • border-bottom-style
  • border-left-style

O todos juntos con el shorthand border-style. Su funcionamiento es exactamente igual que el de border-width: acepta de uno a cuatro valores aplicando el mismo orden top right bottom left.

border-color

Define el color del borde. Acepta cualquier formato de color CSS: nombre en inglés (red, blue), hexadecimal (#F00000), rgb(), rgba() o hsl():

#border-color1 {
    border-color: #F00000;
}

También puedes definirlo por cada lado:

  • border-top-color
  • border-right-color
  • border-bottom-color
  • border-left-color

Su comportamiento sigue el mismo patrón que border-width.

Ejemplos de tipos de borde en CSS

border-style y border-color:

#solid {
    border-color: #F00000;
    border-style: solid;
}
#dashed {
    border-color: #F00000;
    border-style: dashed;
}
#dotted {
    border-color: #F00000;
    border-style: dotted;
}   
#groove {
    border-color: #F00000;
    border-style: groove;
}
#ridge {
    border-color: #F00000;
    border-style: inset;
} 
#outset {
    border-color: #F00000;
    border-style: outset;
}  
#double {
    border-color: #F00000;
    border-style: double;
}

Shorthand border — border-style, border-color y border-width en una sola propiedad:

También es posible definir todas las propiedades al mismo tiempo con el shorthand border, que acepta el grosor, el color y el estilo en cualquier orden:

#border1 {
    border: 2px #F00000 solid;
}
#border2 {
    border-width: 2px;
    border-color: #F00000;
    border-style: solid;
}

Ambas declaraciones producen exactamente el mismo resultado visual; la única diferencia es la cantidad de líneas de código. En proyectos reales suelo preferir el shorthand border cuando los cuatro lados son iguales, y reservar las propiedades individuales cuando necesito configuraciones asimétricas.

Múltiples bordes en un contenedor con CSS

Múltiples bordes en un contenedor con CSS

La propiedad border solo permite un borde por elemento. Si necesitas simular múltiples bordes, el truco está en la propiedad box-shadow: acepta una lista de sombras separadas por comas, y cuando las configuras sin desplazamiento ni difuminado actúan visualmente como bordes apilados.

Sintaxis de la propiedad box-shadow

box-shadow: x y difuminado propagado color inset;
ValorDescripción
xRequerido. Desplazamiento de la sombra en el eje horizontal.
yRequerido. Desplazamiento de la sombra en el eje vertical.
difuminadoOpcional. Radio de difuminado (blur). En cero, el borde tiene un filo nítido.
propagadoOpcional. Radio de expansión (spread). Controla cuánto crece la sombra hacia afuera.
colorOpcional. Color de la sombra.
insetOpcional. Si está presente, la sombra aparece dentro del elemento en lugar de afuera.

 

Creando múltiples bordes con box-shadow

La clave es usar únicamente el parámetro propagado (spread) para controlar el grosor de cada borde, dejando x, y y difuminado en cero:

box-shadow: x y difuminado propagado color;

Con esto creamos dos bordes de 2px cada uno; el primero de color verde y el segundo de color rojo:

box-shadow: 0 0 0 2px green, 0 0 0 4px red;
 

También podemos variar el tamaño de cada borde de forma independiente:

box-shadow: 0 0 0 2px green, 0 0 0 6px red;
 

O apilar todos los bordes que queramos en un mismo contenedor:

box-shadow: 0 0 0 2px green, 0 0 0 4px red, 0 0 0 6px blue, 0 0 0 8px yellow; 
 

Consideraciones importantes

  • Los tres primeros valores de box-shadow (x, y y difuminado) deben estar en 0. Así la sombra queda centrada y simétrica respecto al contenedor, y el borde resultante es sólido — sin difuminado ni desplazamiento.
  • Cada borde siguiente debe tener un propagado mayor que el anterior; de lo contrario el borde interior solapa al exterior. Por ejemplo, esta declaración produce solo un borde verde porque ambos tienen el mismo tamaño:

    box-shadow: 0 0 0 3px green, 0 0 0 3px red;
     

    El borde rojo queda oculto debajo del verde porque tienen el mismo radio de propagado. La solución es incrementar el valor de cada borde sucesivo para que el efecto de múltiples bordes sea visible.

Truco CSS: bordes transparentes con rgba() y background-clip

Bordes transparentes en CSS con rgba y background-clip

Si alguna vez intentaste poner un borde "transparente" en CSS y descubriste que se veía gris o totalmente opaco, tranquilo: a todos nos pasó. La buena noticia es que el truco para lograr bordes realmente transparentes es sencillo cuando sabes cuál es el ingrediente secreto.
A mí me tocó aprenderlo diseñando un botón personalizado, de esos donde quieres que la interfaz luzca moderna sin recargarla. Ahí descubrí que la transparencia del borde no depende solo de rgba(), sino de cómo se comporta el fondo por debajo.

En esta guía te cuento exactamente cómo hacerlo, por qué funciona y cómo aplicar variantes útiles en botones, cards y componentes UI.

¿Qué son los bordes transparentes en CSS y para qué sirven?

En CSS, un borde transparente es simplemente un borde cuyo color incluye un canal de opacidad. Esto se logra con rgba() o hsla().
La gracia es que el contenedor "deja ver" lo que tiene debajo: puede ser un color plano, una imagen o un degradado.

Sirven para:

  • Crear componentes más suaves y modernos.
  • Botones con efecto cristalino (yo los uso muchísimo en diseños minimalistas).
  • Tarjetas donde quieres un borde visible pero discreto.
  • Efectos de UI estilo glassmorphism.

Pero para que el borde realmente se vea transparente —y no gris o "sucio"— necesitas entender un detalle del box model de CSS.

Veremos un pequeño truco que permite que los bordes de los contenedores de nuestros elementos o tags HTML se vean transparentes.

El método principal: rgba() + background-clip

Este es el método que funciona en todos los casos y el que verás en cualquier proyecto moderno:

.contenedor {
   background-color: white;
   border: 20px solid rgba(0, 0, 0, 0.5);
   background-clip: padding-box;
}

¿Por qué el borde se ve opaco aunque uses rgba()?

Esto ocurre porque, por defecto, el fondo (background) se extiende por debajo del área del borde.
Cuando el background es blanco, ese blanco se mezcla con la transparencia del borde y lo hace lucir gris en lugar de transparente.

Esto es justo lo que descubrí la primera vez que intenté añadir transparencia a un botón: en lugar de un borde elegante, obtuve un gris feo. Pensé que el rgba estaba mal… pero no: era el background metiéndose donde no debía.

Cómo funciona background-clip: padding-box

La propiedad clave que soluciona todo esto es:

background-clip: padding-box;

En palabras simples:

  • border-box (valor por defecto): el fondo llega hasta el borde → la transparencia queda arruinada.
  • padding-box: el fondo se recorta antes del borde → el borde se ve tal y como debe.

Regla simple: si quieres bordes transparentes, usa siempre background-clip: padding-box.

Ejemplos prácticos de bordes transparentes en CSS

Bordes transparentes básicos con rgba()

.caja {
   background-color: white;
   border: 15px solid rgba(0, 0, 0, 0.5);
   background-clip: padding-box;
   padding: 20px;
}

Bordes semitransparentes con esquinas redondeadas

.caja-redonda {
   background-color: white;
   border: 10px solid rgba(255, 0, 0, 0.4);
   background-clip: padding-box;
   border-radius: 12px;
   padding: 15px;
}

El truco funciona exactamente igual con border-radius, sin importar el valor.

Botones personalizados con borde transparente

Yo acostumbro a usar bordes transparentes en botones cuando quiero un efecto más "ligero". Por ejemplo:

.boton-transparente {
   padding: 12px 20px;
   background-color: white;
   border: 2px solid rgba(0, 0, 0, 0.3);
   background-clip: padding-box;
   border-radius: 8px;
   font-weight: bold;
   cursor: pointer;
   transition: 0.3s;
}
.boton-transparente:hover {
  border-color: rgba(0, 0, 0, 0.6);
}

Lo uso mucho cuando quiero un botón personalizado sin llegar al clásico estilo outline: la transparencia suaviza todo y lo hace más elegante.

Técnicas alternativas para lograr bordes con transparencia

Estas variantes permiten jugar con estilos más avanzados o animaciones.

1. Usar box-shadow como si fuera un borde
.caja-shadow {
   background: white;
   padding: 20px;
   box-shadow: 0 0 0 5px rgba(0,0,0,0.3);
}

Ventajas:

  • Puedes lograr bordes más suaves o difuminados.
  • Ideal para efectos glassmorphism.
2. Usar border-image con degradados
.caja-degradada {
   border: 6px solid transparent;
   border-image: linear-gradient(to right, transparent, rgba(0,0,0,0.4)) 1;
}

Perfecto para bordes "con luz" o estilizados. Ten en cuenta que border-image no es compatible con border-radius, así que úsalo cuando no necesites esquinas redondeadas.

3. Transparencia + hover con animación
.efecto-hover {
   border: 4px solid rgba(0,0,0,0.2);
   background-clip: padding-box;
   transition: border-color 0.3s ease;
}
.efecto-hover:hover {
   border-color: rgba(0,0,0,0.6);
}

Yo lo uso en botones cuando quiero que, al pasar el ratón, el borde parezca "materializarse" gradualmente.

Bordes transparentes paso a paso

Este truco es realmente sencillo; si queremos tener unos bordes transparentes como el siguiente en nuestras cajas:

Esto es un monto de texto sin sentido que tiene la finalidad de mostrar cómo se ven los bordes transparente de un contenedor flotante. Esto es un monto de texto sin sentido que tiene la finalidad de mostrar cómo se ven los bordes transparente de un contenedor flotante. Esto es un monto de texto sin sentido que tiene la finalidad de mostrar cómo se ven los bordes transparente de un contenedor flotante. Esto es un monto de texto sin sentido que tiene la finalidad de mostrar cómo se ven los bordes transparente de un contenedor flotante. Esto es un monto de texto sin sentido que tiene la finalidad de mostrar cómo se ven los bordes transparente de un contenedor flotante. Esto es un monto de texto sin sentido que tiene la finalidad de mostrar cómo se ven los bordes transparente de un contenedor flotante. Esto es un monto de texto sin sentido que tiene la finalidad de mostrar cómo se ven los bordes transparente de un contenedor flotante. Esto es un monto de texto sin sentido que tiene la finalidad de mostrar cómo se ven los bordes transparente de un contenedor flotante. Esto es un monto de texto sin sentido que tiene la finalidad de mostrar cómo se ven los bordes transparente de un contenedor flotante. Esto es un monto de texto sin sentido que tiene la finalidad de mostrar cómo se ven los bordes transparente de un contenedor flotante. Esto es un monto de texto sin sentido que tiene la finalidad de mostrar cómo se ven los bordes transparente de un contenedor flotante.

Mis bordes transparentes con un poco de CSS.

Dos pasos para lograr el efecto

  • Seleccionar un color con canal de transparencia usando rgba() en lugar de hexadecimales o rgb(). El cuarto parámetro de rgba() controla la opacidad: 0 es totalmente transparente y 1 es completamente opaco.
  • Aplicar la propiedad background-clip con el valor padding-box. De esta forma el color de fondo no se extiende debajo del borde, preservando la transparencia.

Creando bordes transparentes

Para un borde negro con 50% de transparencia, aplicamos el siguiente valor rgba:

rgba(0, 0, 0, 0.5);

Y la propiedad background-clip para evitar que el color de fondo arruine el efecto:

background-clip: padding-box; 

La regla CSS completa quedaría así:

border: 20px solid rgba(0, 0, 0, 0.5);
background-clip: padding-box; 

Finalmente obtenemos el siguiente efecto:

Esto es un monto de texto sin sentido que tiene la finalidad de mostrar cómo se ven los bordes transparente de un contenedor flotante. Esto es un monto de texto sin sentido que tiene la finalidad de mostrar cómo se ven los bordes transparente de un contenedor flotante. Esto es un monto de texto sin sentido que tiene la finalidad de mostrar cómo se ven los bordes transparente de un contenedor flotante. Esto es un monto de texto sin sentido que tiene la finalidad de mostrar cómo se ven los bordes transparente de un contenedor flotante. Esto es un monto de texto sin sentido que tiene la finalidad de mostrar cómo se ven los bordes transparente de un contenedor flotante. Esto es un monto de texto sin sentido que tiene la finalidad de mostrar cómo se ven los bordes transparente de un contenedor flotante. Esto es un monto de texto sin sentido que tiene la finalidad de mostrar cómo se ven los bordes transparente de un contenedor flotante. Esto es un monto de texto sin sentido que tiene la finalidad de mostrar cómo se ven los bordes transparente de un contenedor flotante. Esto es un monto de texto sin sentido que tiene la finalidad de mostrar cómo se ven los bordes transparente de un contenedor flotante. Esto es un monto de texto sin sentido que tiene la finalidad de mostrar cómo se ven los bordes transparente de un contenedor flotante. Esto es un monto de texto sin sentido que tiene la finalidad de mostrar cómo se ven los bordes transparente de un contenedor flotante.

Mis bordes transparentes con un poco de CSS.

¿Quieres un borde rojo semitransparente? Basta con cambiar los tres primeros valores de rgba:

border: 20px solid rgba(255, 0, 0, 0.5);

Y obtenemos:

Esto es un monto de texto sin sentido que tiene la finalidad de mostrar cómo se ven los bordes transparente de un contenedor flotante. Esto es un monto de texto sin sentido que tiene la finalidad de mostrar cómo se ven los bordes transparente de un contenedor flotante. Esto es un monto de texto sin sentido que tiene la finalidad de mostrar cómo se ven los bordes transparente de un contenedor flotante. Esto es un monto de texto sin sentido que tiene la finalidad de mostrar cómo se ven los bordes transparente de un contenedor flotante. Esto es un monto de texto sin sentido que tiene la finalidad de mostrar cómo se ven los bordes transparente de un contenedor flotante. Esto es un monto de texto sin sentido que tiene la finalidad de mostrar cómo se ven los bordes transparente de un contenedor flotante. Esto es un monto de texto sin sentido que tiene la finalidad de mostrar cómo se ven los bordes transparente de un contenedor flotante. Esto es un monto de texto sin sentido que tiene la finalidad de mostrar cómo se ven los bordes transparente de un contenedor flotante. Esto es un monto de texto sin sentido que tiene la finalidad de mostrar cómo se ven los bordes transparente de un contenedor flotante. Esto es un monto de texto sin sentido que tiene la finalidad de mostrar cómo se ven los bordes transparente de un contenedor flotante. Esto es un monto de texto sin sentido que tiene la finalidad de mostrar cómo se ven los bordes transparente de un contenedor flotante.

Mis bordes transparentes con un poco de CSS.

Y esto sería todo. Como ves, usando la misma propiedad border combinada con rgba() y background-clip: padding-box puedes variar el grosor (en estos ejemplos son de 20px) y el color, obteniendo un efecto limpio y realmente transparente.

Truco CSS: bordes internos con box-shadow inset

Bordes internos en CSS con box-shadow inset

Cuando defines padding, margin o border en un elemento, estas propiedades repercuten directamente en su tamaño total. El cálculo del box model clásico sería:

ancho_total = width + 2*border + 2*padding + 2*margin = 300px + 2*5px + 2*7px +2*5px = 334px;
largo_total = height + 2*border + 2*padding + 2*margin = 150px + 2*5px + 2*7px +2*5px = 184px;

Una ayuda visual de lo anteriormente expuesto:

Bordes tradicionales en CSS

¿Qué son los bordes internos en CSS?

Los bordes internos son bordes que no afectan el tamaño total del contenedor porque se dibujan dentro del área del elemento, no fuera. Esto los hace muy útiles en layouts fluidos donde necesitas que varios elementos ocupen un porcentaje exacto del ancho disponible sin que el borde los "empuje" y rompa la fila.

1
2
3

Prueba redimensionar la ventana de tu navegador.

Como habrás notado en el ejemplo anterior, estos tres contenedores ocupan un 33% del ancho total del contenedor. Si los bordes fueran los tradicionales:

1
2
3

El tercer contenedor no podría estar alineado en la misma fila porque el borde suma al ancho total.

Creando bordes internos en CSS con box-shadow inset

La solución está en la propiedad box-shadow con el valor inset. La sintaxis completa es:

box-shadow: inset offset-x offset-y blur-radius spread-radius color
  • inset: indica que la sombra aparecerá dentro del contenedor en lugar de fuera.
  • offset-x y offset-y: desplazamiento en el eje horizontal y vertical. Ponlos en 0 para bordes simétricos.
  • blur-radius: grado de difuminación. Para un borde nítido debe estar en 0.
  • spread-radius: controla el grosor del borde interno. Este es el parámetro clave.
  • color: color del borde en cualquier formato CSS (#08B, rgba(), etc.).

Bordes internos por lados en CSS

Para crear un borde solo en un lado específico, usa offset-x u offset-y para "empujar" la sombra hacia ese lado y deja el spread-radius en 0:

Borde superior de 13 píxeles:

box-shadow: inset 0 13px 0 0 #08B;
Borde de 13px

Borde izquierdo de 13 píxeles:

box-shadow: inset 13px 0 0 0 #08B;
Borde de 13px

Borde derecho de 13 píxeles:

box-shadow: inset -13px 0 0  #08B;
Borde de 13px

Borde inferior de 13 píxeles:

box-shadow: inset 0 -13px 0  #08B;
Bordes de 13px

Bordes internos simétricos en CSS

Para aplicar el mismo borde en los cuatro lados a la vez, usa 0 en offset-x, offset-y y blur-radius, y define el grosor deseado en spread-radius:

Bordes simétricos de 3 píxeles:

box-shadow: inset 0 0 0 3px #08B;
Bordes de 3px

Bordes simétricos de 7 píxeles:

box-shadow: inset 0 0 0 7px #08B;
Bordes de 7px

Bordes simétricos de 13 píxeles:

box-shadow: inset 0 0 0 13px #08B;
Bordes de 13px

Bordes por diagonales en CSS

Combinando valores positivos y negativos en offset-x y offset-y puedes crear bordes internos que afectan solo a dos esquinas opuestas. Estos son los cuatro casos posibles para 13 píxeles:

box-shadow: inset -13px -13px 0 0 #08B;
Bordes de 13px
box-shadow: inset 13px -13px 0 0 #08B;
Bordes de 13px
box-shadow: inset 13px 13px 0 0 #08B;
Bordes de 13px
box-shadow: inset -13px 13px 0 0 #08B;
Bordes de 13px

Preguntas frecuentes sobre bordes en CSS

  • ¿Puedo hacer bordes totalmente invisibles?
    • Sí, usando la palabra clave transparent como color: 
    • border: 10px solid transparent;
    • Muy útil para trucos de layout con pseudoelementos o para reservar espacio sin mostrar el borde.
  • ¿Los bordes transparentes con rgba() funcionan con imágenes de fondo?
    • Sí, mientras uses background-clip: padding-box el efecto funciona igual con cualquier tipo de fondo: color plano, degradado o imagen.
  • ¿Puedo usar hsla() en lugar de rgba()?
    • Totalmente. El canal de transparencia funciona igual en ambos formatos:
    • border: 10px solid hsla(0, 0%, 0%, 0.3);
  • ¿border-radius funciona con box-shadow inset?
    • Sí. La sombra interna respeta el border-radius del elemento, así que puedes combinar ambas propiedades para crear bordes internos redondeados sin problema.
  • ¿Los bordes internos con box-shadow afectan el layout?
    • No. A diferencia de border, la propiedad box-shadow no ocupa espacio en el flujo del documento, por lo que no altera el tamaño ni la posición de los elementos colindantes.

Conclusión

Los bordes en CSS son mucho más versátiles de lo que parecen a primera vista. Con las propiedades básicas (border-width, border-style, border-color) tienes el control completo sobre cada lado de la caja. Y cuando necesitas ir más allá —múltiples bordes, bordes transparentes o bordes que no afecten el layout— la propiedad box-shadow combinada con background-clip: padding-box es tu mejor aliada.

Los bordes transparentes en particular son fáciles de conseguir una vez que entiendes el truco clave: combinar rgba() con background-clip: padding-box. Esto te permite construir interfaces más modernas, botones más limpios (yo los uso mucho en mis propios desarrollos) y efectos visuales que no saturan el diseño.

Si quieres llevarlos más lejos, prueba las variantes de box-shadow o border-image para conseguir estilos avanzados sin complicarte.

La siguiente propiedad muy interesante de conocer es cómo puedes crear reflejos en tus imágenes con solo CSS y webkit-box-reflect.

Aprende a dominar los bordes en CSS: propiedades clave, tipos de estilo, bordes transparentes con background-clip y múltiples bordes internos con box-shadow.


Únete a la comunidad de desarrolladores que han decidido dejar de picar código y empezar a construir productos reales. Recibe mis mejores trucos de arquitectura cada semana:

Acepto recibir anuncios de interes sobre este Blog.