/* NEVYTVÁŘÍ stacking context */
.div1 {
position: relative;
}
/* VYTVÁŘÍ stacking context */
.div2 {
position: relative;
z-index: 0; /* nebo jakákoliv jiná hodnota */
}
/* VYTVÁŘÍ stacking context */
.div3 {
isolation: isolate;
}
Tady je kompletní seznam, co vytváří stacking context:
------------------------------------------------------
Root element (<html>)
position: fixed nebo sticky
position: relative/absolute + jakýkoliv z-index kromě auto
Element s opacity < 1
Element s transform, filter, backdrop-filter
Element s isolation: isolate
mix-blend-mode jiné než normal
perspective hodnota jiná než none
contain s hodnotou layout, paint nebo strict
-webkit-overflow-scrolling: touch
/* Řešení 1 */
div {
position: relative;
isolation: isolate;
}
/* Řešení 2 - stejný výsledek */
div {
position: relative;
z-index: 0; /* nebo jakákoliv jiná hodnota */
}
Jediný rozdíl je v tom, že:
z-index ovlivňuje pozici elementu v rámci stacking contextu jeho rodiče
isolation: isolate vytvoří jen nový stacking context, ale neovlivní pozici elementu
Proto se isolation: isolate někdy považuje za "čistší" řešení, když chceš jen vytvořit nový stacking context a nepotřebuješ řešit překrývání s jinými elementy.
Co dělá isolation: isolate?
Vytváří nový "stacking context" pro element
Všechny z-index hodnoty uvnitř tohoto elementu se vztahují pouze k tomuto novému kontextu
Zabraňuje "propadnutí" negativních z-indexů pod text
Stacking context je hierarchie elementů určující jejich překrývání. Vytváří se několika způsoby:
Kořenový element (<html>)
Element s position: relative/absolute a nenulovým z-index
Element s position: fixed nebo position: sticky
Element s opacity menší než 1
Element s transform, filter, perspective
A právě element s isolation: isolate
Ve tvém případě isolation: isolate říká prohlížeči: "Vytvoř nový kontext pro tento div a všechno uvnitř vykresluj relativně k němu, ne k celé stránce."
Proto se span s negativním z-indexem zobrazí pod ostatním obsahem divu, ale ne úplně "mimo hru".
=================
Když přidáš isolation: isolate nebo z-index, vytvoříš stacking context a negativní z-index se vztahuje k tomuto novému kontextu.
Je to jako bys vytvořil "novou vrstvu" - všechno uvnitř elementu se stacking contextem se vykresluje relativně k této vrstvě, ne k celé stránce.