CSS Izgarasında Merkezleme


181

CSS Grid ile basit bir sayfa oluşturmaya çalışıyorum.

Yapamayacağım şey, HTML'den ilgili ızgara hücrelerine metni ortalamaktır.

Ayrı içinde yerleştirme içeriği denedim divs içini ve dışını her iki left_bgve right_bgboşuna CSS özellikleri bazılarıyla seçicileri ve oynamaya.

Bunu nasıl yaparım?

html,
body {
  margin: 0;
  padding: 0;
}

.container {
  display: grid;
  grid-template-columns: 1fr 1fr;
  grid-template-rows: 100vh;
  grid-gap: 0px 0px;
}

.left_bg {
  display: subgrid;
  background-color: #3498db;
  grid-column: 1 / 1;
  grid-row: 1 / 1;
  z-index: 0;
}

.right_bg {
  display: subgrid;
  background-color: #ecf0f1;
  grid-column: 2 / 2;
  grid_row: 1 / 1;
  z-index: 0;
}

.left_text {
  grid-column: 1 / 1;
  grid-row: 1 / 1;
  position: relative;
  z-index: 1;
  justify-self: center;
  font-family: Raleway;
  font-size: large;
}

.right_text {
  grid-column: 2 / 2;
  grid_row: 1 / 1;
  position: relative;
  z-index: 1;
  justify-self: center;
  font-family: Raleway;
  font-size: large;
}
<div class="container">
  <!--everything on the page-->

  <div class="left_bg">
    <!--left background color of the page-->
  </div>
</div>

<div class="right_bg">
  <!--right background color of the page-->
</div>

<div class="left_text">
  <!--left side text content-->
  <p>Review my stuff</p>

  <div class="right_text">
    <!--right side text content-->
    <p>Hire me!</p>
  </div>
</div>


1
Lütfen w3.org/Style/Examples/007/center.en.html bağlantısını kontrol edin, umarım faydalı olacaktır.
Ali

Yanıtlar:


434

Bu cevabın iki ana bölümü vardır:

  1. CSS Izgarasında hizalamanın nasıl çalıştığını anlama.
  2. CSS Izgarasında merkezleme için altı yöntem.

Yalnızca çözümlerle ilgileniyorsanız, ilk bölümü atlayın.


Izgara düzeninin Yapısı ve Kapsamı

Bir ızgara kabında merkezlemenin nasıl çalıştığını tam olarak anlamak için, önce ızgara düzeninin yapısını ve kapsamını anlamak önemlidir.

Izgara kabının HTML yapısının üç düzeyi vardır:

  • konteyner
  • eşya
  • içerik

Bu seviyelerin her biri ızgara özelliklerini uygulama açısından diğerlerinden bağımsızdır.

Kapsamı bir ızgara kabın bir üst-alt ilişkisi ile sınırlıdır.

Bu, bir ızgara konteynerinin her zaman üst öğe ve bir ızgara öğesinin her zaman alt öğe olduğu anlamına gelir. Izgara özellikleri yalnızca bu ilişki içinde çalışır.

Çocukların ötesinde bir ızgara kabının torunları ızgara düzeninin bir parçası değildir ve ızgara özelliklerini kabul etmezler. (En azından subgridızgara öğelerinin torunlarının birincil kabın satırlarına saygı duymasına izin verecek özellik uygulanana kadar değil .)

Yukarıda açıklanan yapı ve kapsam kavramlarına bir örnek.

Tic-tac-toe benzeri bir ızgara düşünün.

article {
  display: inline-grid;
  grid-template-rows: 100px 100px 100px;
  grid-template-columns: 100px 100px 100px;
  grid-gap: 3px;
}

resim açıklamasını buraya girin

Her bir hücrede X ve O'nun ortalanmasını istiyorsunuz.

Böylece merkezlemeyi kap düzeyinde uygularsınız:

article {
  display: inline-grid;
  grid-template-rows: 100px 100px 100px;
  grid-template-columns: 100px 100px 100px;
  grid-gap: 3px;
  justify-items: center;
}

Ancak, ızgara düzeninin yapısı ve kapsamı justify-itemsnedeniyle, konteynerde ızgara öğeleri, içeriği değil (en azından doğrudan değil) ortalar.

resim açıklamasını buraya girin

Şununla aynı sorun align-items: İçerik bir yan ürün olarak ortalanmış olabilir, ancak düzen tasarımını kaybettiniz.

article {
  display: inline-grid;
  grid-template-rows: 100px 100px 100px;
  grid-template-columns: 100px 100px 100px;
  grid-gap: 3px;
  justify-items: center;
  align-items: center;
}

resim açıklamasını buraya girin

İçeriği ortalamak için farklı bir yaklaşım izlemeniz gerekir. Izgara düzeninin yapısına ve kapsamına tekrar bakarak, ızgara öğesini üst öğe olarak ve içeriği alt öğe olarak ele almanız gerekir.

article {
  display: inline-grid;
  grid-template-rows: 100px 100px 100px;
  grid-template-columns: 100px 100px 100px;
  grid-gap: 3px;
}

section {
  display: flex;
  justify-content: center;
  align-items: center;
  border: 2px solid black;
  font-size: 3em;
}

resim açıklamasını buraya girin

jsFiddle demosu


CSS Izgarasında Merkezleme için Altı Yöntem

Izgara öğelerini ve içeriğini ortalamak için birden çok yöntem vardır.

İşte temel bir 2x2 ızgarası:

grid-container {
  display: grid;
  grid-template-columns: 1fr 1fr;
  grid-auto-rows: 75px;
  grid-gap: 10px;
}


/* can ignore styles below; decorative only */
grid-container {
  background-color: lightyellow;
  border: 1px solid #bbb;
  padding: 10px;
}
grid-item {
  background-color: lightgreen;
  border: 1px solid #ccc;
}
<grid-container>
  <grid-item>this text should be centered</grid-item>
  <grid-item>this text should be centered</grid-item>
  <grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item>
  <grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item>
</grid-container>

flexbox'a

Izgara öğelerinin içeriğini ortalamanın basit ve kolay bir yolu için flexbox kullanın.

Daha spesifik olarak, ızgara öğesini esnek bir kaba dönüştürün.

Bu yöntemle çakışma, teknik özellik ihlali veya başka bir sorun yoktur. Temiz ve geçerli.

grid-item {
  display: flex;
  align-items: center;
  justify-content: center;
}

Tam bir açıklama için bu gönderiye bakın:


Izgara Düzeni

Bir esnek öğenin aynı zamanda bir esnek kap olabileceği gibi, bir ızgara öğesi de bir ızgara kabı olabilir. Bu çözüm yukarıdaki flexbox çözümüne benzer, ancak merkezleme esneme özellikleri değil ızgara ile yapılır.


auto marjlar

margin: autoIzgara öğelerini dikey ve yatay olarak ortalamak için kullanın .

grid-item {
  margin: auto;
}

Izgara öğelerinin içeriğini ortalamak için öğeyi bir ızgara (veya esnek) kabına dönüştürmeniz, anonim öğeleri kendi öğelerine ( CSS tarafından doğrudan hedeflenemedikleri için ) sarmanız ve kenar boşluklarını yeni öğelere uygulamanız gerekir.

grid-item {
  display: flex;
}

span, img {
  margin: auto;
}


Kutu Hizalama Özellikleri

Izgara öğelerini hizalamak için aşağıdaki özellikleri kullanmayı düşünürken, autoyukarıdaki kenar boşlukları bölümünü okuyun .

  • align-items
  • justify-items
  • align-self
  • justify-self

https://www.w3.org/TR/css-align-3/#property-index


text-align: center

İçeriği ızgara öğesinde yatay olarak ortalamak için text-alignözelliği kullanabilirsiniz .

Dikey merkezleme için vertical-align: middleçalışmaz.

Bunun nedeni, vertical-alignözelliğin yalnızca satır içi ve tablo hücresi kaplarına uygulanmasıdır.

display: inline-gridSatır içi düzeyde bir kap oluşturduğunu ve bunun doğru olacağını söyleyebiliriz . Öyleyse neden vertical-alignızgara öğelerinde çalışmıyor ?

Bunun nedeni, ızgara biçimlendirme bağlamında öğelere blok düzeyi öğeler olarak davranılmasıdır.

6.1. Izgara Öğesi Ekranı

displayBir ızgara ürünün değer blockified : belirtilirse displaybir ızgara kabın üretilmesi, bir öğenin içinde akış çocuğun bir satır içi seviyesi değeri, bu da blok düzeyi eşdeğer hesaplar.

Bir de blok biçimlendirme bağlamda , bir şey vertical-alignözelliği orijinal olarak dizayn edilmiş, tarayıcı satıriçi seviyeden kapta blok düzeyinde eleman bulmak için beklemiyor. Bu geçersiz HTML.


CSS Konumlandırma

Son olarak, Grid'de de çalışan genel bir CSS merkezleme çözümü var: mutlak konumlandırma

Bu, belge akışından çıkarılması gereken nesneleri ortalamak için iyi bir yöntemdir. Örneğin, aşağıdakileri yapmak istiyorsanız:

Sadece position: absoluteortalanacak öğeye position: relativeve içeren blok olarak görev yapacak ataya (genellikle üst öğedir ) ayarlayın. Bunun gibi bir şey:

grid-item {
  position: relative;
  text-align: center;
}

span {
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
}

İşte bu yöntemin nasıl çalıştığına dair tam bir açıklama:

Grid spesifikasyonunda mutlak konumlandırma ile ilgili bölüm:


Merhaba Michael, sadece her sütunu satırdaki en küçük sütun boyutuna yeniden boyutlandırmak için ızgara kullanarak mümkün olup olmadığını merak ediyordum?
Codesee

@TheCodesee, tüm gereksinimlerinize bağlı olarak bu mümkün olabilir .. Bir kod örneği var mı? Veya tüm ayrıntıları içeren yeni bir soru göndermeyi düşünün.
Michael Benjamin

olduğu grid-containerve grid-itemHTML etiketleri?
diEcho

1
Bunlar özel HTML etiketleri. Bu demo için yaptığım gibi kendi etiketlerinizi oluşturabilirsiniz. stackoverflow.com/q/36380449/3597276 @ pro.mean
Michael Benjamin

5
Bu harika bir cevap, teşekkürler. O arasındaki, senin iki birinci örneklerde, fark etmemi sağladı flexve grid, align-itemskalır aynı ama nedense justify-contentolurjustify-items
woj

11

Metninizi ortalamak için flexbox kullanabilirsiniz. Bu arada, metin anonim esnek öğe olarak kabul edildiğinden ekstra kaplara gerek yoktur.

Gönderen FlexBox özellikleri :

Esnek bir kabın her akış içi çocuğu bir esnek öğe haline gelir ve doğrudan bir esnek kabın içinde bulunan her bitişik metin akışı, anonim bir esnek öğeye sarılır . Ancak, yalnızca beyaz boşluk içeren anonim bir esnek öğe (örneğin, white-spaceözellikten etkilenebilecek karakterler ) oluşturulmaz (sanki öyleymiş gibi display:none).

Bu nedenle ızgara öğelerini esnek kaplar ( display: flex) yapın ve hem dikey hem de yatay olarak ortalayın align-items: centerve justify-content: centerortalayın.

Ayrıca HTML ve CSS optimizasyonu gerçekleştirildi:

html,
body {
  margin: 0;
  padding: 0;
}

.container {
  display: grid;
  grid-template-columns: 1fr 1fr;
  grid-template-rows: 100vh;
  
  font-family: Raleway;
  font-size: large;
}

.left_bg,
.right_bg {
  display: flex;
  align-items: center;
  justify-content: center;
}

.left_bg {
  background-color: #3498db;
}

.right_bg {
  background-color: #ecf0f1;
}
<div class="container">
  <div class="left_bg">Review my stuff</div>
  <div class="right_bg">Hire me!</div>
</div>


9

Flex kullanmaya bile çalışmayın; css ızgara ile kalın !! :)

https://jsfiddle.net/ctt3bqr0/

justify-self: center;
align-self: center;

burada merkezleme işi yapıyor.

divIzgara hücresinin içinde bulunan bir şeyi ortalamak istiyorsanız, iç içe ızgarayı çalıştırabilmeniz için tanımlamanız gerekir. (Lütfen burada gösterilen her iki örneğe de bakın.)

https://css-tricks.com/snippets/css/complete-guide-grid/

Şerefe!


Yuvalanmış ızgaraları merak ediyordum. Sanırım nasıl yapıldığını bana gösterdiğiniz için teşekkürler. Yani esnekliğin ızgara ile kaçınılması gerektiğini mi yoksa birleştirmek iyi mi?
pancar

Birleştirmek için iyi ama iş için doğru aracı kullandığınızdan emin olmanız gerekir. Biraz zaman bulun ve css ızgara konusunda sizin için çok netleştirecek Rachels sunumunu izleyin. youtu.be/3vJE3bVoF-Q
Konrad Albrecht

Bu yaklaşımla ilgili sorun, ızgara öğelerinde kenarlıklar kullandığınızda ortaya çıkar ...
Andrew

2
Bu kısaltılabilir place-self: center;.
DevonDahon

6

CSS yer öğeleri kısayol özelliği, sırasıyla hizalama öğeleri ve bloklama öğeleri özelliklerini ayarlar. İkinci değer ayarlanmazsa, ilk değer de bunun için kullanılır.

.parent {
  display: grid;
  place-items: center;
}

place-itemsşu anda desteklenmemektedir
Konrad Albrecht

1

Flex kullanmayı deneyin:

Plunker demosu: https://plnkr.co/edit/nk02ojKuXD2tAqZiWvf9

/* Styles go here */

html,
body {
  margin: 0;
  padding: 0;
}

.container {
  display: grid;
  grid-template-columns: 1fr 1fr;
  grid-template-rows: 100vh;
  grid-gap: 0px 0px;
}

.left_bg {
  background-color: #3498db;
  grid-column: 1 / 1;
  grid-row: 1 / 1;
  z-index: 0;
  display: flex;
  justify-content: center;
  align-items: center;

}

.right_bg {
  background-color: #ecf0f1;
  grid-column: 2 / 2;
  grid_row: 1 / 1;
  z-index: 0;
  display: flex;
  justify-content: center;
  align-items: center;
}

.text {
  font-family: Raleway;
  font-size: large;
  text-align: center;
}

HTML

    <div class="container">
  <!--everything on the page-->

  <div class="left_bg">
    <!--left background color of the page-->
    <div class="text">
      <!--left side text content-->
      <p>Review my stuff</p>
    </div>
  </div>

  <div class="right_bg">
    <!--right background color of the page-->
    <div class="text">
      <!--right side text content-->
      <p>Hire me!</p>
    </div>
  </div>
</div>

-2

Bunu istiyorsun?

html,
body {
  margin: 0;
  padding: 0;
}

.container {
  display: grid;
  grid-template-columns: 1fr 1fr;
  grid-template-rows: 100vh;
  grid-gap: 0px 0px;
}

.left_bg {
  display: subgrid;
  background-color: #3498db;
  grid-column: 1 / 1;
  grid-row: 1 / 1;
  z-index: 0;
}

.right_bg {
  display: subgrid;
  background-color: #ecf0f1;
  grid-column: 2 / 2;
  grid_row: 1 / 1;
  z-index: 0;
}

.text {
  font-family: Raleway;
  font-size: large;
  text-align: center;
}
<div class="container">
  <!--everything on the page-->

  <div class="left_bg">
    <!--left background color of the page-->
    <div class="text">
      <!--left side text content-->
      <p>Review my stuff</p>
    </div>
  </div>

  <div class="right_bg">
    <!--right background color of the page-->
    <div class="text">
      <!--right side text content-->
      <p>Hire me!</p>
    </div>
  </div>
</div>


1
Pek değil. Metin de dikey olarak hizalanmalıdır.
pancar

Kullanın.text{ font-family: Raleway; font-size: large; text-align: center; -webkit-transform: rotate(-90deg); -moz-transform: rotate(-90deg); }
Renato siqueira

-2

Bu sorunun birkaç yaşında olduğunu biliyorum, ama kimsenin önermediğini görünce şaşırdım:

   text-align: center;

bu, haklı içerikten daha evrensel bir özelliktir ve kesinlikle ızgaraya özgü değildir, ancak bu sorunun özellikle sorduğu metinle uğraşırken, metni alanı etkilemeden merkeze hizaladığını görüyorum. ızgara öğeleri arasında veya dikey merkezleme arasında. Metni, dikey ekseni üzerinde bulunduğu yerde yatay olarak ortalar. Ayrıca, yaslama içeriği ve hizalama öğeleri ekleyen bir karmaşıklık katmanını kaldırmak için buldum. justify-content ve align-items tüm ızgara öğesini veya öğelerini etkiler, metin hizalama metni içerdiği kapsayıcıyı etkilemeden ortalar. Umarım bu yardımcı olur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.