สร้างกริดที่ปรับตัวได้เองโดยไม่ต้องใช้ media queries และจัดแนวคอมโพเนนต์ที่ซ้อนกันให้ตรงกับแทร็กของพาเรนต์ด้วย subgrid
เปิดบทเรียนนี้ใน Kodokonrepeat(auto-fill, ...) และ repeat(auto-fit, ...) จะสร้างแทร็กจำนวนมากเท่าที่ความกว้างของคอนเทนเนอร์จะเอื้ออำนวย ความแตกต่างจะปรากฏก็ต่อเมื่อมี จำนวนไอเทมน้อยกว่าจำนวนแทร็กที่เป็นไปได้ เท่านั้น: auto-fill จะคงแทร็กว่างเอาไว้ (การ์ดสองใบของคุณจะอยู่ที่ขนาดต่ำสุด โดยมีพื้นที่ว่างทางด้านขวา) ในขณะที่ auto-fit จะ ยุบแทร็กว่างให้เหลือศูนย์ แทร็กที่ถูกใช้งานซึ่งมีค่าสูงสุดเป็น 1fr จะดูดซับพื้นที่ที่ว่างออกมาทั้งหมด และการ์ดสองใบของคุณจะยืดขยายเต็มความกว้าง
.gallery-fill {
display: grid;
grid-template-columns: repeat(
auto-fill, minmax(150px, 1fr)
);
}
.gallery-fit {
display: grid;
grid-template-columns: repeat(
auto-fit, minmax(150px, 1fr)
);
}มีกับดักของ minmax() สองอย่างที่แม้แต่นักพัฒนาระดับซีเนียร์ก็ยังตกลงไป อย่างแรก: minmax(240px, 1fr) จะล้น (overflow) เมื่อคอนเทนเนอร์แคบกว่า 240px เพราะค่าต่ำสุดเป็นพื้นแข็งที่ตายตัว วิธีแก้แบบสำนวนคือซ้อนฟังก์ชันเปรียบเทียบลงไป: minmax(min(100%, 240px), 1fr) อย่างที่สอง: 1fr เดี่ยว ๆ เทียบเท่ากับ minmax(auto, 1fr); ค่าต่ำสุดที่เป็น auto จะยอมให้เนื้อหาที่ตัดคำไม่ได้ (URL ยาว ๆ หรือ <pre>) ขยายแทร็กให้กว้างเกินส่วนแบ่งของมัน minmax(0, 1fr) จะล็อกการกระจายพื้นที่ไว้
.grid {
display: grid;
gap: 1rem;
grid-template-columns: repeat(
auto-fit,
minmax(min(100%, 240px), 1fr)
);
}subgrid แก้ปัญหาเก่าแก่เรื่องการจัดแนวข้ามคอมโพเนนต์ที่ซ้อนกัน ด้วย grid-template-rows: subgrid กริดภายในจะไม่สร้างแทร็กของตัวเองขึ้นมา แต่จะ รับเอาแทร็กของพาเรนต์มาใช้ ในพื้นที่ที่มันครอบคลุมอยู่ มันยังสืบทอดชื่อเส้น (line names) ของพาเรนต์มาด้วย (และสามารถเพิ่มชื่อของตัวเองได้) เช่นเดียวกับ gap ที่มันสามารถเขียนทับในระดับท้องถิ่นได้ กรณีคลาสสิกคือ: การ์ดที่มีหัวข้อ คำอธิบาย และส่วนท้าย ต้องจัดแนวในแนวนอนให้ตรงกันจากการ์ดหนึ่งไปยังอีกการ์ดหนึ่ง ไม่ว่าเนื้อหาจะยาวเท่าใดก็ตาม ซึ่งเป็นสิ่งที่ทำให้เรียบร้อยได้ยากก่อนที่จะมี subgrid เพราะการ์ดแต่ละใบคำนวณความสูงของตัวเองแยกกันโดยลำพัง
.cards {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 1.5rem;
}
.card {
grid-row: span 3;
display: grid;
grid-template-rows: subgrid;
row-gap: 0.5rem;
}