Saltar al contenido

CSS, de a poco

Curso de CSS

Position

Lección 10 de 37 · 4 min

position decide si una caja sigue el flujo normal o se ubica por su cuenta. Todo se reduce a una pregunta: contra qué se mide cada caja.

Static, relative y absolute

position tiene cinco valores. Los primeros tres:

  1. EstáticostaticEl valor por defecto. La caja sigue el flujo y top, right, bottom y left no tienen efecto.
  2. RelativarelativeLa caja se corre desde su propio lugar, pero ese lugar queda reservado. Las vecinas no se mueven.
  3. AbsolutaabsoluteLa caja sale del flujo, las vecinas ocupan su lugar y los desplazamientos se miden contra su bloque contenedor (containing block).

El bloque contenedor de una caja absoluta es el ancestro posicionado más cercano: el primero con un position distinto de static (un transform también cuenta). Se mide desde el borde interno de ese ancestro, donde empieza el relleno. Si no hay ninguno, la caja se mide contra el bloque contenedor inicial: un rectángulo del tamaño de la ventana, al principio de la página.

Elegí un valor, mové top y left y destildá el ticket para ver contra qué se mide el sello. El contorno naranja marca la caja desde la que se miden top y left, y el punteado gris, el lugar del sello en el flujo.

position: absolutese mide contra .ticket

Del Molino

14/10 · 09:12

  • Medialunas ×6$ 4.800
  • Pan de campo$ 3.200
  • Café en grano 250 g$ 7.900

Total$ 15.900

position
sello.css
.ticket {
position: relative;
}
.sello {
position: absolute;
top: 16px;
left: 16px;
}
sello.html
<div class="relative">
…
<div class="absolute top-4 left-4">Pagado</div>
…
</div>

Fixed y sticky

fixed funciona como absolute, pero se mide contra la ventana: la caja queda quieta cuando la página scrollea. Por eso no está en la demo, se iría de ella. Ojo: si un ancestro tiene transform, filter o perspective, la caja se mide contra ese ancestro y deja de quedar fija en la ventana.

sticky es un híbrido: la caja ocupa su lugar como relative hasta que el scroll la lleva al umbral que le diste, y ahí se pega. Para que funcione:

  1. Un umbraltop: 0Necesita un desplazamiento, como top: 0. Sin ninguno, nunca se pega.
  2. Su contenedor de scrolloverflowSe pega dentro de su contenedor de scroll más cercano. Un ancestro con overflow: hidden también es uno, aunque no scrollee, así que la caja deja de pegarse al scroll de la página. Si solo necesitás recortar, overflow: clip no crea uno.
  3. Su padrelímiteNo sale de su padre: cuando el padre termina, se va con él.

inset es el atajo de top, right, bottom y left, en el mismo orden que padding:

capas.css
.capa {
position: absolute;
inset: 0; /* los cuatro en 0: cubre el bloque contenedor */
}
.encabezado {
position: sticky;
top: 0;
}

Capas y z-index

Cuando dos cajas se superponen, las posicionadas se pintan encima de las que no lo están, y entre ellas gana la que viene después en el HTML. z-index cambia ese orden: el número más alto queda adelante. Solo funciona en cajas posicionadas (cualquier valor menos static) y en hijos de flex o grid.

Los números no compiten en toda la página, sino dentro de un contexto de apilamiento (stacking context). Cada contexto se pinta como un bloque: nada de adentro puede quedar encima de lo que tapa al contexto entero, aunque tenga z-index: 9999.

Dos contextos de apilamiento como placas. El contexto A tiene z-index 1 y adentro una caja con z-index 9999; el contexto B tiene z-index 2 y queda encima de A. La caja de 9999 no puede subir más allá del techo de A, así que B la tapa igual.

Crean un contexto, entre otros:

  1. Con z-indexposition + z-indexUna caja posicionada con z-index distinto de auto (fixed y sticky crean uno siempre).
  2. Efectosopacity · transformopacity menor a 1 y un transform distinto de none.
  3. A propósitoisolation: isolateExiste solo para eso: crear un contexto sin cambiar nada más.
tarjeta.css
.tarjeta {
position: relative;
isolation: isolate; /* contexto propio */
}
.tarjeta .fondo {
position: absolute;
inset: 0;
z-index: -1; /* detrás del contenido, pero dentro de la tarjeta */
}

En Tailwind

En Tailwind cada valor de position es una clase con el mismo nombre. Los desplazamientos usan la escala de espaciado, que avanza de a 4px (--spacing vale 0.25rem): top-4 son 16px y left-6 son 24px.

CSSTailwind
position: relativerelative (y static, absolute…)
top: 16px · left: 24pxtop-4 · left-6
top: -8px-top-2
inset: 0 · inset-inline: 0inset-0 · inset-x-0
z-index: 10z-10
isolation: isolateisolate
height: 160px · overflow-y: autoh-40 overflow-y-auto
tarjeta.html
<!-- insignia en la esquina de la tarjeta -->
<div class="relative">
<img src="foto.jpg" alt="…" />
<span class="absolute top-2 right-2 z-10">Nuevo</span>
</div>
<!-- encabezado que se pega al hacer scroll -->
<header class="sticky top-0 z-10">…</header>