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

สรุปคร่าวๆ

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

Flexbox ตารางกริดใช่ไหม

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

คุณจะจัดเรียงองค์ประกอบในคอนเทนเนอร์ Flexbox ไม่ได้ไม่ได้

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

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

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

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

เพื่อทำความคุ้นเคยกับคุณสมบัติแต่ละอย่างของ Grid I ฉันขอแนะนำเป็นอย่างยิ่งให้ Rachel Andrew’s Grid By Example or CSS Tricks' Cheat Sheet หากคุณคุ้นเคยกับ 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 มิติข้อมูล แถบนำทางจะแปรผันได้ทั้งสองมิติเช่นกัน แต่เราจะกำหนดความกว้างขั้นต่ำไว้ที่ 200 พิกเซล (เพราะเหตุใด เพื่อแสดงคุณลักษณะของ CSS Grid แน่นอน)

ในตารางกริด CSS ชุดคอลัมน์และแถวจะเรียกว่าแทร็ก เรามาเริ่มต้นด้วยการกำหนด แถวแนวนอนชุดแรกกัน

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 อยู่ในหนึ่ง) ความกว้างขั้นต่ำคือ 200px ความกว้างสูงสุดคือ 3fr fr คือหน่วยเฉพาะตารางกริดที่ช่วยให้คุณกระจายพื้นที่ว่างที่มีอยู่ไปยังองค์ประกอบตารางกริด fr อาจย่อมาจาก "fraction unit" แต่อาจหมายถึงหน่วยที่ว่างเร็วๆ นี้ก็ได้ ค่าของเราหมายความว่า ทั้ง 2 คอลัมน์จะขยายเต็มหน้าจอ แต่คอลัมน์เนื้อหาจะกว้างเป็น 3 เท่าของคอลัมน์การนำทางเสมอ (หากคอลัมน์การนำทางกว้างกว่า 200 พิกเซล)

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

การวางสินค้า

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

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

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

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

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

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 เซลล์ที่อยู่ติดกันมีชื่อเดียวกัน เซลล์ทั้งสองจะถูกวางรวมอยู่ในพื้นที่เดียวกัน วิธีนี้ช่วยให้คุณระบุความหมายให้กับโค้ดเลย์เอาต์ได้ง่ายขึ้นและทำให้คำค้นหาสื่อใช้ง่ายขึ้น ย้ำอีกครั้งว่าโค้ดนี้ จะสร้างเลย์เอาต์แบบเดียวกับก่อนหน้านี้

ยังมีอีกไหม

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