ตารางกริดย่อยของ CSS

เผยแพร่เมื่อวันที่ 28 กันยายน 2023

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

ก่อนการใช้ตารางย่อย เนื้อหามักจะได้รับการปรับแต่งด้วยตนเองเพื่อหลีกเลี่ยงเลย์เอาต์ที่ขาดๆ เกินๆ อย่างเช่นเลย์เอาต์นี้

การ์ด 3 ใบจะแสดงคู่กัน โดยแต่ละใบจะมีเนื้อหา 3 รายการ ได้แก่ หัวเรื่อง ย่อหน้า และลิงก์ ข้อความแต่ละรายการมีความยาวต่างกัน ทำให้การ์ดดูไม่สมดุลเมื่อวางไว้ข้างกัน

หลังจากตารางย่อย คุณจะจัดแนวเนื้อหาที่มีขนาดแตกต่างกันได้

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

Browser Support

  • Chrome: 117.
  • Edge: 117.
  • Firefox: 71.
  • Safari: 16.

Source

ข้อมูลเบื้องต้นเกี่ยวกับตารางย่อย

ต่อไปนี้เป็นกรณีการใช้งานที่เข้าใจง่ายซึ่งจะแนะนำพื้นฐานของ CSS subgrid ตารางกริดจะกำหนดด้วยคอลัมน์ที่มีชื่อ 2 คอลัมน์ คอลัมน์แรกกว้าง 20ch และคอลัมน์ที่ 2 คือ "ส่วนที่เหลือ" ของพื้นที่ 1fr คุณไม่จำเป็นต้องตั้งชื่อคอลัมน์ แต่ชื่อคอลัมน์มีประโยชน์มากสำหรับวัตถุประสงค์ในการอธิบายและการศึกษา

.grid {
  display: grid;
  gap: 1rem;
  grid-template-columns: [column-1] 20ch [column-2] 1fr;
}

จากนั้น รายการย่อยของตารางกริดที่ครอบคลุม 2 คอลัมน์ดังกล่าวได้รับการตั้งค่าเป็นคอนเทนเนอร์ตารางกริด และรับคอลัมน์ของรายการหลักโดยการตั้งค่า grid-template-columns เป็น subgrid

.grid > .subgrid {
  grid-column: span 2;

  display: grid;
  grid-template-columns: subgrid; /* 20ch 1fr */
}
ภาพหน้าจอของ DevTools ตาราง CSS ที่แสดง 2 คอลัมน์เคียงข้างกันพร้อมชื่อที่เริ่มต้นบรรทัดของคอลัมน์
https://codepen.io/web-dot-dev/pen/NWezjXv

เพียงเท่านี้ คอลัมน์ของตารางกริดหลักก็ส่งต่อไปยังตารางกริดย่อยได้ ตอนนี้ตารางย่อยนี้กําหนดคอลัมน์ย่อยให้กับคอลัมน์ใดคอลัมน์หนึ่งได้แล้ว

ขอท้า! ทำซ้ำเดโมเดิม แต่ให้ทำกับ grid-template-rows

แชร์กริด "มาโคร" ระดับหน้าเว็บ

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

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

การใช้เวิร์กโฟลว์ตารางกริดที่นักออกแบบใช้กันมากที่สุดจะให้ข้อมูลเชิงลึกที่ยอดเยี่ยมเกี่ยวกับความสามารถ เวิร์กโฟลว์ และศักยภาพของ subgrid

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

ภาพหน้าจอจากเครื่องมือสำหรับนักพัฒนาซอฟต์แวร์ตาราง CSS ของ Chrome ที่แสดงเลย์เอาต์ตารางขนาดอุปกรณ์เคลื่อนที่ซึ่งมีการตั้งชื่อแถวและคอลัมน์เพื่อให้ระบุได้อย่างรวดเร็ว ได้แก่ fullbleed, system-status, primary-nav, primary-header, main, footer และ system-gestures

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

.device {
    display: grid;
    grid-template-rows:
      [system-status] 3.5rem
      [primary-nav] 3rem
      [primary-header] 4rem
      [main] auto
      [footer] 4rem
      [system-gestures] 2rem
    ;
    grid-template-columns: [fullbleed-start] 1rem [main-start] auto [main-end] 1rem [fullbleed-end];
}

รูปแบบเพิ่มเติมบางรูปแบบจะให้การออกแบบดังต่อไปนี้

ตารางกริด CSS DevTools แบบเดียวกับก่อนหน้านี้ แต่ครั้งนี้มี UI ของระบบในอุปกรณ์เคลื่อนที่บางส่วน แสงเงา และสีเล็กน้อย ช่วยให้เห็นทิศทางการออกแบบ

ภายในองค์ประกอบหลักนี้จะมีองค์ประกอบที่ฝังอยู่หลายรายการ การออกแบบต้องใช้รูปภาพแบบเต็มความกว้างใต้แถวการนำทางและส่วนหัว ชื่อบรรทัดคอลัมน์ด้านซ้ายสุดและขวาสุดคือ fullbleed-start และ fullbleed-end การตั้งชื่อเส้นตารางในลักษณะนี้ทำให้เด็กๆ จัดแนวเส้นแต่ละเส้นพร้อมกันได้โดยใช้อักษรย่อของตำแหน่ง fullbleed ซึ่งจะสะดวกมากอย่างที่คุณจะได้เห็นในไม่ช้า

ภาพหน้าจอที่ซูมเข้าของตารางกริดที่ซ้อนทับจากเครื่องมือสำหรับนักพัฒนาซอฟต์แวร์ โดยเน้นที่ชื่อคอลัมน์ fullbleed-start และ fullbleed-end โดยเฉพาะ

เมื่อสร้างเลย์เอาต์อุปกรณ์โดยรวมด้วยแถวและคอลัมน์ที่มีชื่อเหมาะสมแล้ว ให้ใช้ subgrid เพื่อส่งแถวและคอลัมน์ที่มีชื่อเหมาะสมไปยังเลย์เอาต์ตารางกริดที่ฝังอยู่ นี่เป็นsubgridช่วงเวลาที่น่าอัศจรรย์ เลย์เอาต์อุปกรณ์จะส่งแถวและคอลัมน์ที่มีชื่อไปยังคอนเทนเนอร์แอป จากนั้นคอนเทนเนอร์จะส่งต่อไปยังคอนเทนเนอร์ย่อยทุกรายการ

.device > .app,
.app > * {
    display: grid;
    grid: subgrid / subgrid;

    /* same as */
    grid-template-rows: subgrid;
    grid-template-columns: subgrid;
}

ตารางกริดย่อย CSS คือค่าที่ใช้แทนรายการแทร็กตารางกริด แถวและคอลัมน์ที่องค์ประกอบนี้ขยายจากองค์ประกอบหลักจะเป็นแถวและคอลัมน์เดียวกันกับที่เสนอ ซึ่งจะทำให้ชื่อบรรทัดจากตารางกริด .device พร้อมใช้งานสำหรับบุตรหลานของ .app แทนที่จะเป็นเฉพาะ .app เท่านั้น เอลิเมนต์ภายใน .app ไม่สามารถอ้างอิงแทร็กตารางกริดที่ .device สร้างขึ้นก่อนตารางกริดย่อย

เมื่อกําหนดค่าทั้งหมดแล้ว รูปภาพที่ฝังจะแสดงแบบเต็มในเลย์เอาต์ได้ subgrid ไม่มีค่าลบหรือเทคนิค แต่ใช้บรรทัดเดียวที่ชัดเจนว่า "เลย์เอาต์ของฉันมีตั้งแต่ fullbleed-start ถึง fullbleed-end"

.app > main img {
    grid-area: fullbleed;
}
เลย์เอาต์มาโครที่เสร็จสมบูรณ์พร้อมรูปภาพที่ฝังเต็มความกว้างใต้แถวการนำทางและส่วนหัวหลักอย่างเหมาะสม และขยายไปยังบรรทัดคอลัมน์ที่มีชื่อแบบเต็มแต่ละบรรทัด
https://codepen.io/web-dot-dev/pen/WNLyjzX

นี่เป็นตารางกริดมาโครที่นักออกแบบใช้ซึ่งติดตั้งใช้งานใน CSS แนวคิดนี้ปรับขนาดและเติบโตไปพร้อมกับคุณได้ตามต้องการ

ตรวจสอบการสนับสนุน

การปรับปรุงแบบเป็นขั้นเป็นตอนด้วย CSS และตารางย่อยนั้นคุ้นเคยและเข้าใจง่าย ใช้ @supports และถามเบราว์เซอร์ในวงเล็บว่าเข้าใจหรือไม่ว่าตารางย่อยเป็นค่าสำหรับคอลัมน์หรือแถวของเทมเพลต ตัวอย่างต่อไปนี้จะตรวจสอบว่าพร็อพเพอร์ตี้ grid-template-columns รองรับคีย์เวิร์ด subgrid หรือไม่ หากเป็นเช่นนั้น หมายความว่าจะใช้ตารางย่อยได้

@supports (grid-template-columns: subgrid) {
  /* safe to enhance to */
}

เครื่องมือสำหรับนักพัฒนาเว็บ

Chrome, Edge, Firefox และ Safari ล้วนมีเครื่องมือสำหรับนักพัฒนาซอฟต์แวร์ตาราง CSS ที่ยอดเยี่ยม และ Chrome, Edge และ Firefox ยังมีเครื่องมือเฉพาะที่จะช่วยเกี่ยวกับตารางย่อย Chrome ประกาศเครื่องมือนี้ใน 115 ส่วน Firefox มีเครื่องมือนี้มามากกว่า 1 ปีแล้ว

ตัวอย่างภาพหน้าจอของป้ายกริดย่อยที่พบในองค์ประกอบในแผงองค์ประกอบ

ป้ายตารางกริดย่อยจะทํางานเหมือนป้ายตารางกริด แต่จะแยกความแตกต่างระหว่างตารางกริดที่เป็นตารางกริดย่อยและตารางกริดที่ไม่ใช่ตารางกริดย่อยได้อย่างชัดเจน

แหล่งข้อมูล

รายการนี้เป็นคอลเล็กชันบทความ ข้อมูลเดโม และแรงบันดาลใจโดยรวมสําหรับการเริ่มต้นใช้งานตารางย่อย หากกำลังมองหาขั้นตอนถัดไปสำหรับการศึกษาในตารางย่อย โปรดสำรวจแหล่งข้อมูลที่ยอดเยี่ยมเหล่านี้