คอร์ส IT พื้นฐาน CSS 031_เลย์เอาต์กริด Grid
เลย์เอาต์กริด Grid
กริดเป็นรูปแบบเลย์เอาต์ที่ประกอบด้วยเส้นแนวนอนและแนวตั้งหลายเส้น ตามกริด เราสามารถจัดเรียงองค์ประกอบการออกแบบ ช่วยให้เราออกแบบหน้าเว็บที่มีองค์ประกอบที่มีตำแหน่งและความกว้างคงที่ ทำให้หน้าเว็บไซต์ของเรามีความเป็นเอกภาพมากขึ้น
กริดโดยทั่วไปจะมีคอลัมน์ (column) และ แถว (row) จำนวนมาก รวมถึงช่องว่างระหว่างแถวกับแถว คอลัมน์กับคอลัมน์ ช่องว่างนี้โดยทั่วไปเรียกว่า รางน้ำ (gutter)

แนวคิดพื้นฐาน
เลย์เอาต์ Grid ประกอบด้วยแนวคิดพื้นฐานต่อไปนี้:
- คอนเทนเนอร์กริด (grid container): เลย์เอาต์กริดประกอบด้วยคอนเทนเนอร์กริดและรายการกริด คอนเทนเนอร์กริดคือคอนเทนเนอร์ที่วางรายการกริดลงในกริด คอนเทนเนอร์กริดสามารถเป็นองค์ประกอบใดก็ได้ แต่โดยทั่วไปจะใช้องค์ประกอบ
div - รายการกริด (grid item): รายการกริดคือองค์ประกอบที่วางไว้ในคอนเทนเนอร์กริด รายการกริดสามารถเป็นองค์ประกอบใดก็ได้ แต่โดยทั่วไปจะใช้องค์ประกอบ
div - เส้นกริด (grid line): เส้นกริดคือเส้นที่แบ่งคอนเทนเนอร์กริดออกเป็นแถวและคอลัมน์ เส้นกริดสามารถเป็นเส้นแนวนอนหรือเส้นแนวตั้ง
- คอลัมน์กริด (grid column): คอลัมน์กริดคือเส้นในทิศทางแนวตั้งในคอนเทนเนอร์กริด
- แถวกริด (grid row): แถวกริดคือเส้นในทิศทางแนวนอนในคอนเทนเนอร์กริด
คุณสมบัติที่ใช้บ่อย
คุณสมบัติคอนเทนเนอร์กริด
คอนเทนเนอร์กริดมีคุณสมบัติต่อไปนี้สำหรับควบคุมเลย์เอาต์กริด:
display: ตั้งค่าโหมดการแสดงผลของคอนเทนเนอร์กริด คอนเทนเนอร์กริดต้องตั้งค่าเป็นdisplay: gridหรือdisplay: inline-gridเพื่อใช้เลย์เอาต์กริดgrid-template-columns: ตั้งค่าจำนวนคอลัมน์และความกว้างคอลัมน์ของคอนเทนเนอร์กริด (ใช้หน่วยfr,px,emฯลฯ)grid-template-rows: ตั้งค่าจำนวนแถวและความสูงแถวของคอนเทนเนอร์กริด (ใช้หน่วยfr,px,emฯลฯ)grid-template: ตั้งค่าgrid-template-columnsและgrid-template-rowsพร้อมกันgrid-auto-columns: ตั้งค่าความกว้างคอลัมน์ของคอนเทนเนอร์กริดgrid-auto-rows: ตั้งค่าความสูงแถวของคอนเทนเนอร์กริด
คุณสมบัติรายการกริด
รายการกริดมีคุณสมบัติต่อไปนี้สำหรับควบคุมเลย์เอาต์ของรายการกริดในกริด:
grid-column: ตั้งค่าคอลัมน์ที่รายการกริดอยู่grid-row: ตั้งค่าแถวที่รายการกริดอยู่grid-column-start: ตั้งค่าตำแหน่งเริ่มต้นของรายการกริดในคอลัมน์grid-column-end: ตั้งค่าตำแหน่งสิ้นสุดของรายการกริดในคอลัมน์grid-row-start: ตั้งค่าตำแหน่งเริ่มต้นของรายการกริดในแถวgrid-row-end: ตั้งค่าตำแหน่งสิ้นสุดของรายการกริดในแถวgrid-area: ตั้งค่าพื้นที่ที่รายการกริดอยู่grid-gap: ตั้งค่าระยะห่างระหว่างเส้นกริด
เลย์เอาต์กริด
กำหนดความกว้างคอลัมน์และความสูงแถวแบบคงที่และแบบปรับได้
ตัวอย่าง:
.grid-example{ display: grid; grid-template-columns: 100px 200px auto; /* คอลัมน์แรก 100px, คอลัมน์ที่สอง 200px, พื้นที่ที่เหลือจัดสรรให้คอลัมน์แบบปรับได้ */ grid-template-rows: 100px 200px auto; /* แถวแรก 100px, แถวที่สอง 200px, พื้นที่ที่เหลือจัดสรรให้แถวแบบปรับได้ */}.item{ margin: 10px; background-color: rgb(100, 150, 200);} <div class="grid-example"> <div class="item">สาธิต Grid</div> <div class="item">สาธิต Grid</div> <div class="item">สาธิต Grid</div> <div class="item">สาธิต Grid</div> <div class="item">สาธิต Grid</div> <div class="item">สาธิต Grid</div> <div class="item">สาธิต Grid</div> <div class="item">สาธิต Grid</div> <div class="item">สาธิต Grid</div> </div>ผลลัพธ์:
ใช้เปอร์เซ็นต์กำหนดความกว้างคอลัมน์และความสูงแถว
ตัวอย่าง:
.grid-example{ display: grid; grid-template-columns: 30% 2fr 1fr; /* คอลัมน์แรกครอบครอง 30%, คอลัมน์ที่สองครอบครองสองส่วนของพื้นที่ที่เหลือ, คอลัมน์ที่สามครอบครองหนึ่งส่วนของพื้นที่ที่เหลือ */ grid-template-rows: 30% 2fr 1fr; /* แถวแรกครอบครอง 30%, แถวที่สองครอบครองสองส่วนของพื้นที่ที่เหลือ, แถวที่สามครอบครองหนึ่งส่วนของพื้นที่ที่เหลือ */}.item{ margin: 10px; background-color: rgb(100, 150, 200);} <div class="grid-example"> <div class="item">สาธิต Grid</div> <div class="item">สาธิต Grid</div> <div class="item">สาธิต Grid</div> <div class="item">สาธิต Grid</div> <div class="item">สาธิต Grid</div> <div class="item">สาธิต Grid</div> <div class="item">สาธิต Grid</div> <div class="item">สาธิต Grid</div> <div class="item">สาธิต Grid</div> </div>ผลลัพธ์:
การแบ่งเท่ากัน (การกระจายโดยเฉลี่ย) ความกว้างคอลัมน์และความสูงแถว
ตัวอย่าง:
.grid-example{ display: grid; grid-template-columns: repeat(3, 1fr); /* แบ่งคอลัมน์เป็น 3 ส่วนเท่าๆ กัน แต่ละคอลัมน์ครอบครองหนึ่งส่วนของพื้นที่ที่เหลือ */ grid-template-rows: repeat(3, 1fr); /* แบ่งแถวเป็น 3 ส่วนเท่าๆ กัน แต่ละแถวครอบครองหนึ่งส่วนของพื้นที่ที่เหลือ */}.item{ margin: 10px; background-color: rgb(100, 150, 200);} <div class="grid-example"> <div class="item">สาธิต Grid</div> <div class="item">สาธิต Grid</div> <div class="item">สาธิต Grid</div> <div class="item">สาธิต Grid</div> <div class="item">สาธิต Grid</div> <div class="item">สาธิต Grid</div> <div class="item">สาธิต Grid</div> <div class="item">สาธิต Grid</div> <div class="item">สาธิต Grid</div> </div>ผลลัพธ์:
ใช้ minmax กำหนดความกว้างและความสูงต่ำสุดและสูงสุดของคอลัมน์และแถว
ตัวอย่าง:
.grid-example{ display: grid; grid-template-columns: minmax(100px, 1fr) minmax(200px, 2fr); /* คอลัมน์แรกความกว้างต่ำสุด 100px, ครอบครองหนึ่งส่วนของพื้นที่ที่เหลือ; คอลัมน์ที่สองความกว้างต่ำสุด 200px, ครอบครองสองส่วนของพื้นที่ที่เหลือ */ grid-template-rows: minmax(100px, 1fr) minmax(200px, 2fr); /* แถวแรกความสูงต่ำสุด 100px, ครอบครองหนึ่งส่วนของพื้นที่ที่เหลือ; แถวที่สองความสูงต่ำสุด 200px, ครอบครองสองส่วนของพื้นที่ที่เหลือ */}.item{ margin: 10px; background-color: rgb(100, 150, 200);} <div class="grid-example"> <div class="item">สาธิต Grid</div> <div class="item">สาธิต Grid</div> <div class="item">สาธิต Grid</div> <div class="item">สาธิต Grid</div> </div>ผลลัพธ์:

ช่องว่างกริด
ช่องว่างกริดควบคุมโดยคุณสมบัติสองตัว grid-row-gap และ grid-column-gap นอกจากนี้ CSS Grid Level 2 ได้แนะนำคุณสมบัติ gap ที่สามารถควบคุม grid-row-gap และ grid-column-gap พร้อมกัน
ตัวอย่าง:
.grid-example{ display: grid; grid-template-columns: 30% 30% 30%; grid-template-rows: 200px 200px; grid-row-gap: 50px; /* ช่องว่างระหว่างแถว 50px */ grid-column-gap: 30px; /* ช่องว่างระหว่างคอลัมน์ 30px */ /* gap: 50px 30px; ช่องว่างระหว่างแถว 50px, ช่องว่างระหว่างคอลัมน์ 30px */}.item{ margin: 10px; background-color: rgb(100, 150, 200);} <div class="grid-example"> <div class="item">สาธิต Grid</div> <div class="item">สาธิต Grid</div> <div class="item">สาธิต Grid</div> <div class="item">สาธิต Grid</div> <div class="item">สาธิต Grid</div> <div class="item">สาธิต Grid</div> </div>ผลลัพธ์:

การจัดวางกริด
การจัดวางกริดโดยทั่วไปหมายถึงการใช้คุณสมบัติ grid-column, grid-row และ grid-area เพื่อจัดวางรายการในเลย์เอาต์กริด คุณสมบัติเหล่านี้ใช้เพื่อระบุคอลัมน์และแถวที่รายการครอบครองในกริด หรือระบุพื้นที่ที่รายการอยู่โดยตรง
grid-columnเป็นคุณสมบัติที่ใช้ตั้งค่าคอลัมน์ที่รายการกริดครอบครอง เป็นรูปแบบย่อของgrid-column-startและgrid-column-endด้วยgrid-columnคุณสามารถกำหนดตำแหน่งของรายการกริดในทิศทางแนวนอนและจำนวนคอลัมน์ที่ครอบครองได้สะดวกยิ่งขึ้นgrid-rowเป็นคุณสมบัติที่ใช้ตั้งค่าแถวที่รายการกริดครอบครอง เป็นรูปแบบย่อของgrid-row-startและgrid-row-endด้วยgrid-rowคุณสามารถกำหนดตำแหน่งของรายการกริดในทิศทางแนวตั้งและจำนวนแถวที่ครอบครองได้สะดวกยิ่งขึ้น- คุณสมบัติ
grid-areaเป็นคุณสมบัติย่อที่ใช้ตั้งค่าคุณสมบัติgrid-row-start,grid-column-start,grid-row-endและgrid-column-endพร้อมกัน ด้วยgrid-areaคุณสามารถกำหนดตำแหน่งและขนาดของรายการกริดในเลย์เอาต์กริดได้อย่างเข้าใจง่ายยิ่งขึ้น
ตัวอย่าง:
.example { display: grid; grid-template-columns: repeat(3, 1fr); /* กำหนด 3 คอลัมน์, แต่ละคอลัมน์ครอบครอง 1 ส่วนพื้นที่ */ grid-template-rows: repeat(2, 150px); /* กำหนด 2 แถว, แต่ละแถวสูง 150px */ gap: 10px; padding: 20px;}.item { background-color: #f2f2f2; padding: 20px; border: 1px solid #ddd; text-align: center;}/* การจัดวางโดยใช้ grid-column และ grid-row */.item1 { grid-column: 1 / 3; /* จากคอลัมน์ที่ 1 ถึงคอลัมน์ที่ 3(1+2 คอลัมน์) */ grid-row: 1 / 2; /* จากแถวที่ 1 ถึงแถวที่ 2(1 แถว) */}/* การจัดวางโดยใช้ grid-area */.item2 { grid-area: 2 / 2 / 3 / 4; /* จากแถวที่ 2 คอลัมน์ที่ 2 ถึงแถวที่ 3 คอลัมน์ที่ 4(2 แถว)(2+3 คอลัมน์) */}<div class="example"> <div class="item item1">Item 1</div> <div class="item item2">Item 2</div> <div class="item">Item 3</div> <div class="item">Item 4</div> <div class="item">Item 5</div> <div class="item">Item 6</div></div>ผลลัพธ์:

ตัวอย่าง:
body { margin: 0; padding: 0;}
.container { display: grid; grid-template-columns: 1fr 2fr; /* กำหนดสองคอลัมน์, คอลัมน์แรกครอบครองหนึ่งส่วน, คอลัมน์ที่สองครอบครองสองส่วน */ grid-template-rows: auto; /* กำหนดความสูงแถว, แถวแรกและแถวที่สามความสูงกำหนดโดยเนื้อหา, แถวที่สองครอบครองพื้นที่ที่เหลือ */ grid-template-areas: "header header" "sidebar main" "footer footer"; /* กำหนดเลย์เอาต์พื้นที่, แต่ละพื้นที่แสดงด้วยสตริง, ช่องว่างแยกเซลล์, ขึ้นบรรทัดใหม่แสดงแถวใหม่ */ min-height: 100vh; /* ตั้งค่าความสูงต่ำสุด, รับประกันว่า footer จะมองเห็นได้แม้ความสูงเนื้อหาน้อยกว่าวิวพอร์ต */}
.header { grid-area: header; /* วาง .header ในพื้นที่ชื่อ "header" */ background-color: #333; color: #fff; padding: 10px;}
.sidebar { grid-area: sidebar; /* วาง .sidebar ในพื้นที่ชื่อ "sidebar" */ background-color: #f2f2f2; padding: 10px;}
.main { grid-area: main; /* วาง .main ในพื้นที่ชื่อ "main" */ padding: 10px;}
.footer { grid-area: footer; /* วาง .footer ในพื้นที่ชื่อ "footer" */ background-color: #333; color: #fff; padding: 10px;} <div class="container"> <div class="header">Header</div> <div class="sidebar">Sidebar</div> <div class="main"> <h1>Main Content</h1> <p>This is the main content area.</p> </div> <div class="footer">Footer</div> </div>ผลลัพธ์:
