Menu

z-index no CSS: ordem de empilhamento e stacking contexts

z-index decide qual elemento sobreposto é desenhado por cima. Veja em quais elementos ele funciona, como os stacking contexts agrupam elementos de modo que um z-index 9999 ainda possa perder, o que cria um stacking context e como resolver um z-index que não funciona.

Esta página tem editores executáveis - edite, execute e veja a saída na hora.

O que o z-index faz

Quando elementos se sobrepõem, o z-index decide qual é desenhado na frente. O número maior vence. Ele funciona em elementos posicionados (qualquer position exceto static) e em itens flex e grid:

Sem z-index, os elementos que vêm depois no HTML são desenhados por cima dos anteriores, então C cobriria B e B cobriria A. Os valores de z-index invertem isso: A fica na frente, depois C, depois B.

Os valores

ValorSignificado
auto (padrão)Empilhado no nível 0 com os irmãos, e não cria stacking context
0Nível 0, mas cria um stacking context
Inteiro positivoNa frente dos valores menores
Inteiro negativoAtrás do nível 0, e atrás do conteúdo do pai se o pai formar o stacking context

Só inteiros são válidos: z-index: 1.5 é ignorado.

Por que um z-index 9999 pode perder: stacking contexts

Os valores de z-index não são comparados na página inteira. Os elementos são agrupados em stacking contexts (contextos de empilhamento), e um z-index só ordena elementos dentro do mesmo contexto. O contexto em si é então posicionado como uma única camada, usando o z-index do elemento que o criou.

Abaixo, o dropdown azul tem z-index: 9999, mas vive dentro de um cabeçalho com z-index: 1. O banner verde, irmão desse cabeçalho, tem z-index: 2. A camada inteira do cabeçalho, com o dropdown junto, fica abaixo do banner:

Aperte o botão. Com z-index: auto, o cabeçalho deixa de formar um stacking context, então o 9999 do dropdown é comparado diretamente com o 2 do banner, e o dropdown vem para a frente. Subir o dropdown para 99999 nunca teria ajudado.

O que cria um stacking context

Qualquer um destes transforma um elemento em um stacking context próprio, prendendo o z-index de tudo o que está dentro dele:

PropriedadeCondição
position: relative ou absoluteCom z-index diferente de auto
position: fixed ou stickySempre
Item flex ou gridCom z-index diferente de auto
opacityAbaixo de 1
transform, scale, rotate, translateQualquer valor diferente de none
filter, backdrop-filterQualquer valor diferente de none
isolationisolate
mix-blend-modeQualquer valor diferente de normal
will-changeCom qualquer uma das propriedades acima
containlayout ou paint (e strict, content)

As surpresas são opacity e transform: acrescentar um fade ou uma animação de hover a um pai pode, de repente, jogar o dropdown dele para trás da seção seguinte.

O z-index: 10 do tooltip deveria colocá-lo acima da coluna seguinte. Mas opacity: 0.99 transforma a primeira coluna em um stacking context com z-index auto (nível 0), e a segunda coluna vem depois no HTML no mesmo nível, então é pintada por cima da primeira coluna inteira, tooltip incluído. Apague a linha do opacity e o tooltip volta para a frente.

z-index negativo

Um z-index negativo coloca o elemento atrás dos irmãos. Se o pai não forma um stacking context, ele pode ir até para trás do fundo do pai, uma surpresa comum. isolation: isolate no pai cria um contexto sem nenhum outro efeito visual e mantém o filho negativo dentro dele:

Sem isolation, a moldura âmbar cai para trás do próprio fundo cinza do botão, e só a borda dela aparece. Com isolation: isolate, a moldura fica dentro do stacking context do botão: acima do fundo, abaixo do texto.

Uma escala de z-index

Escolha algumas camadas com nome para o site inteiro, em vez de ir aumentando os números:

:root {
  --z-dropdown: 10;
  --z-sticky: 20;
  --z-overlay: 30;
  --z-modal: 40;
  --z-toast: 50;
}
.modal { position: fixed; z-index: var(--z-modal); }

A maioria dos bugs de camadas é bug de stacking context, não de número, então uma escala pequena mais isolation: isolate nos componentes que usam z-index por dentro resolvem muita coisa. O z-index precisa de posicionamento para funcionar; a página de position trata disso.

Erros comuns

  • z-index em um elemento static. Acrescente position: relative (ou faça dele um item flex ou grid).
  • Subir para 9999. Se um pai forma um stacking context abaixo do concorrente, nenhum valor no filho vence. Encontre o contexto.
  • Um novo opacity, transform ou filter em um pai que de repente prende o dropdown dele.
  • Valores decimais. z-index: 1.5 é inválido.
  • Esperar que z-index: 0 e auto se comportem igual. 0 cria um stacking context; auto não.
  • Modais dentro de componentes muito aninhados. Renderize-os perto do fim do <body> (ou use a top layer do elemento <dialog>), para que nenhum contexto ancestral os prenda.

Perguntas frequentes

O que o z-index faz?

Define a ordem de empilhamento de elementos sobrepostos: um valor maior é desenhado na frente de um menor dentro do mesmo stacking context. O padrão é auto, e os valores são números inteiros, inclusive negativos.

Por que meu z-index não funciona?

Ou o elemento não está posicionado (o z-index precisa de um position diferente de static, ou de um filho flex ou grid), ou ele está dentro de um pai que forma um stacking context com ordem mais baixa. Um filho nunca consegue subir acima de um elemento que fica acima do stacking context dele, seja qual for o próprio z-index.

O que é um stacking context?

Um grupo de elementos empilhados juntos como uma única camada. Dentro dele, os filhos são ordenados pelo z-index; fora dele, o grupo inteiro é posicionado pelo z-index do elemento que o criou.

O que cria um stacking context?

Entre outros: o elemento raiz, um elemento posicionado com z-index diferente de auto, position: fixed ou sticky, um filho flex ou grid com z-index, opacity abaixo de 1, transform, filter, isolation: isolate e will-change com essas propriedades.

O z-index funciona sem position?

Não em elementos block ou inline normais: position: static o ignora. Ele funciona em itens flex e itens grid sem nenhum position.

Coddy programming languages illustration

Aprenda a programar com o Coddy

COMEÇAR