Menu

CSS Flexbox: display flex, Eksenler, Hizalama ve flex

Flexbox öğeleri bir satıra ya da sütuna dizer ve alanı nasıl paylaşıp nasıl hizalandıklarını kontrol eder. display: flex'i, ana ve çapraz ekseni, bütün kapsayıcı özelliklerini, flex-grow, flex-shrink ve flex-basis'i, her öğenin nereye yerleştiğini ölçen canlı bir oyun alanıyla öğren.

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

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ılan stretch ile öğe 1'in kendi yüksekliği yoktur ve kapsayıcının 170px'lik tam yüksekliğini doldurur.
  • flex-direction: column: artık justify-content öğeleri dikeyde, align-items ise 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-directionAna eksenÇapraz eksenjustify-content öğeleri taşıralign-items öğeleri taşır
row (varsayılan)yatay, okuma sırasındadikeyyataydadikeyde
row-reverseyatay, tersdikeyyataydadikeyde
columndikey, yukarıdan aşağıyataydikeydeyatayda
column-reversedikey, aşağıdan yukarıyataydikeydeyatayda

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:

ÖzellikNe yaparVarsayılan
flex-directionSatır mı sütun mu, hangi yönerow
flex-wrapYer bittiğinde öğelerin yeni bir satıra geçip geçmeyeceğinowrap
flex-flowflex-direction ve flex-wrap için kısa yazımrow nowrap
justify-contentAna eksen boyunca yerleşim ve boşluknormal (flex-start gibi davranır)
align-itemsÖğelerin çapraz eksen boyunca yerleşiminormal (stretch gibi davranır)
align-contentÖğeler alt satıra geçtiğinde satırlar arası boşluknormal
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ığı. 0 asla büyümez demektir.
  • flex-shrink: yeterli alan olmadığında öğenin ne kadar vazgeçtiği. 0 asla küçülmez demektir.

flex kısa yazımı üçünü de ayarlar:

YazdığınAnlamıDavranış
flex: initial (varsayılan)0 1 autoİçerik boyutu, küçülebilir, asla büyümez
flex: 11 1 0%Sıfırdan başlar ve alandan eşit bir pay alır
flex: auto1 1 autoİçerik boyutu artı kalan alandan bir pay
flex: none0 0 autoTam olarak içeriği ya da genişliği, asla büyümez ya da küçülmez
flex: 22 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: flex alı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: auto vardır. Küçülmesi gereken öğeye min-width: 0 ekle.
  • flex: 1 kullanıp genişliklerin neden farklı olduğunu merak etmek. flex: 1 olan öğ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: 0 bunu da düzeltir.
  • Öğeler arasında margin'ler. Kapsayıcıda gap kullan; yalnızca öğelerin arasına girer.
  • Gereksiz yere iç içe flex. Yalnızca doğrudan çocuklar flex öğesidir. Torunlar, kendi ebeveynleri de display: flex değ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.

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA