Jawaban ini memiliki dua bagian utama:
- Memahami bagaimana penyelarasan bekerja di CSS Grid.
- Enam metode untuk memusatkan di CSS Grid.
Jika Anda hanya tertarik dengan solusinya, lewati bagian pertama.
Struktur dan Lingkup tata letak Grid
Untuk memahami sepenuhnya bagaimana pemusatan bekerja dalam wadah kisi, penting untuk terlebih dahulu memahami struktur dan cakupan tata letak kisi.
Struktur HTML wadah kotak memiliki tiga tingkatan:
Masing-masing level ini independen dari yang lain, dalam hal menerapkan properti grid.
The lingkup dari wadah grid terbatas pada hubungan orangtua-anak.
Ini berarti bahwa wadah kotak selalu orang tua dan item kotak selalu menjadi anak. Properti Grid hanya berfungsi dalam hubungan ini.
Keturunan wadah kotak di luar anak-anak bukan bagian dari tata letak kotak dan tidak akan menerima properti kotak. (Setidaknya tidak sampai subgrid
fitur tersebut diimplementasikan, yang akan memungkinkan keturunan item kisi menghormati garis-garis wadah utama.)
Berikut adalah contoh konsep struktur dan ruang lingkup yang dijelaskan di atas.
Bayangkan sebuah kotak seperti tic-tac-toe-like.
article {
display: inline-grid;
grid-template-rows: 100px 100px 100px;
grid-template-columns: 100px 100px 100px;
grid-gap: 3px;
}
Anda ingin X dan O dipusatkan di setiap sel.
Jadi, Anda menerapkan pemusatan pada level kontainer:
article {
display: inline-grid;
grid-template-rows: 100px 100px 100px;
grid-template-columns: 100px 100px 100px;
grid-gap: 3px;
justify-items: center;
}
Tetapi karena struktur dan cakupan tata letak kisi, justify-items
pada wadah memusatkan item kisi, bukan konten (setidaknya tidak secara langsung).
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>
Masalah yang sama dengan align-items
: Konten dapat dipusatkan sebagai produk sampingan, tetapi Anda kehilangan desain tata letak.
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>
Untuk memusatkan konten Anda perlu mengambil pendekatan yang berbeda. Merujuk kembali pada struktur dan cakupan tata letak kisi, Anda perlu memperlakukan item kisi sebagai induk dan konten sebagai anak.
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>
Demo jsFiddle
Enam Metode untuk Pemusatan di CSS Grid
Ada beberapa metode untuk memusatkan item kisi dan kontennya.
Berikut kisi dasar 2x2:
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
Untuk cara sederhana dan mudah untuk memusatkan isi item kisi, gunakan flexbox.
Lebih khusus, jadikan item kisi-kisi menjadi wadah fleksibel.
Tidak ada konflik, pelanggaran spesifikasi atau masalah lain dengan metode ini. Ini bersih dan valid.
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>
Lihat posting ini untuk penjelasan lengkap:
Tata Letak Kotak
Dengan cara yang sama bahwa item fleksibel juga bisa menjadi wadah fleksibel, item kotak juga bisa menjadi wadah kotak. Solusi ini mirip dengan solusi flexbox di atas, kecuali pemusatan dilakukan dengan properti grid, bukan flex.
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
margin
Gunakan margin: auto
untuk memusatkan item kisi secara vertikal dan horizontal.
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>
Untuk memusatkan konten item kisi Anda perlu membuat item menjadi wadah kisi (atau melenturkan), bungkus item anonim dalam elemen mereka sendiri ( karena mereka tidak dapat langsung ditargetkan oleh CSS ), dan menerapkan margin ke elemen baru.
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>
Properti Alignment Box
Saat mempertimbangkan menggunakan properti berikut untuk menyelaraskan item kisi, baca bagian auto
margin di atas.
align-items
justify-items
align-self
justify-self
https://www.w3.org/TR/css-align-3/#property-index
text-align: center
Untuk memusatkan konten secara horizontal dalam item kisi, Anda dapat menggunakan text-align
properti.
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>
Perhatikan bahwa untuk pemusatan vertikal, vertical-align: middle
tidak akan berfungsi.
Ini karena vertical-align
properti hanya berlaku untuk inline dan wadah sel-tabel.
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>
Orang mungkin mengatakan bahwa display: inline-grid
membangun wadah tingkat inline, dan itu akan benar. Jadi mengapa tidak vertical-align
berfungsi di item kisi?
Alasannya adalah bahwa dalam konteks pemformatan kisi , item diperlakukan sebagai elemen tingkat blok.
6.1. Tampilan Item Kisi
The display
nilai item grid blockified : jika ditentukan display
dari anak di-aliran unsur menghasilkan wadah grid nilai inline-tingkat, itu menghitung untuk setara blok-level.
Dalam konteks pemformatan blok , sesuatu yang vertical-align
awalnya dirancang untuk properti itu, browser tidak berharap menemukan elemen level blok dalam wadah level inline. Itu HTML tidak valid.
Pemosisian CSS
Terakhir, ada solusi pemusatan CSS umum yang juga berfungsi di Grid: penentuan posisi absolut
Ini adalah metode yang baik untuk memusatkan objek yang perlu dihapus dari aliran dokumen. Misalnya, jika Anda ingin:
Cukup atur position: absolute
elemen yang akan dipusatkan, dan position: relative
pada leluhur yang akan berfungsi sebagai blok yang berisi (biasanya induknya). Sesuatu seperti ini:
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>
Berikut ini penjelasan lengkap tentang cara kerja metode ini:
Inilah bagian tentang penentuan posisi absolut dalam spesifikasi Kotak: