CSS Flexbox vs Grid: Hangi Yerleşim Sistemi Kullanılmalı?
Hem Flexbox hem de CSS Grid benzer sonuçlar üretebilir, bu yüzden geliştiriciler zaman zaman yanlış olanı seçebilir. Fark tek boyutlu ile iki boyutlu arasındaki farka dayanır ve hangisiyle uğraştığınızı bilmek tercihi netleştirir.
Tek Cümle Kuralı
Öğeleri tek bir yönde (bir satır veya sütun) dizdiğinizde Flexbox kullanın. Yerleşimi aynı anda iki yönde (satırlar ve sütunlar eşzamanlı olarak) kontrol etmeniz gerektiğinde CSS Grid kullanın.
Kararın özü tam olarak budur. Geri kalan her şey, bu kuralın pratikte neden işe yaradığını açıklayan detaylardır.
Flexbox'ın Gerçekten İyi Olduğu Konular
Flexbox, tek bir eksen boyunca alanı dağıtmak için tasarlanmıştır. Onun en can alıcı özelliği, her biri için kesin boyutlar belirtmenize gerek kalmadan öğelerin doğal olarak büyümesi, küçülmesi ve sarmalanmasıdır.
Flexbox'ın doğru seçim olduğu durumlar şunlardır:
- Navigasyon çubukları — belirli öğeleri sağa itmek istediğiniz (
margin-left: auto) veya eşit aralıklı dizmek istediğiniz (justify-content: space-between) bir bağlantı satırı - Her kartın içerik uzunluğuna bakılmaksızın eşit yüksekliğe sahip olduğu Kart satırları (
align-items: stretchbunu otomatik olarak halleder) - Bir konteyner içinde bir öğeyi yatay ve dikey olarak ortalamak — üç satırlık CSS:
display: flex; justify-content: center; align-items: center - Buton grupları, ikon + etiket kombinasyonları ve çocuk öğelerin belirli bir boşlukla yan yana durması gereken herhangi bir bileşen
- Yer kalmadığında öğelerin bir sonraki satıra sarmalanmasını istediğiniz Sarma listeler (Wrapping lists) (
flex-wrap: wrap)
.navbar {
display: flex;
align-items: center;
gap: 1rem;
}
.navbar .logo { margin-right: auto; }
/* logo solda kalır, bağlantılar sağda kalır */
CSS Grid'in Gerçekten İyi Olduğu Konular
Grid, iki boyutlu yerleşimler için tasarlanmıştır — hem satırları hem de sütunları tanımlarsınız; öğeleri hücrelere tam olarak yerleştirebilir, birden fazla satırı veya sütunu kapsayabilir ve her iki yönde boşluklar oluşturabilirsiniz.
Grid'in doğru seçim olduğu durumlar şunlardır:
- Sayfa yerleşimleri — başlık, yan menü, ana içerik ve alt kısmın hepsinin birbirine göre konumlandırılması
- Farklı öğelerin farklı miktarlarda alan kapladığı Dergi veya dashboard yerleşimleri
- Görüntü boyutından bağımsız olarak tutarlı bir ızgara yapısına sahip Resim galerileri
- Etiketlerin ve giriş alanlarının hem yatay hem de dikey olarak hizalanması gereken Form yerleşimleri
- Aynı anda hem satırları HEM DE sütunları düşündüğünüz herhangi bir yerleşim
.page {
display: grid;
grid-template-columns: 250px 1fr;
grid-template-rows: auto 1fr auto;
grid-template-areas:
"header header"
"sidebar main"
"footer footer";
min-height: 100dvh;
}
Yan Yana Örnek: Bir Kart Izgarası
Karmaşanın yaşandığı yer burasıdır. Her iki sistem de bir kart satırı oluşturabilir:
.card-row {
display: flex;
gap: 1rem;
flex-wrap: wrap;
}
.card { flex: 1 1 280px; }
Grid ile:
.card-row {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 1rem;
}
Her ikisi de çalışır. Grid versiyonu burada genellikle tercih edilir çünkü minmax ile auto-fill kullanımı size daha öngörülebilir bir sütun davranışı sağlar — her sütun tam olarak aynı genişliktedir ve ızgara düzenli bir şekilde yeniden şekillenir. Flexbox versiyonu ise kartların değişken genişliklere sahip olabildiği ve onların mevcut alanı daha akıcı kullanmasını istediğiniz durumlarda daha iyidir.
Hizalama Farkı
Flexbox'ta, öğeleri ana eksen (seçtiğiniz yön) ve çapraz eksen (ona dik olan) boyunca hizalarsınız. Görünmez bir satır ve sütun ızgarası içinde bir hücrenin konumunu bağımsız olarak kontrol edemezsiniz.
Grid'de ise her öğe, hem satır hem de sütun konumuna sahip bir hücrede yaşar. Bir öğeyi açıkça 2. satır, 3. sütuna yerleştirebilir veya tarayıcının onu otomatik yerleştirmesine izin verebilirsiniz. Flexbox'ın hücre kavramı yoktur — öğeler sadece belirttiğiniz yönde akar.
Yaygın Hatalar
Basit merkezleme için Grid kullanmak: display: flex; align-items: center; justify-content: center, tek bir öğe için bir ızgara kurmaktan daha hızlıdır. Flexbox, tek eksenli görevlerde kazanır.
Tam sayfa yerleşimleri için Flexbox kullanmak: Birbirine konumsel olarak bağlı olması gereken iki'den fazla bileşene sahip olduğunuzda (başlık + yan menü + içerik + alt kısım), Flexbox'ın ikinci ekseninin eksikliği bir soruna dönüşür. Grid bunu adlandırılmış alanlarla (named areas) halleder.
Grid satırlarının yerine Flexbox sütununu kullanmak: <flex-direction: column> öğelerin dikey olarak üst üste binmesini sağlar, ancak içeriği birden fazla sütunda eşzamanlı olarak hizalama yeteneğini kaybedersiniz. Sütunlar hakkında düşünüyorsanız Grid'e geçin.
İkisini Birlikte Kullanmak
Grid ve Flexbox birbirini dışlayan yapılar değildir. En yaygın gerçek dünya modeli sayfa düzeyi yerleşim için Grid, her bölümün içinde Flexbox kullanımıdır:
- Grid; yan menüyü, başlığı ve ana içerik alanını konumlandırır
- Navigasyonun içinde (başlık alanında bulunan), Flexbox logo + bağlantılar + CTA butonu satırını halleder
- Ana içerik alanının içinde, bir kart ızgarası sütun yapısı için Grid kullanır
- Her kartın içinde, Flexbox ikon + metin + buton yerleşimini halleder
Bu kompozisyon deseni — yapı için Grid, bileşenler için Flexbox — çoğu modern CSS framework'ünün (Tailwind, Bootstrap) içsel çalışma prensibidir.
Hızlı Özellik Referansı
| İstediğiniz şey | Flexbox | Grid |
|---|---|---|
| Yerleşim yönünü ayarla | flex-direction | grid-template-columns/rows |
| Öğeler arası boşluk | gap veya justify-content | gap |
| Çapraz eksende hizala | align-items | align-items |
| Bir öğeyi spesifik olarak yerleştir | Doğrudan mümkün değil | grid-column / grid-row |
| Öğeleri eşit yükseklikte yap | align-items: stretch | Varsayılan davranış |
| Media queries olmadan duyarlı (responsive) yapı | flex-wrap: wrap + <style="font-family: monospace;">flex-basis | auto-fill + <style="font-family: monospace;">minmax() |
Flexbox Yerleşimlerini Görsel Olarak Oluşturun
Flex konteynerleri oluşturmak, hizalamayı ayarlamak ve üretilen CSS'i saniyeler içinde kopyalamak için görsel CSS Flexbox Generator'ımızı kullanın.