ปัญหา
Flexbox ทำให้การอยู่ตรงกลางเป็นเรื่องง่ายมาก
โดยเพียงแค่การใช้align-items: center
และjustify-content: center
การภาชนะดิ้นดิ้นรายการ (s) จะเป็นในแนวตั้งและแนวนอนแน่นิ่ง
อย่างไรก็ตามมีปัญหากับวิธีนี้เมื่อรายการ flex มีขนาดใหญ่กว่า flex container
ตามที่ระบุไว้ในคำถามเมื่อรายการ flex ล้นคอนเทนเนอร์ด้านบนจะไม่สามารถเข้าถึงได้
สำหรับการโอเวอร์โฟลว์ในแนวนอนส่วนด้านซ้ายจะเข้าไม่ถึง (หรือส่วนขวาในภาษา RTL)
นี่คือตัวอย่างของคอนเทนเนอร์ LTR ที่มีjustify-content: center
และรายการ flex สามรายการ:
ดูที่ด้านล่างของคำตอบนี้สำหรับคำอธิบายของพฤติกรรมนี้
โซลูชัน # 1
เพื่อแก้ไขปัญหานี้ใช้flexbox อัตรากำไรอัตโนมัติjustify-content
แทน
ด้วยauto
ระยะขอบรายการเฟล็กที่ล้นจะสามารถอยู่ตรงกลางในแนวตั้งและแนวนอนโดยไม่สูญเสียการเข้าถึงส่วนใด ๆ ของมัน
ดังนั้นแทนที่จะเป็นรหัสนี้ใน flex container:
#flex-container {
align-items: center;
justify-content: center;
}
ใช้รหัสนี้ในรายการ flex:
.flex-item {
margin: auto;
}
ปรับปรุงการสาธิต
โซลูชัน # 2 (ยังไม่ได้ติดตั้งในเบราว์เซอร์ส่วนใหญ่)
เพิ่มsafe
มูลค่าให้กับกฎการจัดตำแหน่งคำหลักของคุณเช่นนี้:
justify-content: safe center
หรือ
align-self: safe center
จากสเปคโมดูลการจัดตำแหน่งกล่อง CSS :
4.4 การจัดตำแหน่งล้น: safe
และunsafe
คำหลักและขีดจำกัดความปลอดภัยในการเลื่อน
เมื่อ [flex item] ใหญ่กว่า [flex container] มันจะล้น โหมดการจัดตำแหน่งบางโหมดหากได้รับเกียรติในสถานการณ์นี้อาจทำให้ข้อมูลสูญหาย: ตัวอย่างเช่นหากเนื้อหาของแถบด้านข้างอยู่กึ่งกลางเมื่อพวกเขาล้นพวกเขาอาจส่งส่วนหนึ่งของกล่องผ่านขอบเริ่มต้นของวิวพอร์ตซึ่งไม่สามารถเลื่อนไป .
เพื่อควบคุมสถานการณ์นี้สามารถระบุโหมดการจัดตำแหน่งโอเวอร์โฟลว์ได้อย่างชัดเจน Unsafe
การจัดตำแหน่งให้เกียรติโหมดการจัดตำแหน่งที่ระบุในสถานการณ์ล้นแม้ว่ามันจะทำให้เกิดการสูญเสียข้อมูลในขณะที่safe
การจัดตำแหน่งเปลี่ยนโหมดการจัดตำแหน่งในสถานการณ์ล้นในความพยายามที่จะหลีกเลี่ยงการสูญเสียข้อมูล
พฤติกรรมเริ่มต้นคือการมีเรื่องการจัดตำแหน่งภายในพื้นที่ที่เลื่อนได้แม้ว่าในขณะที่เขียนคุณสมบัติความปลอดภัยนี้ยังไม่ได้ดำเนินการ
safe
หากขนาดของ [flex item] ล้น [flex container] เกิน [flex item] จะถูกจัดตำแหน่งแทนราวกับว่าโหมดการจัดตำแหน่งเป็น [ flex-start
]
unsafe
โดยไม่คำนึงถึงขนาดสัมพัทธ์ของ [flex item] และ [flex container] ค่าการจัดตำแหน่งที่กำหนดจะถูกให้เกียรติ
หมายเหตุ: โมดูลการจัดตำแหน่งกล่องมีไว้สำหรับการใช้งานในรูปแบบกล่องหลายแบบไม่ใช่แค่งอเท่านั้น ดังนั้นในข้อความที่ตัดตอนมาด้านบนคำในวงเล็บจะพูดว่า "หัวเรื่องการจัดตำแหน่ง", "คอนเทนเนอร์จัดตำแหน่ง" และ " start
" ฉันใช้คำเฉพาะแบบดิ้นเพื่อให้ความสนใจกับปัญหาเฉพาะนี้
คำอธิบายสำหรับการ จำกัด การเลื่อนจาก MDN:
ข้อพิจารณาในการยืดหยุ่นของรายการ
คุณสมบัติการจัดตำแหน่งของ Flexbox ทำกึ่งกลาง "จริง" ไม่เหมือนกับวิธีการจัดกึ่งกลางอื่น ๆ ใน CSS ซึ่งหมายความว่ารายการเฟล็กซ์จะยังคงอยู่กึ่งกลางแม้ว่ามันจะล้นคอนเทนเนอร์เฟล็กซ์ก็ตาม
บางครั้งสิ่งนี้อาจเป็นปัญหาได้หากพวกเขาล้นขอบด้านบนของหน้าหรือขอบด้านซ้าย [... ] เนื่องจากคุณไม่สามารถเลื่อนไปที่พื้นที่นั้นแม้ว่าจะมีเนื้อหาอยู่ที่นั่น!
ในรุ่นอนาคตคุณสมบัติการจัดตำแหน่งจะถูกขยายเพื่อให้มีตัวเลือก "ปลอดภัย" เช่นกัน
สำหรับตอนนี้หากเป็นข้อกังวลคุณสามารถใช้มาร์จิ้นเพื่อให้ได้ศูนย์กลางโดยที่พวกเขาจะตอบกลับด้วยวิธีที่ "ปลอดภัย" และหยุดอยู่ตรงกลางหากพวกเขาล้น
แทนที่จะใช้align-
คุณสมบัติเพียงวางauto
ระยะขอบบนไอเท็มเฟล็กที่คุณต้องการจัดกึ่งกลาง
แทนที่justify-
คุณสมบัติให้วางระยะขอบอัตโนมัติไว้ที่ขอบด้านนอกของรายการเฟล็กต์แรกและสุดท้ายในคอนเทนเนอร์เฟล็กซ์
auto
อัตรากำไรขั้นต้นจะ "ดิ้น" และถือว่าพื้นที่เหลือศูนย์กลางรายการดิ้นเมื่อมีเหลือพื้นที่และเปลี่ยนไปใช้การจัดตำแหน่งปกติเมื่อไม่
อย่างไรก็ตามหากคุณพยายามแทนที่justify-content
ด้วยการจัดกึ่งกลางตามขอบในเฟล็กบ็อกซ์แบบหลายบรรทัดคุณอาจจะโชคไม่ดีเนื่องจากคุณจำเป็นต้องวางระยะขอบในรายการเฟล็กซ์แรกและสุดท้ายในแต่ละบรรทัด หากคุณไม่สามารถคาดการณ์ล่วงหน้าว่ารายการใดจะสิ้นสุดลงในบรรทัดใดคุณไม่สามารถใช้การจัดกึ่งกลางตามขอบในแกนหลักได้อย่างน่าเชื่อถือเพื่อแทนที่justify-content
คุณสมบัติ