display: flex ne yapar
Bir ebeveyne display: flex ver, doğrudan çocukları bir satırda yan yana dizilir ve aynı yüksekliğe esner. Bu tek bildirim, bir şey satırını dizmek için float'ların, inline-block'un ve çoğu konumlandırma hilesinin yerini alır.
İlk kutuda her div tam bir satır kaplıyor. İkincisinde üç öğe tek bir satırda duruyor, her biri yalnızca içeriği kadar geniş, ve One ile Three, Two'nun yüksekliğine esniyor. Yalnızca ebeveyn değişti: display: flex her zaman öğelere değil kapsayıcıya verilir.
Flexbox oyun alanı
Değerleri seç ve öğelerin hareket etmesini izle. Kutunun altındaki kod satırı gördüğün şeyin CSS'i, onun altındaki liste ise tarayıcının her öğeyi gerçekte nereye yerleştirdiği; getBoundingClientRect() ile ölçülüyor.
Denenecek şeyler:
justify-content: space-between: öğe 1 x 0'a yerleşir ve öğe 3 uzak kenara değer.align-items: center: üç öğe kendi yüksekliklerini korur ve merkezleri hizalanır. Varsayılanstretchile öğe 1'in kendi yüksekliği yoktur ve kapsayıcının 170px'lik tam yüksekliğini doldurur.flex-direction: column: artıkjustify-contentöğeleri dikeyde,align-itemsise yatayda taşır. İki özellik ekranı değil eksenleri takip eder.
Ana eksen ve çapraz eksen
Her flex kapsayıcının iki ekseni vardır. Ana eksen, flex-direction ile belirlenen, öğelerin aktığı yöndür. Çapraz eksen onu dik keser.
flex-direction | Ana eksen | Çapraz eksen | justify-content öğeleri taşır | align-items öğeleri taşır |
|---|---|---|---|---|
row (varsayılan) | yatay, okuma sırasında | dikey | yatayda | dikeyde |
row-reverse | yatay, ters | dikey | yatayda | dikeyde |
column | dikey, yukarıdan aşağı | yatay | dikeyde | yatayda |
column-reverse | dikey, aşağıdan yukarı | yatay | dikeyde | yatayda |
Sağdan sola bir sayfada (dir="rtl") row sağ kenardan başlar, çünkü ana eksen yazı yönünü takip eder.
Kapsayıcı özellikleri
Bunlar display: flex verilen elemente yazılır:
| Özellik | Ne yapar | Varsayılan |
|---|---|---|
flex-direction | Satır mı sütun mu, hangi yöne | row |
flex-wrap | Yer bittiğinde öğelerin yeni bir satıra geçip geçmeyeceği | nowrap |
flex-flow | flex-direction ve flex-wrap için kısa yazım | row nowrap |
justify-content | Ana eksen boyunca yerleşim ve boşluk | normal (flex-start gibi davranır) |
align-items | Öğelerin çapraz eksen boyunca yerleşimi | normal (stretch gibi davranır) |
align-content | Öğeler alt satıra geçtiğinde satırlar arası boşluk | normal |
gap | Öğeler arası boşluk (row-gap, column-gap) | 0 |
justify-content ve align-items'ın bütün değerleriyle kendi sayfası var: justify-content ve align-items. Alt satıra geçme ve yön flex-wrap sayfasında.
Öğe özellikleri: flex-grow, flex-shrink, flex-basis
Bunlar çocuklara yazılır ve kapsayıcının genişliğini nasıl paylaşacaklarına karar verir:
flex-basis: boş alan paylaştırılmadan önce bir öğenin başladığı boyut (auto, "genişliğimi ya da içeriğimi kullan" demektir).flex-grow: öğenin kalan alandan kaç pay aldığı.0asla büyümez demektir.flex-shrink: yeterli alan olmadığında öğenin ne kadar vazgeçtiği.0asla küçülmez demektir.
flex kısa yazımı üçünü de ayarlar:
| Yazdığın | Anlamı | Davranış |
|---|---|---|
flex: initial (varsayılan) | 0 1 auto | İçerik boyutu, küçülebilir, asla büyümez |
flex: 1 | 1 1 0% | Sıfırdan başlar ve alandan eşit bir pay alır |
flex: auto | 1 1 auto | İçerik boyutu artı kalan alandan bir pay |
flex: none | 0 0 auto | Tam olarak içeriği ya da genişliği, asla büyümez ya da küçülmez |
flex: 2 | 2 1 0% | flex: 1 olan bir öğenin iki katı pay |
Her satır padding'inin içinde 480px genişliğinde ve iki 8px'lik boşluk öğelere 464px bırakıyor. Yazdırılan genişlikler nasıl paylaştırıldığını gösteriyor: ilk satırda her biri yaklaşık 155px, ikincide 116 + 232 + 116 (flex: 2 öğesi komşularının her birinin iki katı pay alıyor), üçüncüde ise 100 + 372; burada flex: none öğesi genişliğini koruyor ve diğer öğe geri kalanın hepsini alıyor.
Flexbox ile gerçek düzenler
Başta bir logo ve sonda linkler olan bir başlık, en yaygın flex düzenidir. Bir öğeye verilen margin-inline-start: auto, önündeki bütün boş alanı yutar ve onu ve ondan sonraki her şeyi sona iter:
align-items: center daha büyük logo metnini linklerle hizalar ve gap linklerin arasını, sonuncuda geri alınacak margin'ler olmadan açar.
İkinci gündelik kalıp bir medya satırıdır: sabit boyutlu bir ikon ve geri kalanı alıp kendi sütununda satır kıran metin.
Garantiyi flex: none verir. Flex öğeleri varsayılan olarak küçülür, bu yüzden onu daireden kaldırır ve metinden de flex: 1'i kaldırırsan paragraf daireyi yaklaşık 23px genişliğe sıkıştırır: bir oval. Bir kutuda tek bir şeyi ortalamak flexbox ile iki satırdır (justify-content: center; align-items: center); div ortalama sayfası bunu diğer yollarla karşılaştırıyor.
order ve erişilebilirlik
order özelliği ve -reverse yönleri, öğelerin HTML'de nerede olduğunu değil, nerede göründüğünü değiştirir. Ekran okuyucular ve Tab tuşu hâlâ HTML sırasını takip eder, bu yüzden bir klavye kullanıcısı ekrandaki ilk linkten sonuncusuna atlayabilir. Onları yalnızca süsleme için kullan; sıranın bir anlamı olduğunda HTML'i değiştir.
Flexbox mı grid mi
Flexbox bir seferde tek yönde çalışır: bir satırdaki öğeler kendilerini içeriklerine göre boyutlandırır ve ikinci bir satır (alt satıra geçmeyle) ilkiyle hizalanmaz. Grid ise iki yönde çalışır: sütunları ve satırları tanımlarsın ve öğeler onlara oturur. Bir gezinme çubuğu, bir araç çubuğu ya da bir form satırı flexbox'tır; bir galeri ya da kenar çubuklu bir sayfa grid'dir.
Sık yapılan hatalar
display: flex'i ebeveyn yerine öğeye vermek. Kapsayıcıdisplay: flexalır; çocukları öğelerdir.- Yükseklik yokken
align-items'ın öğeleri dikeyde taşımasını beklemek. Kapsayıcı yalnızca en uzun öğesi kadar uzunsa hareket edecek yer yoktur. Kapsayıcıya bir yükseklik ver; aksi halde özellik çalışıyordur ama yapacak bir işi yoktur. - Küçülmek yerine taşan metin. Flex öğelerinde
min-width: autovardır. Küçülmesi gereken öğeyemin-width: 0ekle. flex: 1kullanıp genişliklerin neden farklı olduğunu merak etmek.flex: 1olan öğeler alanı eşit paylaşır, ama içeriği sığmayan bir öğe (uzun bir URL, bir resim) onun altına küçülmez.min-width: 0bunu da düzeltir.- Öğeler arasında margin'ler. Kapsayıcıda
gapkullan; yalnızca öğelerin arasına girer. - Gereksiz yere iç içe flex. Yalnızca doğrudan çocuklar flex öğesidir. Torunlar, kendi ebeveynleri de
display: flexdeğilse normal düzeni takip eder.
Sıkça Sorulan Sorular
display: flex ne işe yarar?
Bir elementi flex kapsayıcıya çevirir. Doğrudan çocukları flex öğeleri olur ve varsayılan olarak bir satırda yan yana, aynı yüksekliğe esnetilerek yerleştirilir; alanı nasıl paylaştıklarını justify-content, align-items ve gap gibi özellikler kontrol eder.
flex: 1 ne anlama gelir?
flex: 1, flex: 1 1 0%'nin kısaltmasıdır: öğe büyüyebilir (flex-grow: 1), küçülebilir (flex-shrink: 1) ve sıfır boyuttan başlar (flex-basis: 0%). Hepsi flex: 1 olan öğeler boş alanı eşit paylaşır, bu yüzden içerikleri sığmıyor olmadıkça aynı genişlikte olurlar.
justify-content ile align-items arasındaki fark nedir?
justify-content öğeleri ana eksen boyunca (bir satırda yatayda), align-items ise çapraz eksen boyunca (bir satırda dikeyde) yerleştirir. flex-direction: column ile iki eksen yer değiştirir, böylece justify-content dikey olur.
Flexbox mı grid mi kullanmalıyım?
Öğeleri kendilerini içeriklerine göre boyutlandıran tek bir satır ya da sütun için flexbox kullan: gezinme çubukları, buton grupları, bir input'un yanındaki etiket. Birbiriyle hizalanan satırlar ve sütunlar istediğinde, örneğin bir kart ızgarası ya da sayfa düzeni için grid kullan.
Flex öğem neden kapsayıcısından taşıyor?
Bir flex öğesinin varsayılan olarak min-width: auto değeri vardır, bu yüzden en uzun kelimesinin ya da en geniş çocuğunun genişliğinin altına küçülmeyi reddeder. Küçülebilmesi için öğeye min-width: 0 (ya da overflow: hidden) ver, örneğin text-overflow: ellipsis'in çalışması için.
Flexbox span gibi satır içi elementlerde çalışır mı?
Evet. display: flex verilen her element bir flex kapsayıcıdır ve çocukları kendi display değerleri ne olursa olsun flex öğesi olur; böylece <span> çocuklar satır içi olmaktan çıkar ve bloklar gibi genişlik, yükseklik ve margin kabul eder.