วางตำแหน่งรายการสุดท้ายที่ยืดหยุ่นที่ส่วนท้ายของคอนเทนเนอร์


97

คำถามนี้เกี่ยวข้องกับเบราว์เซอร์ที่รองรับ css3 เต็มรูปแบบรวมถึง flexbox

ฉันมีตู้คอนเทนเนอร์แบบยืดหยุ่นพร้อมสิ่งของบางอย่างอยู่ พวกเขาทั้งหมดมีเหตุผลที่จะเริ่มต้นแบบยืดหยุ่น แต่ฉันต้องการให้รายการสุดท้าย .endเป็นธรรมสำหรับ flex-end มีวิธีที่ดีในการดำเนินการโดยไม่ต้องแก้ไข HTML และไม่ต้องใช้การกำหนดตำแหน่งแบบสัมบูรณ์

.container {
  display: flex;
  flex-direction: column;
  outline: 1px solid green;
  min-height: 400px;
  width: 100px;
  justify-content: flex-start;
}
p {
  height: 50px;
  background-color: blue;
  margin: 5px;
}
<div class="container">
  <p></p>
  <p></p>
  <p></p>
  <p class="end"></p>
</div>


2
ใช่. ดูautoภาพประกอบขอบได้ที่นี่: stackoverflow.com/a/33856609/3597276
Michael Benjamin

อาจซ้ำกันได้ของAlign an element to bottom ด้วย flexbox
mfluehr

คำตอบ:


204

โมดูลเค้าโครงกล่องที่ยืดหยุ่น - 8.1 การจัดแนวด้วยระยะขอบอัตโนมัติ

ระยะขอบอัตโนมัติในรายการที่ยืดหยุ่นมีผลคล้ายกับระยะขอบอัตโนมัติในขั้นตอนการบล็อก:

  • ในระหว่างการคำนวณฐานดิ้นและความยาวที่ยืดหยุ่นระยะขอบอัตโนมัติจะถือว่าเป็น 0

  • ก่อนที่จะจัดแนวผ่านjustify-contentและalign-selfพื้นที่ว่างเชิงบวกจะกระจายไปยังระยะขอบอัตโนมัติในมิติข้อมูลนั้น

ดังนั้นคุณสามารถใช้margin-top: autoเพื่อกระจายช่องว่างระหว่างองค์ประกอบอื่นและองค์ประกอบสุดท้าย

สิ่งนี้จะวางตำแหน่งองค์ประกอบสุดท้ายที่ด้านล่าง

p:last-of-type {
  margin-top: auto;
}

ตัวอย่างแนวตั้ง


ในทำนองเดียวกันคุณยังสามารถใช้margin-left: autoหรือmargin-right: autoสำหรับการจัดตำแหน่งเดียวกันในแนวนอน

p:last-of-type {
  margin-left: auto;
}

ตัวอย่างแนวนอน


1
ดีไม่น่าเชื่อว่าฉันพลาด! น่าอายโดยเฉพาะอย่างยิ่งเนื่องจากฉันรู้ทั้งหมดเกี่ยวกับเคล็ดลับการใช้ระยะขอบอัตโนมัติถึงกึ่งกลางแนวตั้งและใช้มันตลอดเวลา
George Mauer

1
@ j08691 ฉันไม่มีคำอธิบายอย่างเป็นทางการว่าเหตุใดจึงใช้งานได้ แต่คล้ายกับวิธีที่คุณสามารถใช้margin: 0 autoสำหรับการจัดกึ่งกลางแนวนอน รายการ Flexbox เคารพระยะขอบและฉันเชื่อว่าmargin: autoจะวางตำแหน่งรายการโดยมีช่องว่างระหว่างพี่น้องให้มากที่สุด ดู: w3.org/TR/css-flexbox-1/#auto-margins
Josh Crozier

2
@ jo8691 ถ้าฉันจำไม่ผิดmargin: autoในรายการดิ้นบอกให้สร้างพื้นที่ในทิศทางนั้นให้มากที่สุด
George Mauer

1
ข้อมูลจำเพาะระบุว่า Prior to alignment via justify-content and align-self, any positive free space is distributed to auto margins in that dimension.
George Mauer

ฉันกำลังพยายามเรียนรู้เพิ่มเติมเกี่ยวกับ flexbox ดังนั้นจึงเป็นการดีที่จะเห็นข้อมูลอ้างอิงที่อธิบายลักษณะการทำงานนี้ โดยเฉพาะอย่างยิ่งมันมีจุดมุ่งหมายเช่นกันและไม่ใช่เรื่องแปลกประหลาดหรือผลข้างเคียง
j08691

60

หลักการ flexbox นี้ยังทำงานในแนวนอน

ในระหว่างการคำนวณฐานดิ้นและความยาวที่ยืดหยุ่นระยะขอบอัตโนมัติจะถือว่าเป็น 0
ก่อนที่จะจัดแนวผ่าน justify-content และ align-self พื้นที่ว่างเชิงบวกจะถูกกระจายไปยังระยะขอบอัตโนมัติในมิตินั้น

การตั้งค่าระยะขอบซ้ายอัตโนมัติสำหรับรายการสุดท้ายจะทำงาน

.last-item {
  margin-left: auto;
}

ตัวอย่างรหัส:

.container {
  display: flex;
  width: 400px;
  outline: 1px solid black;
}

p {
  height: 50px;
  width: 50px;
  margin: 5px;
  background-color: blue;
}

.last-item {
  margin-left: auto;
}
<div class="container">
  <p></p>
  <p></p>
  <p></p>
  <p class="last-item"></p>
</div>

Codepen Snippet

สิ่งนี้มีประโยชน์มากสำหรับส่วนท้ายของเดสก์ท็อป

อย่างที่Envatoทำที่นี่กับโลโก้ของ บริษัท

Codepen Snippet


3
ไม่แน่ใจว่าทำไมสิ่งนี้ถึงใช้งานได้จริง แต่มันช่วยฉันในโครงการ
Louis345

4
จะเกิดอะไรขึ้นถ้าฉันต้องการให้รายการทั้งหมดอยู่ตรงกลางและรายการสุดท้ายที่ด้านขวา?
Illorian
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.