ตารางกริด CSS – เลย์เอาต์ตารางกลับมาแล้ว รับรู้และทั่วถึง

TL;DR

หากคุณคุ้นเคยกับ Flexbox อยู่แล้ว Grid น่าจะคุ้นเคยดี Rachel Andrew ดูแลเว็บไซต์ที่เน้น CSS Grid ไว้อย่างดีเพื่อช่วยให้คุณเริ่มต้นใช้งาน ตารางพร้อมใช้งานใน Google Chrome แล้ว

Flexbox ตารางกริด

ในช่วง 2-3 ปีที่ผ่านมา CSS Flexbox เริ่มมีการใช้อย่างแพร่หลายและการรองรับเบราว์เซอร์ก็ทำได้ดีเยี่ยม (นอกจากว่าคุณเป็นหนึ่งในคนยากจนที่ต้องรองรับ IE9 และเวอร์ชันที่ต่ำกว่า) Flexbox ทําให้งานการจัดวางที่ซับซ้อนหลายอย่างง่ายขึ้น เช่น การจัดวางระยะห่างเท่าๆ กันระหว่างองค์ประกอบ การจัดวางจากบนลงล่าง หรือการวางแนวตั้งตรงกลาง ซึ่งเป็นสุดยอดเวทมนตร์ของ CSS

คุณไม่สามารถจัดแนวองค์ประกอบในคอนเทนเนอร์ Flexbox หลายรายการได้

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

CSS Grid อยู่ระหว่างการพัฒนา โดยมีการแจ้งว่าไม่เหมาะสมในเบราว์เซอร์ส่วนใหญ่มานานกว่า 5 ปี และใช้เวลาเพิ่มเติมไปกับความสามารถในการทำงานร่วมกันเพื่อหลีกเลี่ยงการเปิดตัวที่มีข้อบกพร่องเหมือนอย่าง Flexbox ดังนั้น หากคุณใช้ตารางกริดเพื่อใช้เลย์เอาต์ใน Chrome คุณก็อาจได้ผลลัพธ์เดียวกันใน Firefox และ Safari ขณะเขียนบทความนี้ การใช้งานตารางกริดของ Microsoft Edge ล้าสมัยแล้ว (เหมือนกับที่มีอยู่ใน IE11) และการอัปเดต "อยู่ระหว่างการพิจารณา"

แม้ว่าจะมีแนวคิดและไวยากรณ์คล้ายกัน แต่อย่าคิดว่า Flexbox และ Grid เป็นเทคนิคการจัดวางที่แข่งขันกัน ตารางกริดจะจัดเรียงเป็น 2 มิติ ส่วน Flexbox จะจัดวางเป็น 1 มิติ การใช้ทั้ง 2 อย่างร่วมกันจะทำให้เกิดการทำงานร่วมกัน

การกําหนดตารางกริด

หากต้องการทำความคุ้นเคยกับพร็อพเพอร์ตี้แต่ละรายการของตารางกริด เราขอแนะนำตารางกริดจากตัวอย่างของ Rachel Andrew หรือชีตสรุปของ CSS Tricks หากคุณคุ้นเคยกับ Flexbox แล้ว พร็อพเพอร์ตี้จำนวนมากและความหมายของพร็อพเพอร์ตี้ๆ เหล่านั้นก็ควรมีความคุ้นเคยดีอยู่แล้ว

มาดูเลย์เอาต์ตารางกริด 12 คอลัมน์มาตรฐานกัน รูปแบบ 12 คอลัมน์แบบคลาสสิกได้รับความนิยมมากเนื่องจากหมายเลข 12 หารด้วย 2, 3, 4 และ 6 และมีประโยชน์สำหรับการออกแบบจำนวนมาก เราจะใช้เลย์เอาต์นี้แทน

คุณไม่สามารถจัดแนวองค์ประกอบในคอนเทนเนอร์ Flexbox หลายรายการได้

มาเริ่มกันด้วยโค้ดมาร์กอัป

<!DOCTYPE html>
<body>
    <header></header>
    <nav></nav>
    <main></main>
    <footer></footer>
</body>

ในสไตล์ชีต เราเริ่มต้นด้วยการเพิ่มขนาด body ให้ครอบคลุมทั้งวิดเจ็ตการแสดงผล และเปลี่ยนเป็นคอนเทนเนอร์ตารางกริด

html, body {
    width: 100vw;
    min-height: 100vh;
    margin: 0;
    padding: 0;
}
body {
    display: grid;
}

ตอนนี้เราใช้ CSS Grid. ไชโย

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

ตัวอย่างเลย์เอาต์แบบง่าย

ส่วนหัวและท้ายกระดาษมีความกว้างที่เปลี่ยนแปลงได้ และเนื้อหาจะเปลี่ยนแปลงได้ทั้ง 2 มิติ แถบนําทางจะมีขนาดแตกต่างกันไปทั้ง 2 ขนาดเช่นกัน แต่เราจะกำหนดความกว้างขั้นต่ำไว้ที่ 200 พิกเซล (เพราะเหตุใด เพื่อแสดงฟีเจอร์ของ CSS Grid แน่นอน)

ใน CSS Grid ชุดคอลัมน์และแถวเรียกว่าแทร็ก มาเริ่มกันด้วยการกําหนดชุดแทร็กแรกของเรา ซึ่งเป็นแถว

body {
    display: grid;
    grid-template-rows: 150px auto 100px;
}

grid-template-rows ใช้ลําดับขนาดที่กําหนดแถวแต่ละแถว ในกรณีนี้ เรากำหนดความสูงของแถวแรกเป็น 150 พิกเซลและแถวสุดท้ายเป็น 100 พิกเซล แถวกลางตั้งค่าเป็น auto ซึ่งหมายความว่าแถวดังกล่าวจะปรับความสูงตามความจําเป็นเพื่อรองรับรายการตารางกริด (รายการย่อยของคอนเทนเนอร์ตารางกริด) ในแถวนั้น เนื่องจากข้อความของเรายืดออกเต็มวิวพอร์ต แทร็กที่มีเนื้อหา (สีเหลืองในรูปภาพด้านบน) จะขยายจนเต็มพื้นที่ว่างอย่างน้อยที่สุด และจะขยายขึ้น (และทำให้เอกสารเลื่อน) หากจำเป็น

สำหรับคอลัมน์ เราต้องการใช้แนวทางแบบไดนามิกมากขึ้น โดยต้องการให้ทั้งการนำทางและเนื้อหาขยาย (และย่อ) แต่เราต้องการให้การนำทางไม่ย่อต่ำกว่า 200 พิกเซล และต้องการให้เนื้อหามีขนาดใหญ่กว่าการนำทาง ใน Flexbox เราใช้ flex-grow และ flex-shrink แต่ใน Grid จะใช้คำสั่งต่อไปนี้

body {
    display: grid;
    grid-template-rows: 150px auto 100px;
    grid-template-columns: minmax(200px, 3fr) 9fr;
}

เรากําหนด 2 คอลัมน์ คอลัมน์แรกจะกำหนดโดยใช้ฟังก์ชัน minmax() ซึ่งรับค่า 2 ค่า ได้แก่ ขนาดต่ำสุดและสูงสุดของแทร็กนั้น (เหมือนกับ min-width และ max-width ใน 1 จุด) ความกว้างขั้นต่ำคือ 200px ตามที่เรา พูดถึงก่อนหน้านี้ ความกว้างสูงสุดคือ 3fr fr คือหน่วยเฉพาะของตารางกริดที่ช่วยให้คุณกระจายพื้นที่ว่างไปยังองค์ประกอบตารางกริดได้ fr อาจย่อมาจาก "หน่วยเศษส่วน" แต่อาจหมายถึงหน่วยฟรีในเร็วๆ นี้ด้วย ค่าของเราหมายความว่าทั้ง 2 คอลัมน์จะขยายเต็มหน้าจอ แต่คอลัมน์เนื้อหาจะกว้างเท่ากับคอลัมน์การนำทาง 3 เท่าเสมอ (หากคอลัมน์การนำทางกว้างกว่า 200 พิกเซล)

แม้ว่าตำแหน่งของรายการแบบตารางกริดจะยังไม่ถูกต้อง แต่ขนาดของแถวและคอลัมน์ทำงานได้อย่างถูกต้องและเป็นไปตามลักษณะการทำงานที่เรามุ่งหวังไว้

การวางสิ่งของ

ฟีเจอร์ที่มีประสิทธิภาพมากที่สุดอย่างหนึ่งของตารางกริดคือการวางรายการโดยไม่คำนึงถึงลําดับ DOM (อย่างไรก็ตาม เนื่องจากโปรแกรมอ่านหน้าจอจะไปยังส่วนต่างๆ ของ DOM เราขอแนะนําอย่างยิ่งให้คุณคำนึงถึงวิธีเรียงลําดับองค์ประกอบใหม่เพื่อให้เข้าถึงได้อย่างถูกต้อง) หากไม่มีการวางองค์ประกอบด้วยตนเอง ระบบจะวางองค์ประกอบไว้ในตารางกริดตามลำดับ DOM โดยจัดเรียงจากซ้ายไปขวาและบนลงล่าง แต่ละองค์ประกอบจะครอบครองเซลล์ 1 เซลล์ เปลี่ยนลำดับการเติมข้อมูลในตารางได้โดยใช้ grid-auto-flow

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

header {
    grid-column: 1 / 3;
}
nav {
    grid-row: 2 / span 2;
}
ตำแหน่งโฆษณาที่กำหนดเอง

เราต้องการให้ส่วนหัวเริ่มต้นในคอลัมน์แรกและสิ้นสุดก่อนคอลัมน์ที่ 3 การนำทางควรเริ่มต้นที่แถวที่ 2 และครอบคลุม 2 แถว

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

body {
    display: grid;
    grid-template-rows: 150px [nav-start] auto 100px [nav-end];
    grid-template-columns: [header-start] minmax(200px, 3fr) 9fr [header-end];
}
header {
    grid-column: header-start / header-end;
}
nav {
    grid-row: nav-start / nav-end;
}

โค้ดด้านบนจะให้เลย์เอาต์เดียวกับโค้ดก่อนหน้า

ยิ่งไปกว่านั้น คือคุณลักษณะของการตั้งชื่อภูมิภาคในตารางกริด

body {
    display: grid;
    grid-template-rows: 150px auto 100px;
    grid-template-columns: minmax(200px, 3fr) 9fr;
    grid-template-areas: "header header"
                        "nav    content"
                        "nav    footer";
}
header {
    grid-area: header;
}
nav {
    grid-area: nav;
}

grid-template-areas ใช้สตริงชื่อที่คั่นด้วยเว้นวรรค ซึ่งช่วยให้นักพัฒนาแอปตั้งชื่อเซลล์แต่ละเซลล์ได้ หากเซลล์ที่อยู่ติดกัน 2 เซลล์มีชื่อเดียวกัน ระบบจะรวมเซลล์ดังกล่าวไว้ในพื้นที่เดียวกัน วิธีนี้จะช่วยให้คุณระบุความหมายเพิ่มเติมในโค้ดเลย์เอาต์และทำให้ Media Query ใช้งานได้ง่ายขึ้น โปรดทราบว่าโค้ดนี้จะสร้างเลย์เอาต์แบบเดียวกับก่อนหน้านี้

มีอะไรให้เราช่วยอีกไหม

ใช่ มีมากเกินกว่าที่จะอธิบายได้ในบล็อกโพสต์เดียว Rachel Andrew ที่เป็น GDE ด้วย เป็นผู้เชี่ยวชาญที่ได้รับเชิญในกลุ่มทํางาน CSS และทํางานร่วมกับกลุ่มนี้มาตั้งแต่ต้นเพื่อให้แน่ใจว่า Grid จะทําให้การออกแบบเว็บง่ายขึ้น เธอยังเขียนหนังสือเกี่ยวกับเรื่องนี้ด้วย เว็บไซต์ Grid By Example ของเธอเป็นแหล่งข้อมูลที่มีประโยชน์ในการทำความคุ้นเคยกับ Grid หลายคนคิดว่าตารางกริดเป็นก้าวที่ปฏิวัติวงการการออกแบบเว็บ และตอนนี้ตารางกริดเปิดใช้โดยค่าเริ่มต้นใน Chrome แล้ว คุณจึงเริ่มใช้งานได้ตั้งแต่วันนี้