Bu cevabın iki ana bölümü vardır:
- CSS Izgarasında hizalamanın nasıl çalıştığını anlama.
- 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:
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;
}
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-items
nedeniyle, konteynerde ızgara öğeleri, içeriği değil (en azından doğrudan değil) ortalar.
article {
display: inline-grid;
grid-template-rows: 100px 100px 100px;
grid-template-columns: 100px 100px 100px;
grid-gap: 3px;
justify-items: center;
}
section {
border: 2px solid black;
font-size: 3em;
}
<article>
<section>X</section>
<section>O</section>
<section>X</section>
<section>O</section>
<section>X</section>
<section>O</section>
<section>X</section>
<section>O</section>
<section>X</section>
</article>
Ş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;
}
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;
}
section {
border: 2px solid black;
font-size: 3em;
}
<article>
<section>X</section>
<section>O</section>
<section>X</section>
<section>O</section>
<section>X</section>
<section>O</section>
<section>X</section>
<section>O</section>
<section>X</section>
</article>
İç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;
}
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;
}
<article>
<section>X</section>
<section>O</section>
<section>X</section>
<section>O</section>
<section>X</section>
<section>O</section>
<section>X</section>
<section>O</section>
<section>X</section>
</article>
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;
}
grid-container {
display: grid;
grid-template-columns: 1fr 1fr;
grid-auto-rows: 75px;
grid-gap: 10px;
}
grid-item {
display: flex; /* new */
align-items: center; /* new */
justify-content: center; /* new */
}
/* 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>
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.
grid-container {
display: grid;
grid-template-columns: 1fr 1fr;
grid-auto-rows: 75px;
grid-gap: 10px;
}
grid-item {
display: grid; /* new */
align-items: center; /* new */
justify-items: center; /* new */
}
/* 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>
auto
marjlar
margin: auto
Izgara öğelerini dikey ve yatay olarak ortalamak için kullanın .
grid-item {
margin: auto;
}
grid-container {
display: grid;
grid-template-columns: 1fr 1fr;
grid-auto-rows: 75px;
grid-gap: 10px;
}
grid-item {
margin: auto;
}
/* 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>
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;
}
grid-container {
display: grid;
grid-template-columns: 1fr 1fr;
grid-auto-rows: 75px;
grid-gap: 10px;
}
grid-item {
display: flex;
}
span, img {
margin: auto;
}
/* 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><span>this text should be centered</span></grid-item>
<grid-item><span>this text should be centered</span></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>
Kutu Hizalama Özellikleri
Izgara öğelerini hizalamak için aşağıdaki özellikleri kullanmayı düşünürken, auto
yukarı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 .
grid-container {
display: grid;
grid-template-columns: 1fr 1fr;
grid-auto-rows: 75px;
grid-gap: 10px;
text-align: center; /* new */
}
/* 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>
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.
grid-container {
display: grid;
grid-template-columns: 1fr 1fr;
grid-auto-rows: 75px;
grid-gap: 10px;
text-align: center; /* <--- works */
vertical-align: middle; /* <--- fails */
}
/* 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>
display: inline-grid
Satı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ı
display
Bir ızgara ürünün değer blockified : belirtilirse display
bir ı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: absolute
ortalanacak öğeye position: relative
ve 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%);
}
grid-container {
display: grid;
grid-template-columns: 1fr 1fr;
grid-auto-rows: 75px;
grid-gap: 10px;
}
grid-item {
position: relative;
text-align: center;
}
span, img {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
/* 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><span>this text should be centered</span></grid-item>
<grid-item><span>this text should be centered</span></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>
İşte bu yöntemin nasıl çalıştığına dair tam bir açıklama:
Grid spesifikasyonunda mutlak konumlandırma ile ilgili bölüm: