CSS Flexbox Rehberi: justify-content ve align-items

CSS Flexbox nedir? justify-content, align-items, flex-direction, flex-wrap ve gap özelliklerini örneklerle öğrenin; responsive kart düzeni oluşturun.

7

Modern web tasarımında menüleri aynı satırda hizalamak, kartları yan yana yerleştirmek veya bir butonu bulunduğu alanın ortasına getirmek sık karşılaşılan ihtiyaçlardır. CSS Flexbox (Flexible Box Layout), bu tür yerleşimleri oluşturmak için geliştirilmiş esnek bir CSS düzen sistemidir.

Bu Nizokka Akademi rehberinde display: flex, justify-content, align-items, flex-direction, flex-wrap ve gap özelliklerini uygulamalı olarak öğreneceğiz. Ayrıca responsive kart düzeni oluşturacak ve Flexbox kullanırken sık yapılan hataları inceleyeceğiz.

1. CSS Flexbox Nedir?

Flexbox, bir kapsayıcının içindeki öğeleri tek bir ana eksen boyunca yerleştirmeyi ve diğer eksende hizalamayı kolaylaştırır. Öğeler, mevcut alana göre büyüyebilir, küçülebilir veya bir sonraki satıra geçebilir.

Bir elementi Flexbox kapsayıcısına dönüştürmek için display: flex kullanılır:

.kapsayici {
  display: flex;
}

Bu kuralın uygulandığı element flex container, onun doğrudan çocukları ise flex item olarak adlandırılır. İç içe geçmiş torun elementler kendiliğinden flex item olmaz.

2. Flexbox'ta Ana Eksen ve Çapraz Eksen

Flexbox'ı anlamanın en önemli noktası iki eksendir:

  • Main axis (Ana eksen): Öğelerin temel yerleşim yönüdür. flex-direction ile belirlenir.
  • Cross axis (Çapraz eksen): Ana eksene dik olan yöndür.

Varsayılan flex-direction: row durumunda yatay yazım düzenlerinde ana eksen genellikle yatay, çapraz eksen dikeydir. flex-direction: column kullanıldığında ana eksen dikey yöne geçer.

Akılda kalacak kural: justify-content ana eksende, align-items çapraz eksende hizalama yapar. Bu nedenle bu özellikleri ezberlerken yalnızca “yatay” ve “dikey” sözcüklerine bağlı kalmayın.

3. İlk Flexbox Örneğimiz

Üç kutuyu bir satırda göstermek için şu HTML kodunu kullanın:

<div class="kapsayici">
  <div class="kutu">HTML</div>
  <div class="kutu">CSS</div>
  <div class="kutu">JavaScript</div>
</div>

Ardından CSS dosyanıza şu kuralları ekleyin:

.kapsayici {
  display: flex;
  gap: 16px;
  padding: 16px;
  border: 1px solid #cbd5e1;
}

.kutu {
  padding: 16px;
  background-color: #dbeafe;
  border-radius: 8px;
}

Sonuçta üç kutu aynı flex kapsayıcısının doğrudan çocukları olduğu için ana eksende yan yana dizilir. gap ise öğeler arasında 16 piksel boşluk bırakır.

4. justify-content Nedir? Ana Eksende Hizalama

justify-content, öğeler yerleştirildikten sonra ana eksende kalan boş alanın nasıl dağıtılacağını belirler.

Sık kullanılan değerleri şöyledir:

Değer Görevi
flex-start Öğeleri ana eksenin başlangıcına toplar.
flex-end Öğeleri ana eksenin sonuna toplar.
center Öğeleri ana eksende ortalar.
space-between İlk ve son öğeyi uçlara yerleştirir, aradaki boşluğu dağıtır.
space-around Her öğenin etrafına boşluk dağıtır.
space-evenly Öğeler arasındaki ve dış kenarlardaki aralıkları eşit dağıtır.

justify-content: space-between örneği

.ust-menu {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 16px;
}

Bu tür bir yapı, solda logo ve sağda menü bağlantılarının bulunduğu üst çubuklar için kullanışlıdır.

Ancak dağıtılacak boş alan yoksa justify-content etkisi beklediğiniz kadar belirgin olmayabilir.

5. align-items Nedir? Çapraz Eksende Hizalama

align-items, flex öğelerini çapraz eksen boyunca hizalar.

Yaygın değerler:

  • stretch: Uygun durumlarda öğeleri çapraz eksende kullanılabilir alanı dolduracak şekilde uzatır.
  • flex-start: Çapraz eksenin başlangıcına hizalar.
  • flex-end: Çapraz eksenin sonuna hizalar.
  • center: Çapraz eksende ortalar.
  • baseline: Öğeleri metin taban çizgileri üzerinden hizalamaya çalışır.

Hem yatay hem dikey ortalama

.ortala {
  display: flex;
  justify-content: center;
  align-items: center;
  min-height: 240px;
  border: 1px solid #cbd5e1;
}

Varsayılan satır yönünde justify-content: center yatay, align-items: center dikey ortalama sağlar.

min-height, dikey hizalamanın fark edilebilmesi için kapsayıcıda yeterli alan oluşturur.

6. flex-direction: row ve column Arasındaki Fark

flex-direction, ana eksenin yönünü belirler:

.yatay {
  display: flex;
  flex-direction: row;
}

.dikey {
  display: flex;
  flex-direction: column;
}

row, öğeleri satır yönünde; column ise sütun yönünde sıralar.

row-reverse ve column-reverse seçenekleri de vardır.

Dikkat: Yönü tersine çevirmek yalnızca görsel sırayı değiştirir; klavye ile gezinme ve ekran okuyucu sırası genellikle kaynak HTML sırasını izlemeye devam eder. Anlamlı içerik sırasını öncelikle HTML'de doğru kurun.

column kullanıldığında hizalama nasıl değişir?

.dikey-kapsayici {
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: flex-start;
  min-height: 300px;
}

Bu örnekte justify-content artık dikey ana eksende etkilidir; align-items ise yatay çapraz eksende çalışır.

7. flex-wrap ile Alt Satıra Geçiş

Varsayılan flex-wrap: nowrap durumunda flex öğeleri tek satırda kalmaya çalışır.

Yeterli alan yoksa öğeler küçülebilir veya içerik taşabilir.

Birden fazla satıra izin vermek için flex-wrap: wrap kullanılır.

.etiket-listesi {
  display: flex;
  flex-wrap: wrap;
  gap: 12px;
}

Bu yöntem, kategori etiketleri veya farklı ekran genişliklerine uyum sağlaması gereken kart grupları için yararlıdır.

8. gap, row-gap ve column-gap

gap, flex öğeleri arasında düzenli boşluk oluşturur. Dış kenarlarda otomatik margin eklemez.

.kartlar {
  display: flex;
  flex-wrap: wrap;
  gap: 20px;
}

Satır ve sütun aralıklarını ayrı belirtmek de mümkündür:

.kartlar {
  row-gap: 24px;
  column-gap: 16px;
}

Flex ve Grid düzenlerinde gap, öğelerin kendi margin değerleriyle tek tek uğraşmadan tutarlı aralıklar oluşturmayı kolaylaştırır.

9. flex-grow, flex-shrink ve flex-basis

Flexbox'ın esnek olmasını sağlayan üç temel özellik şunlardır:

  • flex-grow: Ana eksendeki pozitif boş alanın nasıl paylaştırılacağını belirler.
  • flex-shrink: Alan yetersizse öğelerin ne ölçüde küçülebileceğini belirler.
  • flex-basis: Esneklik hesaplaması başlamadan önce öğenin ana eksendeki başlangıç boyutunu belirler.
.sol-panel {
  flex: 1 1 220px;
}

.ana-icerik {
  flex: 2 1 400px;
  min-width: 0;
}

flex: 1 1 220px sırasıyla büyüme katsayısı, küçülme katsayısı ve başlangıç boyutunu bildirir.

Bu örnekte öğeler, alan müsait olduğunda farklı oranlarda genişleyebilir. Gerçek boyutlar minimum içerik ölçüleri, mevcut boşluk ve diğer CSS kurallarından da etkilenir.

İpucu: Uzun bağlantılar veya büyük kod blokları içeren esnek öğelerde min-width: 0, içerik nedeniyle oluşan beklenmedik yatay taşmaları azaltmaya yardımcı olabilir.

10. align-self ile Tek Bir Öğeyi Farklı Hizalama

align-items kapsayıcıdaki öğelere ortak hizalama verirken align-self tek bir flex öğesinin çapraz eksendeki hizalamasını değiştirebilir.

.satir {
  display: flex;
  align-items: center;
  min-height: 160px;
}

.ozel-oge {
  align-self: flex-start;
}

Bir öğenin kendisine verilen align-self değeri, o öğe açısından kapsayıcının align-items değerini geçersiz kılabilir.

11. Mini Proje: Responsive Ders Kartları

Şimdi Nizokka Akademi için küçük bir ders listesi oluşturalım.

HTML'i index.html dosyanıza, CSS'i ise style.css dosyanıza ekleyin.

HTML kodu

<section class="dersler" aria-labelledby="ders-baslik">
  <h2 id="ders-baslik">Popüler Dersler</h2>

  <div class="ders-listesi">

    <article class="ders-karti">
      <h3>HTML Temelleri</h3>
      <p>Web sayfası iskeletini öğrenin.</p>
      <a href="/academy">Dersi incele</a>
    </article>

    <article class="ders-karti">
      <h3>CSS Seçicileri</h3>
      <p>Stil kurallarının mantığını kavrayın.</p>
      <a href="/academy">Dersi incele</a>
    </article>

    <article class="ders-karti">
      <h3>CSS Flexbox</h3>
      <p>Esnek sayfa düzenleri oluşturun.</p>
      <a href="/academy">Dersi incele</a>
    </article>

  </div>
</section>

CSS kodu

*,
*::before,
*::after {
  box-sizing: border-box;
}

.dersler {
  max-width: 1100px;
  margin: 40px auto;
  padding: 0 16px;
}

.ders-listesi {
  display: flex;
  flex-wrap: wrap;
  gap: 20px;
}

.ders-karti {
  display: flex;
  flex-direction: column;
  flex: 1 1 260px;
  min-width: 0;
  padding: 24px;
  border: 1px solid #cbd5e1;
  border-radius: 14px;
  background: #ffffff;
}

.ders-karti h3 {
  margin: 0 0 12px;
}

.ders-karti p {
  line-height: 1.6;
  margin: 0 0 20px;
}

.ders-karti a {
  margin-top: auto;
  color: #1d4ed8;
  font-weight: 700;
}

.ders-karti a:focus-visible {
  outline: 3px solid #f59e0b;
  outline-offset: 4px;
}

Bu tasarımda flex-wrap: wrap kartların gerektiğinde alt satıra geçmesini sağlar.

flex: 1 1 260px kartlara esnek bir başlangıç genişliği verir.

Kartın içindeki margin-top: auto ise bağlantıyı, dikey eksende yeterli boşluk bulunduğunda kartın alt bölümüne iter.

Deneyin: Tarayıcı penceresini daraltarak kartların satır değiştirmesini izleyin. Ardından gap değerini 20px'ten 12px'e indirip sonucu karşılaştırın.

12. Flexbox ile Grid Arasındaki Fark

Flexbox genellikle tek boyutlu yerleşimlerde; menülerde, buton gruplarında, küçük bileşenlerde ve tek satır ya da sütun boyunca hizalamada çok etkilidir.

CSS Grid ise satır ve sütunları birlikte tasarlamanın önemli olduğu iki boyutlu düzenlerde avantajlıdır.

Bu kesin bir yasak değildir: her iki sistem de farklı durumlarda birlikte kullanılabilir.

13. Sık Yapılan Flexbox Hataları

  • justify-content özelliğini her zaman yatay hizalama sanmak.
  • Eksenin flex-direction ile değiştiğini unutmak.
  • align-items: center yazıp kapsayıcıda hizalamayı fark ettirecek çapraz eksen alanı bulunmadığını gözden kaçırmak.
  • Öğelerin alt satıra geçmesini beklerken flex-wrap: wrap eklememek.
  • İçerik yüzünden taşan kartlarda minimum boyutları kontrol etmemek.
  • order veya row-reverse kullanarak görsel sırayı değiştirip klavye gezinme sırasını göz ardı etmek.
  • align-content ile align-items özelliklerini karıştırmak.

Not: align-content, birden fazla flex satırının çapraz eksende nasıl dağıtıldığını etkiler. Tek satırlı düzende genellikle beklenen etkiyi göstermez.

14. Sık Sorulan Sorular

justify-content ile align-items arasındaki fark nedir?

justify-content, ana eksendeki boş alanın dağıtımını; align-items ise öğelerin çapraz eksendeki hizalamasını yönetir.

Flexbox kullanmak için JavaScript gerekir mi?

Hayır. Flexbox tamamen CSS ile çalışır. JavaScript yalnızca ek etkileşim veya dinamik davranış gerektiğinde kullanılabilir.

Flexbox mobil uyumlu tasarım için yeterli mi?

Flexbox birçok responsive düzen için yeterlidir. Ancak iyi bir mobil deneyim; uygun boyutlar, okunabilir metinler, görseller ve gerektiğinde media query kullanımı gibi ek kararları da gerektirir.

gap mi, margin mi kullanmalıyım?

Bir flex grubundaki öğeler arasında tutarlı boşluk için genellikle gap kullanmak daha kolaydır. Bir öğeye özgü dış boşluk gerektiğinde margin uygundur.

15. Sonuç ve Alıştırma

CSS Flexbox, modern arayüz geliştirmede en kullanışlı yerleşim araçlarından biridir.

display: flex ile bir kapsayıcı oluşturabilir, justify-content ile ana eksendeki dağılımı, align-items ile çapraz eksendeki hizalamayı kontrol edebilirsiniz.

gap, flex-wrap ve flex özellikleri ise düzenin farklı ekran genişliklerine uyum sağlamasına yardımcı olur.

Alıştırma: Mini projedeki ders kartlarına dördüncü bir kart ekleyin. Kartların dar ekranda alt alta, geniş ekranda yan yana yerleşimini inceleyin. Sonra kart içindeki açıklama uzunluklarını değiştirerek bağlantıların hizalanmasını gözlemleyin.

Nizokka Akademi serimizin bir sonraki yazısında CSS Grid ile satır ve sütunları birlikte yönetmeyi öğreneceğiz.

Benzer içerikler

HTML ve CSS

CSS Box Model: Margin, Padding ve Border Farkları

CSS Box Model nedir? Margin, padding, border ve content farklarını öğrenin. box-sizing, genişlik hesabı ve mobil uyumlu kart örnekleriyle CSS kutu modelini keşfedin.

İçeriği oku →

HTML ve CSS

CSS Nedir? CSS Seçicileri ve İlk Stil Dosyanız

CSS nedir ve nasıl kullanılır? CSS seçicilerini, class ve ID farkını, stil dosyası oluşturmayı ve temel CSS kurallarını uygulamalı örneklerle öğrenin.

İçeriği oku →

HTML ve CSS

Semantik HTML Nedir? SEO ve Erişilebilirlik Rehberi

Semantik HTML nedir? header, nav, main, article ve section etiketlerini örneklerle öğrenin. Daha erişilebilir ve anlaşılır web sayfaları oluşturun.

İçeriği oku →

Teknik desteğe mi ihtiyacınız var?

Projenizin kapsamını birlikte değerlendirelim

İletişime geçin