CSS จัดรายการหนึ่งรายการให้ตรงกับ flexbox


212

https://jsfiddle.net/vhem8scs/

เป็นไปได้หรือไม่ที่จะจัดแนวรายการสองรายการไว้ทางซ้าย ลิงก์แสดงอย่างชัดเจนยิ่งขึ้น ตัวอย่างสุดท้ายคือสิ่งที่ฉันต้องการบรรลุ

ใน flexbox ฉันมีหนึ่งบล็อคของโค้ด ด้วย float ฉันมีโค้ดสี่บล็อก นั่นเป็นเหตุผลหนึ่งว่าทำไมฉันถึงชอบ flexbox

HTML

<div class="wrap">
  <div>One</div>
  <div>Two</div>
  <div>Three</div>
</div>

<!-- DESIRED RESULT -->

<div class="result">
  <div>One</div>
  <div>Two</div>
  <div>Three</div>
</div>

CSS

.wrap {
  display: flex;
  background: #ccc;
  width: 100%;
  justify-content: space-between;
}

.result {
  background: #ccc;
  margin-top: 20px;
}

.result:after {
  content: '';
  display: table;
  clear: both;
}

.result div {
  float: left;
}
.result div:last-child {
  float: right;
}

คำตอบ:


524

ในการจัดตำแหน่งเด็กงอหนึ่งชุดให้อยู่ทางขวาmargin-left: auto;

จากข้อมูลจำเพาะดิ้น :

การใช้ระยะขอบอัตโนมัติหนึ่งครั้งในแกนหลักคือการแยกรายการเฟล็กซ์ออกเป็น "กลุ่ม" ที่แตกต่างกัน ตัวอย่างต่อไปนี้แสดงวิธีใช้สิ่งนี้เพื่อสร้างรูปแบบ UI ทั่วไป - แถบการกระทำเดียวที่มีการจัดตำแหน่งทางซ้ายและแนวอื่นทางด้านขวา

.wrap div:last-child {
  margin-left: auto;
}

อัพเดทซอ

บันทึก:

คุณสามารถบรรลุผลที่คล้ายกันได้โดยการตั้งค่า flex-grow: 1 บนไอเท็มเฟล็กกลาง (หรือชวเลขflex:1) ซึ่งจะผลักไอเท็มสุดท้ายไปทางขวา ( สาธิต )

ความแตกต่างที่เห็นได้ชัดคือรายการกลางนั้นใหญ่กว่าที่จำเป็นต้องมี เพิ่มเส้นขอบให้กับรายการ flex เพื่อดูความแตกต่าง

การสาธิต


ขอบคุณ! ฉันลองสิ่งอื่นที่ใช้ได้ก่อนที่จะอ่าน มันเป็นการตั้งค่า flex-grow: 1 บนองค์ประกอบที่ควรผลักดันอีก มันทำงานได้ดี คุณรู้หรือไม่ว่าอันไหนดีกว่าและเพราะอะไร
Jens Törnell

2
คำตอบที่ดี ดังนั้นระยะขอบจึงไม่เพิ่มพื้นที่ว่างและความยืดหยุ่น: 1 เย็น!
Jens Törnell

4
@ JensTörnell autoระยะขอบใช้พื้นที่ว่างในคอนเทนเนอร์เพื่อแยกรายการเฟล็กซ์ กระบวนการflex-grow/ flexคุณสมบัติใช้พื้นที่ว่างนั้นมอบให้กับไอเท็มเฟล็กซ์ซึ่งขยายตามจำนวนนั้น ตามที่กล่าวไว้โดย Danield วิธีหลังทำให้โปรแกรม flex สองใหญ่ขึ้นซึ่งคุณอาจไม่ต้องการ
Michael Benjamin

12
ไม่ใช่ฮีโร่ทุกคนที่สวมเสื้อคลุม
Tom

2
@ user1063287 เพื่อจัดองค์ประกอบหลายองค์ประกอบทางด้านขวาเพียงใช้ระยะขอบซ้าย: อัตโนมัติในองค์ประกอบแรกซึ่งจะต้องจัดชิดขวา สมมุติว่าคุณต้องการให้องค์ประกอบทั้ง 4 เรียงชิดกับด้านขวาคุณทำสิ่งนี้: div:nth-last-child(4) { margin-left: auto } codepen.io/danield770/pen/ERyoar
Danield

37

สำหรับตัวเลือกเฟล็กบ็อกซ์แบบสั้น ๆ ให้จัดกลุ่มรายการที่จัดชิดซ้ายและรายการที่จัดชิดขวา:

<div class="wrap">
  <div>
    <span>One</span>
    <span>Two</span>
  </div>
  <div>Three</div>
</div>

และใช้space-between:

.wrap {
  display: flex;
  background: #ccc;
  justify-content: space-between;
}

วิธีนี้คุณสามารถจัดกลุ่มหลายรายการทางด้านขวา (หรือเพียงรายการเดียว)

https://jsfiddle.net/c9mkewwv/3/


วิธีนี้ใช้งานได้ แต่ถ้าคุณไม่เปลี่ยนองค์ประกอบภายในแต่ละกลุ่มให้เป็นdisplay: inline;หรือdisplay: inline-block;พวกมันจะถูกซ้อนกันแทนที่จะเป็นแถวเหมือน flexbox มิฉะนั้นจะมีพวกมันอยู่ด้วย
DIMM Reaper

@TheDIMMReaper ฉันไม่แน่ใจว่าฉันเห็นปัญหา คุณสามารถขยายหรือไม่
spflow

ฉันแค่หมายถึงว่าคุณเปลี่ยนแท็กที่ห่อOneและTwoจากdivs เป็นspans ได้อย่างไรหากยังคงอยู่แท็กเหล่าdisplay: block;นั้นจะไหลไปยังบรรทัดอื่น เนื่องจากเดิม OP มีdivs ฉันแค่ต้องการชี้ให้เห็นว่าเพียงแค่วางไว้ในที่อื่นdivจะไม่ทำงานโดยไม่เปลี่ยนการแสดงแท็กเดิม
DIMM Reaper

1
ใช่ตั้งแต่ตอนนี้องค์ประกอบต่างๆอยู่ในระดับที่ต่ำกว่าdisplay: flexจะไม่มีผลต่อเลย์เอาต์ของพวกเขาอีกต่อไป หากคุณต้องการใช้ div ของใช่inlineหรือinline-blockจะทำงานได้ แต่เห็นได้ชัดว่าflexเนื่องจากเราใช้เพื่อค่าเริ่มต้นflex-direction: rowกับ div div แล้ว อดีต jsfiddle.net/ynbb5964/2
โฟล์

ขอบคุณฉันลองจัดตำแหน่งตัวเอง: flex-end แต่ทำไมมันไม่ทำงาน?
Anand

3

เพื่อจัดองค์ประกอบบางอย่าง (headerElement) ในศูนย์และองค์ประกอบสุดท้ายไปทางขวา (headerEnd)

.headerElement {
    margin-right: 5%;
    margin-left: 5%;
}
.headerEnd{
    margin-left: auto;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.