Posicionamiento e índice z

Quieres una pequeña insignia "Oferta" en la esquina superior derecha de una foto de producto. Quieres un encabezado que se mantenga en su lugar mientras la página se desplaza debajo de él. Quieres un diálogo que flota sobre todo lo demás en la página. El espaciado CSS ordinario no puede hacer nada de esto, porque solo organiza elementos uno tras otro. El posicionamiento es el conjunto de herramientas que permite que un elemento salga de esa disposición ordinaria y se sitúe exactamente donde lo señales, incluso encima de otra cosa.
La propiedad position
Cada elemento comienza con posicionamiento estático, que es una forma simple de decir "siéntate en tu lugar normal en el flujo de la página". Ese es el comportamiento predeterminado, y la mayoría de las veces es lo que quieres. El posicionamiento comienza a importar cuando quieres que un elemento se aleje de ese lugar normal.
El primer paso es position: relative. Desplaza un elemento desde donde estaría normalmente, usando cuatro propiedades de desplazamiento: top, right, bottom y left. Lo importante es que el elemento mantiene su espacio original. Nada más se mueve para llenar el vacío.
.badge {
position: relative;
top: 10px; /* desplazado 10px hacia abajo desde su lugar normal */
left: 20px; /* desplazado 20px hacia la derecha desde su lugar normal */
}Esos desplazamientos top y left no hacen nada en absoluto en un elemento static. Solo comienzan a funcionar una vez que le das al elemento un position diferente de static.
static, lo que significa que se sienta en su lugar normal. Cambia a position: relative y puedes desplazarlo con top, right, bottom y left, mientras su espacio original permanece reservado. Esas propiedades de desplazamiento no hacen nada hasta que el elemento está posicionado, así que si top parece ignorado, verifica que hayas establecido un position primero. Posicionamiento absoluto
position: absolute es un movimiento más grande. Extrae el elemento completamente del flujo normal, por lo que ya no ocupa espacio, y los elementos alrededor se cierran como si nunca hubiera estado allí. Luego lo colocas usando los mismos desplazamientos top, right, bottom y left.
La pregunta es: ¿desplazamiento desde qué? Un elemento absoluto se posiciona contra su ancestro posicionado más cercano, es decir, el padre más cercano que tiene un position propio (cualquier cosa que no sea static). Por eso el patrón de insignia en una tarjeta siempre viene en pareja: haces la tarjeta relative para que se convierta en el punto de referencia, luego haces la insignia absolute para que pueda sentarse en la esquina de la tarjeta.
.card {
position: relative; /* se convierte en el punto de referencia */
}
.card .badge {
position: absolute;
top: 8px; /* 8px desde la parte superior de la tarjeta */
right: 8px; /* 8px desde la derecha de la tarjeta */
}Sin position: relative en la tarjeta, la insignia buscaría más arriba en la página un ancestro posicionado y terminaría en algún lugar donde no lo querías.
position: absolute extrae un elemento del flujo, por lo que no ocupa espacio y los vecinos se cierran detrás de él. Luego se posiciona contra su padre más cercano que tiene un position establecido. Por eso el truco de insignia en tarjeta es una pareja: relative en la tarjeta, absolute en la insignia, así que la insignia aterrizará en la esquina de la tarjeta y no en algún lugar aleatorio. Fijo y pegajoso
position: fixed fija un elemento a la pantalla misma. Sale del flujo como lo hace absolute, pero en lugar de anclarse a un padre, se ancla al viewport, la ventana visible. Una vez fijo, permanece en el mismo lugar en la pantalla incluso mientras desplazas la página. Así es como una barra de navegación o un botón "volver al inicio" se mantiene visible todo el tiempo.
.site-header {
position: fixed;
top: 0; /* fijado a la parte superior de la ventana */
left: 0;
right: 0; /* estirado a todo el ancho */
}position: sticky es el término medio amigable. Un elemento pegajoso se desplaza junto con la página normalmente, hasta que alcanza un umbral que estableces, y luego se queda en su lugar. Un encabezado de sección que se desplaza hacia arriba con su contenido y luego se mantiene en la parte superior de la pantalla es el ejemplo clásico.
.section-title {
position: sticky;
top: 0; /* se pega una vez que alcanza el borde superior */
}position: fixed fija un elemento a la pantalla, por lo que permanece en su lugar mientras desplazas, que es cómo un encabezado o un botón de volver al inicio se mantiene. position: sticky es el término medio: se desplaza con la página, luego se pega una vez que alcanza un umbral como top: 0. Fijo también se superpone a lo que hay debajo, así que deja algo de espacio para el contenido que cubre. Apilamiento con z-index
Cuando los elementos se superponen, algo tiene que decidir cuál se sienta en la parte superior. Eso es lo que controla z-index. Un z-index más alto se dibuja delante de uno más bajo, así que un desplegable con z-index: 10 cubre una tarjeta con z-index: 1.
Hay una regla que atrapa a todos: z-index solo funciona en elementos posicionados. Si un elemento todavía es static, su z-index se ignora. Así que casi siempre estableces un position y un z-index juntos.
.modal {
position: fixed;
z-index: 100; /* se sienta encima del contenido normal de la página */
}
.modal-overlay {
position: fixed;
z-index: 99; /* el fondo oscuro, un paso detrás del modal */
}Rara vez necesitas números enormes aquí. Una escala pequeña y ordenada como 1, 10, 100 es más fácil de razonar que una página llena de 9999s compitiendo.
z-index decide cuál está al frente: un número más alto gana. Solo funciona en elementos posicionados, así que un z-index en un elemento static simple se ignora, y estableces position y z-index juntos. Mantén los números pequeños y ordenados, como 1, 10, 100, en lugar de un montón de 9999s. 
