Menu

CSS ile Div Ortalama: Bütün Yöntemler, Ölçülerek

Bir div'i yatayda, dikeyde ya da ikisinde birden ortalamanın bütün yolları: flexbox, grid, margin auto, transform ile absolute konum, margin auto ile inset ve align-content. Her biri canlı çalışıyor ve kendi ortalamasını ölçüyor; hangisinin ne zaman kullanılacağını gösteren bir tablo da var.

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

Kısa cevap

Bir div'i ebeveyninin içinde hem yatayda hem dikeyde ortalamak için ebeveyni grid yap ve içeriğini ortala:

.parent {
  display: grid;
  place-items: center;
  min-height: 200px; /* the parent needs room to center in */
}

Bu her boyuttaki çocuk için çalışır ve çocuğun kendisine hiçbir şey vermeyi gerektirmez. Aşağıda altı yöntem yan yana. Her kutu çizildikten sonra kendini ölçüyor ve merkezinin ebeveynin merkezinden ne kadar uzak olduğunu yazdırıyor:

Altısı da iki eksende 0px bildiriyor (sahnenin 1px kenarlığı her kenarda eşit olduğu için merkezi kaydırmıyor). Bir kutunun genişliğini ya da metnini değiştir ve tekrar çalıştır: sabit bir boyuta bağlı olmayan yöntemler 0'da kalır.

Hangi yöntemi kullanmalı

YöntemOrtaladığıÇocuğun sabit boyutu gerekir mi?En uygun olduğu yer
Grid place-items: centerİki eksenHayırVarsayılan seçim: bir kutudaki tek çocuk
Flexbox justify-content + align-itemsİki eksenHayırGrup olarak ortalanan bir öğe satırı ya da sütunu
Flex ya da grid ebeveynde margin: autoİki eksenHayırKardeşleri farklı dizilirken tek bir öğeyi ortalamak
margin: 0 autoYalnızca yatayBir width ya da max-widthNormal akıştaki sayfa kapsayıcıları, makaleler, formlar
Absolute + translate(-50%, -50%)İki eksenHayırDiğer içeriğin üstündeki katmanlar, rozetler ve modal'lar
Absolute + inset: 0; margin: autoİki eksenEvet, genişlik ve yükseklikSabit boyutlu diyaloglar
Bir blokta align-content: centerDikeyHayırEbeveynin display değerini değiştirmeden dikey ortalama

Yöntem 1: flexbox

Flexbox iki özellikle iki eksende ortalar. justify-content ana ekseni (bir satırda yatay), align-items ise çapraz ekseni yönetir:

Birkaç çocukla flexbox onları bir satırda tutarak grup olarak ortalar. Üç öğeyi tek bir ortalanmış sütunda üst üste dizecek olan grid'i geçtiği yer burasıdır. Bütün hizalama değerlerini justify-content sayfası anlatıyor.

Yöntem 2: grid

place-items: center, align-items: center artı justify-items: center için bir kısa yazımdır. Tek çocuklu bir grid kapsayıcısında o çocuğu iki yönde de ortalar:

height yerine min-height, kart 180px'ten uzun olursa kartın taşması yerine ebeveynin büyümesine izin verir.

Yöntem 3: margin: 0 auto (yatay)

Genişliği kapsayıcısından küçük olan bir blok element, otomatik yan margin'lerle yatayda ortalanabilir. Tarayıcı boş alanı iki taraf arasında eşit paylaştırır:

İkinci kutu bütün genişliği dolduruyor, bu yüzden boş alan yok ve hiçbir şey kıpırdamıyor. margin: 0 auto'nun "çalışmamasının" olağan nedeni budur. Ayrıca normal akışta yalnızca yatayda ortalar; orada dikey auto margin'ler 0 olur. Yine de bir flex ya da grid ebeveynin içinde margin: auto iki yönde de ortalar; yukarıdaki karşılaştırmadaki üçüncü kutu budur.

Yöntem 4: absolute konum ve transform

Element diğer içeriğin üstünde durmak zorundaysa (bir fotoğraftaki rozet, sayfanın üstündeki bir modal), onu %50'ye absolute olarak konumlandır ve kendi boyutunun yarısı kadar geri çek:

top: 50%; left: 50% elementin sol üst köşesini merkeze koyar. translate() içindeki yüzdeler elementin kendi boyutuna göredir, bu yüzden -50% onu genişliği ve yüksekliği ne olursa olsun yarısı kadar geri taşır. Ebeveyn konumlandırılmış olmalıdır (position: relative), yoksa element bunun yerine sayfada ortalanır. Konumlandırmayı position sayfası anlatıyor.

Boyutu bilinen elementler için bir çeşit: position: absolute; inset: 0; margin: auto; artı bir width ve height. Otomatik margin'ler dört taraftaki boşluğu paylaşır.

Yöntem 5: normal bir blokta align-content

align-content: center artık yalnızca flex ve grid kapsayıcılarda değil, sıradan blok kapsayıcılarda da çalışıyor. Çocukların nasıl dizildiğini değiştirmeden içeriği dikeyde ortalar:

.parent {
  min-height: 200px;
  align-content: center;   /* vertical centering, still display: block */
}
.child {
  max-width: 300px;
  margin-inline: auto;     /* horizontal centering */
}

Güncel Chrome, Firefox ve Safari'de desteklenir. Eski tarayıcılar onu yok sayar, bu yüzden onları desteklemen gerekiyorsa grid kullan.

Bütün ekranda ortalamak

Kaydırmadan bağımsız olarak bir diyaloğu viewport'ta ortalamak için sabit, tam ekran bir katmanı grid ile birleştir:

.overlay {
  position: fixed;
  inset: 0;                     /* covers the viewport */
  display: grid;
  place-items: center;
  background: rgb(0 0 0 / 50%);
}

Bütün bir sayfanın içeriğini dikeyde ortalamak için ebeveynde 100vh yerine min-height: 100dvh kullan: telefonlarda 100vh tarayıcı araç çubuklarının arkasındaki alanı da kapsar, bu yüzden "merkez" fazla aşağıda kalır.

Metni ortalamak farklı bir iştir

Yukarıdaki her şey bir kutuyu ortalıyor. Bir kutunun içindeki metni ortalamak için HTML metin ortalama sayfasında gösterildiği gibi ona text-align: center ver. Çoğu zaman ikisine de ihtiyacın olur: kartı ortalamak için grid, içindeki satırları ortalamak için text-align.

Sık yapılan hatalar

  • Yüksekliği olmayan bir ebeveyn. Dikey ortalama boş alan ister; içeriğine göre küçülen bir ebeveynde hiç yoktur.
  • Tam genişlikteki bir blokta margin: 0 auto. Önce ona bir width ya da max-width ver.
  • Normal akışta dikey ortalamak için margin: auto. Orada dikey auto margin'ler 0'dır; flex ya da grid kullan.
  • Konumlandırılmış bir ebeveyn olmadan absolute ortalama. Element kutuda değil sayfada ortalanır.
  • Çocukta align-items: center. Hizalama özellikleri margin: auto ve align-self dışında ebeveyne (flex ya da grid kapsayıcıya) verilir.
  • Bir bloğu ortalamak için text-align: center. Bir blok çocuğu değil, satır içi içeriği (metin, resimler, inline-block çocuklar) ortalar.

Sıkça Sorulan Sorular

Bir div hem yatayda hem dikeyde nasıl ortalanır?

Ebeveyni grid yap ve içeriğini ortala: .parent { display: grid; place-items: center; }. Flexbox sürümü display: flex; justify-content: center; align-items: center; şeklindedir. İki durumda da ebeveynin div'den uzun bir yüksekliği olmalıdır.

Bir div yalnızca yatayda nasıl ortalanır?

Ona bir genişlik ve otomatik yan margin'ler ver: .box { width: 300px; margin: 0 auto; } (esnek bir blok için max-width). Mantıksal özelliklerde bunun karşılığı margin-inline: auto'dur.

margin: 0 auto div'imi neden ortalamıyor?

Div'in kapsayıcısından küçük bir genişliği yoktur, bu yüzden paylaştırılacak boş alan yoktur (bir blok varsayılan olarak tam genişliği doldurur). width ya da max-width ver. Satır içi elementlerde de hiçbir şey yapmaz ve normal akışta asla dikeyde ortalamaz.

Div'im neden dikeyde ortalanmıyor?

Ebeveyn yalnızca içeriği kadar uzundur, bu yüzden içinde ortalanacak fazladan boşluk yoktur. Ebeveyne bir yükseklik (ya da min-height) ver, sonra grid ya da flexbox ile ortala.

Bir div'i ortalamanın en kolay yolu nedir?

Ebeveyne display: grid; place-items: center;: iki bildirim, iki eksen, çocuğun boyutu ne olursa olsun. Ebeveyn aynı zamanda başka öğeleri bir satırda diziyorsa flexbox kullan.

Bir div'in içindeki metin nasıl ortalanır?

Metin ve satır içi içerik için div'e text-align: center ver. Div'in kendisini ortalamak ile içindeki metni ortalamak ayrı işlerdir.

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA