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-widthborder-right-widthborder-bottom-widthborder-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 4pxright: borde derecho 5pxbottom: borde inferior 6pxleft: borde izquierdo 7px
border-width: 4px 5px 6px;top: borde superior 4pxrightyleft: bordes derecho e izquierdo 5pxbottom: borde inferior 6px
border-width: 4px 5px;topybottom: bordes superior e inferior 4pxrightyleft: 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 usadodashed— línea de guionesdotted— línea de puntosdouble— doble línea sólidagroove— efecto de ranura tridimensionalridge— efecto de cresta tridimensional (inverso degroove)inset— borde con apariencia hundidaoutset— borde con apariencia elevada
También es posible definirlos lado a lado con las propiedades individuales:
border-top-styleborder-right-styleborder-bottom-styleborder-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-colorborder-right-colorborder-bottom-colorborder-left-color
Su comportamiento sigue el mismo patrón que border-width.
Ejemplos de tipos de borde en CSS
border-style y border-color:
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:
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

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;| Valor | Descripción |
|---|---|
x | Requerido. Desplazamiento de la sombra en el eje horizontal. |
y | Requerido. Desplazamiento de la sombra en el eje vertical. |
difuminado | Opcional. Radio de difuminado (blur). En cero, el borde tiene un filo nítido. |
propagado | Opcional. Radio de expansión (spread). Controla cuánto crece la sombra hacia afuera. |
color | Opcional. Color de la sombra. |
inset | Opcional. 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,yydifuminado) deben estar en0. 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
propagadomayor 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

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.
Dos pasos para lograr el efecto
- Seleccionar un color con canal de transparencia usando
rgba()en lugar de hexadecimales orgb(). El cuarto parámetro dergba()controla la opacidad:0es totalmente transparente y1es completamente opaco. - Aplicar la propiedad
background-clipcon el valorpadding-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.
¿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.
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

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:

¿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.
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:
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 colorinset: indica que la sombra aparecerá dentro del contenedor en lugar de fuera.offset-xyoffset-y: desplazamiento en el eje horizontal y vertical. Ponlos en0para bordes simétricos.blur-radius: grado de difuminación. Para un borde nítido debe estar en0.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 izquierdo de 13 píxeles:
box-shadow: inset 13px 0 0 0 #08B;Borde derecho de 13 píxeles:
box-shadow: inset -13px 0 0 #08B;Borde inferior de 13 píxeles:
box-shadow: inset 0 -13px 0 #08B;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 simétricos de 7 píxeles:
box-shadow: inset 0 0 0 7px #08B;Bordes simétricos de 13 píxeles:
box-shadow: inset 0 0 0 13px #08B;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;box-shadow: inset 13px 13px 0 0 #08B;box-shadow: inset -13px 13px 0 0 #08B;Preguntas frecuentes sobre bordes en CSS
- ¿Puedo hacer bordes totalmente invisibles?
- Sí, usando la palabra clave
transparentcomo color: border: 10px solid transparent;- Muy útil para trucos de layout con pseudoelementos o para reservar espacio sin mostrar el borde.
- Sí, usando la palabra clave
- ¿Los bordes transparentes con rgba() funcionan con imágenes de fondo?
- Sí, mientras uses
background-clip: padding-boxel efecto funciona igual con cualquier tipo de fondo: color plano, degradado o imagen.
- Sí, mientras uses
- ¿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-radiusdel elemento, así que puedes combinar ambas propiedades para crear bordes internos redondeados sin problema.
- Sí. La sombra interna respeta el
- ¿Los bordes internos con box-shadow afectan el layout?
- No. A diferencia de
border, la propiedadbox-shadowno ocupa espacio en el flujo del documento, por lo que no altera el tamaño ni la posición de los elementos colindantes.
- No. A diferencia de
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.