Menu

CSS z-index: Katman Sırası ve Stacking Context

z-index, üst üste binen elementlerden hangisinin en üste çizileceğine karar verir. Hangi elementlerde çalıştığını, stacking context'lerin elementleri nasıl gruplayıp z-index 9999'un bile kaybetmesine yol açtığını, neyin stacking context oluşturduğunu ve çalışmayan z-index'in nasıl düzeltileceğini öğren.

Bu sayfada çalıştırılabilir editörler var - düzenle, çalıştır ve sonucu anında gör.

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ğerAnlamı
auto (varsayılan)Kardeşleriyle 0 seviyesinde istiflenir ve stacking context oluşturmaz
00 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:

ÖzellikKoşul
position: relative ya da absoluteauto dışında bir z-index ile
position: fixed ya da stickyHer zaman
Flex ya da grid öğesiauto dışında bir z-index ile
opacity1'in altında
transform, scale, rotate, translatenone dışındaki herhangi bir değer
filter, backdrop-filternone dışındaki herhangi bir değer
isolationisolate
mix-blend-modenormal dışındaki herhangi bir değer
will-changeYukarıdaki özelliklerden birini adlandırırsa
containlayout 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: relative ekle (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, transform ya da filter değerinin açılır menüyü aniden hapsetmesi.
  • Ondalık değerler. z-index: 1.5 geçersizdir.
  • z-index: 0 ile auto'nun aynı davranmasını beklemek. 0 bir stacking context oluşturur; auto oluş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.

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA