จัดองค์ประกอบให้อยู่ด้านล่างสุดด้วย flexbox


374

ฉันมีลูกdivกับ:

<div class="content">
  <h1>heading 1</h1>
  <h2>heading 2</h2>
  <p>Some more or less text</p>
  <a href="/" class="button">Click me</a>
</div>

และฉันต้องการเค้าโครงต่อไปนี้:

 -------------------
|heading 1          |
|heading 2          | 
|paragraph text     |
|can have many      |
|rows               |
|                   |
|                   |
|                   | 
|link-button        |
 -------------------

ไม่ว่าจะมีข้อความมากแค่ไหนในpฉันต้องการที่จะติด.buttonที่ด้านล่างเสมอโดยไม่ทำให้มันไหลออกมา ฉันได้ยินมาว่าสิ่งนี้สามารถทำได้ด้วย Flexbox แต่ฉันไม่สามารถใช้งานได้


7
เพียงแค่ให้มันpostition: absolute; bottom 0;?
Jonathan

12
@Janathan the wrapper ไม่มีความสูงคงที่ ถ้าฉันเอามันออกมามันจะทับข้อความ
ใหญ่ขึ้น

2
@supersize Q เก่า แต่คุณสามารถให้เสื้อคลุมposition:relative- มันโง่เพราะฉันคิดว่ามันสัมพันธ์กันโดยปริยาย แต่คุณมี SET เพื่อให้การวางตำแหน่งที่แน่นอนของเด็กอยู่ จากนั้นbottom:0จะพอดีล้าง
Jacksonkr

Jacksonkr ถูกต้องนี่คือทางออกที่ดีที่สุดคนอื่น ๆ ยาวเกินไปซับซ้อนเกินไปหรือไม่ทำงานอย่างถูกต้อง
4259 Barbz_YHOOL

2
@Jacksonkr ตำแหน่งเริ่มต้นของ div เป็นไม่ได้static relative
ขนาด

คำตอบ:


641

คุณสามารถใช้ระยะขอบอัตโนมัติ

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

ดังนั้นคุณสามารถใช้หนึ่งในเหล่านี้ (หรือทั้งสองอย่าง):

p { margin-bottom: auto; } /* Push following elements to the bottom */
a { margin-top: auto; } /* Push it and following elements to the bottom */

หรือคุณสามารถสร้างองค์ประกอบก่อนการaเติบโตเพื่อเติมพื้นที่ว่าง:

p { flex-grow: 1; } /* Grow to fill available space */


2
สำหรับฉันมันใช้งานได้ใน Chrome แต่ไม่ใช่ใน Safari บน iOS 10.2 มีใครยืนยันได้บ้าง
Matthew

@Oriol ฉันชอบวิธีนี้ แต่ไม่ใช่ผลข้างเคียงของการสูญเสียระยะขอบคุณจะทำอย่างไรกับเรื่องนี้
Neil

11
ทำงานแบบยืดหยุ่นสำหรับฉัน นี่คือวิธีที่ฉันทำhtml { height: 100%; } body { min-height: 100%; display: flex; flex-direction: column; } #site-content { flex: 1; }
protoEvangelion

2
นอกจากนี้โปรดทราบด้วยว่าอย่าลืมheight: 100%องค์ประกอบหลักที่คุณพยายามผลักดันบางสิ่งลงไปด้วยmargin-top: auto;
skolind

1
"พื้นที่ว่างในเชิงบวกใด ๆ ถูกแจกจ่ายไปยังระยะขอบอัตโนมัติในมิตินั้น" มันเป็นสิ่งเล็ก ๆ น้อย ๆ เช่นนี้ที่หรูหรามากสำหรับฉันโซลูชันนี้คือโค้ด 2 บรรทัดตามคำตอบของคุณ ขอบคุณ :)
danjah

146

คุณสามารถใช้ display: flex เพื่อจัดวางองค์ประกอบไปที่ด้านล่าง แต่ฉันไม่คิดว่าคุณต้องการใช้ flex ในกรณีนี้เนื่องจากจะมีผลกับองค์ประกอบทั้งหมดของคุณ

ในการจัดตำแหน่งองค์ประกอบไปที่ด้านล่างโดยใช้ flex ลองทำดังนี้:

.container {
  display: flex;
}

.button {
  align-self: flex-end;
}

ทางออกที่ดีที่สุดของคุณคือการกำหนดตำแหน่ง: แน่นอนกับปุ่มและตั้งค่าเป็นbottom: 0หรือคุณสามารถวางปุ่มนอกคอนเทนเนอร์และใช้ค่าลบtransform: translateY(-100%)เพื่อนำมาไว้ในคอนเทนเนอร์ดังนี้:

.content {
    height: 400px;
    background: #000;
    color: #fff;
}
.button {
    transform: translateY(-100%);
    display: inline-block;
}

ตรวจสอบJSFiddleนี้


6
หากคุณต้องการที่ด้านล่างตรวจสอบให้แน่ใจว่าได้ตั้งค่าทิศทางการโค้งเป็นคอลัมน์
46770 Viliami

3
ถ้าฉันไม่สามารถให้ความสูงได้ล่ะ?
ทำเครื่องหมาย

สิ่งที่ได้ผลสำหรับฉันก็คือ: `` ` เนื้อหา {display: flex; ดิ้นทิศทาง: คอลัมน์; ปรับเนื้อหา: flex-end; } <div class = "content"> <a class="bottom"> บางสิ่งบางอย่าง </a> </div> `` `
gsalgadotoledo

84

วิธีแก้ปัญหาalign-self: flex-end;ไม่ได้ผลสำหรับฉัน แต่วิธีนี้ใช้ได้ในกรณีที่คุณต้องการใช้ flex:

ผลลัพธ์

 -------------------
|heading 1          |
|heading 2          | 
|paragraph text     |
|                   |
|                   |
|                   | 
|link button        |
 -------------------

รหัส

หมายเหตุ:เมื่อ "เรียกใช้ข้อมูลโค้ด" คุณต้องเลื่อนลงเพื่อดูลิงค์ที่ด้านล่าง

.content {
  display: flex;
  justify-content: space-between;
  flex-direction: column;
  height: 300px;
}

.content .upper {
  justify-content: normal;
}

/* Just to show container boundaries */
.content .upper, .content .bottom, .content .upper > * {
  border: 1px solid #ccc;
}
<div class="content">
  <div class="upper">
	  <h1>heading 1</h1>
	  <h2>heading 2</h2>
	  <p>paragraph text</p>
  </div>

  <div class="bottom">
	  <a href="/" class="button">link button</a>
  </div>
</div>


1
content เป็นคอนเทนเนอร์คอลัมน์ซึ่งมี 2 คอนเทนเนอร์อื่น ๆ โดยมี justify-content: space-between; คุณบอก flexbox เพื่อผลักดันภาชนะออกจากกันเท่าที่จะทำได้ (ในกรณีนี้ถูก จำกัด โดยความสูงของที่บรรจุเนื้อหา)
ConquerorsHaki

นั่นไม่ใช่ผลลัพธ์ที่แท้จริงมันจะมีช่องว่างระหว่างแต่ละรายการ (ด้วยเหตุนี้ชื่อ)
Barbz_YHOOL

1
@Barbz_YHOOL ไม่มันใช้งานได้ถ้าคุณเพิ่มความสูงของคอนเทนเนอร์ (ดูตัวอย่างที่อัปเดตแล้ว)
Timo

1
หลังจากค้นหามากแล้วมันก็สมบูรณ์แบบ! ขอบคุณ.
Rudy

1
ด้วยการดัดแปลงเล็กน้อยคำตอบนี้ใช้ได้อย่างสมบูรณ์แบบสำหรับฉันขอบคุณ
RealMJDev

2

ไม่แน่ใจเกี่ยวกับ flexbox แต่คุณสามารถใช้คุณสมบัติตำแหน่งได้

ชุดผู้ปกครองdiv position: relative และองค์ประกอบลูกซึ่งอาจจะมี<p>หรือ<h1>ฯลฯ .. ชุดและposition: absolutebottom: 0

ตัวอย่าง:

index.html

<div class="parent">
  <p>Child</p>
</div>

style.css

.parent {
  background: gray;
  width: 10%;
  height: 100px;    
  position: relative;
}
p {
  position: absolute;
  bottom: 0;
}

รหัสปากกาที่นี่


1
position:fixedจะไม่ทำงานเพราะถ้าอย่างนั้นมันจะไม่สัมพันธ์กับที่บรรจุอยู่บางทีคุณอาจหมายถึงposition:absoluteอะไร
Sensoray

1
ในขณะที่รหัสนี้อาจตอบคำถาม แต่มีบริบทเพิ่มเติมเกี่ยวกับสาเหตุและ / หรือวิธีการที่รหัสนี้ตอบคำถามช่วยปรับปรุงมูลค่าระยะยาว
rollstuhlfahrer

1
อัปเดตคำตอบ
Sanjay Shr


0

เมื่อตั้งค่าการแสดงผลเป็นแบบยืดหยุ่นคุณสามารถใช้flexคุณสมบัติเพื่อทำเครื่องหมายเนื้อหาที่สามารถเติบโตและเนื้อหาที่ไม่สามารถทำได้

คุณสมบัติยืดหยุ่น

div.content {
 height: 300px;
 display: flex;
 flex-direction: column;
}

div.up {
  flex: 1;
}

div.down {
  flex: none;
}
<div class="content">
  <div class="up">
    <h1>heading 1</h1>
    <h2>heading 2</h2>
    <p>Some more or less text</p>
  </div>

  <div class="down">
    <a href="/" class="button">Click me</a>
  </div>
</div>


-1

ลองสิ่งนี้

.content {
      display: flex;
      flex-direction: column;
      height: 250px;
      width: 200px;
      border: solid;
      word-wrap: break-word;
    }

   .content h1 , .content h2 {
     margin-bottom: 0px;
    }

   .content p {
     flex: 1;
    }
   <div class="content">
  <h1>heading 1</h1>
  <h2>heading 2</h2>
  <p>Some more or less text</p>
  <a href="/" class="button">Click me</a>
</div>


-1

ฉันเพิ่งพบทางออกสำหรับสิ่งนี้

สำหรับผู้ที่ไม่พอใจกับคำตอบที่กำหนดสามารถลองใช้วิธีนี้กับ flexbox

CSS

    .myFlexContainer {
        display: flex;
        width: 100%;
    }

    .myFlexChild {
        width: 100%;
        display: flex;

        /* 
         * set this property if this is set to column by other css class 
         *  that is used by your target element 
         */
        flex-direction: row;

        /* 
         * necessary for our goal 
         */
        flex-wrap: wrap;
        height: 500px;
    }

    /* the element you want to put at the bottom */
    .myTargetElement {
        /*
         * will not work unless flex-wrap is set to wrap and 
         * flex-direction is set to row
         */
        align-self: flex-end;
    }

HTML

    <div class="myFlexContainer">
        <div class="myFlexChild">
            <p>this is just sample</p>
            <a class="myTargetElement" href="#">set this to bottom</a>
        </div>
    </div>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.