พิจารณา flex-direction
สิ่งแรกที่มาถึงใจเมื่ออ่านคำถามของคุณคือการที่ไม่เคยนำไปใช้กับflex-basis
width
เมื่อflex-direction
เป็นrow
, flex-basis
การควบคุมความกว้าง
แต่เมื่อflex-direction
เป็นcolumn
, flex-basis
การควบคุมความสูง
ความแตกต่างที่สำคัญ
นี่คือความแตกต่างที่สำคัญระหว่างflex-basis
และwidth
/ height
:
flex-basis
ใช้กับไอเท็ม flex เท่านั้น ภาชนะ Flex (ที่ไม่ได้นอกจากนี้ยังมีรายการ flex) จะไม่สนใจflex-basis
แต่สามารถใช้และwidth
height
flex-basis
ทำงานบนแกนหลักเท่านั้น ตัวอย่างเช่นถ้าคุณอยู่ในflex-direction: column
ที่width
สถานที่ให้บริการจะต้องใช้สำหรับการปรับขนาดรายการแนวนอนดิ้น
flex-basis
จะไม่มีผลกับไอเท็มเฟล็กซ์ตำแหน่งที่แน่นอน width
และheight
คุณสมบัติจะมีความจำเป็น อย่างตำแหน่งรายการดิ้นไม่ได้มีส่วนร่วมในรูปแบบเฟล็กซ์
โดยใช้flex
สถานที่ให้บริการสามคุณสมบัติ - flex-grow
, flex-shrink
และflex-basis
- สามารถรวมกันได้อย่างเรียบร้อยเป็นหนึ่งในการประกาศ ใช้width
กฎเดียวกันจะต้องมีรหัสหลายบรรทัด
พฤติกรรมเบราว์เซอร์
ในแง่ของวิธีที่พวกเขาจะแสดงผลควรจะมีความแตกต่างระหว่างflex-basis
และwidth
เว้นแต่flex-basis
เป็นหรือauto
content
จากสเป็ค:
7.2.3 flex-basis
คุณสมบัติ
สำหรับค่าอื่น ๆ ทั้งหมดกว่าauto
และcontent
, flex-basis
ได้รับการแก้ไขแบบเดียวกับwidth
ในโหมดการเขียนในแนวนอน
แต่ผลกระทบของauto
หรือcontent
อาจจะน้อยหรือไม่มีอะไรเลย เพิ่มเติมจากสเป็ค:
auto
เมื่อระบุไว้ในรายการเฟล็กซ์ที่คำหลักดึงค่าของหลักคุณสมบัติขนาดเป็นที่ใช้auto
flex-basis
หากค่าที่เป็นตัวเองแล้วค่าที่ใช้คือauto
content
content
ระบุขนาดอัตโนมัติขึ้นอยู่กับเนื้อหาของรายการที่ยืดหยุ่น
หมายเหตุ: ค่านี้ไม่ปรากฏในรุ่นที่วางจำหน่ายครั้งแรกของ Flexible Box Layout ดังนั้นการใช้งานรุ่นเก่าบางอย่างจะไม่สนับสนุน ผลเทียบเท่าสามารถทำได้โดยการใช้auto
ร่วมกันที่มีขนาดหลัก ( width
หรือheight
) auto
ของ
ดังนั้นตามข้อมูลจำเพาะflex-basis
และwidth
แก้ไขเหมือนกันเว้นแต่flex-basis
เป็นหรือauto
content
ในกรณีเช่นนี้flex-basis
อาจใช้ความกว้างของเนื้อหา (ซึ่งน่าจะเป็นwidth
คุณสมบัติที่ใช้เช่นกัน)
flex-shrink
ปัจจัย
สิ่งสำคัญคือต้องจดจำการตั้งค่าเริ่มต้นของ flex container การตั้งค่าบางอย่างเหล่านี้รวมถึง:
flex-direction: row
- รายการที่ยืดหยุ่นจะจัดเรียงในแนวนอน
justify-content: flex-start
- ไอเท็มแบบเฟล็กจะเรียงซ้อนกันที่จุดเริ่มต้นของบรรทัดบนแกนหลัก
align-items: stretch
- รายการที่ยืดหยุ่นจะขยายเพื่อครอบคลุมขนาดข้ามของคอนเทนเนอร์
flex-wrap: nowrap
- รายการที่ยืดหยุ่นจะถูกบังคับให้อยู่ในบรรทัดเดียว
flex-shrink: 1
- ไอเท็มเฟล็กซ์ได้รับอนุญาตให้หด
บันทึกการตั้งค่าล่าสุด
เนื่องจากรายการดิ้นได้รับอนุญาตให้หดตัวตามค่าเริ่มต้น (ซึ่งป้องกันไม่ให้ล้นภาชนะ) ที่ระบุflex-basis
/ width
/ height
อาจถูกแทนที่
ตัวอย่างเช่น flex-basis: 100px
หรือwidth: 100px
ประกอบกับflex-shrink: 1
จะไม่จำเป็นต้องเป็น 100px
ในการแสดงความกว้างที่ระบุ - และคงไว้ - คุณจะต้องปิดการหดตัว:
div {
width: 100px;
flex-shrink: 0;
}
หรือ
div {
flex-basis: 100px;
flex-shrink: 0;
}
หรือตามคำแนะนำของสเป็ค:
flex: 0 0 100px; /* don't grow, don't shrink, stay fixed at 100px */
7.2 ส่วนประกอบของความยืดหยุ่น
ผู้เขียนมีการส่งเสริมให้มีความยืดหยุ่นในการควบคุมการใช้flex
ชวเลขมากกว่าที่มีคุณสมบัติตัวหนังสือโดยตรงเป็นชวเลขได้อย่างถูกต้องรีเซ็ตส่วนประกอบใด ๆ ที่ไม่ได้ระบุเพื่อรองรับการใช้งานร่วมกัน
ข้อบกพร่องของเบราว์เซอร์
เบราว์เซอร์บางตัวมีปัญหาในการปรับขนาดรายการ flex ในคอนเทนเนอร์แบบซ้อนที่ซ้อนกัน
flex-basis
ละเว้นในคอนเทนเนอร์ flex แบบซ้อน width
โรงงาน
เมื่อใช้flex-basis
คอนเทนเนอร์จะไม่สนใจขนาดของลูกและเด็ก ๆ จะล้นภาชนะ แต่ด้วยwidth
คุณสมบัติภาชนะที่เคารพขนาดของเด็กและขยายตาม
อ้างอิง:
ตัวอย่าง:
งอรายการที่ใช้flex-basis
และคอนเทนเนอร์ white-space: nowrap
ล้น โรงงานinline-flex
width
ดูเหมือนว่าชุดเฟล็กซ์คอนเทนเนอร์จะinline-flex
ไม่รู้จักflex-basis
กับเด็กเมื่อแสดงผล sibling ด้วยwhite-space: nowrap
(แม้ว่ามันอาจเป็นเพียงรายการที่มีความกว้างไม่ได้กำหนด) คอนเทนเนอร์ไม่ขยายเพื่อรองรับรายการ
แต่เมื่อwidth
คุณสมบัติถูกนำมาใช้แทนflex-basis
ภาชนะที่เคารพขนาดของเด็กและขยายตาม นี่ไม่ใช่ปัญหาใน IE11 และ Edge
อ้างอิง:
ตัวอย่าง:
flex-basis
(และflex-grow
) ไม่ทำงานกับองค์ประกอบตาราง
อ้างอิง:
flex-basis
ล้มเหลวใน Chrome และ Firefox เมื่อคอนเทนเนอร์ grandparent เป็นองค์ประกอบย่อให้พอดี การตั้งค่าทำงานได้ดีใน Edge
เช่นเดียวกับในตัวอย่างที่นำเสนอในลิงค์ด้านบนซึ่งเกี่ยวข้องกับposition: absolute
การใช้float
และinline-block
จะทำให้การแสดงผลมีข้อบกพร่องเหมือนกัน ( สาธิต jsfiddle )
ข้อบกพร่องที่มีผลต่อ IE 10 และ 11: