z-index ne yapar
Elementler üst üste bindiğinde hangisinin önde çizileceğine z-index karar verir. Yüksek sayı kazanır. Konumlandırılmış elementlerde (static dışındaki her position) ve flex ile grid öğelerinde çalışır:
z-index olmadan, HTML'de sonra gelen elementler öncekilerin üstüne çizilir, yani C, B'yi ve B de A'yı örterdi. z-index değerleri bunu tersine çeviriyor: A önde, sonra C, sonra B.
Değerler
| Değer | Anlamı |
|---|---|
auto (varsayılan) | Kardeşleriyle 0 seviyesinde istiflenir ve stacking context oluşturmaz |
0 | 0 seviyesi, ama bir stacking context oluşturur |
| Pozitif tam sayı | Düşük değerlerin önünde |
| Negatif tam sayı | 0 seviyesinin arkasında; ebeveyn stacking context'i oluşturuyorsa ebeveynin içeriğinin de arkasında |
Yalnızca tam sayılar geçerlidir: z-index: 1.5 yok sayılır.
z-index 9999 neden kaybedebilir: stacking context'ler
z-index değerleri bütün sayfa boyunca karşılaştırılmaz. Elementler stacking context'ler halinde gruplanır ve bir z-index yalnızca aynı context içindeki elementleri sıralar. Context'in kendisi ise onu oluşturan elementin z-index'i kullanılarak tek bir katman olarak yerleştirilir.
Aşağıda mavi açılır menünün z-index: 9999 değeri var, ama z-index: 1 olan bir başlığın içinde duruyor. O başlığın kardeşi olan yeşil şeridin z-index: 2 değeri var. Açılır menü dahil bütün başlık katmanı şeridin altında:
Butona bas. z-index: auto ile başlık artık bir stacking context oluşturmaz, böylece açılır menünün 9999'u doğrudan şeridin 2'siyle karşılaştırılır ve açılır menü öne gelir. Açılır menüyü 99999'a çıkarmak asla işe yaramazdı.
Stacking context'i ne oluşturur
Bunlardan herhangi biri bir elementi kendi stacking context'ine çevirir ve içindeki her şeyin z-index'ini hapseder:
| Özellik | Koşul |
|---|---|
position: relative ya da absolute | auto dışında bir z-index ile |
position: fixed ya da sticky | Her zaman |
| Flex ya da grid öğesi | auto dışında bir z-index ile |
opacity | 1'in altında |
transform, scale, rotate, translate | none dışındaki herhangi bir değer |
filter, backdrop-filter | none dışındaki herhangi bir değer |
isolation | isolate |
mix-blend-mode | normal dışındaki herhangi bir değer |
will-change | Yukarıdaki özelliklerden birini adlandırırsa |
contain | layout ya da paint (ve strict, content) |
Şaşırtıcı olanlar opacity ve transform'dur: bir ebeveyne bir solma ya da hover animasyonu eklemek, açılır menüsünü aniden bir sonraki bölümün arkasına atabilir.
Tooltip'in z-index: 10 değeri onu bir sonraki sütunun üstüne koymalı. Ama opacity: 0.99 ilk sütunu z-index'i auto (0 seviyesi) olan bir stacking context yapıyor ve ikinci sütun HTML'de aynı seviyede daha sonra geliyor, bu yüzden tooltip dahil bütün ilk sütunun üstüne boyanıyor. opacity satırını sil, tooltip yine önde olur.
Negatif z-index
Negatif bir z-index bir elementi kardeşlerinin arkasına koyar. Ebeveyn bir stacking context oluşturmuyorsa ebeveynin arka planının bile arkasına gidebilir; bu yaygın bir sürprizdir. Ebeveyne verilen isolation: isolate başka hiçbir görsel etki olmadan bir context oluşturur ve negatif çocuğu onun içinde tutar:
Isolation olmadan kehribar rengi çerçeve butonun kendi gri arka planının arkasına düşer, bu yüzden yalnızca kenarı görünür. isolation: isolate ile çerçeve butonun stacking context'inin içinde kalır: arka planının üstünde, metninin altında.
Bir z-index ölçeği
Tırmanan sayılar yerine bütün site için birkaç adlandırılmış katman seç:
:root {
--z-dropdown: 10;
--z-sticky: 20;
--z-overlay: 30;
--z-modal: 40;
--z-toast: 50;
}
.modal { position: fixed; z-index: var(--z-modal); }
Katman hatalarının çoğu sayı hatası değil stacking context hatasıdır; bu yüzden küçük bir ölçek artı içeride z-index kullanan bileşenlere verilen isolation: isolate çok iş görür. z-index'in çalışması için konumlandırma gerekir; bunu position sayfası anlatıyor.
Sık yapılan hatalar
- Static bir elementte z-index.
position: relativeekle (ya da onu bir flex veya grid öğesi yap). - 9999'a kadar tırmanmak. Bir ebeveyn rakibin altında bir stacking context oluşturuyorsa hiçbir çocuk değeri kazanamaz. Bunun yerine context'i bul.
- Bir ebeveyne eklenen yeni
opacity,transformya dafilterdeğerinin açılır menüyü aniden hapsetmesi. - Ondalık değerler.
z-index: 1.5geçersizdir. z-index: 0ileauto'nun aynı davranmasını beklemek.0bir stacking context oluşturur;autooluşturmaz.- Derin iç içe bileşenlerin içindeki modal'lar. Hiçbir ata context onları hapsedemesin diye onları
<body>'nin sonuna yakın bir yerde çiz (ya da<dialog>elementinin üst katmanını kullan).
Sıkça Sorulan Sorular
z-index ne işe yarar?
Üst üste binen elementlerin katman sırasını ayarlar: aynı stacking context içinde yüksek değer düşük olanın önüne çizilir. Varsayılan auto'dur ve değerler negatifler dahil tam sayılardır.
z-index'im neden çalışmıyor?
Ya element konumlandırılmamıştır (z-index, static dışında bir position ister ya da bir flex veya grid çocuğu olmalıdır), ya da daha düşük sırada bir stacking context oluşturan bir ebeveynin içindedir. Bir çocuk, kendi z-index'i ne olursa olsun, stacking context'inin altına yerleştirildiği bir elementin üstüne asla çıkamaz.
Stacking context nedir?
Tek bir katman olarak birlikte istiflenen bir element grubudur. İçinde çocuklar z-index'lerine göre sıralanır; dışarıda ise bütün grup, onu oluşturan elementin z-index'iyle yerleştirilir.
Stacking context'i ne oluşturur?
Diğerlerinin yanında: kök element, z-index'i auto dışında olan konumlandırılmış bir element, position: fixed ya da sticky, z-index'i olan bir flex veya grid çocuğu, 1'in altındaki opacity, transform, filter, isolation: isolate ve bu özellikler üzerindeki will-change.
z-index position olmadan çalışır mı?
Normal blok ya da satır içi elementlerde hayır: position: static onu yok sayar. Flex ve grid öğelerinde ise hiç position olmadan çalışır.