Posicionamiento y capas
💡 🎯 Al terminar esta lección podrás…
- Elegir el valor de
positionadecuado para cada caso. - Colocar una insignia sobre una tarjeta con
relativeyabsolute. - Crear encabezados pegajosos y elementos fijos.
- Resolver problemas de apilamiento con
z-index.
1.El flujo normal y por qué a veces hay que salirse
Por defecto, los elementos se colocan uno tras otro, de arriba abajo (los de bloque) y de izquierda a derecha (los de línea). Es el flujo normal y casi siempre es lo que quieres.
La propiedad position permite sacar un elemento del flujo o ajustarlo, para casos concretos: una insignia sobre una foto, un menú que se queda arriba al desplazarte, un cuadro de diálogo sobre toda la página. No sirve para maquetar columnas: para eso están Flexbox y Grid (lecciones 6 y 7).
| Valor | Ocupa lugar en el flujo | Se coloca respecto a… | Para qué |
|---|---|---|---|
static | Sí | (valor por defecto, ignora top/left…) | Normal |
relative | Sí (su hueco se conserva) | Su propia posición original | Ajustes mínimos y referencia para hijos absolute |
absolute | No | El ancestro posicionado más cercano | Insignias, iconos, tooltips |
fixed | No | La ventana del navegador | Barras fijas, botones flotantes |
sticky | Sí | Se «pega» al llegar a un umbral al desplazar | Encabezados y tablas pegajosas |
2.relative: ajustar y servir de referencia
position: relative casi no cambia nada visible por sí solo. Su verdadero valor es otro: convierte al elemento en la referencia de los hijos con position: absolute.
.tarjeta { position: relative; } /* la referencia */
.insignia {
position: absolute; /* sale del flujo */
top: 12px; /* a 12px del borde superior de .tarjeta */
right: 12px; /* y a 12px del derecho */
}
⚠️ Importante · Sin referencia, se va a otro sitio
Un hijo absolute busca su ancestro posicionado más cercano (cualquier ancestro con position distinto de static). Si no encuentra ninguno, se coloca respecto a toda la página. Por eso casi siempre pones position: relative en el padre.
3.absolute: colocar con precisión
Con top, right, bottom, left (o el atajo inset) indicas la distancia a los bordes de la referencia. Algunos usos habituales:
.padre { position: relative; }
.hijo {
position: absolute;
inset: 0; /* top, right, bottom y left: 0 → llena el padre */
margin: auto; /* con ancho y alto definidos, queda centrado */
width: 120px; height: 60px;
}
/* La otra manera clásica */
.hijo2 {
position: absolute;
top: 50%; left: 50%;
transform: translate(-50%, -50%);
}
📌 Nota · Hoy hay mejores opciones para centrar
Para centrar contenido normal, Flexbox y Grid son más sencillos (display: grid; place-items: center). absolute se reserva para elementos que flotan sobre otros.
4.fixed y sticky
| Aspecto | fixed | sticky |
|---|---|---|
| Referencia | La ventana | Su contenedor (padre) al desplazar |
| Ocupa espacio | No (hay que dejar hueco) | Sí (conserva su sitio) |
| Comportamiento | Siempre en la misma posición de la pantalla | Fluye normal hasta alcanzar top: … y entonces se pega |
| Típico | Botón de WhatsApp, banner de cookies | Encabezado de sección, cabecera de tabla, índice lateral |
.boton-flotante { position: fixed; right: 16px; bottom: 16px; }
.encabezado {
position: sticky;
top: 0; /* se pega al borde superior al desplazar */
background: #fff;
z-index: 10;
}
⚠️ Importante · Por qué mi sticky no se pega
Las causas habituales: falta top (o bottom/left…), o algún ancestro tiene overflow: hidden/auto, que cambia la referencia del desplazamiento. Revisa la cadena de padres.
5.z-index y apilamiento
Los elementos posicionados pueden superponerse. z-index decide quién queda encima: un número mayor se ve por delante. Solo funciona en elementos con position distinto de static (y en ítems de flex/grid).
Contextos de apilamiento: la trampa del z-index
Cada elemento con ciertas propiedades (position + z-index, opacity < 1, transform, filter…) crea un contexto de apilamiento: un «mundo aparte» donde los z-index de dentro no compiten con los de fuera. Por eso a veces un z-index: 9999 no logra pasar por encima de otro elemento.
- Un hijo nunca puede salir por encima de lo que está por encima de su contexto de apilamiento.
- Usa valores pequeños y ordenados (1, 10, 100) y nómbralos con variables:
--z-menu: 10; --z-modal: 100;. - Si no logras superponer algo, busca un ancestro con
transform,opacityoposition+z-indexque cree un contexto.
6.Un caso completo: el cuadro modal
Un modal combina todo lo anterior: una capa fija que cubre la pantalla, un contenido centrado y un z-index alto:
💡 Consejo · Accesibilidad de los modales
Visualmente solo necesitas CSS, pero un modal real también necesita JavaScript y HTML correcto: usa la etiqueta <dialog>, que gestiona el foco, la tecla Esc y el fondo por ti. Lo verás en el curso de JavaScript.
7.float: una pieza de historia
float hacía que un elemento se desplazara a un lado y el texto lo rodeara, como en una revista. Hoy se usa solo para eso: imágenes con texto alrededor. Para maquetar se usa Flexbox o Grid.
.foto-lateral { float: left; margin: 0 16px 8px 0; width: 160px; }
.despues { clear: both; } /* el siguiente bloque ya no rodea la imagen */
📌 Nota · Verás float en código antiguo
Hasta hace unos años casi todos los diseños se hacían con float. Si ves código con clearfix, columnas con float: left, etc., es de esa época: puedes sustituirlo por Flexbox o Grid.
8.Errores frecuentes
- Usar
position: absolutepara todo el diseño: se rompe en cuanto cambia el tamaño de pantalla o el contenido. - Olvidar
position: relativeen el padre: la insignia se coloca respecto a la página. z-indexsinposition: no hace nada (salvo en flex/grid).- Subir el
z-indexa 99999: no resuelve un contexto de apilamiento. stickysintopo con un ancestro conoverflow.- Un elemento
fixedtapa el contenido: deja espacio conpaddingen elbody. - Colocar con
top/leftenpxen tamaños críticos: usa%,inseto unidades relativas.
📒 Apuntes para llevar
positionsaca elementos del flujo para casos puntuales; no es para maquetar columnas.relativeconserva su sitio y sirve de referencia para los hijosabsolute.absolutese coloca respecto al ancestro posicionado más cercano contop/right/bottom/leftoinset.fixedse pega a la ventana;stickyfluye y se pega al llegar a su umbral (necesitatop).z-indexordena elementos superpuestos, pero solo dentro de su contexto de apilamiento.transform,opacity < 1yfiltercrean contextos de apilamiento nuevos.- Un modal = capa
fixed+inset: 0+ contenido centrado +z-indexalto (y mejor con<dialog>). floatqueda para que el texto rodee imágenes.
9.Glosario
| Término | Significado |
|---|---|
| Flujo normal | La colocación por defecto: los elementos uno tras otro. |
| Ancestro posicionado | El ancestro más cercano con position distinto de static. |
inset | Atajo para top, right, bottom y left a la vez. |
z-index | Orden de apilamiento de elementos superpuestos. |
| Contexto de apilamiento | Grupo cuyos z-index internos no compiten con los de fuera. |
sticky | Posición que se pega al desplazar al llegar a un umbral. |
float | Hace que un elemento se desplace a un lado y el texto lo rodee. |
| Superposición | Elementos colocados unos sobre otros. |
🧠 Comprueba lo aprendido
Elige una respuesta en cada pregunta. Verás al instante si acertaste y por qué.
Un hijo con position: absolute se coloca respecto a…
Busca el ancestro más cercano con position distinto de static; si no hay, usa la página.
¿Qué necesita position: sticky para funcionar?
Sin un umbral (top, bottom…) no sabe cuándo pegarse.
z-index: 9999 no logra poner un elemento encima de otro. ¿Qué es lo más probable?
Los z-index de dentro de un contexto no compiten con los de fuera.
¿Qué diferencia hay entre fixed y sticky?
fixed se coloca respecto a la ventana; sticky conserva su lugar en el flujo hasta que alcanza el umbral.
¿Para qué conviene usar float hoy?
Las columnas se hacen con Flexbox o Grid; float queda para el texto alrededor de imágenes.
Tu progreso se guarda en este navegador y se refleja en el índice del curso.
💡 🚀 ¡Ahora te toca!
La práctica fija lo aprendido. Pasa al ejercicio de esta lección.