Выровняйте элемент снизу с помощью flexbox

376

У меня есть 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        |
 -------------------

Независимо от того, сколько текста в pI, я хочу прикрепить .buttonвсегда внизу, не вынимая его из потока. Я слышал, что это может быть достигнуто с Flexbox, но я не могу заставить его работать.

большегрузные
источник
7
Просто дайте это postition: absolute; bottom 0;?
Джонатан
12
@ Джонатан обертка не имеет фиксированной высоты. Если бы я вынул его из потока, он бы перекрыл текст
суперразмер
2
@supersize old Q, но вы могли бы дать обертку position:relative- это глупо, потому что я думаю, что по умолчанию это относительно, но вы установили SET для того, чтобы ограничить абсолютное позиционирование ребенка. Тогда bottom:0подойдет флеш.
Джексонкр
Джексонкр прав, это ЛУЧШЕЕ решение, другие слишком длинные, слишком запутанные или неправильно
работают
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. Кто-нибудь может подтвердить?
Мэтью
@ Ориол Мне нравится этот подход, но не побочный эффект потери коллапса, что бы вы сделали по этому поводу?
Нил
11
Flex-Grow работал на меня. Вот как я это сделал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
если вы хотите, чтобы это было внизу, убедитесь, что для flex-direction установлено значение столбца.
Вильями,
3
Что делать, если я не могу указать высоту?
Марк
То, что работало для меня, было просто: `` `. content {display: flex; flex-direction: столбец; justify-content: 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>

Timo
источник
1
content - контейнер столбца, который содержит 2 других контейнера, с justify-content: space -ween; вы говорите флексбоксу, насколько необходимо оттолкнуть контейнер друг от друга (в данном случае он ограничен высотой контейнера содержимого)
ConquerorsHaki
это не реальный результат, он будет иметь место между каждым элементом (отсюда и название)
Barbz_YHOOL
1
@Barbz_YHOOL Нет, это работает, если вы увеличиваете высоту контейнера (см. Обновленный пример)
Тимо
1
После долгих поисков это просто идеально! Спасибо.
Руди
1
С небольшой модификацией этот ответ отлично сработал для меня, спасибо
RealMJDev
2

Не уверен насчет flexbox, но вы можете сделать это с помощью свойства position.

установить родительский 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?
Sensoray
1
Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, почему и / или как этот код отвечает на вопрос, повышает его долгосрочную ценность.
Rollstuhlfahrer
1
Обновленный ответ.
Санджай Шр
1

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

<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

Ferit
источник
0

При настройке дисплея на изгиб можно просто использовать flexсвойство, чтобы указать, какой контент может расти, а какой нет.

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>
Aj Go
источник