Menu

CSS Grid Layout: Sütunlar, Satırlar, fr, gap ve Alanlar

CSS grid öğeleri aynı anda satırlara ve sütunlara yerleştirir. display: grid'i, grid-template-columns'u, fr birimini, repeat() ve minmax()'ı, auto-fill ile auto-fit farkını, öğeleri grid-column ile yerleştirmeyi ve grid-template-areas'ı, düzenleyip ölçtüğün canlı bir ızgarayla öğren.

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

Üç satırda bir grid

Bir kapsayıcıya display: grid ver ve sütunlarını grid-template-columns ile listele. Çocuklar hücreleri sırayla, İngilizcede soldan sağa doldurur ve sütunlar dolduğunda yeni bir satır başlar:

Yedi öğe, üç sütun: iki dolu satır ve ilk sütununda öğe 7 olan üçüncü bir satır. Her sütun aynı genişlikte ve bir satırdaki her öğe aynı yükseklikte, bu yüzden kenarlar iki yönde de hizalanıyor. Grid'in flexbox'a kattığı şey budur.

Grid oyun alanı

Herhangi bir grid-template-columns değeri yaz ya da bir hazır ayara tıkla. Gösterge, tarayıcının hesapladığı sütun genişliklerini (getComputedStyle'dan) ve öğelerin kaç satıra ihtiyaç duyduğunu gösterir:

Görülecek bazı şeyler: 1fr 2fr ikinci sütunu tam olarak ilkinin iki katı yapar. 200px 1fr 200px'i korur ve geri kalanı ikinci sütuna verir. auto 1fr auto dış sütunları içeriklerine göre boyutlandırır. repeat(4, 100px) sonunda boş alan bırakır, çünkü hiçbir şey esnek değildir. 1fr 2 gibi geçersiz bir değer yok sayılır ve grid son geçerli değeri korur.

fr birimi

fr, "boş alanın bir payı" demektir. Tarayıcı önce sabit sütunları (px, rem, %, auto içerik) ve boşlukları çıkarır, sonra kalanı fr sütunları arasında sayılarına göre paylaştırır.

600px'lik bir kapsayıcıda grid-template-columns, boşluk yokSütun genişlikleri
1fr 1fr 1fr200, 200, 200
1fr 2fr200, 400
100px 1fr 1fr100, 250, 250
1fr 50%300, 300

fr, % ile aynı değildir: yüzdeler artı boşluklar %100'ü aşıp taşabilir, fr sütunları ise her zaman yalnızca boşluklardan sonra kalanı paylaşır.

repeat(), minmax() ve medya sorgusu olmadan esnek bir grid

repeat(4, 1fr), 1fr 1fr 1fr 1fr demektir. minmax(120px, 1fr) asla 120px'ten dar olmayan ve bir pay almak için büyüyen bir sütundur. Bir sayı yerine auto-fill ya da auto-fit ile birleştir, grid sığdığı kadar sütun oluşturur:

.cards {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
  gap: 16px;
}

Bu tek bildirim, kapsayıcının sığdırabildiği kadar en az 180px'lik sütun verir: geniş bir ekranda birkaç tane, bir telefonda bir tane, hiç medya sorgusu olmadan. auto-fill ile auto-fit arasındaki fark, sütunlardan daha az öğe olduğunda ortaya çıkar:

Kapsayıcıya beş 100px'lik sütun sığıyor. auto-fill beşini de tutuyor, bu yüzden A, B ve C her biri 112px ve iki boş sütun kalıyor. auto-fit boş olanları çökertiyor, bu yüzden üç öğe her biri yaklaşık 187px'e esniyor.

Öğeleri yerleştirmek: grid-column ve grid-row

Grid çizgileri başlangıç kenarından itibaren 1'den numaralanır. grid-column: 1 / 3, "1. çizgiden 3. çizgiye" demektir, yani iki sütun. span 2, "nereye düşersen oradan iki sütun" demektir ve -1 son çizgidir:

Koyu öğe bütün ilk satırı dolduruyor. Mavi olan 2'ye 2'lik bir bloğu, kehribar rengi olan iki satırı kaplıyor. a ve b öğeleri kalan hücreleri kendiliğinden dolduruyor: grid yerleştirebildiği her öğeyi bir sonraki boş hücreye koyar. grid-auto-rows: 60px, grid-template-rows ile tanımlamadığın satırların yüksekliğini ayarlar.

grid-template-areas: bir düzenin parçalarını adlandır

Bir sayfa düzeni için alanları adlandır ve onları metin olarak çiz. Her metin bir satır, her kelime bir hücredir ve bir öğe grid-area ile bir alana katılır:

Başlık ve alt bilgi iki sütuna yayılıyor, çünkü adları satırlarının iki hücresini de dolduruyor. Ortadaki satır 1fr, bu yüzden 280px'ten kalan yüksekliği alıyor. Bir telefonda her şeyi üst üste dizmek için bir medya sorgusunun alanları yalnızca tek sütun olarak yeniden çizmesi yeterlidir: grid-template-columns: 1fr ile grid-template-areas: "header" "side" "main" "footer". Kalıbı medya sorguları sayfası gösteriyor.

Hücrelerin içinde hizalamak

Grid öğeleri varsayılan olarak hücrelerini dolduracak şekilde esner. Bu özellikler onları hücrenin içinde hareket ettirir:

ÖzellikNereyeNeyi taşır
justify-itemskapsayıcıher öğeyi satır boyunca (satır içi eksen)
align-itemskapsayıcıher öğeyi yukarı aşağı (blok ekseni)
place-itemskapsayıcıkısa yazım: place-items: center ikisinde de ortalar
justify-self / align-selföğetek bir öğeyi
justify-content / align-contentkapsayıcıgrid kapsayıcıdan küçük olduğunda bütün izler kümesini

display: grid; place-items: center;, bir kutuda tek bir çocuğu ortalamanın en kısa yoludur.

Grid mi flexbox mı

Grid iki boyutludur: sütunlara (ve satırlara) sen karar verirsin ve içerik onları doldurur, bu yüzden bir galerideki her kart son satırda bile aynı genişliktedir. Flexbox tek boyutludur: öğeler tek bir çizgi boyunca kendilerini içeriklerine göre boyutlandırır. İkisi iyi karışır: sayfa ve kart galerisi için grid, her kartın içindeki başlık satırı için flexbox. Diğer yarıyı flexbox sayfası anlatıyor.

Sıra ve erişilebilirlik

grid-template-areas, grid-row, grid-column ve order bir öğeyi herhangi bir yere yerleştirebilir, ama ekran okuyucular ve Tab tuşu hâlâ HTML sırasını takip eder. Kaynak sırasını anlamlı tut (başlık, gezinme, ana içerik, alt bilgi) ve grid'i onu düzenlemek için kullan, anlamsız bir HTML sırasını düzeltmek için değil.

Sık yapılan hatalar

  • display: grid'i öğelere vermek. Ebeveyne verilir; yalnızca doğrudan çocuklar grid öğesidir.
  • Boşluklarla yüzde kullanmak. grid-template-columns: 50% 50% artı gap: 16px 16px taşar. 1fr 1fr kullan.
  • auto-fit isterken auto-fill. Az öğeyle auto-fill boş sütunlar bırakır. Öğeleri esnetmek için auto-fit'e geç.
  • Payının ötesine büyüyen bir 1fr sütun. Bir 1fr sütun en uzun içeriğinin (uzun bir URL, geniş bir resim) altına küçülmez. Küçülmesine izin vermek için minmax(0, 1fr) kullan.
  • Dikdörtgen olmayan alan metinleri. Her adlandırılmış alan bir dikdörtgen oluşturmalı ve her satır metninde aynı sayıda hücre olmalıdır, yoksa bütün grid-template-areas bildirimi yok sayılır.
  • Çizgi numaralarının 1'den başladığını unutmak. Üç sütunun dört çizgisi vardır: 1 / 4 ya da 1 / -1 üçünü de kaplar.

Sıkça Sorulan Sorular

CSS grid nedir?

Elementleri aynı anda satırlara ve sütunlara yerleştiren bir düzen sistemidir. Bir kapsayıcıya display: grid verirsin, sütunlarını grid-template-columns ile (ve isteğe bağlı olarak satırlarını) tarif edersin ve doğrudan çocukları hücreleri sırayla doldurur.

CSS grid'de 1fr ne anlama gelir?

fr, grid kapsayıcısındaki boş alanın bir payıdır. grid-template-columns: 1fr 1fr 1fr üç eşit sütun verir, 1fr 2fr ise ikinci sütunu ilkinin iki katı genişliğinde yapar. Önce sabit boyutlar ve boşluklar çıkarılır; fr sütunları kalanı paylaşır.

auto-fill ile auto-fit arasındaki fark nedir?

İkisi de sığdığı kadar sütun oluşturur. auto-fill boş sütunları tutar, bu yüzden az sayıda öğe dar kalır ve satırın sonunda boş alan bırakır. auto-fit boş sütunları çökertir, bu yüzden öğeler satırı dolduracak şekilde esner. Satırı dolduracak kadar öğe varsa ikisi aynı görünür.

Bir grid öğesi iki sütuna nasıl yayılır?

Öğeye grid-column: span 2 ver ya da başlangıç ve bitiş çizgilerini ver: grid-column: 1 / 3, 1. ve 2. sütunları kaplar. grid-column: 1 / -1 tam genişliğe yayılır, çünkü -1 son çizgidir.

Flexbox yerine ne zaman grid kullanmalıyım?

Satırların ve sütunların birbiriyle hizalanması gerektiğinde grid kullan: kart galerileri, hizalı etiketli formlar, başlık, kenar çubuğu ve alt bilgisi olan bir sayfa. Öğeleri kendilerini içeriklerine göre boyutlandıran tek bir satır ya da sütun için, örneğin bir gezinme çubuğu için flexbox kullan.

grid-gap ile gap aynı şey mi?

Evet. grid-gap, grid-row-gap ve grid-column-gap eski adlardır. Tarayıcılar onları hâlâ takma ad olarak kabul eder, ama flexbox'ta da çalışan gap, row-gap ve column-gap yaz.

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA