A camada superior fica acima da document
relacionada na viewport do navegador, e cada document
tem uma camada superior associada. Isso significa que os elementos promovidos para a camada superior não precisam se preocupar com a hierarquia z-index
ou DOM. Eles também têm um pseudoelemento ::backdrop
para brincar. A especificação da API Fullscreen entra em mais detalhes, já que a Fullscreen era um ótimo exemplo da camada superior em uso antes do suporte ao dialog
.
A camada superior ajuda a resolver o problema de renderizar conteúdo acima do restante do document
.
Pontos importantes:
- A camada superior está fora do fluxo document
.
- z-index
não tem efeito na camada superior.
- Cada elemento na camada de cima tem um pseudoelemento ::backdrop
estilizável.
- Cada elemento e ::backdrop
geram um novo contexto de empilhamento.
- Os elementos da camada superior são empilhados na ordem em que aparecem no conjunto. A última entrada aparece na parte superior. Se você quiser promover um elemento, remova e adicione novamente.
Como imitamos a camada superior até agora? Não é incomum que os desenvolvedores coloquem um elemento de contêiner vazio no final da body
. Isso vai ser usado como uma "falso" camada superior. A ideia é que esse contêiner seja posicionado acima de tudo na pilha. Quando você quer promover algo acima de tudo, anexe-o a esse contêiner. Isso pode ser visto em pacotes conhecidos, como SweetAlert, reactjs-popup, Magnific Popup e outros.
Com novos componentes e APIs integrados, como <dialog>
e "Popover", você não vai precisar recorrer a essas soluções alternativas. Você pode promover o conteúdo para a camada superior.
Os frameworks de interface permitem que os elementos promovidos sejam colocados junto com os componentes correspondentes. No entanto, eles costumam ser separados no DOM quando se trata de renderização.
Ao usar a camada superior, os elementos promovidos são onde você os coloca no código-fonte (por exemplo, um <dialog>
). Não importa quantas camadas abaixo no DOM o elemento está. Ele será promovido para a camada superior e você poderá inspecioná-lo onde espera que esteja, colocalizado com o HTML do componente. Isso facilita a inspeção do elemento acionador e do elemento promovido no DOM ao mesmo tempo. Isso é útil, por exemplo, se o elemento acionador estiver fazendo atualizações de atributos. Isso também tem um benefício adicional para a acessibilidade, agora que os elementos estão localizados juntos.
Para ilustrar a camada superior em comparação com o z-index
alto, considere esta demonstração.
Nesta demonstração, você pode abrir um pop-up do SweetAlert e também uma camada superior <dialog>
. Abra o <dialog>
e tente abrir o pop-up do SweetAlert. Ele vai aparecer abaixo do elemento da camada superior. E a raiz do pop-up SweetAlert está usando um z-index
de 10000 com position: fixed
.
.swal-overlay {
z-index: 10000;
position: fixed;
}
Não é necessário aplicar estilos ao <dialog>
para que ele apareça acima de todo o outro conteúdo.
DevTools
Isso nos leva ao suporte ao DevTools. O Chrome DevTools está adicionando suporte a elementos da camada superior para que você possa inspecionar a camada superior. Isso facilita a depuração e a visualização de como as coisas estão se acumulando na camada superior ou o que está na camada superior.
Alina Varkki tem um ótimo artigo que aborda em detalhes o uso dessas ferramentas. No momento, eles estão disponíveis como um recurso de pré-lançamento na versão 105 do Chrome Canary.
Pronto.
Uma breve introdução à camada superior. Agora você pode dizer "Até mais" para:
.popup-container {
z-index: 10000;
}
O que você enviaria para a camada superior? Você já testou o dialog
? Ou conferir a API OpenUI Popover? Conte para nós.