Posicionamento e z-index

Você quer um pequeno emblema "Promoção" sentado no canto superior direito de uma foto de produto. Você quer um cabeçalho que fica no lugar enquanto a página rola embaixo dele. Você quer um diálogo que flutua acima de tudo mais na página. O espaçamento CSS ordinário não pode fazer nenhum disso, porque ele apenas organiza elementos um após o outro. Posicionamento é o conjunto de ferramentas que permite que um elemento saia desse arranjo ordinário e sente-se exatamente onde você o aponta, até mesmo em cima de algo mais.
A propriedade position
Todo elemento começa com posicionamento estático, que é uma forma simples de dizer "sente-se no seu lugar normal no fluxo da página". Esse é o padrão, e na maioria das vezes é o que você quer. Posicionamento começa a importar quando você quer que um elemento se mova para longe desse lugar normal.
O primeiro passo é position: relative. Ele move um elemento de onde normalmente ficaria, usando quatro propriedades de deslocamento: top, right, bottom e left. A coisa-chave é que o elemento mantém seu espaço original. Nada mais se move para preencher a lacuna.
.badge {
position: relative;
top: 10px; /* empurrado 10px para baixo de seu lugar normal */
left: 20px; /* empurrado 20px para a direita de seu lugar normal */
}Esses deslocamentos top e left não fazem absolutamente nada em um elemento static. Eles só começam a funcionar quando você dá ao elemento um position diferente de static.
static, significando que fica em seu lugar normal. Mude para position: relative e você pode ajustá-lo com top, right, bottom e left, enquanto seu espaço original fica reservado. Essas propriedades de deslocamento não fazem nada até o elemento estar posicionado, então se top parece ser ignorado, verifique se você definiu um position primeiro. Posicionamento absoluto
position: absolute é um movimento maior. Ele remove o elemento completamente do fluxo normal, então ele não ocupa mais nenhum espaço, e os elementos ao redor dele se fecham como se ele nunca tivesse existido. Então você o coloca usando os mesmos deslocamentos top, right, bottom e left.
A questão é: deslocado de quê? Um elemento absoluto se posiciona contra seu ancestral posicionado mais próximo, significando o pai mais próximo que tem um position próprio (qualquer coisa que não seja static). É por isso que o padrão emblema-em-um-cartão sempre vem em um par: você torna o cartão relative para que se torne o ponto de referência, depois torna o emblema absolute para que possa ficar no canto do cartão.
.card {
position: relative; /* se torna o ponto de referência */
}
.card .badge {
position: absolute;
top: 8px; /* 8px do topo do cartão */
right: 8px; /* 8px da direita do cartão */
}Sem position: relative no cartão, o emblema procuraria mais acima na página por um ancestral posicionado e pousaria em algum lugar que você não pretendia.
position: absolute puxa um elemento para fora do fluxo, então ele não ocupa espaço e vizinhos se fecham atrás dele. Ele então se posiciona contra seu pai mais próximo que tem um position definido. É por isso que o truque emblema-em-um-cartão é um par: relative no cartão, absolute no emblema, para que o emblema pouse no canto do cartão e não em algum lugar aleatório. Fixed e sticky
position: fixed fixa um elemento na tela em si. Ele sai do fluxo como absolute faz, mas em vez de ancorar a um pai, ele ancora na janela de visualização, a janela visível. Uma vez fixo, ele fica no mesmo lugar na tela mesmo enquanto você rola a página. É assim que uma barra de navegação ou um botão "voltar ao topo" fica visível o tempo todo.
.site-header {
position: fixed;
top: 0; /* fixado no topo da janela */
left: 0;
right: 0; /* esticado em toda a largura */
}position: sticky é o meio-termo amigável. Um elemento sticky rola junto com a página normalmente, até atingir um limite que você define, e depois fica no lugar. Um título de seção que rola com seu conteúdo e depois se prende ao topo da tela é o exemplo clássico.
.section-title {
position: sticky;
top: 0; /* fica fixo quando chega à borda superior */
}position: fixed fixa um elemento na tela, então ele fica no lugar enquanto você rola, é assim que um cabeçalho ou um botão voltar-ao-topo fica por perto. position: sticky é o meio-termo: ele rola com a página, depois fica fixo uma vez que atinge um limite como top: 0. Fixed também se sobrepõe ao que está abaixo dele, então deixe um pouco de espaço para o conteúdo que ele cobre. Empilhamento com z-index
Quando elementos se sobrepõem, algo tem que decidir qual fica em cima. É isso que z-index controla. Um z-index maior desenha na frente de um menor, então um dropdown com z-index: 10 cobre um cartão com z-index: 1.
Há uma regra que pega todos de surpresa: z-index só funciona em elementos posicionados. Se um elemento ainda for static, seu z-index é ignorado. Então você quase sempre define um position e um z-index juntos.
.modal {
position: fixed;
z-index: 100; /* fica acima do conteúdo normal da página */
}
.modal-overlay {
position: fixed;
z-index: 99; /* a sobreposição escura, um passo atrás do modal */
}Você raramente precisa de números enormes aqui. Uma escala pequena e organizada como 1, 10, 100 é mais fácil de raciocinar do que uma página cheia de 9999s lutando uns contra os outros.
z-index decide qual fica na frente: um número maior vence. Só funciona em elementos posicionados, então um z-index em um elemento static simples é ignorado, e você define position e z-index juntos. Mantenha os números pequenos e organizados, como 1, 10, 100, em vez de uma pilha de 9999s. 
