z-index con overflow:hidden - solución completa
El problema: Tienes un elemento posicionado que aparece cortado o simplemente no se muestra. Revisas todo y tienes el z-index correcto. El culprit? overflow: hidden.
¿Por qué overflow:hidden corta elementos?
Cuando aplicas overflow: hidden a un contenedor, acts como una barrera que recorta todo lo que sale de sus límites, incluyendo elementos posicionados.
/* Este contenedor corta elementos posicionados */
.card-container {
overflow: hidden;
}
/* El badge aparece cortado */
.badge {
position: absolute;
top: -10px;
right: -10px;
}
Las soluciones
Solución 1: Usa overflow: visible (La más simple)
/* ❌ Oculta el badge */
.card {
overflow: hidden;
}
/* ✅ Permite que el badge se vea */
.card {
overflow: visible;
}
Solución 2: Remueve overflow del padre
<!-- ❌ El padre tiene overflow:hidden -->
<div class="card" style="overflow: hidden">
<div class="badge">Nuevo</div>
</div>
<!-- ✅ Sin overflow problemático -->
<div class="card">
<div class="badge">Nuevo</div>
</div>
Solución 3: Expande el contenedor
Si necesitas overflow: hidden por diseño:
.card {
overflow: hidden;
/* Expandir para dejar espacio al elemento posicionado */
padding: 10px;
}
.badge {
position: absolute;
top: 0;
right: 0;
/* Ahora tiene espacio para mostrarse */
}
Solución 4: Mueve el elemento fuera del contenedor
<!-- ❌ Dentro del contenedor cortado -->
<div class="card" style="overflow: hidden">
<img src="producto.jpg" />
<span class="badge">Oferta</span>
</div>
<!-- ✅ El badge fuera -->
<div class="card-wrapper" style="position: relative">
<div class="card" style="overflow: hidden">
<img src="producto.jpg" />
</div>
<span class="badge">Oferta</span>
</div>
Solución 5: Usa CSS Grid/Flexbox con cuidado
/* ❌ overflow:hidden en flex container */
.flex-container {
display: flex;
overflow: hidden;
}
/* ✅ overflow: visible en items */
.flex-item {
overflow: visible;
}
Ejemplo completo: Tarjeta con badge
.producto-card {
position: relative;
width: 300px;
border: 1px solid #ddd;
border-radius: 8px;
overflow: hidden; /* Recorta contenido que sale */
}
.producto-card:hover {
overflow: visible; /* Expande al hacer hover */
}
.producto-imagen {
width: 100%;
height: 200px;
object-fit: cover;
}
.badge-oferta {
position: absolute;
top: 10px;
right: -20px; /* Sale del contenedor */
background: red;
color: white;
padding: 5px 30px;
transform: rotate(45deg);
}
/* Solución: Quitar overflow o expandir */
.producto-card {
overflow: visible; /* Permite ver el badge */
}
Tabla de soluciones según el caso
| Caso | Solución |
|---|---|
| Badge en esquina | overflow: visible |
| Tooltip en input | Mover tooltip fuera del padre |
| Dropdown en navbar | overflow: visible en el item |
| Popup en modal | Portal renderizado en body |
Errores comunes
❌ Pensar que z-index lo arreglará
/* No funciona si el padre tiene overflow:hidden */
.badge {
position: absolute;
z-index: 9999; /* Ignorado */
}
❌ Aplicar overflow:hidden a todo
/* ❌ Too much clipping */
* {
overflow: hidden;
}
/* ✅ Solo cuando sea necesario */
.card {
overflow: hidden;
}
Checklist
- ¿El padre tiene
overflow: hidden? - ¿Puedes usar
overflow: visible? - ¿Puedes mover el elemento fuera del padre?
- ¿Expandir el padding del padre ayuda?
Artículos relacionados
- Problemas z-index CSS: Guía completa
- z-index no funciona: 5 soluciones
- Dropdown z-index problemas
- z-index modal no funciona
- Entiende el stacking context
: overflow:hidden es útil pero puede ser cruel. Dale a tus elementos el espacio que necesitan.