document_cover
ทำไม minHeight: 0 ถึงจำเป็นสำหรับ ScrollArea ใน Nested Flexbox
flexboxcssmantinescrollareafrontendreacttypescriptlayouttimeline
2 ต.ค. 68 , 14:45
เมื่อใช้ ScrollArea ของ Mantine หรือ component ที่มีการ scroll ใน nested flexbox containers มักพบปัญหาที่ content ทะลุออกจาก container แม้จะใช้ flex: 1 แล้ว บทความนี้จะอธิบายสาเหตุของปัญหา และวิธีแก้ไขด้วย minHeight: 0 อย่างละเอียด พร้อมตัวอย่างการใช้งานจริง
เนื้อหาของเอกสารนี้ ใช้ AI ช่วยเขียนนะครับ อยากรู้ว่ามันจะทำได้รู้เรื่องแค่ไหน แต่เท่าที่ดูมัน อธิบายยืดเยื้อชะมัด อยากได้กระชับกว่านี้จัง สงสัยต้องปรับ prompt อีกบาน

ปัญหาที่พบบ่อย

ScrollArea ไม่ทำงาน content ทะลุออกมา
Scrollbar ไม่ปรากฏแม้ content ยาวเกิน
Container ขยายตาม content แทนที่จะถูกจำกัดโดย parent



ตัวอย่างโค้ดที่มีปัญหา



ต้นเหตุของปัญหา

Flexbox มี default value ที่เป็นต้นเหตุของปัญหา:

ค่า auto หมายความว่า "ขนาดต่ำสุดต้องพอกับ content ภายใน" กล่าวคือ flex item จะไม่ยอมเล็กกว่าขนาดของ content แม้ว่า parent จะกำหนดขนาดไว้แล้วก็ตาม



ทำไมถึงเกิดปัญหา

ทำไมถึงไม่คิดว่าปัญหาอยู่ที่ min-height

1.ไม่ค่อยมีคนรู้จัก- เอกสารส่วนใหญ่ไม่ได้เน้นเรื่องmin-height: auto
2.คิดว่า flex: 1 พอแล้ว- หลายคนคิดว่าflex: 1ควรทำให้ยืดหดได้เอง
3.ไม่มี error message- เพียงแค่ทะลุออกมา ไม่มีข้อความบอกว่าผิดตรงไหน
4.เฉพาะ nested flex- ถ้าไม่ซ้อนหลายชั้น ปัญหาไม่เกิด



วิธีแก้ปัญหา

หลักการแก้ไข Override ค่า default ด้วย minHeight: 0 เพื่อบอกว่า: "ยอมเล็กได้ถึง 0px - ให้ถูกจำกัดขนาดโดย parent แทนที่จะขยายตาม content"



ตัวอย่างโค้ดที่แก้ไขแล้ว



ตัวอย่างการตัดสินใจ



กรณี Mixed Flex Directions

เมื่อมีทั้ง row และ column ผสมกัน:

กฎสำคัญ: มองที่ flexDirection ของ parent ไม่ใช่ตัว element เอง