Вирівняйте елемент вниз за допомогою флекси


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;?
Джонатан

12
@Jonathan обгортка не має фіксованої висоти. Якщо я вийму його з потоку, він перекриє текст
надмірний

2
@supersize старого Q, але ви могли б дати обгортку position:relative- це гуфі, тому що я думаю, що за замовчуванням це відносно, але ви встановили його для того, щоб абсолютне позиціонування дитини містилося. Тоді bottom:0підійде рум'янець.
Джексонкр

Джексонкр має рацію, це найкраще рішення, інші занадто довгі, занадто перекручені або не працюють належним чином
Barbz_YHOOL

2
@Jacksonkr за замовчуванням місце діва 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. Чи може хтось підтвердити?
Метью

@Oriol Мені подобається такий підхід, але не побічний ефект від втрати краху, що ви робите з цим?
Ніл

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
якщо ви хочете його внизу, переконайтеся, що встановіть напрямок згину на стовпчик.
Віліямі

3
Що робити, якщо я не можу забезпечити висоту?
Марк

Що для мене спрацювало просто: `` `. зміст {показ: флекс; флекс-напрямок: стовпчик; виправдати-зміст: флекс-енд; } <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 інших контейнера, з виправданням-content: space-between; ви кажете флексикс максимально відштовхувати контейнер один від одного (у цьому випадку обмежений висотою контейнера для вмісту)
ConquerorsHaki

це не реальний результат, у ньому буде пробіл між кожним елементом (звідси і назва)
Barbz_YHOOL

1
@Barbz_YHOOL Ні, це працює, якщо збільшити висоту контейнера (див. Оновлений приклад)
Тімо,

1
Після багато пошуків це просто ідеально! Дякую.
Руді

1
З невеликою модифікацією ця відповідь спрацювала для мене чудово, дякую
RealMJDev

2

Не впевнений у flexbox, але ви можете зробити це за допомогою властивості позиції.

набір батьківський div position: relative і дочірній елемент , який може бути <p>або і <h1>т.д .. комплект position: absoluteі bottom: 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?
Сенсорай

1
Хоча цей код може відповісти на питання, надаючи додатковий контекст щодо того, чому та / або як цей код відповідає на питання, покращує його довгострокове значення.
rollstuhlfahrer

1
Оновлена ​​відповідь.
Санджай Шр

0

введіть тут опис зображення

<section style="display:flex; flex-wrap:wrap;">
    <div style="display:flex; flex-direction:column; flex:1;">
        <button style="margin-top: auto;"/>
    </div>
    <div style="display:flex; flex-direction:column; flex:1;">
        <button style="margin-top: auto;"/>
    </div>
</section>

Демо: https://codepen.io/ferittuncer/pen/YzygpWX


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

Я просто знайшов для цього рішення.

для тих, хто не задоволений наведеними відповідями, можна спробувати цей підхід за допомогою флексбоксу

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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.