ทำ div div ที่เหลือ * ช่องว่าง * แนวนอนใน flexbox


205

ฉันมี 2 divs เคียงข้างกันใน flexbox มือขวาควรมีความกว้างเท่ากันเสมอและฉันต้องการให้มือซ้ายจับที่เหลือ แต่จะไม่เว้นแต่ฉันจะตั้งค่าความกว้างเป็นพิเศษ

ดังนั้นในขณะนี้มันถูกตั้งค่าเป็น 96% ซึ่งดูโอเคจนกระทั่งคุณสควอชหน้าจอจริงๆ - จากนั้น div มือขวาจะได้รับพื้นที่ที่ต้องการเล็กน้อย

ฉันเดาว่าฉันจะทิ้งมันไว้อย่างที่มันเป็น แต่มันก็รู้สึกผิด - เหมือนจะต้องมีวิธีพูด:

คนที่ใช่ก็เหมือนกันเสมอ คุณอยู่ทางซ้ายคุณจะได้ทุกอย่างที่เหลือ

.ar-course-nav {
  cursor: pointer;
  padding: 8px 12px 8px 12px;
  border-radius: 8px;
}
.ar-course-nav:hover {
  background-color: rgba(0, 0, 0, 0.1);
}
<br/>
<br/>
<div class="ar-course-nav" style="display:flex; justify-content:space-between;">
  <div style="width:96%;">
    <div style="overflow:hidden; white-space:nowrap; text-overflow:ellipsis;">
      <strong title="Course Name Which is Really Quite Long And Does Go On a Bit But Then When You Think it's Stopped it Keeps on Going for even longer!">
                Course Name Which is Really Quite Long And Does Go On a Bit But Then When You Think it's Stopped it Keeps on Going for even longer!
            </strong>
    </div>
    <div style="width:100%; display:flex; justify-content:space-between;">
      <div style="color:#555555; margin-right:8px; overflow:hidden; white-space:nowrap; text-overflow:ellipsis;" title="A really really really really really really really really really really really long department name">
        A really really really really really really really really really really really long department name
      </div>
      <div style="color:#555555; text-align:right; white-space:nowrap;">
        Created: 21 September 2016
      </div>
    </div>
  </div>
  <div style="margin-left:8px;">
    <strong>&gt;</strong>
  </div>
</div>

คำตอบ:


326

ใช้flex-growสถานที่ให้บริการที่จะทำให้รายการดิ้นกินพื้นที่ว่างบนแกนหลัก

คุณสมบัตินี้จะขยายรายการให้มากที่สุดปรับความยาวเป็นสภาพแวดล้อมแบบไดนามิกเช่นการปรับขนาดหน้าจอหรือการเพิ่ม / ลบรายการอื่น ๆ

ตัวอย่างที่พบบ่อยคือไม่ใช้สถานที่ให้บริการจดชวเลขที่flex-grow: 1flex: 1

ดังนั้นแทนที่จะwidth: 96%บน div flex: 1ของคุณใช้


คุณเขียน:

ดังนั้นในขณะนี้มันถูกตั้งค่าเป็น 96% ซึ่งดูโอเคจนกระทั่งคุณสควอชหน้าจอจริงๆ - จากนั้น div มือขวาจะได้รับพื้นที่ที่ต้องการเล็กน้อย

การบีบตัว div ที่มีความกว้างคงที่นั้นสัมพันธ์กับคุณสมบัติยืดหยุ่นอื่น: flex-shrink

โดยค่าเริ่มต้นรายการ flex จะถูกตั้งค่าให้flex-shrink: 1สามารถหดได้เพื่อป้องกันการล้นของคอนเทนเนอร์

flex-shrink: 0หากต้องการปิดการใช้งานคุณลักษณะนี้

ดูรายละเอียดเพิ่มเติมปัจจัยส่วนในคำตอบที่นี่:flex-shrink


เรียนรู้เพิ่มเติมเกี่ยวกับการจัดแนวโค้งตามแกนหลักที่นี่:

เรียนรู้เพิ่มเติมเกี่ยวกับการจัดแนวเฟล็กซ์ตามแนวแกนไขว้ที่นี่:


1
ฉันมีสถานการณ์เดียวกันและใช้ไม่ได้มีผลกระทบเหมือนกันกว่าflex-grow: 1 flex: 1คุณอาจจะรู้ว่าทำไมมันแตกต่างกันอย่างไร (ฉันแก้ไขปัญหาของฉันกับหลัง, ขอบคุณ)
WhGandalf

4
ด้วยการflex-grow: 1ที่flex-basisสถานที่ให้บริการยังคงอยู่ที่autoค่าเริ่มต้นของมัน ด้วยความflex: 1ที่คุณสมบัติการเปลี่ยนแปลงflex-basis 0ดูคำตอบของฉันที่นี่สำหรับการตรวจสอบในเชิงลึก: stackoverflow.com/q/43520932/3597276 @WhGandalf
Michael Benjamin

flex-shrink เป็นกุญแจสำคัญสำหรับฉัน :)
38790

26

โดยทั่วไปฉันพยายามทำให้รหัสของฉันมีส่วนตรงกลางที่ 'แถว' เพื่อปรับเนื้อหาโดยอัตโนมัติทั้งสองด้าน (ในกรณีของฉันคือตัวคั่นเส้นประ) เช่นเดียวกับ @Michael_B แนะนำให้ใช้คีย์display:flexในคอนเทนเนอร์แถวและอย่างน้อยต้องแน่ใจว่าคอนเทนเนอร์กลางของคุณในแถวมีflex-growค่าอย่างน้อย 1 สูงกว่าคอนเทนเนอร์ภายนอก (ถ้าคอนเทนเนอร์ภายนอกไม่มีflex-growคุณสมบัติใด ๆใช้คอนเทนเนอร์กลาง ต้องการเพียง 1 สำหรับflex-grow)

นี่คือรูปของสิ่งที่ฉันพยายามทำและโค้ดตัวอย่างสำหรับวิธีแก้ไข

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

ป้อนคำอธิบายรูปภาพที่นี่

.row {
  background: lightgray;
  height: 30px;
  width: 100%;
  display: flex;
  align-items:flex-end;
  margin-top:5px;
}
.left {
  background:lightblue;
}
.separator{
  flex-grow:1;
  border-bottom:dotted 2px black;
}
.right {
  background:coral;
}
<div class="row">
  <div class="left">Left</div>
  <div class="separator"></div>
  <div class="right">Right With Text</div>
</div>
<div class="row">
  <div class="left">Left With More Text</div>
  <div class="separator"></div>
  <div class="right">Right</div>
</div>
<div class="row">
  <div class="left">Left With Text</div>
  <div class="separator"></div>
  <div class="right">Right With More Text</div>
</div>

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