คำตอบนี้มีสองส่วนหลัก:
- ทำความเข้าใจเกี่ยวกับการจัดตำแหน่งใน CSS Grid
- หกวิธีสำหรับการอยู่ตรงกลางใน CSS Grid
หากคุณสนใจเฉพาะโซลูชันให้ข้ามส่วนแรก
โครงสร้างและขอบเขตของเค้าโครงตาราง
เพื่อให้เข้าใจอย่างถ่องแท้ถึงวิธีการทำงานของศูนย์กลางในคอนเทนเนอร์กริดสิ่งสำคัญคือต้องเข้าใจโครงสร้างและขอบเขตของเค้าโครงกริดก่อน
โครงสร้าง HTML ของคอนเทนเนอร์กริดมีสามระดับ:
แต่ละระดับเหล่านี้เป็นอิสระจากระดับอื่นในแง่ของการใช้คุณสมบัติกริด
ขอบเขตของภาชนะตารางจะถูก จำกัด ให้ความสัมพันธ์แม่ลูก
ซึ่งหมายความว่าคอนเทนเนอร์กริดเป็นพาเรนต์เสมอและรายการกริดจะเป็นรายการย่อยเสมอ คุณสมบัติกริดทำงานภายในความสัมพันธ์นี้เท่านั้น
ลูกหลานของคอนเทนเนอร์กริดที่อยู่ถัดจากเด็ก ๆ นั้นไม่ได้เป็นส่วนหนึ่งของเค้าโครงกริดและจะไม่ยอมรับคุณสมบัติกริด (อย่างน้อยก็จนกว่าจะsubgrid
มีการใช้งานคุณลักษณะนี้ซึ่งจะทำให้ลูกหลานของรายการในตารางเคารพบรรทัดของคอนเทนเนอร์หลัก)
นี่คือตัวอย่างของแนวคิดโครงสร้างและขอบเขตที่อธิบายข้างต้น
ลองนึกภาพตารางที่คล้ายกับโอเอกซ์
article {
display: inline-grid;
grid-template-rows: 100px 100px 100px;
grid-template-columns: 100px 100px 100px;
grid-gap: 3px;
}
คุณต้องการให้ X และ O เป็นศูนย์กลางในแต่ละเซลล์
ดังนั้นคุณจึงใช้การจัดกึ่งกลางที่ระดับคอนเทนเนอร์:
article {
display: inline-grid;
grid-template-rows: 100px 100px 100px;
grid-template-columns: 100px 100px 100px;
grid-gap: 3px;
justify-items: center;
}
แต่เนื่องจากโครงสร้างและขอบเขตของเค้าโครงตารางjustify-items
บนคอนเทนเนอร์จะจัดกึ่งกลางรายการกริดไม่ใช่เนื้อหา (อย่างน้อยก็ไม่ตรง)
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>
ปัญหาเดียวกันกับalign-items
: เนื้อหาอาจอยู่กึ่งกลางเป็นผลพลอยได้ แต่คุณสูญเสียการออกแบบเลย์เอาต์
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>
ในการจัดกึ่งกลางเนื้อหาคุณจำเป็นต้องใช้แนวทางที่แตกต่าง อ้างถึงโครงสร้างและขอบเขตของเค้าโครงตารางอีกครั้งคุณจะต้องถือว่ารายการกริดเป็นผู้ปกครองและเนื้อหาเป็นลูก
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
หกวิธีสำหรับการอยู่ตรงกลางใน CSS Grid
มีหลายวิธีสำหรับการจัดกึ่งกลางรายการกริดและเนื้อหา
นี่คือตาราง 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
สำหรับวิธีที่ง่ายและสะดวกในการจัดกึ่งกลางเนื้อหาของรายการกริดใช้ flexbox
โดยเฉพาะอย่างยิ่งทำให้รายการตารางเป็นคอนเทนเนอร์แบบยืดหยุ่น
ไม่มีความขัดแย้งการละเมิดข้อมูลจำเพาะหรือปัญหาอื่น ๆ ด้วยวิธีนี้ มันสะอาดและถูกต้อง
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>
ดูโพสต์นี้สำหรับคำอธิบายที่สมบูรณ์:
เค้าโครงตาราง
ในลักษณะเดียวกับที่รายการ flex สามารถเป็น flex container รายการ grid สามารถเป็น container grid โซลูชันนี้คล้ายกับโซลูชัน flexbox ด้านบนยกเว้นว่าการจัดกึ่งกลางนั้นทำด้วยกริดไม่ใช่คุณสมบัติแบบเฟล็กซ์
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: auto
เพื่อจัดรายการกริดในแนวตั้งและแนวนอน
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>
ในการจัดกึ่งกลางเนื้อหาของรายการกริดคุณต้องทำให้รายการเป็นคอนเทนเนอร์กริด (หรือเฟล็กซ์) ห่อรายการที่ไม่ระบุชื่อในองค์ประกอบของตนเอง ( เนื่องจากไม่สามารถกำหนดเป้าหมายโดยตรงด้วย CSS ) และใช้ระยะขอบกับองค์ประกอบใหม่
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>
คุณสมบัติการจัดตำแหน่งกล่อง
เมื่อพิจารณาการใช้คุณสมบัติต่อไปนี้เพื่อจัดแนวรายการตารางให้อ่านส่วนที่auto
ระยะขอบด้านบน
align-items
justify-items
align-self
justify-self
https://www.w3.org/TR/css-align-3/#property-index
text-align: center
เมื่อต้องการจัดกึ่งกลางเนื้อหาตามแนวนอนในรายการกริดคุณสามารถใช้text-align
คุณสมบัติได้
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>
โปรดทราบว่าสำหรับการจัดกึ่งกลางแนวตั้งvertical-align: middle
จะไม่ทำงาน
นี่เป็นเพราะvertical-align
คุณสมบัติใช้กับคอนเทนเนอร์แบบอินไลน์และเซลล์ตารางเท่านั้น
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
สร้างตู้คอนเทนเนอร์ในระดับและนั่นจะเป็นจริง เหตุใดจึงไม่vertical-align
ทำงานในรายการกริด
เหตุผลก็คือในบริบทการจัดรูปแบบกริดรายการจะถือว่าเป็นองค์ประกอบระดับบล็อก
6.1 แสดงรายการกริด
display
ค่าของรายการตารางจะblockified : ถ้าระบุdisplay
ของเด็กในการไหลขององค์ประกอบการสร้างภาชนะตารางเป็นค่าอินไลน์ระดับมันคำนวณเทียบเท่าระดับบล็อกของตน
ในบริบทการจัดรูปแบบบล็อกสิ่งที่vertical-align
คุณสมบัติได้รับการออกแบบมาสำหรับเบราว์เซอร์ไม่ได้คาดหวังว่าจะพบองค์ประกอบระดับบล็อกในคอนเทนเนอร์ระดับ inline นั่นคือ HTML ที่ไม่ถูกต้อง
การวางตำแหน่ง CSS
สุดท้ายมีโซลูชันการจัดกึ่งกลาง CSS ทั่วไปที่ใช้งานได้ใน Grid: การจัดตำแหน่งที่แน่นอน
นี่เป็นวิธีที่ดีสำหรับการจัดกึ่งกลางวัตถุที่ต้องถูกลบออกจากผังเอกสาร ตัวอย่างเช่นหากคุณต้องการ:
เพียงตั้งค่าposition: absolute
องค์ประกอบที่จะให้อยู่กึ่งกลางและposition: relative
บนบรรพบุรุษที่จะทำหน้าที่เป็นบล็อกที่มี (มักจะเป็นผู้ปกครอง) บางสิ่งเช่นนี้
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>
นี่คือคำอธิบายที่สมบูรณ์เกี่ยวกับวิธีการทำงานของวิธีนี้:
นี่คือส่วนของการวางตำแหน่งที่แน่นอนในข้อมูลจำเพาะของกริด: