Kapsayıcı ve öğe ayarlarını değiştir, sonucu anında canlı önizlemede gör, hazır CSS ve HTML kodunu kopyala. Araç yalnızca varsayılandan farklı olan satırları yazar, böylece çıktı temiz kalır. Her şey tarayıcında çalışır, hiçbir değer sunucuya gönderilmez.
align-content yalnızca satırlar birden fazla olduğunda çalışır. Etkinleştirmek için flex-wrap değerini wrap ya da wrap-reverse yap.
|
justify-content ana eksende, align-items karşı eksende hizalar. flex-direction değerini değiştirdiğinde bu iki eksen yer değiştirir, bu yüzden aynı ayar bambaşka bir sonuç verir.
Bir kutuya tıklayarak onu seçip ayarlarını değiştirebilirsin. Genişlik ve yükseklik yalnızca önizleme içindir, çıktıya yazılmaz.
Bir öğeye display: flex verdiğinde o öğe flex kapsayıcısına, doğrudan çocukları da flex öğesine dönüşür. Bundan sonra düzeni yöneten şey iki eksendir: ana eksen ve karşı eksen. Ana ekseni flex-direction belirler. Değer row ise ana eksen yatay, karşı eksen dikeydir; column yaptığın anda ikisi yer değiştirir.
Bu ayrım küçük görünür ama her şeyi değiştirir. justify-content her zaman ana eksende, align-items her zaman karşı eksende hizalar. row düzeninde justify-content: center içeriği yatayda ortalar, flex-direction değerini column yaptığın anda aynı satır içeriği dikeyde ortalamaya başlar. Flexbox ile ilgili en sık yaşanan kafa karışıklığı buradan doğar, bu yüzden araçtaki eksen notu ekranda sürekli açık durur.
flex, üç özelliğin kısayoludur: flex-grow, flex-shrink ve flex-basis. flex: 1 yazdığında tarayıcı bunu flex: 1 1 0% olarak açar. Yani yalnızca büyüme katsayısını değil, öğenin temel boyutunu da ayarlamış olursun.
Fark tam burada. flex-grow: 1 tek başına yazıldığında flex-basis auto kalır, yani her öğe önce kendi içeriği kadar yer kaplar ve artan boşluk ondan sonra paylaştırılır. İçeriği uzun olan öğe geniş, kısa olan dar kalır. flex: 1 ise temel boyutu sıfırlar, içerik ne olursa olsun bütün öğeler eşit genişlik alır. Eşit sütunlar istiyorsan flex: 1, içerikle orantılı sütunlar istiyorsan flex-grow: 1 doğru olanıdır.
Flex öğelerinin varsayılan flex-shrink değeri 1’dir, yani yer kalmadığında küçülürler. Ama bir sınır vardır: bir öğe kendi min-content boyutunun altına inmez. Uzun bir kelime, kırılmayan bir tablo ya da satır sonu alamayan bir metin öğeyi olduğu yerde tutar ve kapsayıcıdan taşırır.
Çözüm, o öğeye min-width: 0 vermektir; column düzeninde karşılığı min-height: 0 olur. Bu, örtük min-content sınırını kaldırır ve öğenin gerçekten küçülmesine izin verir. Bir flex öğesinin içinde text-overflow: ellipsis ya da overflow: hidden çalışmıyorsa, durumların büyük çoğunluğu bu tek satırla düzelir.
İkisi de karşı eksende hizalar ama farklı şeyleri hizalar. align-items öğeleri kendi satırlarının içinde konumlandırır. align-content ise satırların tamamını kapsayıcının içinde konumlandırır.
Tek satır varken align-content hiçbir şey yapmaz, çünkü hizalanacak ikinci bir satır yoktur. Bu yüzden araçta flex-wrap değeri nowrap iken align-content düğmeleri pasif görünür. Etkisini görmek için önce flex-wrap değerini wrap yapman gerekir.
Eskiden öğelerin arasına boşluk koymak için son öğe hariç hepsine margin-right verilirdi. gap bu numaraya gerek bırakmaz: yalnızca öğelerin arasına boşluk koyar, kenarlarda fazladan boşluk bırakmaz ve satır atlandığında dikey boşluğu da kendisi halleder. Flexbox tarafında gap desteği 2021’den beri bütün güncel tarayıcılarda var, bu yüzden bugün rahatça kullanılabilir.
order öğelerin ekrandaki sırasını değiştirir ama HTML içindeki sırasını değiştirmez. Sekme tuşuyla gezinen bir kullanıcı ya da ekran okuyucu, kaynaktaki sırayı takip eder. Görsel sıra ile okuma sırası ayrıştığında ortaya gezinmesi zor bir sayfa çıkar.
Bu yüzden order özelliğini küçük düzeltmeler için kullan, sayfanın asıl kurgusunu HTML içinde doğru sırayla yaz. Aynı uyarı row-reverse ve wrap-reverse için de geçerlidir.
| Konu | Flexbox | Grid |
|---|---|---|
| Eksen sayısı | Tek eksen | İki eksen |
| Çıkış noktası | İçerik | Yerleşim planı |
| Hizalama davranışı | Satırlar birbirinden bağımsızdır | Sütunlar bütün satırlar boyunca hizalı kalır |
| En uygun olduğu yer | Üst menü, buton grubu, etiket listesi, kart içi düzen | Sayfa iskeleti, galeri, panel yerleşimi |
| Boşluk | gap desteklenir | gap desteklenir |
Pratikte ikisi rakip değil. Sayfanın genel iskeletini Grid ile kurup, o iskeletin içindeki kart başlığını, buton grubunu ya da üst menüyü Flexbox ile dizmek en yaygın yaklaşımdır. Bir düzende satır ve sütunların birlikte hizalı kalması gerekiyorsa Grid, tek bir yönde akan ve içeriğin boyuna göre esneyen bir dizilim gerekiyorsa Flexbox doğru araçtır.
Araç yalnızca CSS’in varsayılan değerinden farklı olan satırları yazar. flex-direction: row, flex-wrap: nowrap ya da align-items: stretch zaten tarayıcının varsayılanı olduğu için çıktıya hiç girmez. Aynı şekilde hiç özelleştirmediğin bir öğe için ayrı bir kural üretilmez. Böylece kopyaladığın blok, projendeki stil dosyasını gereksiz satırlarla şişirmez.
Arka plan ve renk tarafında da hızlı bir çıktıya ihtiyacın olursa CSS gradyan oluşturucu aynı mantıkla çalışır: ayarları değiştir, sonucu önizlemede gör, kodu kopyala.
flex-direction ile ana ekseni belirle: row yatay, column dikey dizer. Öğelerin sığmadığında alt satıra taşınmasını istiyorsan flex-wrap değerini wrap yap; align-content ancak bundan sonra çalışmaya başlar.
justify-content ana eksende, align-items karşı eksende hizalar; ekranda duran eksen notu hangisinin hangisi olduğunu her an söyler. row-gap ile column-gap'i bağlı bırakırsan çıktıya tek satırlık gap kısayolu yazılır.
Önizlemedeki bir kutuya tıklayıp onu seç, sonra flex-grow, flex-shrink, flex-basis, align-self ve order değerlerini değiştir. Her kutunun üstünde o anki flex kısayolu yazar, böylece hangi ayarın ne yaptığını anında görürsün.
Araç yalnızca varsayılandan farklı olan satırları yazar, bu yüzden çıktı kısa kalır. CSS ve HTML panellerini ayrı ayrı kopyala; sınıf adları iki panelde birebir eşleşir.
Flexbox tek eksenlidir ve içerikten yola çıkar; öğeler tek bir yönde akar ve boyutlarını büyük ölçüde içerikleri belirler. Grid iki eksenlidir ve yerleşim planından yola çıkar; satır ve sütunları önceden tanımlarsın. Üst menü, buton grubu ya da bir kartın içi için Flexbox, sayfanın genel iskeleti için Grid daha uygundur. İkisini aynı sayfada birlikte kullanmak yaygın ve doğru bir yaklaşımdır.
Hayır. flex: 1 kısayolu flex: 1 1 0% olarak açılır, yani flex-basis değerini de sıfırlar ve bütün öğeler içerikten bağımsız olarak eşit genişlik alır. flex-grow: 1 tek başına yazıldığında flex-basis auto kalır, öğeler önce kendi içeriği kadar yer kaplar ve yalnızca artan boşluk paylaştırılır. Eşit sütun istiyorsan flex: 1, içerikle orantılı sütun istiyorsan flex-grow: 1 kullan.
Flex öğeleri varsayılan olarak küçülür ama kendi min-content boyutunun altına inmez. Uzun bir URL, kırılmayan bir kelime ya da bir tablo öğeyi olduğu genişlikte tutar. Öğeye min-width: 0 (column düzeninde min-height: 0) vererek bu örtük sınırı kaldırabilirsin. Metin kısaltma ve taşma gizleme kurallarının bir flex öğesinin içinde çalışmadığı durumların çoğu bu satırla çözülür.
align-items öğeleri kendi satırlarının içinde hizalar, align-content ise satırların tamamını kapsayıcının içinde hizalar. Tek satır varken align-content hiçbir şey yapmaz, çünkü konumlandıracak ikinci bir satır yoktur. Farkı görmek için flex-wrap değerini wrap yapıp kapsayıcıya satırların toplamından daha fazla yükseklik vermen gerekir.
Evet. Flexbox tarafında gap desteği 2021’den beri bütün güncel masaüstü ve mobil tarayıcılarda var. gap yalnızca öğelerin arasına boşluk koyar, kenarlarda fazladan boşluk bırakmaz ve satır atlandığında dikey boşluğu da kendisi yönetir. Son öğe hariç hepsine margin vermeye dayanan eski yönteme artık gerek yok.
Kapsayıcıya display: flex, justify-content: center ve align-items: center vermen yeterli. Tek şart, kapsayıcının karşı eksende ortalanacak boş alanının olması, yani bir yüksekliğinin bulunmasıdır; yoksa dikey ortalama gözle görülmez. Araçtaki Tam ortala kalıbı bu düzeni tek tıkla kurar.
Evet, dikkat gerektirir. order yalnızca görsel sırayı değiştirir; klavyeyle gezinme ve ekran okuyucular HTML’deki kaynak sırasını izler. Görsel sıra ile okuma sırası ayrıştığında sayfa klavye kullanıcıları için kafa karıştırıcı hâle gelir. En sağlıklısı, asıl sıralamayı HTML içinde doğru kurmak ve order özelliğini küçük düzeltmelerle sınırlamaktır.