Ders 15 / 26
Yığılma Bağlamı
Kutuların çizim sırası; z-index değerlerinin yalnızca kardeşler arasında karşılaştırılması ve yığılma bağlamını kuran bildirimler.
İçindekiler
Konumlandırma kutuları üst üste bindirdi: rozet kartın üzerinde, yapışan başlık satırların üzerinde duruyor. Bir soru açıkta kaldı — iki kutu aynı noktada çakışırsa hangisi üstte çizilir?
Yanıt z-index yazmakla bitmiyor. Bu özelliğin sık karşılaşılan bir davranışı vardır:
bazen daha yüksek bir değer daha altta kalır. Sebep bir hata değil, yığılma bağlamı
(stacking context) adı verilen bir yapıdır. Bu ders o yapıyı tanımlar.
Varsayılan Çizim Sırası
z-index hiç yazılmadığında bile bir sıra vardır. Aynı yığılma bağlamındaki kutular
kabaca şu sırayla çizilir — önce çizilen altta kalır:
- Bağlamı kuran kutunun arka planı ve kenarlığı.
- Negatif
z-indexdeğerli konumlandırılmış kutular. - Akıştaki blok kutuların arka planları.
- Kaydırılmış kutular.
- Satır içi içerik ve metin.
z-index: autoya da0olan konumlandırılmış kutular.- Pozitif
z-indexdeğerli konumlandırılmış kutular.
Bu listeden iki gözlem çıkar. Birincisi, konumlandırılmış bir kutu akıştaki kutuların
üstünde çizilir; z-index yazmaya gerek yoktur. Bir rozetin kartın üzerinde görünmesi
için position: absolute yeter.
İkincisi, aynı düzeydeki kutular arasında belge sırası belirleyicidir: sonra gelen üstte çizilir.
z-index Yalnızca Kardeşler Arasında Karşılaştırılır
z-index bir kutuya küresel bir yükseklik vermez. Değer, yalnızca kutunun kendi yığılma
bağlamı içindeki kardeşleriyle karşılaştırılır.
Bir kutu yığılma bağlamı kurduğunda, içindeki bütün kutular o bağlamın içine kapanır. Dışarıdaki kutularla karşılaştırılan şey artık çocukların değerleri değil, bağlamı kuran kutunun değeridir.
// yigilma.mjs — yigilma baglamlarini agac olarak cozer ve cizim sirasini uretir const agac = { ad: "kok", zIndex: "auto", baglamKurar: true, cocuk: [ { ad: "A", zIndex: 1, baglamKurar: true, cocuk: [ { ad: "A1", zIndex: 999, baglamKurar: true, cocuk: [] }, { ad: "A2", zIndex: 5, baglamKurar: true, cocuk: [] }, ]}, { ad: "B", zIndex: 2, baglamKurar: true, cocuk: [ { ad: "B1", zIndex: 1, baglamKurar: true, cocuk: [] }, ]}, { ad: "C", zIndex: "auto", baglamKurar: false, cocuk: [] }, ], }; // bir baglam icindeki cocuklar z-index'e gore, esitse belge sirasina gore siralanir function ciz(dugum, derinlik = 0, onEk = "") { const yol = onEk ? `${onEk} > ${dugum.ad}` : dugum.ad; const z = dugum.zIndex === "auto" ? 0 : dugum.zIndex; console.log(`${" ".repeat(derinlik)}${dugum.ad.padEnd(4)} z=${String(dugum.zIndex).padEnd(4)} yol=${yol}`); const sirali = [...dugum.cocuk] .map((c, i) => ({ c, i })) .sort((x, y) => { const zx = x.c.zIndex === "auto" ? 0 : x.c.zIndex; const zy = y.c.zIndex === "auto" ? 0 : y.c.zIndex; return zx - zy || x.i - y.i; }); for (const { c } of sirali) ciz(c, derinlik + 1, yol); return z; } console.log("cizim sirasi (ustteki alttan uste dogru, ic ice):"); ciz(agac); console.log("\n--- A1 ile B karsilastirmasi ---"); console.log("A1.z = 999, B.z = 2"); console.log("A1 kok baglaminda degil; A (z=1) baglaminin icinde."); console.log("Kok baglaminda karsilastirilan degerler: A=1, B=2 -> B ustte."); console.log("Sonuc: A1 (999) tum B agacinin ALTINDA kalir.");
cizim sirasi (ustteki alttan uste dogru, ic ice):
kok z=auto yol=kok
C z=auto yol=kok > C
A z=1 yol=kok > A
A2 z=5 yol=kok > A > A2
A1 z=999 yol=kok > A > A1
B z=2 yol=kok > B
B1 z=1 yol=kok > B > B1
--- A1 ile B karsilastirmasi ---
A1.z = 999, B.z = 2
A1 kok baglaminda degil; A (z=1) baglaminin icinde.
Kok baglaminda karsilastirilan degerler: A=1, B=2 -> B ustte.
Sonuc: A1 (999) tum B agacinin ALTINDA kalir.
Son blok, bu dersin çözdüğü sorunun tam ifadesidir. A1 kutusunun z-index değeri 999 —
sayfadaki en yüksek değer. Buna karşın 2 değerli B kutusunun altında kalıyor.
Sebep, A1 kutusunun kök bağlamda bulunmamasıdır. Kök bağlamda karşılaştırılan iki değer
vardır: A için 1 ve B için 2. B kazanır ve bütün alt ağacıyla birlikte A’nın
üstünde çizilir. A1 kutusunun 999 değeri yalnızca kardeşi A2 ile karşılaştırılır.
Uygulanabilir sonuç şudur: bir kutu beklendiği kadar yukarı çıkmıyorsa çözüm değeri büyütmek değildir. Değeri milyona çıkarmak da işe yaramaz. Çözüm, atalar zincirinde hangi kutunun bağlam kurduğunu bulmak ve karşılaştırmayı o düzeyde yapmaktır.
Yığılma Bağlamını Ne Kurar
Bir kutu şu koşullardan biri sağlandığında yığılma bağlamı kurar:
- Belgenin kök ögesi (her zaman bir bağlam kurar).
positiondeğeristaticdışında vez-indexdeğeriautodışında olan kutular.position: fixedya daposition: stickyolan kutular (z-indexyazılmasa bile).opacitydeğeri 1’den küçük olan kutular.transform,filter,perspective,clip-path,maskgibi özelliklerinnonedışında bir değer aldığı kutular.isolation: isolatebildirilen kutular.- Esnek kutu ya da ızgara düzeninin
z-indexdeğeriautodışında olan çocukları.
Bu listenin ortası dikkat çekicidir. opacity: 0.99 yazmak — görsel olarak fark
edilmeyecek bir değişiklik — bir yığılma bağlamı kurar ve o kutunun içindeki bütün
z-index hesabını dışarıdan yalıtır. Aynı şey bir kutuya hareket vermek için yazılan
transform bildirimi için de geçerlidir.
Yığılmayla ilgisi olmayan bir bildirimin yığılmayı değiştirmesi şaşırtıcı görünür, ama gerekçesi vardır: bu özelliklerin hepsi kutuyu ve içeriğini bir bütün olarak işlemeyi gerektirir. Saydamlık, kutunun içindekilerin ayrı ayrı değil, birlikte harmanlanmasıyla hesaplanır; bu da onları tek bir katman olarak ele almayı zorunlu kılar.
isolation: isolate
Listedeki son maddeden önceki isolation: isolate bildirimi, yığılma bağlamı kurmanın yan
etkisiz yoludur. Bir kutunun içindeki z-index değerlerinin dışarıya sızmasını istemiyorsa
yazılır ve başka hiçbir şeyi değiştirmez.
Bu, birden çok bileşenin bir arada bulunduğu sayfalarda kullanışlıdır: her bileşen kendi
bağlamını kurarsa, iç z-index değerleri küçük ve yerel tutulabilir. Bir bileşenin 10
değeri başka bir bileşenin 10 değeriyle yarışmaz.
z-index Ölçeği
Bu dersin pratik sonucu bir yazım disiplinidir.
z-indexdeğerleri küçük ve adlandırılmış tutulur. Sayfada birkaç katman vardır — taban, yapışan başlık, açılır katman, üst katman — ve her birine 1, 10, 100 gibi seyrek değerler verilir. Aradaki boşluk sonradan katman eklemeye yer bırakır.- Bir kutunun üstte kalması için önce
positionyeter mi diye bakılır; konumlandırılmış kutu akıştaki kutuların zaten üstündedir. - Bileşenler
isolation: isolateile yalıtılır; böylece iç değerler dışarıya sızmaz.
/* istasyon.css — 14. adım: katman ölçeği */ .kart { position: relative; isolation: isolate; } .kart .durum-rozeti { position: absolute; z-index: 1; inset-block-start: 8px; inset-inline-end: 8px; } .olcum-cizelgesi thead th { position: sticky; z-index: 10; inset-block-start: 0; background-color: #f5f7f8; } .atlama-baglantisi:focus { position: fixed; z-index: 100; inset-block-start: 8px; inset-inline-start: 8px; }
Karta yazılan isolation: isolate, rozetin z-index: 1 değerinin kartın dışındaki hiçbir
şeyle yarışmamasını sağlar. Yapışan başlık 10, odaklanan atlama bağlantısı 100 katmanında
durur; üçü arasındaki sıra sayfanın tamamı için tanımlıdır ve okunabilir.
Özet
- Çizim sırası
z-indexyazılmasa da tanımlıdır; konumlandırılmış kutular akıştaki kutuların üstünde, aynı düzeydekiler ise belge sırasına göre çizilir. z-indexküresel bir yükseklik vermez; yalnızca kutunun kendi yığılma bağlamı içindeki kardeşleriyle karşılaştırılır.- Bir kutu bağlam kurduğunda içindeki bütün değerler o bağlama kapanır; dışarıyla karşılaştırılan şey bağlamı kuran kutunun değeridir.
opacity,transform,filtergibi yığılmayla ilgisiz görünen bildirimler de bağlam kurar, çünkü kutunun içeriğini bir bütün olarak işlemeyi gerektirirler.isolation: isolatebağlam kurmanın yan etkisiz yoludur; bileşenlerin iç katman değerlerini yerel tutmak için kullanılır.
Sonraki Adım
Bu konu boyunca kutular ölçüldü, dizildi, üst üste bindirildi. Bir durum hâlâ ele alınmadı: içerik kutusuna sığmadığında ne olur? Uzun bir istasyon adı dar bir hücreye, geniş bir ölçüm çizelgesi dar bir ekrana sığmaz. Sonraki ders taşmanın ne olduğunu ve kırpma, kaydırma, gizleme seçeneklerinin her birinin neyi kaybettirdiğini ele alır.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.