フレックスボックスで要素を下に揃えます


375

私には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ます。デフォルトでは相対的であると思うので間抜けですが、子の絶対位置を含めるためにSETを使用しています。その後、bottom:0ぴったりフィットします。
ジャクソンクル

Jacksonkrは正解です。これが最良のソリューションです。他のソリューションは長すぎる、複雑すぎる、または正しく動作しない
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では機能しますが、iOS 10.2のSafariでは機能しません。誰か確認できますか?
2016

@オリオール私はこのアプローチが好きですが、折りたたみマージンが失われる副作用はありません。これについてどうしますか?
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 2018

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
下部に配置する場合は、フレックス方向をcolumnに設定してください。
Viliami 2017年

3
高さを提供できない場合はどうなりますか?
マーク

私のために働いたのはちょうど `` `でした。content {display:flex; フレックス方向:列; 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>


1
contentは、他の2つのコンテナーを保持する列コンテナーで、justify-content:space-between; コンテナを可能な限り互いに離れるようにフレックスボックスに指示します(この場合、コンテンツコンテナの高さによって制限されます)
ConquerorsHaki

これは実際の結果ではありません。各項目の間にスペースがあるため(名前が付けられます)
Barbz_YHOOL

1
@Barbz_YHOOLいいえ、コンテナの高さを上げると機能します(更新された例を参照)
Timo

1
たくさん検索した後、これは完璧です!ありがとうございました。
Rudy

1
少し変更を加えれば、この回答は私にとって完璧に機能しました。ありがとう
RealMJDev

2

flexboxについては不明ですが、positionプロパティを使用して行うことができます。

またはなどの親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 2018年

1
このコードは質問に答えることがありますが、このコードが質問に答える理由や方法に関する追加のコンテキストを提供すると、長期的な価値が向上します。
rollstuhlfahrer 2018年

1
回答を更新しました。
Sanjay Shr 2018年

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


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

私はこれに対する解決策を見つけました。

与えられた答えに満足していない人のために、フレックスボックスでこのアプローチを試すことができます

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.