flexbox
เลย์เอาต์แบบไดนามิกไม่สามารถใช้ได้กับเฟล็กบ็อกซ์อย่างน้อยก็ไม่เป็นไปอย่างสะอาดและมีประสิทธิภาพ
Flexbox เป็นระบบโครงร่างหนึ่งมิติ ซึ่งหมายความว่าสามารถจัดเรียงรายการตามแนวนอนหรือแนวตั้ง รายการยืดหยุ่นจะถูกคุมขังในแถวหรือคอลัมน์
ระบบกริดที่แท้จริงคือสองมิติซึ่งหมายความว่ามันสามารถจัดเรียงรายการตามแนวนอนและแนวตั้ง ไอเท็มเนื้อหาสามารถขยายข้ามแถวและคอลัมน์พร้อมกันซึ่งไอเท็มแบบยืดหยุ่นไม่สามารถทำได้
นี่คือเหตุผลที่ flexbox มีความจุ จำกัด สำหรับการสร้างกริด นอกจากนี้ยังเป็นเหตุผลว่าทำไม W3C ได้มีการพัฒนาเทคโนโลยี CSS3 อื่นกริดเค้าโครง
row wrap
ในภาชนะดิ้นกับflex-flow: row wrap
รายการดิ้นต้องตัดใหม่แถว
ซึ่งหมายความว่ารายการดิ้นไม่สามารถห่อภายใต้รายการอื่นในแถวเดียวกัน
โปรดสังเกตว่าdiv # 3ตัดด้านล่างdiv # 1อย่างไรการสร้างแถวใหม่ มันไม่สามารถห่อใต้div # 2ได้
ดังนั้นเมื่อรายการไม่สูงที่สุดในแถวพื้นที่สีขาวยังคงอยู่ทำให้เกิดช่องว่างที่ไม่น่าดู
column wrap
หากคุณเปลี่ยนไปflex-flow: column wrap
ใช้เลย์เอาต์ที่คล้ายกับกริดสามารถทำได้มากกว่า อย่างไรก็ตามคอนเทนเนอร์ทิศทางของคอลัมน์มีปัญหาที่อาจเกิดขึ้นได้สี่อย่างจากค้างคาว:
- ดิ้นรายการไหลในแนวตั้งไม่ใช่แนวนอน (เช่นที่คุณต้องการในกรณีนี้)
- คอนเทนเนอร์ขยายในแนวนอนไม่ใช่แนวตั้ง (เช่นเค้าโครง Pinterest)
- มันต้องใช้ภาชนะที่จะมีความสูงคงที่เพื่อให้รายการทราบว่าจะห่อ
- ขณะที่เขียนนี้ก็มีความบกพร่องในเบราว์เซอร์ที่สำคัญทั้งหมดที่ภาชนะที่ไม่ขยายเพื่อรองรับคอลัมน์เพิ่มเติม
ดังนั้นคอนเทนเนอร์ทิศทางคอลัมน์จึงไม่ใช่ตัวเลือกในกรณีนี้และในหลายกรณี
CSS Grid ที่มีขนาดรายการไม่ได้กำหนด
เค้าโครงกริดจะเป็นทางออกที่สมบูรณ์แบบสำหรับปัญหาของคุณหากความสูงต่างๆของไอเท็มเนื้อหาสามารถกำหนดล่วงหน้าได้ ข้อกำหนดอื่น ๆ ทั้งหมดอยู่ในความสามารถของ Grid
ต้องรู้จักความกว้างและความสูงของรายการกริดเพื่อปิดช่องว่างด้วยรายการที่อยู่รอบ ๆ
ดังนั้น Grid ซึ่งเป็น CSS ที่ดีที่สุดที่มีให้สำหรับการสร้างเลย์เอาต์แบบก่ออิฐในแนวนอนก็ยังขาดอยู่ในกรณีนี้
ในความเป็นจริงจนกระทั่งเทคโนโลยี CSS มาพร้อมกับความสามารถในการปิดช่องว่างโดยอัตโนมัติ CSS โดยทั่วไปไม่มีวิธีแก้ปัญหา บางสิ่งเช่นนี้อาจต้องมีการปรับแต่งเอกสารใหม่ดังนั้นฉันไม่แน่ใจว่าจะมีประโยชน์หรือมีประสิทธิภาพเพียงใด
คุณจะต้องมีสคริปต์
โซลูชัน JavaScript มักใช้การกำหนดตำแหน่งแบบสัมบูรณ์ซึ่งจะลบไอเท็มเนื้อหาออกจากโฟลว์เอกสารเพื่อจัดเรียงใหม่โดยไม่มีช่องว่าง นี่คือสองตัวอย่าง:
CSS Grid พร้อมกำหนดขนาดรายการ
สำหรับเลย์เอาต์ที่ความกว้างและความสูงของไอเท็มเนื้อหาเป็นที่รู้จักกันนี่เป็นเลย์เอาต์แบบก่ออิฐแนวนอนใน CSS บริสุทธิ์:
grid-container {
display: grid; /* 1 */
grid-auto-rows: 50px; /* 2 */
grid-gap: 10px; /* 3 */
grid-template-columns: repeat(auto-fill, minmax(30%, 1fr)); /* 4 */
}
[short] {
grid-row: span 1; /* 5 */
background-color: green;
}
[tall] {
grid-row: span 2;
background-color: crimson;
}
[taller] {
grid-row: span 3;
background-color: blue;
}
[tallest] {
grid-row: span 4;
background-color: gray;
}
grid-item {
display: flex;
align-items: center;
justify-content: center;
font-size: 1.3em;
font-weight: bold;
color: white;
}
<grid-container>
<grid-item short>01</grid-item>
<grid-item short>02</grid-item>
<grid-item tall>03</grid-item>
<grid-item tall>04</grid-item>
<grid-item short>05</grid-item>
<grid-item taller>06</grid-item>
<grid-item short>07</grid-item>
<grid-item tallest>08</grid-item>
<grid-item tall>09</grid-item>
<grid-item short>10</grid-item>
<grid-item tallest>etc.</grid-item>
<grid-item tall></grid-item>
<grid-item taller></grid-item>
<grid-item short></grid-item>
<grid-item short></grid-item>
<grid-item short></grid-item>
<grid-item short></grid-item>
<grid-item tall></grid-item>
<grid-item short></grid-item>
<grid-item taller></grid-item>
<grid-item short></grid-item>
<grid-item tall></grid-item>
<grid-item short></grid-item>
<grid-item tall></grid-item>
<grid-item short></grid-item>
<grid-item short></grid-item>
<grid-item tallest></grid-item>
<grid-item taller></grid-item>
<grid-item short></grid-item>
<grid-item tallest></grid-item>
<grid-item tall></grid-item>
<grid-item short></grid-item>
</grid-container>
มันทำงานอย่างไร
- สร้างคอนเทนเนอร์กริดระดับบล็อก (
inline-grid
จะเป็นตัวเลือกอื่น ๆ )
grid-auto-rows
คุณสมบัติกำหนดความสูงของแถวที่สร้างขึ้นโดยอัตโนมัติ ในตารางนี้แต่ละแถวมีความสูง 50px
grid-gap
คุณสมบัติคือชวเลขเป็นและgrid-column-gap
grid-row-gap
กฎนี้ตั้งค่าช่องว่าง 10px ระหว่างรายการกริด (มันใช้ไม่ได้กับพื้นที่ระหว่างรายการและภาชนะ)
grid-template-columns
คุณสมบัติกำหนดความกว้างของคอลัมน์ที่กำหนดไว้อย่างชัดเจน
repeat
โน้ตกำหนดรูปแบบของคอลัมน์ (หรือแถว) ซ้ำ
auto-fill
ฟังก์ชั่นบอกตารางต้องไปเข้าแถวเป็นคอลัมน์หลายคน (หรือแถว) ที่เป็นไปได้โดยไม่ต้องล้นภาชนะ (สิ่งนี้สามารถสร้างพฤติกรรมที่คล้ายคลึงกับเค้าโครงแบบยืดหยุ่นflex-wrap: wrap
)
minmax()
ฟังก์ชั่นตั้งค่าต่ำสุดและสูงสุดช่วงขนาดสำหรับแต่ละคอลัมน์ (หรือแถว) ในโค้ดด้านบนความกว้างของแต่ละคอลัมน์จะต้องมีอย่างน้อย 30% ของคอนเทนเนอร์และสูงสุดของพื้นที่ว่างใด ๆ ที่มีอยู่
fr
หน่วยหมายถึงส่วนของพื้นที่ว่างในภาชนะตารางที่ มันเปรียบได้กับflex-grow
คุณสมบัติของ flexbox
ด้วยgrid-row
และspan
เรากำลังบอกรายการตารางว่ามีกี่แถวที่ควรขยาย
รองรับเบราว์เซอร์สำหรับ CSS Grid
- Chrome - การสนับสนุนอย่างเต็มที่ตั้งแต่วันที่ 8 มีนาคม 2017 (รุ่น 57)
- Firefox - การสนับสนุนอย่างเต็มที่ตั้งแต่วันที่ 6 มีนาคม 2017 (รุ่น 52)
- Safari - การสนับสนุนอย่างเต็มที่ตั้งแต่วันที่ 26 มีนาคม 2017 (เวอร์ชั่น 10.1)
- Edge - รองรับเต็มที่ตั้งแต่วันที่ 16 ตุลาคม 2017 (รุ่น 16)
- IE11 - ไม่รองรับสเป็คปัจจุบัน รองรับรุ่นที่ล้าสมัย
นี่คือภาพที่สมบูรณ์: http://caniuse.com/#search=grid
ฟีเจอร์การซ้อนทับกริดใน Firefox
ในเครื่องมือ Firefox dev เมื่อคุณตรวจสอบกริดคอนเทนเนอร์จะมีไอคอนกริดเล็ก ๆ ในการประกาศ CSS เมื่อคลิกจะแสดงโครงร่างของตารางของคุณบนหน้า
รายละเอียดเพิ่มเติมได้ที่นี่: https://developer.mozilla.org/en-US/docs/Tools/Page_Inspector/How_to/Examine_grid_layouts