Grid Auto Placement คืออะไร? และทำงานอย่างไร?
Flex กับ Grid นี่สองพี่น้อง จัดเว็บเป็นกอง ได้ลองแล้วจะรู้ว่าดี โอ้วยากสุด ๆ ลองแล้วสะดุด~
Flexbox นั้นเป็นมาตรฐานการจัดเว็บในมิติเดียว ส่วนลูกพี่อย่าง CSS Grid Layout นั้นจัดได้ถึงสองมิติ เราได้อธิบายเรื่องนี้กันไปแล้วใน CSS Grid Layout คืออะไร? รู้จักมาตรฐานการออกแบบเลย์เอาท์ใน 2 มิติกันเถอะ!
บทความดังกล่าวได้พูดถึงการสร้างเลย์เอาท์ด้วยการวางตารางสองมิติผ่านการใช้งาน Grid Layout จากนั้นจึงนำอีลีเมนต์ต่าง ๆ ที่เรามีไปวางตามตำแหน่งต่าง ๆ ผ่านการระบุตำแหน่งว่าไอเทมก้อนไหนต้องวางในช่องของแถวที่เท่าไหร่และคอลัมภ์ใดบ้าง ทีนี้จึงมีคำถามเกิดขึ้น หากเราไม่ระบุเลขแถวหรือหลักเลยหละ ก็แบบว่าขี้เกียจงี้ CSS Grid Layout จะนำอีลีเมนต์ของเราไปวางตำแหน่งใด?
Grid วางไอเทมอย่างไรเมื่อไม่ระบุตำแหน่ง
สัญชาตญาณสัตว์ป่าของ Grid นั้น จะเริ่มจากการจัด Grid Item ที่ระบุตำแหน่งของแถวและหลักชัดเจนให้หมดก่อน หลังจากนั้นจึงเริ่มชายตามองพวก Grid Item สัมภเวสีที่ไม่มีที่อยู่ระบุชัดเจน
กำหนดให้ Grid Container ของเราประกอบด้วยรูปภาพของเหล่าผู้ทรงเกียรติ ดังนี้
1<!DOCTYPE html>2<html lang="en">3 <head>4 <style>5 .container {6 display: grid;7 /* สร้าง 3 คอลัมภ์ แต่ละคอลัมภ์กว้าง 100px */8 grid-template-columns: repeat(3, 100px);9 /* สร้าง 3 แถว แต่ละแถวสูง 100px */10 grid-template-rows: repeat(3, 100px);11 }1213 .image {14 object-fit: cover;15 width: 100%;16 height: 100%;17 }1819 .image:nth-child(1) {20 grid-column: 2 / 3;21 grid-row: 2 / 3;22 }2324 .image:nth-child(2) {25 grid-column: 3 / 4;26 grid-row: 1 / 2;27 }2829 .image:nth-child(3) {30 grid-column: 1 / 2;31 grid-row: 3 / 4;32 }33 </style>34 </head>35 <body>36 <div class="container">37 <img src="./prayuth.png" alt="ผู้นำ" class="image" />38 <img src="./thanathorn.png" alt="เกือบเป็นผู้นำ" class="image" />39 <img src="./คุณช่อ.png" alt="อีช่อ" class="image" />40 </div>41 </body>42</html>
เราเลือกให้ท่านผู้นำอันเป็นที่รักอยู่ตรงกลาง ด้วยการบอกให้ท่านอยู่เส้นแถวที่ 2 ถึงเส้นแถวที่ 3 และในคอลัมภ์จากเส้นหลักที่ 2 ถึง 3 ส่วนคนอื่นเราจัดทิ้งจัดขว้างให้เขาอยู่ทะแยง ๆ กันไป เพราะเขาเหล่านั้นไม่ถูกกันกับคนตรงกลาง!
สมมติตอนนี้ชิปกับเดลอยากก้าวเข้าสู่สภาหละ เราจึงเพิ่ม Grid Item ของพวกเขาเข้าไป คุณคิดว่าแก๊งชิพมังค์นี้จะอยากอยู่ใกล้ใคร?
1<div class="container">2 <img src="./prayuth.png" alt="ผู้นำ" class="image" />3 <img src="./thanathorn.png" alt="เกือบเป็นผู้นำ" class="image" />4 <img src="./คุณช่อ.png" alt="อีช่อ" class="image" />5 <img src="./ชิปกับเดล.png" alt="ชิปกับเดล" class="image" />6</div>
ภายหลังการแทรกชิปกับเดลเข้าไปผลลัพธ์ที่ได้เป็นเช่นนี้
เกิดอะไรขึ้น ทำไมชิปกับเดลถึงเลือกอยู่ข้างคุณธนาธรมากกว่าบุคคลผู้น่านับถือที่สุดในปฐพีอย่างท่านข้างล่าง?
กรณีของชิปกับเดลที่เราไม่ได้กำหนดไว้ว่าพวกเขาควรอยู่แถวและหลักที่เท่าไหร่ Grid จะพยายามหาช่องว่างที่มีพอที่จะใส่โดยไม่ทับที่กับ Cell ที่มีการใช้งานไปแล้ว โดย Grid จะเริ่มทำการหาพื้นที่ว่างตามแนวแถวก่อนโดยไล่จากซ้ายไปขวาในแต่ละแถว หากไม่พบพื้นที่ว่างที่พอเพียงในแถวนี้ ก็จะเข้าค้นหาต่อในแถวถัดไป
การค้นหาในแนวแถวตั้งแต่แถวแรกทำให้เราพบว่า ช่องแรกมีคุณธนาธรจับจองอยู่แต่ช่องถัดไปนั้นยังว่าง ชิปกับเดลจึงขอจองพื้นที่ในช่องนี้
ตามธรรมชาติของ Grid Item นั้น เมื่อไม่กำหนดจุดเริ่มและจุดสิ้นสุดใด ๆ แต่ละไอเทมจะมีการจับจองพื้นที่แค่ 1 ช่อง (span 1) จาก Grid Line หนึ่งไปสู่ Line ที่อยู่ติดกัน หากต้องการให้มีการเขมือบพื้นที่มากกว่านี้สามารถระบุผ่าน span ได้ เช่น span 2
จะหมายถึงกินพื้นที่สองช่อง (จาก Line ที่ n ไปสู่ n + 2)
เพราะการค้าในคลองนั้นเจริญ ชิปกับเดลจึงชวนผองเพื่อนมาร่วมขายถั่วในคลอง
1<div class="container">2 <img src="./prayuth.png" alt="ผู้นำ" class="image" />3 <img src="./thanathorn.png" alt="เกือบเป็นผู้นำ" class="image" />4 <img src="./คุณช่อ.png" alt="อีช่อ" class="image" />5 <img src="./ชิปกับเดล.png" alt="ชิปกับเดล" class="image" />6 <!-- เพื่อนต้องมา -->7 <img src="./เพื่อนชิปกับเดล.png" alt="เพื่อนชิปกับเดล" class="image" />8</div>
แต่เรือของพวกเขานั้นใหญ่กว่าของชิปกับเดลมาก จึงต้องเพิ่มความกว้างของพื้นที่คอลัมภ์เป็น 2 (span 2)
1/* เพื่อนของชิปกับเดล */2.image:nth-child(5) {3 grid-column: span 2;4}
เราพบว่าแม้แต่เพื่อนของชิปกับเดลก็ยังไม่ยอมอยู่ข้างลุง นี่มันเกิดอะไรขึ้น?
ภายหลังที่ Grid Item ที่ระบุตำแหน่งชัดแจ้งได้จองพื้นที่แล้ว Grid Item ที่ไม่ระบุตำแหน่งก็เริ่มมองหาพื้นที่ว่างตั้งแต่หัวของแถวแรก เพราะคุณธนาธรเป็นเจ้าของที่ช่องแรก ชิพกับเดลที่มาทีหลังจึงต้องอยู่ช่องสอง เมื่อถึงคราวของเพื่อนชิพมังค์ที่ต้องการพื้นที่ถึงสองช่องจึงไม่พอบรรจุในแถวแรก ครั้นขึ้นแถวใหม่ก็เจอลุงขวางทาง สุดท้ายไปเจอช่องว่างทีพอเหมาะในแถวสุดท้ายกับสาวสวยอย่างคุณช่อแทน
เวลาผ่านไปธุรกิจขายถั่วของตระกูลชิพมังค์เติบโตแซงหน้าอาบังไปมากจนต้องไปชวนแก๊งเพื่อนอีกกลุ่มมาร่วมขาย เราจึงเพิ่มแก๊งชิพมังค์เข้าไปในระบบ Grid ของเราอีกหนึ่ง ดังนี้
1<div class="container">2 <img src="./prayuth.png" alt="ผู้นำ" class="image" />3 <img src="./thanathorn.png" alt="เกือบเป็นผู้นำ" class="image" />4 <img src="./คุณช่อ.png" alt="อีช่อ" class="image" />5 <img src="./ชิปกับเดล.png" alt="ชิปกับเดล" class="image" />6 <img src="./เพื่อนชิปกับเดล.png" alt="เพื่อนชิปกับเดล" class="image" />7 <!-- มาอีกกลุ่ม อัดกันไปให้เต็มคลองแสนแสบ -->8 <img9 src="./เพื่อนชิปกับเดลอีกกลุ่ม.png"10 alt="เพื่อนชิปกับเดลอีกกลุ่ม"11 class="image"12 />13</div>
อ้าว ไม่เหมือนที่ตกลงกันไว้หนิ? เรียกเพื่อนเข้ามาร่วมขายถั่วอีกหนึ่ง แต่เพื่อนหายไปไหน เจอใครจับไปปรับทัศนคติรึเปล่า?
สิ่งหนึ่งที่ต้องเน้นเป็นพิเศษคือ การค้นหาพื้นที่ว่างนั้นจะไม่ได้เริ่มค้นหาใหม่ตั้งแต่หัวของแถวแรก แต่จะเริ่มค้นหาที่ว่างจากตำแหน่งสุดท้ายที่ค้นหาล่าสุด เพราะตำแหน่ง DOM ของไอเทมนี้อยู่ต่อจากไอเทมก่อนหน้า จึงต้องวางไอเทมใหม่นี้ต่อท้ายแทน เป็นผลทำให้ไอเทมใหม่นี้แม้จะมีขนาดพอที่จะใส่ในช่องที่สามของแถวแรกแต่ก็ทำไม่ได้ มันจึงต้องไปอยู่ในแถวที่สามแทน
รู้จัก Explicit Grid และ Implicit Grid
พื้นที่ของ Grid ที่เป็นผลจากการสร้างผ่าน grid-template-rows
grid-template-columns
หรือ grid-template-areas
เราเรียกว่า explicit grid
จากตัวอย่างของเราที่ระบุทั้ง grid-template-rows
และ grid-template-columns
นั้นเป็นผลทำให้เกิดพื้นที่ขนาด 3 x 3 ช่อง หลังจากวางชิปกับเดลและเพื่อนลงไป ตำแหน่งค้นหาล่าสุดจะอยู่แถวที่สาม ครั้นจะวางเพื่อนเพิ่มอีกหนึ่งย่อมทำไม่ได้เพราะติดพุงคุณช่อ สิ่งที่ Grid จะทำให้กับเราได้ก็คือการเพิ่มแถวใหม่และให้ไอเทมใหม่นั้นจับจองพื้นที่ในแถวใหม่นั้นแทน ทว่าเรานั้นเห็นจากผลลัพธ์ไปแล้วว่าความว่างเปล่าเป็นสิ่งที่เราเผชิญ...
เมื่อ Grid ทำการเพิ่มพื้นที่ใหม่นอกเหนือจาก Explicit Grid เราจะเรียกส่วนนี้ว่า Implicit Grid โดยมีขนาดของ Grid Track เป็น auto นั่นเป็นเหตุผลที่ว่าทำไมรูปของเราไม่แสดง
CSS Grid Layout อนุญาตให้เรากำหนดขนาดของ Grid Track ของ Implicit Grid ได้ผ่าน grid-auto-columns
และ grid-auto-rows
เช่นนี้แล้วเมื่อเราอยากให้ขนาดของ Grid Item ใหม่จาก Implicit Grid มีขนาดเท่ากับของ Explicit Grid เราจึงต้องกำหนดให้พวกมันมีขนาดเป็น 100px เช่นเดียวกับที่ระบุใน grid-template-columns
และ grid-template-rows
1.container {2 display: grid;3 /* สร้าง 3 คอลัมภ์ แต่ละคอลัมภ์กว้าง 100px */4 grid-template-columns: repeat(3, 100px);5 /* สร้าง 3 แถว แต่ละแถวสูง 100px */6 grid-template-rows: repeat(3, 100px);7}
จนถึงตอนนี้ ตัวอย่างที่แสดงมาทั้งหมดนั้นจะมีการเรียงตัวของไอเทมในแนวแถวจากซ้ายไปขวา หากหมดแถวแล้วยังหาที่ว่างลงไอเทมถัดไปไม่ได้ก็จะขึ้นแถวใหม่ไปเรื่อย ๆ เมื่อเป็นเช่นนี้จึงไม่มีไอเทมใดเกินออกจาก Explicit Grid ในแนวคอลัมภ์เลย (ไม่เพิ่มคอลัมภ์ใหม่) แต่อาจไปเกินแนวแถวแทน
จะเป็นไปได้ถ้าจะให้การจัดเรียงของ Grid Item ที่ไม่ได้ระบุตำแหน่งนี้ (Implicit Grid Items) เป็นไปตามแนวคอลัมภ์จากบนลงล่างแทน และเมื่อสิ้นสุดแต่ละคอลัมภ์แล้วก็ให้ค้นหาใหม่ในคอลัมภ์ถัดไป?
การใช้งาน grid-auto-flow
เรามาจัดการเรียงแก๊งค์ชิพมังค์ในแนวตั้งกัน ให้เหล่าผองเพื่อนไหลจากบนลงล่างตามแนวคอลัมภ์ วิธีการของเราคือการใช้ grid-auto-flow
grid-auto-flow
นั้นสามารถใช้เพื่อกำหนดทิศทางการไหลของกลุ่ม Grid Items ที่ไม่ได้ระบุตำแหน่ง โดยสามารถเลือกให้ไหลไปตามแถว (จากซ้ายไปขวา) ผ่านค่า row
หรือไหลตามแนวคอลัมภ์ (จากบนลงล่าง) ผ่านค่า column
เมื่อกำหนดทิศทางไหลไปทางใด จะไม่มีทางที่ Grid Items จะเกินออกไปในทิศทางนั้น เช่น กำหนด grid-auto-flow: row
ทิศทางการไหลจะเป็นจากซ้ายไปขวา เมื่อสิ้นสุดแถวนั้นจะค้นหาพื้นที่ว่างในแถวถัดไปแทน ไม่มีการขึ้นคอลัมภ์ใหม่
ค่าเริ่มต้นของ
grid-auto-flow
นั้นเป็นrow
เราจึงเห็นทิศทางการค้นหาเป็นไปจากซ้ายไปขวาตั้งแต่แรก
อย่าปล่อยให้ลุงต้องเหงา... ด้วยการจัด auto flow ตามแนวดิ่งผ่าน grid-auto-flow: column
กันเถอะ!
1.container {2 display: grid;3 grid-template-columns: repeat(3, 100px);4 grid-template-rows: repeat(3, 100px);5 grid-auto-rows: 100px;6 grid-auto-columns: 100px;7 /* ให้ทิศทางเป็นไปตามคอลัมภ์ ค้นหาจากบนลงล่าง เมื่อสุดคอลัมภ์ให้ค้นหาในคอลัมภ์ถัดไป */8 grid-auto-flow: column;9}
แก๊งค์ชิพมังค์ตอนนี้จะไล่หาพื้นที่ว่างตามคอลัมภ์ โดยมองจากบนลงล่าง สำหรับชิปกับเดลภาพแรกเมื่อหาพื้นที่ว่างของคอลัมภ์แรกจากบนลงล่าง ช่องที่สองจะว่างพอดี ส่วนชิปกับเดลภาพสองจะเริ่มค้นหาต่อจากภาพแรกจึงได้พื้นที่ของแถวที่สาม ถึงตอนนี้ก็จะจบคอลัมภ์แรกพอดี การค้นหาพื้นที่ว่างในรอบถัดไปจึงต้องเริ่มในคอลัมภ์ใหม่ เป็นผลให้ภาพสุดท้ายวางในตำแหน่งแรกของคอลัมภ์ที่สอง
ธุรกิจขายถั่วเงินงอกเงยขนาดนี้มีหรือจะพ้นสรรพากร~ เผื่อให้ระบบภาษียังคงสมบูรณ์ เราจึงเพิ่มสรรพากรเข้าไป
1<div class="container">2 <img src="./prayuth.png" alt="ผู้นำ" class="image" />3 <img src="./thanathorn.png" alt="เกือบเป็นผู้นำ" class="image" />4 <img src="./คุณช่อ.png" alt="อีช่อ" class="image" />5 <img src="./ชิปกับเดล.png" alt="ชิปกับเดล" class="image" />6 <img src="./เพื่อนชิปกับเดล.png" alt="เพื่อนชิปกับเดล" class="image" />7 <img8 src="./เพื่อนชิปกับเดลอีกกลุ่ม.png"9 alt="เพื่อนชิปกับเดลอีกกลุ่ม"10 class="image"11 />12 <!-- ส่งเงินมาเดี๋ยวนี้! -->13 <img src="./กรมสรรพากร.png" alt="เจ้าหนี้รายปี" class="image" />14</div>
ภาพใหม่ของกรมสรรพากรนี้ กำหนดให้ครอบคลุมพื้นที่ 3 คอลัมภ์ เพื่อสะท้อนถึงการกินจุ
1/* กรมสรรพากร กินพื้นที่ 3 คอลัมภ์ */2.image:nth-child(7) {3 object-fit: contain;4 grid-column: span 3;5}
Grid Item ของกรมสรรพากรต้องวางแนวดิ่ง (column) ต่อจากหมายเลข 3 แต่จะเห็นว่าแนวดิ่งของคอลัมภ์ที่ 3 นั้นไม่เหลือที่ว่างแล้ว กรมสรรพากรจึงต้องขึ้นคอลัมภ์ใหม่ในคอลัมภ์ที่ 4 แต่เนื่องจากกรมสรรพากรนั้นกินจุ จึงเกิดคอลัมภ์ใหม่เกินมาอีก 2 คอลัมภ์ดังภาพ
กล่าวโดยสรุป: ตั้งค่า grid-auto-flow ทิศทางใด ทิศทางนั้นจะไม่มี implicit grid items เกิน
และนี่คือโปรแกรมทั้งหมดที่เราเขียนขึ้นมาตั้งแต่ต้นจนถึงตรงนี้ครับ
1<!DOCTYPE html>2<html lang="en">3 <head>4 <style>5 .container {6 display: grid;7 grid-template-columns: repeat(3, 100px);8 grid-template-rows: repeat(3, 100px);9 grid-auto-rows: 100px;10 grid-auto-columns: 100px;11 grid-auto-flow: column;12 }1314 .image {15 object-fit: cover;16 width: 100%;17 height: 100%;18 }1920 .image:nth-child(1) {21 grid-column: 2 / 3;22 grid-row: 2 / 3;23 }2425 .image:nth-child(2) {26 grid-column: 1 / 2;27 grid-row: 1 / 2;28 }2930 .image:nth-child(3) {31 grid-column: 3 / 4;32 grid-row: 3 / 4;33 }3435 .image:nth-child(5) {36 grid-column: span 2;37 }3839 .image:nth-child(7) {40 object-fit: contain;41 grid-column: span 3;42 }43 </style>44 </head>45 <body>46 <div class="container">47 <img src="./prayuth.png" alt="ผู้นำ" class="image" />48 <img src="./thanathorn.png" alt="เกือบเป็นผู้นำ" class="image" />49 <img src="./คุณช่อ.png" alt="อีช่อ" class="image" />50 <img src="./ชิปกับเดล.png" alt="ชิปกับเดล" class="image" />51 <img src="./เพื่อนชิปกับเดล.png" alt="เพื่อนชิปกับเดล" class="image" />52 <img53 src="./เพื่อนชิปกับเดลอีกกลุ่ม.png"54 alt="เพื่อนชิปกับเดลอีกกลุ่ม"55 class="image"56 />57 <img src="./กรมสรรพากร.png" alt="เจ้าหนี้รายปี" class="image" />58 </div>59 </body>60</html>
Dense และ Sparse คืออะไร?
ผมขอเริ่มหัวข้อนี้ด้วย HTML และ CSS ก้อนใหม่ ดังนี้ครับ
1<!DOCTYPE html>2<html lang="en">3 <head>4 <style>5 .container {6 display: grid;7 grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));8 grid-auto-rows: 100px;9 grid-auto-columns: 100px;10 }1112 .image {13 object-fit: cover;14 width: 100%;15 height: 100%;16 }1718 .vspan-2 {19 grid-row: span 2;20 }2122 .hspan-2 {23 grid-column: span 2;24 }2526 .hspan-3 {27 grid-column: span 3;28 }29 </style>30 </head>31 <body>32 <div class="container">33 <img src="./มีถั่วไหม.png" class="image hspan-2" />34 <img src="./ยาราไนก้า.png" class="image vspan-2 hspan-2" />35 <img src="./ชิปกับเดล.png" class="image vspan-2 hspan-3" />36 <img src="./ท่านผู้นำ.png" class="image vspan-2" />37 <img src="./ถั่ว.jpg" class="image" />38 <img src="./มีถั่วไหม.png" class="image hspan-2" />39 <img src="./ยาราไนก้า.png" class="image vspan-2 hspan-2" />40 <img src="./ชิปกับเดล.png" class="image vspan-2 hspan-3" />41 <img src="./ท่านผู้นำ.png" class="image vspan-2" />42 <img src="./ถั่ว.jpg" class="image" />43 </div>44 </body>45</html>
ถึงตอนนี้ผมคิดว่าเพื่อน ๆ น่าจะพอเดาผลลัพธ์ออกแล้วว่าหน้าตาควรเป็นเช่นใด
ตามที่เราได้คุยกันไปครับ หากเราไม่ได้ระบุ grid-auto-flow
ตัว CSS Grid Layout เองจะใช้ค่าเริ่มต้นเป็น row
อันเป็นผลให้เกิดการหาพื้นที่ว่างไล่ตามแถวจากซ้ายไปขวา และเริ่มหาพื้นที่ต่อไปถัดจากตำแหน่งค้นหาครั้งล่าสุด (ตำแหน่ง DOM ล่าสุด) ไม่ได้เริ่มต้นค้นหาใหม่ตั้งแต่จุดเริ่มต้นของแถวแรก
เพราะการจับจองพื้นที่ไม่ได้เริ่มมองหาจากบรรทัดแรก เลยทำให้เกิดช่องว่างประปรายไปตาม Grid Container มากมาย เรียกลักษณะการแสดงผลแบบนี้ว่า Sparse หากเงื่อนไขของเราคือพยายามหาทางให้พื้นที่ทั้งหมดถูกใช้เต็มมากที่สุดเท่าที่จะเป็นไปได้ดังรูปข้างล่าง สามารถทำได้หรือไม่?
ใน CSS Grid Layout เรามีวิธีบอกให้ค้นหาพื้นที่ว่างตั้งแต่ต้น Grid ไม่ใช่เริ่มหาจากตำแหน่งล่าสุด (ตามลำดับของ DOM) ด้วยการตั้งค่าแบบ Dense
1.container {2 display: grid;3 grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));4 grid-auto-rows: 100px;5 grid-auto-columns: 100px;6 <!-- เริ่มตำแหน่งค้นหาช่องว่างแต่ต้น -->7 grid-auto-flow: dense;8}
เหตุเพราะ Grid พยายามค้นหาช่องว่างก่อนหน้า จึงเป็นผลทำให้ Grid Container ของเราดูเต็มมากขึ้น ไม่เป็นช่องโหว่เหมือนแบบ Sparse
จากการใช้งานข้างต้นจะพบว่า grid-auto-flow นั้นนอกจากจะใช้กำหนดทิศทางการวางได้แล้ว ยังสามารถกำหนด sparse/dense ได้อีกด้วย นอกจากนี้ grid-auto-flow ยังอนุญาตให้เราระบุทั้ง row/column ควบคู่ไปกับ dense เช่น grid-auto-flow: column dense
ที่หมายถึงทิศทางค้นหาและวางในแนวคอลัมภ์แบบ Dense นั่นเอง
ค่าเริ่มต้นของ grid-auto-flow นั้นจะเป็น row และแสดงผลแบบ sparse
เอกสารอ้างอิง
Auto-placement in CSS Grid Layout. Retrieved July, 8, 2019, from https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Grid_Layout/Auto-placement_in_CSS_Grid_Layout
CSS Grid Layout Module Level 1. Retrieved July, 8, 2019, from https://drafts.csswg.org/css-grid
สารบัญ
- Grid วางไอเทมอย่างไรเมื่อไม่ระบุตำแหน่ง
- รู้จัก Explicit Grid และ Implicit Grid
- การใช้งาน grid-auto-flow
- Dense และ Sparse คืออะไร?
- เอกสารอ้างอิง