วิธีการจัดแนวรายการแบบยืดหยุ่นตามแกนหลัก
ตามที่ระบุไว้ในคำถาม:
ในการจัดแนวไอเท็มแบบเฟล็กซ์ตามแกนหลักมีหนึ่งคุณสมบัติ: justify-content
กับรายการดิ้นจัดตามแกนข้ามมีสามคุณสมบัติ: align-content
, และalign-items
align-self
คำถามนั้นถามว่า:
เหตุใดจึงไม่มีjustify-items
และjustify-self
คุณสมบัติ?
หนึ่งคำตอบอาจเป็นเพราะพวกเขาไม่จำเป็น
ข้อกำหนด flexboxให้สองวิธีการในการจัดตำแหน่งรายการดิ้นตามแกนหลัก
justify-content
คุณสมบัติคำหลักและ
auto
อัตรากำไรขั้นต้น
ปรับเนื้อหา
justify-content
คุณสมบัติสอดคล้องรายการดิ้นตามแกนหลักของภาชนะดิ้น
มันถูกนำไปใช้กับ flex container แต่มีผลกับรายการ flex เท่านั้น
มีตัวเลือกการจัดตำแหน่งห้าตัว:
flex-start
~ รายการที่ยืดหยุ่นจะถูกบรรจุจนถึงจุดเริ่มต้นของบรรทัด
flex-end
~ รายการที่ยืดหยุ่นจะถูกบรรจุลงในตอนท้ายของบรรทัด
center
~ รายการที่ยืดหยุ่นจะถูกบรรจุเข้าหากึ่งกลางของบรรทัด
space-between
~ รายการที่ยืดหยุ่นจะเว้นระยะเท่ากันโดยรายการแรกจัดชิดขอบหนึ่งของคอนเทนเนอร์และรายการสุดท้ายจัดชิดขอบตรงกันข้าม ขอบที่ใช้โดยรายการแรกและสุดท้ายจะขึ้นอยู่กับflex-direction
และโหมดการเขียน ( ltr
หรือrtl
)
space-around
~ เหมือนกับspace-between
ยกเว้นที่มีช่องว่างขนาดครึ่งทั้งสองด้าน
ระยะขอบอัตโนมัติ
ด้วยauto
ระยะขอบรายการที่ยืดหยุ่นสามารถจัดกึ่งกลางเว้นระยะห่างหรือบรรจุลงในกลุ่มย่อย
ซึ่งแตกต่างจากjustify-content
ซึ่งใช้กับ flex คอนเทนเนอร์auto
ระยะขอบไปในรายการ flex
มันทำงานโดยใช้พื้นที่ว่างทั้งหมดในทิศทางที่กำหนด
จัดกลุ่มรายการที่ยืดหยุ่นไปทางขวา แต่รายการแรกอยู่ทางซ้าย
สถานการณ์จากคำถาม:
การจัดกลุ่มของรายการ flex จัดชิดขวา ( justify-content: flex-end
) แต่มีการจัดเรียงรายการแรกทางซ้าย ( justify-self: flex-start
)
พิจารณาส่วนหัวที่มีกลุ่มของรายการ nav และโลโก้ ด้วย
justify-self
โลโก้ที่สามารถจัดชิดซ้ายในขณะที่รายการ nav อยู่ไกลและสิ่งทั้งหมดปรับอย่างราบรื่น ("งอ") ขนาดหน้าจอที่แตกต่างกัน
สถานการณ์ที่มีประโยชน์อื่น ๆ :
วางไอเท็มเฟล็กซ์ที่มุม
สถานการณ์จากคำถาม:
- วางรายการที่ยืดหยุ่นในมุม
.box { align-self: flex-end; justify-self: flex-end; }
จัดรายการที่อยู่กึ่งกลางในแนวตั้งและแนวนอน
margin: auto
เป็นทางเลือกและjustify-content: center
align-items: center
แทนรหัสนี้บนเฟล็กคอนเทนเนอร์:
.container {
justify-content: center;
align-items: center;
}
คุณสามารถใช้สิ่งนี้กับรายการเฟล็กซ์:
.box56 {
margin: auto;
}
ทางเลือกนี้จะเป็นประโยชน์เมื่อกลางรายการดิ้นที่ล้นภาชนะ
จัดรายการที่อยู่กึ่งกลางและจัดรายการที่สองที่อยู่ตรงกลางระหว่างส่วนที่หนึ่งกับขอบ
flex container จัดเรียงรายการ flex โดยกระจายพื้นที่ว่าง
ดังนั้นเพื่อสร้างสมดุลที่เท่าเทียมกันดังนั้นรายการกลางสามารถอยู่กึ่งกลางในคอนเทนเนอร์ที่มีรายการเดียวข้างต้องมีการถ่วงดุล
ในตัวอย่างด้านล่างจะมีการแนะนำรายการเฟล็กซ์ที่สามที่มองไม่เห็น (กล่อง 61 & 68) เพื่อปรับยอดรายการ "ของจริง" (กล่อง 63 & 66)
แน่นอนวิธีนี้ไม่มีอะไรดีในแง่ของความหมาย
หรือคุณสามารถใช้องค์ประกอบหลอกแทนองค์ประกอบ DOM ที่แท้จริง หรือคุณสามารถใช้การกำหนดตำแหน่งแบบสัมบูรณ์ ทั้งสามวิธีครอบคลุมที่นี่: ศูนย์และรายการ flex จัดชิดด้านล่าง
หมายเหตุ: ตัวอย่างข้างต้นจะใช้งานได้เฉพาะในแง่ของการจัดกึ่งกลางที่แท้จริง - เมื่อรายการด้านนอกสุดมีความสูง / ความกว้างเท่ากัน เมื่อไอเท็มเฟล็กซ์มีความยาวต่างกันให้ดูตัวอย่างถัดไป
จัดรายการที่อยู่กึ่งกลางเมื่อรายการที่อยู่ติดกันมีขนาดแตกต่างกัน
สถานการณ์จากคำถาม:
ในแถวของสามไอเท็มเฟล็กซ์ติดไอเท็มกลางเข้ากับกึ่งกลางของคอนเทนเนอร์ ( justify-content: center
) และจัดเรียงไอเท็มที่อยู่ติดกันกับขอบคอนเทนเนอร์ ( justify-self: flex-start
และ
justify-self: flex-end
)
โปรดทราบว่าค่าspace-around
และspace-between
ในjustify-content
สถานที่ให้บริการจะไม่ให้รายการกึ่งกลางในความสัมพันธ์กับภาชนะถ้ารายการที่อยู่ติดกันมีความกว้างที่แตกต่างกัน ( ดูตัวอย่าง )
ตามที่ระบุไว้ยกเว้นว่ารายการที่ยืดหยุ่นทั้งหมดมีความกว้างหรือความสูงเท่ากัน (ขึ้นอยู่กับflex-direction
) รายการกลางไม่สามารถอยู่ตรงกลางอย่างแท้จริง ปัญหานี้ทำให้เป็นกรณีที่แข็งแกร่งสำหรับjustify-self
คุณสมบัติ (ออกแบบมาเพื่อจัดการงานแน่นอน)
#container {
display: flex;
justify-content: space-between;
background-color: lightyellow;
}
.box {
height: 50px;
width: 75px;
background-color: springgreen;
}
.box1 {
width: 100px;
}
.box3 {
width: 200px;
}
#center {
text-align: center;
margin-bottom: 5px;
}
#center > span {
background-color: aqua;
padding: 2px;
}
<div id="center">
<span>TRUE CENTER</span>
</div>
<div id="container">
<div class="box box1"></div>
<div class="box box2"></div>
<div class="box box3"></div>
</div>
<p>The middle box will be truly centered only if adjacent boxes are equal width.</p>
ต่อไปนี้เป็นสองวิธีในการแก้ไขปัญหานี้:
โซลูชัน # 1: การจัดตำแหน่งแบบสัมบูรณ์
ข้อมูลจำเพาะ flexbox ช่วยให้การวางตำแหน่งที่แน่นอนของรายการดิ้น สิ่งนี้ช่วยให้รายการกลางอยู่กึ่งกลางอย่างสมบูรณ์โดยไม่คำนึงถึงขนาดของพี่น้อง
เพียงแค่เก็บไว้ในใจว่าเหมือนองค์ประกอบตำแหน่งอย่างทุกรายการจะถูกลบออกจากการไหลของเอกสาร ซึ่งหมายความว่าพวกเขาไม่ใช้พื้นที่ในภาชนะและสามารถทับซ้อนพี่น้องของพวกเขา
ในตัวอย่างด้านล่างรายการกลางอยู่กึ่งกลางตำแหน่งที่แน่นอนและรายการด้านนอกยังคงอยู่ในลำดับ แต่รูปแบบเดียวกันสามารถทำได้ในแบบย้อนกลับ: จัดกึ่งกลางของรายการด้วยjustify-content: center
และวางตำแหน่งรายการด้านนอกอย่างแน่นอน
โซลูชัน # 2: ตู้บรรจุ Flex แบบซ้อน (ไม่มีตำแหน่งแน่นอน)
.container {
display: flex;
}
.box {
flex: 1;
display: flex;
justify-content: center;
}
.box71 > span { margin-right: auto; }
.box73 > span { margin-left: auto; }
/* non-essential */
.box {
align-items: center;
border: 1px solid #ccc;
background-color: lightgreen;
height: 40px;
}
<div class="container">
<div class="box box71"><span>71 short</span></div>
<div class="box box72"><span>72 centered</span></div>
<div class="box box73"><span>73 loooooooooooooooong</span></div>
</div>
นี่คือวิธีการทำงาน:
- div (
.container
) ระดับบนสุดเป็นคอนเทนเนอร์แบบยืดหยุ่น
- div เด็กแต่ละคน (
.box
)ขณะนี้เป็นรายการที่ยืดหยุ่น
- แต่ละ
.box
รายการจะได้รับflex: 1
เพื่อกระจายพื้นที่คอนเทนเนอร์อย่างเท่าเทียมกัน
- ตอนนี้ไอเท็มกำลังกินพื้นที่ทั้งหมดในแถวและมีความกว้างเท่ากัน
- ทำให้แต่ละรายการเป็นเฟล็กซ์ (ซ้อน) และเพิ่ม
justify-content: center
ภาชนะดิ้นและเพิ่ม
- ตอนนี้แต่ละคน
span
องค์ประกอบจะเป็นรายการเฟล็กซ์กึ่งกลาง
- ใช้
auto
ระยะขอบโค้งงอเพื่อเลื่อนด้านนอกspan
ซ้ายและขวา
คุณสามารถละทิ้งjustify-content
และใช้งานได้auto
ระยะขอบได้โดยเฉพาะ
แต่justify-content
สามารถทำงานที่นี่ได้เพราะauto
ระยะขอบมีลำดับความสำคัญเสมอ จากสเป็ค:
8.1 สอดคล้องกับauto
ระยะขอบ
ก่อนที่จะจัดตำแหน่งผ่านjustify-content
และalign-self
พื้นที่ว่างบวกใด ๆ จะถูกกระจายไปยังระยะขอบอัตโนมัติในมิตินั้น
justify-content: space-same (แนวคิด)
ย้อนกลับไปjustify-content
สักครู่นี่เป็นแนวคิดสำหรับอีกทางเลือกหนึ่ง
space-same
~ ไฮบริดของและspace-between
space-around
รายการแบบยืดหยุ่นจะเว้นระยะเท่ากัน (เช่นspace-between
) ยกเว้นช่องว่างขนาดครึ่งทั้งสองด้าน (เช่นspace-around
) จะมีช่องว่างขนาดเต็มทั้งสองด้าน
รูปแบบนี้สามารถทำได้ด้วย::before
และ::after
หลอกองค์ประกอบบนภาชนะดิ้น
(เครดิต: @oriolสำหรับรหัสและ@crlสำหรับป้ายกำกับ)
อัปเดต:เบราว์เซอร์เริ่มนำไปใช้งานspace-evenly
ซึ่งประสบความสำเร็จตามที่กล่าวข้างต้น ดูโพสต์นี้สำหรับรายละเอียด: ช่องว่างที่เท่ากันระหว่างรายการเฟล็ก
PLAYGROUND (รวมรหัสสำหรับตัวอย่างด้านบนทั้งหมด)
justify-self
จะทำงานให้กับรายการดิ้นได้อย่างไร สมมติว่าคุณมีรายการ a, b, c, d ที่มีพื้นที่เพิ่มเติมเพื่อกระจายไปรอบ ๆ พวกมันและที่เก็บของแบบยืดหยุ่นjustify-content: space-between
ดังนั้นพวกมันจึงจบลงเช่น | abcd | การเพิ่มเช่นjustify-self: center
หรือ 'ปรับตัวเอง: flex-end` ไปยังรายการ' b 'หมายถึงอะไร คุณคาดหวังว่ามันจะไปที่ไหน (ฉันเห็นการสาธิตในคำตอบหนึ่งข้อที่นี่ แต่ฉันไม่เห็นวิธีที่ชัดเจนว่าจะใช้งานได้โดยทั่วไป)