Flexbox 2015 yılı civarında tüm büyük tarayıcılara geldi ve geliştiricilerin on yıldır geçici çözümlerle aşmaya çalıştığı sorunu hemen çözdü: dikey ortalama. Ancak çoğu kişi bunu ters öğrendi — neden çalıştığını anlamadan justify-content: center'ı bir kopya kağıdından ezberledi. Layout beklediği gibi davranmadığında, bu anlama boşluğu beş dakikalık bir görevi bir saatlik deneme yanılmaya dönüştürür. Bu kılavuz önce zihinsel modeli oluşturur, ardından gerçek projelerde önemli olan her özelliği kapsar.
Zihinsel Model: Bir Seferde Bir Eksen
Flexbox'ın temel kavramı, öğeleri tek bir eksen boyunca düzenlemesidir. Öğelerin aktığı yön olan bir ana eksen ve buna dik uzanan bir çapraz eksen vardır. Neredeyse her yeni başlayanın kaçırdığı kritik içgörü: flex-direction hangi eksenin hangisi olduğunu belirler. Diğer her şey bundan türer.
/* Default: main axis runs LEFT → RIGHT, cross axis runs TOP → BOTTOM */
.container {
display: flex;
flex-direction: row; /* default */
}
/* Rotated: main axis now runs TOP → BOTTOM, cross axis runs LEFT → RIGHT */
.container {
display: flex;
flex-direction: column;
}
/*
justify-content → controls alignment on the MAIN axis
align-items → controls alignment on the CROSS axis
This is why centering something in both axes looks like this:
*/
.center-both {
display: flex;
justify-content: center; /* horizontally centred (main axis = row) */
align-items: center; /* vertically centred (cross axis) */
}flex-direction: column'a geçtiğinizde, justify-content artık yatay hizalamayı kontrol etmez — ana eksen döndüğü için dikey hizalamayı kontrol eder. align-items artık yatayı kontrol eder. Bir şeyin beklediğiniz yerde hizalanmadığı her durumda bu dönüşümü aklınızda tutun.Kapsayıcı Özellikleri
Bu özellikler flex kapsayıcıya — display: flex olan üst öğeye — uygulanır. Tüm alt öğelerin nasıl dağıtılacağını ve hizalanacağını kontrol ederler.
/* display: flex makes the element a block-level flex container.
display: inline-flex makes it inline (sits in text flow). */
.nav {
display: flex;
}
/* flex-direction — which way does the main axis run? */
.nav {
flex-direction: row; /* left to right (default) */
flex-direction: row-reverse; /* right to left */
flex-direction: column; /* top to bottom */
flex-direction: column-reverse; /* bottom to top */
}
/* flex-wrap — what happens when items overflow the container? */
.card-grid {
flex-wrap: nowrap; /* all items forced onto one line (default) */
flex-wrap: wrap; /* items wrap onto additional lines */
flex-wrap: wrap-reverse; /* items wrap in reverse order */
}
/* gap — space between items. Modern approach; avoids margin hacks. */
.card-grid {
gap: 1.5rem; /* same in both directions */
gap: 1rem 2rem; /* row-gap column-gap */
}gap özelliği özel bir söz hak ediyor. Var olmadan önce, yaygın kalıp flex öğelerine margin eklemek ve ardından dış kenarları negatif marginlerle iptal etmekti. gap tüm bunların yerine temiz bir şekilde geçiyor — her yerde bunun yerine onu kullanın.
/* justify-content — alignment on the MAIN axis */
.nav {
justify-content: flex-start; /* packed to start (default) */
justify-content: flex-end; /* packed to end */
justify-content: center; /* packed to centre */
justify-content: space-between; /* first/last at edges, equal gaps between */
justify-content: space-around; /* equal space around each item */
justify-content: space-evenly; /* equal space between every gap */
}
/* align-items — alignment on the CROSS axis (single line) */
.nav {
align-items: stretch; /* items fill cross-axis height (default) */
align-items: flex-start;/* items align to start of cross axis */
align-items: flex-end; /* items align to end of cross axis */
align-items: center; /* items centred on cross axis */
align-items: baseline; /* items aligned by their text baseline */
}
/* align-content — cross-axis alignment when there are MULTIPLE lines
(only takes effect with flex-wrap: wrap and enough items to wrap) */
.card-grid {
flex-wrap: wrap;
align-content: flex-start; /* rows packed to top */
align-content: center; /* rows centred vertically */
align-content: space-between; /* rows spread out with space between */
}İşte bunları birleştiren gerçek bir nav bar. Logo solda durur ve navigasyon bağlantıları margin-left: auto kullanılarak sağa itilir — klasik bir Flexbox hilesi. justify-content: space-between yaklaşımı da işe yarar, ancak ikiden fazla grubunuz olduğunda auto-margin tekniği daha esnektir.
/* Nav: logo left, links right */
.site-nav {
display: flex;
align-items: center;
gap: 1rem;
padding: 0 2rem;
height: 64px;
background: #1a1a2e;
}
.site-nav .logo {
font-size: 1.25rem;
font-weight: 700;
color: #fff;
text-decoration: none;
}
.site-nav .nav-links {
display: flex;
align-items: center;
gap: 1.5rem;
margin-left: auto; /* pushes everything after it to the right */
list-style: none;
margin-top: 0;
margin-bottom: 0;
padding: 0;
}
.site-nav .nav-links a {
color: #ccc;
text-decoration: none;
font-size: 0.9rem;
}
.site-nav .nav-links a:hover {
color: #fff;
}Öğe Özellikleri
Bu özellikler flex öğelerine uygulanır — flex kapsayıcının doğrudan çocukları. Bireysel öğelerin nasıl büyüyeceğini, küçüleceğini ve boyutlandırılacağını kontrol ederler.
flex-grow— bu öğenin mevcut boş alandan ne kadar talep ettiği. Varsayılan0(büyüme). Bir öğe üzerinde1olarak ayarlandığında tüm kalan alanı alır.flex-shrink— yeterli alan olmadığında bu öğenin diğerlerine göre ne kadar küçüldüğü. Varsayılan1. Bir öğenin küçülmesini önlemek için0olarak ayarlayın.flex-basis— herhangi bir büyüme veya küçülmeden önce öğenin başlangıç boyutu. Bir uzunluk (250px,30%) veyaauto(öğenin içerik boyutunu kullan) olabilir.align-self— belirli bir öğe içinalign-items'ı geçersiz kılar. Aynı değerleri kabul eder:auto,flex-start,flex-end,center,baseline,stretch.order— HTML'e dokunmadan görsel sırayı değiştirir. Varsayılan0. Düşük değerler önce görünür. Dikkatli kullanın — sekme sırasını bozar ve klavye ve ekran okuyucu kullanıcıları için erişilebilirlik sorunlarına neden olur.
/* Classic sidebar + main content layout */
.app-layout {
display: flex;
min-height: 100vh;
}
.sidebar {
flex: 0 0 280px; /* don't grow, don't shrink, always 280px wide */
background: #f5f5f5;
padding: 2rem 1.5rem;
}
.main-content {
flex: 1; /* grow to fill all remaining space */
padding: 2rem;
min-width: 0; /* critical: prevents content overflow in flex children */
}
/* Responsive: stack vertically on mobile */
@media (max-width: 768px) {
.app-layout {
flex-direction: column;
}
.sidebar {
flex: none; /* reset — don't use flex-basis on column layout */
}
}min-width: 0 tuzağı: Varsayılan olarak, flex öğeleri minimum içerik boyutlarının altına küçülemez. Bir flex öğesinin içinde uzun bir kelime veya geniş bir tablo varsa, kaydırılmak yerine taşar. Flex öğesine min-width: 0 eklemek bunu düzeltir. Kenar çubuğu düzenlerinde ana içerik alanıyla sürekli karşılaşılır.flex Kısayolu Açıklandı
flex kısayolu, flex-grow, flex-shrink ve flex-basis'i tek bir bildirimde bir araya getirir. W3C spesifikasyonu, yaygın durumları kapsayan bir avuç anahtar kelime değeri tanımlar ve bunlar sıklıkla birbirleriyle karıştırılır.
/* flex: 1
Expands to: flex-grow: 1; flex-shrink: 1; flex-basis: 0%
Meaning: grow and shrink freely; start from zero (ignore content size).
All items with flex: 1 share space equally, regardless of content.
Most common choice for "fill available space". */
.tab { flex: 1; }
/* flex: auto
Expands to: flex-grow: 1; flex-shrink: 1; flex-basis: auto
Meaning: grow and shrink freely; start from the item's content size.
Items with more content get more space — proportional, not equal. */
.column { flex: auto; }
/* flex: none
Expands to: flex-grow: 0; flex-shrink: 0; flex-basis: auto
Meaning: completely rigid — don't grow, don't shrink, stay at content size.
Use for items that should never flex (icons, avatars, fixed labels). */
.avatar { flex: none; }
/* flex: 0 0 200px
Explicit: don't grow, don't shrink, always exactly 200px.
Same as writing out all three values. More readable for fixed-size items. */
.sidebar { flex: 0 0 200px; }
/* Practical difference: flex: 1 vs flex: auto in a tab bar
With flex: 1 → all tabs are equal width regardless of label length
With flex: auto → "Settings" tab is wider than "Home" tab */
.tabs { display: flex; }
.tab-equal { flex: 1; } /* equal width tabs */
.tab-auto { flex: auto; } /* content-sized tabs */Yaygın Gerçek Dünya Düzenleri
Düzenli olarak başvuracağınız dört kalıp — yalnızca Flexbox ile inşa edilmiş.
/* 1. Sticky footer
The footer always sits at the bottom, even on short pages.
body (or .app-shell) becomes a column flex container. */
body {
display: flex;
flex-direction: column;
min-height: 100vh;
margin: 0;
}
main {
flex: 1; /* expands to push footer down */
}
footer {
/* stays at the bottom */
}/* 2. Centred modal / hero content
Both axes centred — the Flexbox vertical-centring party trick. */
.hero {
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
padding: 2rem;
background: linear-gradient(135deg, #667eea, #764ba2);
}
.hero-content {
max-width: 640px;
text-align: center;
color: #fff;
}/* 3. Nav bar: logo left, links right */
.site-nav {
display: flex;
align-items: center;
padding: 0 2rem;
height: 64px;
}
.site-nav .nav-links {
margin-left: auto; /* auto margin consumes all free space to its left */
display: flex;
gap: 1.5rem;
list-style: none;
padding: 0;
margin-top: 0;
margin-bottom: 0;
}/* 4. Card row that wraps on mobile */
.card-grid {
display: flex;
flex-wrap: wrap;
gap: 1.5rem;
}
.card {
flex: 1 1 280px; /* grow and shrink, but never below 280px wide */
background: #fff;
border-radius: 8px;
padding: 1.5rem;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
}
/* On wide screens: 3-4 cards per row.
On narrow screens: cards wrap into their own rows automatically.
No media query needed for the wrap itself — flex-wrap handles it. */Flexbox ve Grid — Hangisini Ne Zaman Kullanmalı
Bu soru sürekli gündeme gelir ve cevap çoğu makalenin gösterdiğinden daha basittir: Flexbox tek boyutlu düzenler içindir. CSS Grid iki boyutlu düzenler içindir. Öğeleri tek bir satırda veya tek bir sütunda düzenliyorsanız — bir nav bar, bir düğme grubu, bir kart satırı — Flexbox doğru araçtır. Satırları ve sütunları aynı anda kontrol etmeniz gerekiyorsa — tam sayfa düzeni, fotoğraf mozaiği, form ızgarası — Grid'e ulaşın.
Pratikte her ikisini de aynı projede kullanırsınız. Grid sayfa düzeyindeki yapıyı yönetir (başlık, kenar çubuğu, ana içerik, altbilgi). Flexbox bu bölgeler içindeki bileşenleri yönetir (nav bar, kart içeriği, modal içindeki düğme kümesi). Rekabet etmek yerine birbirini tamamlarlar.
flex-wrap: wrap ile Flexbox bunu yapabilir, ancak aynı görsel satırdaki öğelerin birbirleriyle ilişkisi yoktur — yükseklikleri bağımsızdır. Grid'in örtük satır boyutlandırması bunu otomatik olarak ele alır. Sarılmış bir satırdaki kartların hepsinin aynı yükseklikte olmasına VE iç öğelerinin kartlar arasında hizalanmasına ihtiyacınız varsa, Grid daha temizdir.Sonuç
Flexbox zihinsel modeli şöyledir: bir yön seçin, hangi özelliklerin hangi ekseni kontrol ettiğini anlayın, ardından öğelerin büyüyüp büyümeyeceğine, küçülüp küçülmeyeceğine yoksa sabit mi kalacağına karar verin. Bu anlaşıldığında, kopya kağıdı bir koltuk değneğinden arama aracına dönüşür. MDN Flexbox kılavuzu uç durumlar için en iyi referanstır ve CSS-Tricks'in tam kılavuzu etrafındaki en kullanışlı görsel kopya kağıdı olmaya devam etmektedir. Prodüksiyon kullanımı için tarayıcı desteği neredeyse evrenseldir — önek gerekmez. W3C spesifikasyonu, gerçekten kafa karıştırıcı bir uç durumla karşılaşırsanız gözden geçirmeye değer — algoritma hassas bir şekilde belgelenmiştir ve "neden böyle davranıyor" sorularının çoğunu yanıtlar.