Saltar al contenido
Curso de CSS
Todos los cursos Ir al ejercicio →

Posicionamiento y capas

  • ⏱ 40 minutos
  • 📶 Nivel: principiante
  • 🧩 Incluye ejercicio

💡 🎯 Al terminar esta lección podrás…

  • Elegir el valor de position adecuado para cada caso.
  • Colocar una insignia sobre una tarjeta con relative y absolute.
  • 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).

ValorOcupa lugar en el flujoSe coloca respecto a…Para qué
staticSí(valor por defecto, ignora top/left…)Normal
relativeSí (su hueco se conserva)Su propia posición originalAjustes mínimos y referencia para hijos absolute
absoluteNoEl ancestro posicionado más cercanoInsignias, iconos, tooltips
fixedNoLa ventana del navegadorBarras fijas, botones flotantes
stickySíSe «pega» al llegar a un umbral al desplazarEncabezados 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.

El patrón más usado de posicionamiento
.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 */
}
✏️ Insignia sobre una tarjeta

⚠️ 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:

Centrar un elemento dentro de su padre
.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%);
}
✏️ Centrado absoluto

📌 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

Aspectofixedsticky
ReferenciaLa ventanaSu contenedor (padre) al desplazar
Ocupa espacioNo (hay que dejar hueco)Sí (conserva su sitio)
ComportamientoSiempre en la misma posición de la pantallaFluye normal hasta alcanzar top: … y entonces se pega
TípicoBotón de WhatsApp, banner de cookiesEncabezado de sección, cabecera de tabla, índice lateral
Barra fija vs encabezado pegajoso
.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.

✏️ Encabezado pegajoso (desplázate dentro del cuadro)

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).

✏️ Apilar tres tarjetas

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 modal combina todo lo anterior: una capa fija que cubre la pantalla, un contenido centrado y un z-index alto:

✏️ Modal

💡 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.

Texto alrededor de una imagen
.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

📒 Apuntes para llevar

  • position saca elementos del flujo para casos puntuales; no es para maquetar columnas.
  • relative conserva su sitio y sirve de referencia para los hijos absolute.
  • absolute se coloca respecto al ancestro posicionado más cercano con top/right/bottom/left o inset.
  • fixed se pega a la ventana; sticky fluye y se pega al llegar a su umbral (necesita top).
  • z-index ordena elementos superpuestos, pero solo dentro de su contexto de apilamiento.
  • transform, opacity < 1 y filter crean contextos de apilamiento nuevos.
  • Un modal = capa fixed + inset: 0 + contenido centrado + z-index alto (y mejor con <dialog>).
  • float queda para que el texto rodee imágenes.

9.Glosario

TérminoSignificado
Flujo normalLa colocación por defecto: los elementos uno tras otro.
Ancestro posicionadoEl ancestro más cercano con position distinto de static.
insetAtajo para top, right, bottom y left a la vez.
z-indexOrden de apilamiento de elementos superpuestos.
Contexto de apilamientoGrupo cuyos z-index internos no compiten con los de fuera.
stickyPosición que se pega al desplazar al llegar a un umbral.
floatHace que un elemento se desplace a un lado y el texto lo rodee.
SuperposiciónElementos 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…

¿Qué necesita position: sticky para funcionar?

z-index: 9999 no logra poner un elemento encima de otro. ¿Qué es lo más probable?

¿Qué diferencia hay entre fixed y sticky?

¿Para qué conviene usar float hoy?

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.

Ir al ejercicio