ไทย

สำรวจ CSS Subgrid และเรียนรู้วิธีสร้างเลย์เอาต์ซ้อนกันที่ซับซ้อน ตอบสนอง และบำรุงรักษาง่ายสำหรับการออกแบบเว็บสมัยใหม่ ฝึกฝนเทคนิคกริดขั้นสูงให้เชี่ยวชาญ

CSS Subgrid: ปลดปล่อยพลังของเลย์เอาต์ซ้อนกัน

CSS Grid ได้ปฏิวัติการจัดวางเลย์เอาต์บนเว็บ โดยมอบความยืดหยุ่นและการควบคุมที่เหนือชั้น อย่างไรก็ตาม การจัดการกริดที่ซ้อนกันบางครั้งอาจกลายเป็นเรื่องยุ่งยาก นี่คือจุดที่ CSS Subgrid เข้ามาช่วย Subgrid ช่วยให้ grid item สามารถสืบทอดขนาดแทร็ก (track sizing) ของกริดหลักได้ ทำให้เลย์เอาต์ที่ซับซ้อนง่ายขึ้นและโค้ดของคุณสามารถบำรุงรักษาได้ง่ายขึ้น บทความนี้จะให้คำแนะนำที่ครอบคลุมเพื่อทำความเข้าใจและนำ CSS Subgrid ไปใช้ พร้อมตัวอย่างการใช้งานจริงและข้อมูลเชิงลึกสำหรับนักพัฒนาทุกระดับ

CSS Subgrid คืออะไร?

Subgrid เป็นคุณสมบัติของ CSS Grid ที่ช่วยให้ grid item สามารถกลายเป็นกริดในตัวเองได้ โดยสืบทอดแถวและคอลัมน์แทร็กที่กำหนดโดยกริดหลัก ซึ่งหมายความว่าคุณสามารถจัดแนวเนื้อหาข้ามกริดที่ซ้อนกันหลายๆ อันได้โดยไม่จำเป็นต้องกำหนดขนาดแทร็กในแต่ละกริดที่ซ้อนกันอย่างชัดเจน ลองนึกว่ามันเป็นวิธีการขยายโครงสร้างของกริดหลักไปยังองค์ประกอบลูก เพื่อสร้างเลย์เอาต์ที่สอดคล้องและเป็นอันหนึ่งอันเดียวกันมากขึ้น

ทำไมต้องใช้ Subgrid?

ความเข้ากันได้ของเบราว์เซอร์

ก่อนที่จะเริ่มใช้งาน จำเป็นต้องตรวจสอบความเข้ากันได้ของเบราว์เซอร์ ณ ปลายปี 2023 Subgrid ได้รับการสนับสนุนอย่างดีในเบราว์เซอร์สมัยใหม่ต่างๆ รวมถึง Chrome, Firefox, Safari และ Edge อย่างไรก็ตาม การใช้ Can I use เพื่อตรวจสอบสถานะการสนับสนุนล่าสุดเป็นแนวปฏิบัติที่ดีเสมอ

การใช้งาน Subgrid เบื้องต้น

เรามาเริ่มด้วยตัวอย่างง่ายๆ เพื่ออธิบายแนวคิดพื้นฐานของ Subgrid

โครงสร้าง HTML

ขั้นแรก เราจะกำหนดโครงสร้าง HTML พื้นฐานสำหรับกริดของเรา


<div class="container">
  <div class="header">Header</div>
  <div class="sidebar">Sidebar</div>
  <div class="content">
    <div class="item-1">Item 1</div>
    <div class="item-2">Item 2</div>
    <div class="item-3">Item 3</div>
    <div class="item-4">Item 4</div>
  </div>
  <div class="footer">Footer</div>
</div>

การจัดสไตล์ด้วย CSS

ตอนนี้ เราจะมากำหนด CSS เพื่อสร้างกริดหลักและซับกริดภายในองค์ประกอบ .content


.container {
  display: grid;
  grid-template-columns: 200px 1fr;
  grid-template-rows: auto 1fr auto;
  grid-template-areas:
    "header header"
    "sidebar content"
    "footer footer";
  height: 100vh;
}

.header {
  grid-area: header;
  background-color: #eee;
  padding: 10px;
}

.sidebar {
  grid-area: sidebar;
  background-color: #ddd;
  padding: 10px;
}

.content {
  grid-area: content;
  display: grid;
  grid-template-columns: subgrid;
  grid-template-rows: subgrid;
  background-color: #ccc;
  padding: 10px;
}

.item-1, .item-2, .item-3, .item-4 {
  background-color: #bbb;
  padding: 10px;
}

.footer {
  grid-area: footer;
  background-color: #eee;
  padding: 10px;
}

/* กำหนดการวางตำแหน่งของไอเท็มภายในซับกริด .content */
.content {
    grid-template-columns: subgrid;
    grid-template-rows: subgrid;
    display: grid;
}

.item-1 { grid-column: 1; grid-row: 1; }
.item-2 { grid-column: 2; grid-row: 1; }
.item-3 { grid-column: 1; grid-row: 2; }
.item-4 { grid-column: 2; grid-row: 2; }


ในตัวอย่างนี้ องค์ประกอบ .content ถูกกำหนดให้เป็นซับกริด คุณสมบัติ grid-template-columns: subgrid; และ grid-template-rows: subgrid; จะสั่งให้ซับกริดสืบทอดขนาดแทร็กจากกริดหลัก ตอนนี้พื้นที่เนื้อหาจะสอดคล้องกับขนาดแทร็กที่กำหนดในกริดคอนเทนเนอร์หลัก โดยไม่จำเป็นต้องตั้งค่าใดๆ สำหรับซับกริดโดยตรง ซึ่งช่วยให้มั่นใจได้ถึงการจัดตำแหน่งที่สมบูรณ์แบบระหว่างแถบด้านข้างและไอเท็มภายในพื้นที่เนื้อหา

เทคนิค Subgrid ขั้นสูง

การขยายข้ามแทร็ก (Spanning Tracks)

Subgrid ยังช่วยให้ไอเท็มภายในซับกริดสามารถขยายข้ามหลายแทร็กได้เช่นเดียวกับในกริดปกติ ซึ่งให้ความยืดหยุ่นมากยิ่งขึ้นในการสร้างเลย์เอาต์ที่ซับซ้อน


.item-1 {
  grid-column: 1 / span 2;
  grid-row: 1;
}

โค้ดนี้จะทำให้ .item-1 ขยายข้ามสองคอลัมน์แรกของซับกริด

การตั้งชื่อเส้นกริด (Named Grid Lines)

คุณสามารถใช้เส้นกริดที่ตั้งชื่อกับ Subgrid เพื่อความชัดเจนและการควบคุมที่ดียิ่งขึ้น สมมติว่าคุณมีเส้นที่ตั้งชื่อในกริดหลักของคุณ:


.container {
  display: grid;
  grid-template-columns: [sidebar-start] 200px [sidebar-end content-start] 1fr [content-end];
  grid-template-rows: [header-start] auto [header-end content-start] 1fr [content-end footer-start] auto [footer-end];
  grid-template-areas:
    "header header"
    "sidebar content"
    "footer footer";
  height: 100vh;
}

จากนั้นคุณสามารถอ้างอิงถึงเส้นที่ตั้งชื่อเหล่านี้ภายในซับกริดของคุณได้:


.content {
  grid-area: content;
  display: grid;
  grid-template-columns: subgrid;
  grid-template-rows: subgrid;
}

.item-1 {
  grid-column: content-start / content-end;
  grid-row: content-start;
}

การจัดการแทร็กโดยนัย (Implicit Tracks)

หากจำนวนไอเท็มในกริดมีมากกว่าจำนวนแทร็กที่กำหนดไว้ในกริดหลัก Subgrid จะสร้างแทร็กโดยนัยขึ้นมา คุณสามารถควบคุมขนาดของแทร็กโดยนัยเหล่านี้ได้โดยใช้คุณสมบัติ grid-auto-rows และ grid-auto-columns เช่นเดียวกับ CSS Grid ทั่วไป

ตัวอย่างการใช้งานจริงและกรณีศึกษา

มาสำรวจตัวอย่างการใช้งานจริงบางส่วนที่แสดงให้เห็นว่า Subgrid สามารถใช้สร้างเลย์เอาต์ที่ซับซ้อนได้อย่างไร

รายการสินค้าที่ซับซ้อน

ลองจินตนาการถึงหน้ารายการสินค้าที่คุณต้องการแสดงรายละเอียดต่างๆ ของผลิตภัณฑ์ (รูปภาพ ชื่อ คำอธิบาย ราคา) ในลักษณะที่สอดคล้องและจัดเรียงอย่างเป็นระเบียบ Subgrid สามารถช่วยให้บรรลุเป้าหมายนี้ได้อย่างง่ายดาย


<div class="product-grid">
  <div class="product">
    <img src="product1.jpg" alt="Product 1">
    <h3>Product Name 1</h3>
    <p>Description of product 1.</p>
    <span>$99.99</span>
  </div>
  <div class="product">
    <img src="product2.jpg" alt="Product 2">
    <h3>Product Name 2</h3>
    <p>Description of product 2.</p>
    <span>$129.99</span>
  </div>
</div>

.product-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
  gap: 20px;
}

.product {
  display: grid;
  grid-template-columns: subgrid;
  grid-template-rows: subgrid;
  border: 1px solid #ccc;
  padding: 10px;
}

.product > img {
  grid-column: 1;
  grid-row: 1;
  width: 100%;
  height: auto;
}

.product > h3 {
  grid-column: 1;
  grid-row: 2;
  margin-top: 10px;
}

.product > p {
  grid-column: 1;
  grid-row: 3;
  margin-top: 5px;
}

.product > span {
  grid-column: 1;
  grid-row: 4;
  margin-top: 10px;
  font-weight: bold;
}

ในตัวอย่างนี้ องค์ประกอบ .product ใช้ Subgrid เพื่อจัดตำแหน่งรูปภาพ ชื่อ คำอธิบาย และราคาให้ตรงกันอย่างสม่ำเสมอในทุกผลิตภัณฑ์ แม้ว่าความยาวของเนื้อหาจะแตกต่างกันก็ตาม สิ่งนี้ช่วยให้มั่นใจได้ถึงการนำเสนอที่สะอาดตาและเป็นมืออาชีพ

เลย์เอาต์แบบนิตยสาร

การสร้างเลย์เอาต์สไตล์นิตยสารที่มีบล็อกเนื้อหาหลากหลายอาจเป็นเรื่องท้าทาย Subgrid ทำให้กระบวนการง่ายขึ้นโดยช่วยให้คุณสามารถจัดตำแหน่งองค์ประกอบต่างๆ ข้ามส่วนต่างๆ ของเลย์เอาต์ได้


<div class="magazine-layout">
  <div class="main-article">
    <h2>Main Article Title</h2>
    <p>Main article content...</p>
  </div>
  <div class="sidebar-article">
    <h3>Sidebar Article Title</h3>
    <p>Sidebar article content...</p>
  </div>
  <div class="featured-image">
    <img src="featured.jpg" alt="Featured Image">
  </div>
</div>

.magazine-layout {
  display: grid;
  grid-template-columns: 2fr 1fr;
  grid-template-rows: auto 1fr auto;
  gap: 20px;
}

.main-article {
  grid-column: 1;
  grid-row: 1 / span 2;
  border: 1px solid #ccc;
  padding: 10px;
}

.sidebar-article {
  grid-column: 2;
  grid-row: 1;
  border: 1px solid #ccc;
  padding: 10px;
}

.featured-image {
  grid-column: 2;
  grid-row: 2;
  border: 1px solid #ccc;
  padding: 10px;
}

.magazine-layout > div {
    display: grid;
    grid-template-columns: subgrid;
    grid-template-rows: subgrid;
}

.magazine-layout h2, .magazine-layout h3 {
    grid-column: 1;
    grid-row: 1;
}

.magazine-layout p {
    grid-column: 1;
    grid-row: 2;
}

.magazine-layout img {
    grid-column: 1;
    grid-row: 1;
}

ในตัวอย่างนี้ บทความหลัก บทความในแถบด้านข้าง และรูปภาพเด่นทั้งหมดใช้โครงสร้างกริดเดียวกัน ทำให้มั่นใจได้ถึงการจัดตำแหน่งหัวข้อและเนื้อหาที่สอดคล้องกันในส่วนต่างๆ การใช้ Subgrid ทำให้ CSS ง่ายขึ้นและทำให้เลย์เอาต์สามารถบำรุงรักษาได้ง่ายขึ้น

เลย์เอาต์ของฟอร์ม

การสร้างเลย์เอาต์ฟอร์มที่ซับซ้อนซึ่งมีป้ายกำกับและช่องกรอกข้อมูลที่จัดตำแหน่งตรงกันอาจเป็นเรื่องยุ่งยาก Subgrid เป็นวิธีแก้ปัญหาที่ตรงไปตรงมา


<form class="form-grid">
  <div class="form-row">
    <label for="name">Name:</label>
    <input type="text" id="name" name="name">
  </div>
  <div class="form-row">
    <label for="email">Email:</label>
    <input type="email" id="email" name="email">
  </div>
  <div class="form-row">
    <label for="message">Message:</label>
    <textarea id="message" name="message"></textarea>
  </div>
</form>

.form-grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: 10px;
}

.form-row {
  display: grid;
  grid-template-columns: subgrid;
  grid-template-rows: subgrid;
}

.form-row label {
  grid-column: 1;
  grid-row: 1;
  text-align: right;
  padding-right: 10px;
}

.form-row input, .form-row textarea {
  grid-column: 2;
  grid-row: 1;
  width: 100%;
}


.form-grid {
    display: grid;
    grid-template-columns: 150px 1fr; /* กำหนดขนาดแทร็กในกริดหลัก */
    gap: 10px;
}

ในที่นี้ องค์ประกอบ .form-row ใช้ Subgrid เพื่อจัดตำแหน่งป้ายกำกับและช่องกรอกข้อมูลให้ตรงกันอย่างสม่ำเสมอในทุกแถว ขนาดของแทร็กถูกกำหนดไว้ในกริดหลัก (.form-grid) ทำให้มั่นใจได้ถึงรูปลักษณ์ที่สม่ำเสมอ

แนวทางปฏิบัติที่ดีที่สุดและข้อควรพิจารณา

Subgrid เปรียบเทียบกับ CSS Grid ทั่วไป

แม้ว่าทั้ง Subgrid และ CSS Grid จะเป็นเครื่องมือจัดเลย์เอาต์ที่ทรงพลัง แต่ก็มีวัตถุประสงค์ที่แตกต่างกัน CSS Grid ปกติเหมาะสำหรับการสร้างเลย์เอาต์หน้าเว็บโดยรวมและกำหนดโครงสร้างพื้นฐานของเนื้อหาของคุณ ในทางกลับกัน Subgrid เหมาะที่สุดสำหรับการจัดการเลย์เอาต์ที่ซ้อนกันและการจัดแนวเนื้อหาข้ามระดับการซ้อนกันหลายระดับ ลองนึกว่า Subgrid เป็นส่วนขยายของ CSS Grid ที่ช่วยลดความซับซ้อนของสถานการณ์เลย์เอาต์ที่ซับซ้อน

การแก้ไขปัญหาที่พบบ่อย

บทสรุป

CSS Subgrid เป็นส่วนเสริมที่มีค่าสำหรับชุดเครื่องมือ CSS Grid ซึ่งเป็นวิธีที่ทรงพลังในการจัดการเลย์เอาต์ซ้อนกันที่ซับซ้อน และสร้างการออกแบบเว็บที่สวยงาม บำรุงรักษาง่าย และตอบสนองได้ดี ด้วยการทำความเข้าใจแนวคิดพื้นฐานและสำรวจตัวอย่างการใช้งานจริง คุณสามารถใช้ประโยชน์จาก Subgrid เพื่อสร้างเลย์เอาต์ที่ซับซ้อนซึ่งก่อนหน้านี้ทำได้ยากหรือเป็นไปไม่ได้ด้วยเทคนิค CSS แบบดั้งเดิม เปิดรับ Subgrid และปลดล็อกความเป็นไปได้ใหม่ๆ ในโครงการพัฒนาเว็บของคุณ Subgrid ช่วยให้คุณสามารถขยายพลังของ CSS Grid ไปยังองค์ประกอบที่ซ้อนกันได้อย่างแท้จริง ทำให้สามารถควบคุมและบำรุงรักษาโค้ดได้ดียิ่งขึ้น ลองทดลองใช้และสำรวจข้อดีในการทำให้เลย์เอาต์ CSS ที่ซับซ้อนง่ายขึ้น

แหล่งข้อมูลเพิ่มเติม