divのコンテンツを下に揃える方法


1164

次のCSSおよびHTMLコードがあるとします。

#header {
  height: 150px;
}
<div id="header">
  <h1>Header title</h1>
  Header content (one or multiple lines)
</div>

ヘッダーセクションの高さは固定されていますが、ヘッダーの内容が変わる場合があります。

ヘッダーのコンテンツをヘッダーセクションの下部に垂直方向に揃えて、テキストの最後の行がヘッダーセクションの下部に「固定」されるようにしたいと考えています。

したがって、テキストが1行しかない場合は、次のようになります。

-----------------------------
| ヘッダーのタイトル
|
|
|
| ヘッダーの内容(結果は1行になります)
-----------------------------

そして、3つの行がある場合:

-----------------------------
| ヘッダーのタイトル
|
| ヘッダーコンテンツ(そうです
| それが完璧であることの多くのもの
| 3行にまたがる)
-----------------------------

CSSでこれを行うにはどうすればよいですか?

回答:


1322

相対+絶対配置が最善の策です。

#header {
  position: relative;
  min-height: 150px;
}

#header-content {
  position: absolute;
  bottom: 0;
  left: 0;
}

#header, #header * {
  background: rgba(40, 40, 100, 0.25);
}
<div id="header">
  <h1>Title</h1>
  <div id="header-content">Some content</div>
</div>

しかし、それで問題が発生する可能性があります。試したところ、コンテンツの下に表示されるドロップダウンメニューに問題がありました。それはただきれいではありません。

正直なところ、垂直方向のセンタリングの問題や、アイテムの垂直方向の配置の問題は高さが固定されていないため、テーブルを使用する方が簡単です。

例:テーブルを使用せずにこのHTMLレイアウトを実行できますか?


4
ここで尋ねる前に実際にその解決策を見つけましたが、どういうわけか位置を追加するのを忘れていました。ヘッダーdivに移動し、コンテンツはページの下部に表示され続けます。ありがとう
kristof 2009

15
ドロップダウン位置をz-indexプロパティで管理して、前面に表示できます。z-indexプロパティは、相対的または絶対的に配置された要素で機能することに注意してください。また、意味論的に言えば、レイアウト結果を達成するためにテーブルを使用することは正しくありません。
アレハンドロガルシアイグレシアス

1
元の問題で説明されているテキストコンテンツの場合、#header-contentは実際にはp要素であるか、少なくともaである必要がありますspan
Josh Burgess 14

2
非表形式のデータにテーブルを使用しないでください!代わりに、CSS表示プロパティdisplay: table-cell、またはtable-row、またはを使用してくださいtable。純粋なレイアウトにテーブルを使用する必要はもうありません。
Jeremy Moritz

1
ヘッダーの位置は何を基準にしていますか?
stack1

158

CSSポジショニングを使用:

/* Creates a new stacking context on the header */
#header {
  position: relative;
}

/* Positions header-content at the bottom of header's context */
#header-content {
  position: absolute;
  bottom: 0;
}

cletusが指摘したように、これを機能させるにはヘッダーコンテンツを特定する必要があります。

<span id="header-content">some header content</span>

<div style="height:100%; position:relative;">
    <div style="height:10%; position:absolute; bottom:0px;">bottom</div>
</div>

4
fyi ...これにより、ヘッダーコンテンツの幅が縮小したためwidth = '100%'、ヘッダーコンテンツにaを追加する必要がありました
dsdsdsdsd

2
@dsdsdsdsd#header-contentにdisplay:blockを追加して修正することもできます。
Patrick McElhaney 2014

1
@dsdsdsdsdその理由は、<span>要素にはdisplay: inline;デフォルトでコンテナの全幅を占めないためです。最も適切な修正は、スパンをに変更すること<div>です。これは、デフォルトではブロック要素です。
BadHorsie 2017

1
または、<h1>-<h6>の1つ。これもデフォルトでブロックされ、テキストをヘッダーとして識別します。これは、検索エンジン、支援技術、およびコードを読む人々に役立ちます。
Patrick McElhaney 2017

下部のコンテンツの高さが可変の場合は機能せず、コンテナの境界からはみ出します。
Mozfet

126

レガシーブラウザについて心配していない場合は、フレックスボックスを使用してください。

親要素には、表示タイプをflexに設定する必要があります

div.parent {
  display: flex;
  height: 100%;
}

次に、子要素のalign-selfをflex-endに設定します。

span.child {
  display: inline-block;
  align-self: flex-end;
}

これが私が学習に使用したリソースです:http : //css-tricks.com/snippets/css/a-guide-to-flexbox/


@bafromca、動作しない2つの理由。1:align-itemsの代わりに 'align-self'を使用します(私のせいで、元の投稿を編集しました)。2:親に高さがなければ、100%の高さは機能しません。
Lee Irvine、

うまくいきませんでした。コンテナ内のアイテムの最後ではなく、コンテナの下部に配置します。
Mozfet

2020年には、これが正しい答えになるはずです。caniuse.com

119

私はこれらのプロパティを使用し、それが機能します!

#header {
  display: table-cell;
  vertical-align: bottom;
}

42
IE8以前ではサポートされていません。IE9でサポートされています。
random_user_name

23
@cale_bによるcaniuse.comそれはDOES IE8で仕事を。
Zach Lysobey 2013

5
@ZachL Happenstance-企業のクライアント向けにIE8でレガシーアプリをサポートしていますが、これは実際に機能します。
Daniel Szabo

4
@fguillen:Chrome(v31)でもテストされました。そこでも動作します。
Daniel Szabo

5
table-cell多くのものを壊します。ブートストラップグリッドシステムのように。col-md-12100%幅のdivはもう提供されません。
ノア

65

この同じ問題にしばらく取り組んだ後、ようやく私の要件のすべてを満たすソリューションを見つけました。

  • コンテナの高さを知っている必要はありません。
  • 相対+絶対ソリューションとは異なり、コンテンツはそれ自体のレイヤーに浮かびません(つまり、通常はコンテナーdivに埋め込まれます)。
  • ブラウザ間で動作します(IE8 +)。
  • 実装が簡単です。

解決策は1つだけです<div>。これを「アライナー」と呼びます。

CSS

.bottom_aligner {
    display: inline-block;
    height: 100%;
    vertical-align: bottom;
    width: 0px;
}

html

<div class="bottom_aligner"></div>
... Your content here ...

このトリックは、テキストベースラインをコンテナーの下部にプッシュする背の高い細いdivを作成することで機能します。

これは、OPが求めていたものを達成する完全な例です。「bottom_aligner」は、デモンストレーションのみを目的として厚く赤くしています。

CSS:

.outer-container {
  border: 2px solid black;
  height: 175px;
  width: 300px;
}

.top-section {
  background: lightgreen;
  height: 50%;
}

.bottom-section {
  background: lightblue;
  height: 50%;
  margin: 8px;
}

.bottom-aligner {
  display: inline-block;
  height: 100%;
  vertical-align: bottom;
  width: 3px;
  background: red;
}

.bottom-content {
  display: inline-block;
}

.top-content {
  padding: 8px;
}

HTML:

<body>
  <div class="outer-container">
    <div class="top-section">
      This text
      <br> is on top.
    </div>
    <div class="bottom-section">
      <div class="bottom-aligner"></div>
      <div class="bottom-content">
        I like it here
        <br> at the bottom.
      </div>
    </div>
  </div>
</body>

下のコンテンツを揃える


ほとんど完璧です:)しかし、自動改行は許可されていません。
Gaston Sanchez

外部コンテナがスクロールできる場合は機能しません(overflow-y:auto)。:(
ecraig12345

私は推測するマリン:8pxがあるべきマージン:8px
グラハム・ペラン

2
これは、::beforeルールを追加した場合にも機能します。これにより、余分な要素が不要になります。最後にflexを使用しましたが、使用できない場合に役立ちます。
Sheepy

これは本当に素晴らしい解決策です。これheightは、ボックス/コンテナその親の(pxまたは%などに)が設定されている場合にのみ機能します。
BairDev 2017年

38

それを行う最新の方法はflexboxを使用することです。以下の例を参照してください。Some text...フレックスコンテナーに直接含まれているテキストは匿名のフレックスアイテムにラップされるため、HTMLタグにラップする必要はありません。

header {
  border: 1px solid blue;
  height: 150px;
  display: flex;                   /* defines flexbox */
  flex-direction: column;          /* top to bottom */
  justify-content: space-between;  /* first item at start, last at end */
}
h1 {
  margin: 0;
}
<header>
  <h1>Header title</h1>
  Some text aligns to the bottom
</header>

一部のテキストしかなく、コンテナの下部に垂直に揃えたい場合。

section {
  border: 1px solid blue;
  height: 150px;
  display: flex;                   /* defines flexbox */
  align-items: flex-end;           /* bottom of the box */
}
<section>Some text aligns to the bottom</section>


2
下揃えの要素がドキュメントフローにまだ存在している必要がありましたposition:absolute;。これは、では使用できません。この解決策は私の場合には完璧に機能しました!
スウェン

1
反応コンポーネントの内部では、これが適切なソリューションです。受け入れられたソリューションは失敗します。
Soleil-MathieuPrévot2018年

1
これは実際に私のために働いた唯一の解決策です。@Soleilが述べたように、それはReactに関係しているのかもしれません...私はCSSの専門家ではないので、完全にはわかりません。
BK

反応コンポーネントで完全に動作します
user1155773

25

親/ブロック要素の行の高さがインライン要素の行の高さより大きい場合、インライン要素またはインラインブロック要素をブロックレベル要素の下部に揃えることができます。*

マークアップ:

<h1 class="alignBtm"><span>I'm at the bottom</span></h1>

css:

h1.alignBtm {
  line-height: 3em;
}
h1.alignBtm span {
  line-height: 1.2em;
  vertical-align: bottom;
}

*標準モードになっていることを確認してください


25
display: flex;
align-items: flex-end;

2
flexboxは古いブラウザでは十分にサポートされていないことに注意してください。
AnthonyB

11
@AnthonyB-古いと定義しますか?開発者としてこの記録を変更する必要があります。テクノロジーは進歩し、古いものは生き残ることができません。IE9と10には、私が見ることができるものからのフレックスに関する問題がありますが、それらはそれぞれ2011年と2012年にリリースされました...それは2017年です。これらの古いブラウザーと壊れたブラウザーを手放す必要があります。視覚的な満足感のためではなく、セキュリティと一般的なソフトウェアの更新のためです。
ティッシュ

3
@Tischあなたは私たちが開発者としてまともな最新のテクノロジーを使用しなければならないことは絶対に正しいことです。しかし、驚かないように、この互換性の問題について警告します。
AnthonyB 2017

下のコンテンツ<h1>がの中にある<p>場合、または<div>私が使用する場合justify-content: space-between
agapitocandemor 2018年

11

簡単にフレックスを達成できます

header {
  border: 1px solid blue;
  height: 150px;
  display: flex;                   /* defines flexbox */
  flex-direction: column;          /* top to bottom */
  justify-content: space-between;  /* first item at start, last at end */
}
h1 {
  margin: 0;
}
<header>
  <h1>Header title</h1>
  Some text aligns to the bottom
</header>


6

複数の動的な高さのアイテムがある場合は、テーブルとテーブルセルのCSS表示値を使用します。

HTML

<html>
<body>

  <div class="valign bottom">
    <div>

      <div>my bottom aligned div 1</div>
      <div>my bottom aligned div 2</div>
      <div>my bottom aligned div 3</div>

    </div>
  </div>

</body>
</html>

CSS

html,
body {
  width: 100%;
  height: 100%;
}
.valign {
  display: table;
  width: 100%;
  height: 100%;
}
.valign > div {
  display: table-cell;
  width: 100%;
  height: 100%;
}
.valign.bottom > div {
  vertical-align: bottom;
}

ここにJSBinデモを作成しました:http ://jsbin.com/INOnAkuF/2/edit

デモには、同じ手法を使用して垂直方向に中央揃えする方法の例も含まれています。


5

これはflexboxを使用する別のソリューションですが、下揃えにflex-endを使用しません。アイデアはmargin-bottomh1autoに設定して、残りのコンテンツを一番下にプッシュすることです。

#header {
  height: 350px;
  display:flex;
  flex-direction:column;
  border:1px solid;
}

#header h1 {
 margin-bottom:auto;
}
<div id="header">
  <h1>Header title</h1>
  Header content (one or multiple lines) Header content (one or multiple lines)Header content (one or multiple lines) Header content (one or multiple lines)
</div>

margin-top:autoテキストでも同じことができますが、この場合は、divまたは内にラップする必要がありますspan

#header {
  height: 350px;
  display:flex;
  flex-direction:column;
  border:1px solid;
}

#header span {
 margin-top:auto;
}
<div id="header">
  <h1>Header title</h1>
  <span>Header content (one or multiple lines)</span>
</div>


パーフェクト!グラシアス
グレースニコル

4

これには絶対+相対は必要ありません。コンテナーとデータの両方の相対位置を使用することは非常に可能です。これがあなたのやり方です。

データの高さがになると仮定しますx。コンテナは相対的で、フッターも相対的です。あなたがしなければならないすべてはあなたのデータに追加することです

bottom: -webkit-calc(-100% + x);

データは常にコンテナの一番下にあります。動的な高さのコンテナがある場合でも機能します。

HTMLはこのようになります

<div class="container">
  <div class="data"></div>
</div>

CSSはこのようになります

.container{
  height:400px;
  width:600px;
  border:1px solid red;
  margin-top:50px;
  margin-left:50px;
  display:block;
}
.data{
  width:100%;
  height:40px;
  position:relative;
   float:left;
  border:1px solid blue;
  bottom: -webkit-calc(-100% + 40px);
   bottom:calc(-100% + 40px);
}

ここでライブ例

お役に立てれば。


bottom: -webkit-calc(-100% + x);をしているのか説明できますか?
mhatch '19

@mhatchコンテナの下部にフッターを保持します。
Aditya Ponkshe 2017年

4

これは柔軟な方法です。もちろん、ユーザーが7年前に必要だったため、IE8ではサポートされていません。何をサポートする必要があるかに応じて、これらのいくつかは廃止できます。

それでも、外側のコンテナーなしでこれを行う方法があったら、それ自体のテキスト内でテキスト自体を整列させるだけでよいでしょう。

#header {
    -webkit-box-align: end;
    -webkit-align-items: flex-end;
    -ms-flex-align: end;
    align-items: flex-end;
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    height: 150px;
}

4

非常にシンプルな1行のソリューションは、divのすべてのテキストが下になることを念頭に置いて、divに行の高さを追加することです。

CSS:

#layer{width:198px;
       height:48px;
       line-height:72px;
       border:1px #000 solid}
#layer a{text-decoration:none;}

HTML:

<div id="layer">
    <a href="#">text at div's bottom.</a>
</div>

これは、div内のテキストだけを下げたい場合の実用的で高速なソリューションです。画像とものを組み合わせる必要がある場合は、もう少し複雑でレスポンシブなCSSをコーディングする必要があります。


3

#header全体ではなく、コンテンツのラッピングdivの高さ(他の返信で示されている#header-content)を設定できる場合は、このアプローチを試すこともできます。

HTML

<div id="header">
    <h1>some title</h1>
    <div id="header-content">
        <span>
            first line of header text<br>
            second line of header text<br>
            third, last line of header text
        </span>
    </div>
</div>

CSS

#header-content{
    height:100px;
}

#header-content::before{
  display:inline-block;
  content:'';
  height:100%;
  vertical-align:bottom;
}

#header-content span{
    display:inline-block;
}

コードペンに表示


3

働いているようです:

HTML:私は一番下にいます

css:

h1.alignBtm {
  line-height: 3em;
}
h1.alignBtm span {
  line-height: 1.2em;
  vertical-align: bottom;
}

3

これらすべての答えはどれも私にとってはうまくいきませんでした...私はflexboxの専門家ではありませんが、これはかなり簡単に理解できました。シンプルで理解しやすく、使いやすいです。残りのコンテンツから何かを分離するには、空のdivを挿入し、スペースを埋めるまで拡大させます。

https://jsfiddle.net/8sfeLmgd/1/

.myContainer {
  display: flex;
  height: 250px;
  flex-flow: column;
}

.filler {
  flex: 1 1;
}
<div class="myContainer">
  <div>Top</div>
  <div class="filler"></div>
  <div>Bottom</div>
</div>

コンテナのサイズが固定されていない場合でも、下部のコンテンツのサイズが固定されていない場合、これは期待どおりに反応します。


3

私は言及されているものよりもはるかに簡単な方法を考案しました。

ヘッダーdivの高さを設定します。次に、その中でH1タグを次のようにスタイルします。

float: left;
padding: 90px 10px 11px

私はクライアントのサイトで作業しています。デザインでは、テキストが特定のdivの下部にある必要があります。これらの2行を使用して結果を達成しましたが、正常に動作します。また、テキストが拡大しても、パディングは同じままです。


1
レスポンシブレイアウトを使用して画面のサイズを変更すると、コンテンツが他のコンテンツの上にフロートします。
Mozfet

2

私はこのソリューションがデフォルトのブートストラップ開始テンプレートに基づいていることを発見しました

/* HTML */

<div class="content_wrapper">
  <div class="content_floating">
    <h2>HIS This is the header<br>
      In Two Rows</h2>
    <p>This is a description at the bottom too</p> 
  </div>
</div>

/* css */

.content_wrapper{
      display: table;
      width: 100%;
      height: 100%; /* For at least Firefox */
      min-height: 100%;
    }

.content_floating{
  display: table-cell;
  vertical-align: bottom;
  padding-bottom:80px;

}

2
#header {
    height: 150px;
    display:flex;
    flex-direction:column;
}

.top{
    flex: 1;
}   

<div id="header">
    <h1 class="top">Header title</h1>
    Header content (one or multiple lines)
</div>

#header {
    height: 250px;
    display:flex;
    flex-direction:column;
    background-color:yellow;
}

.top{
    flex: 1;
}
<div id="header">
    <h1 class="top">Header title</h1>
    Header content (one or multiple lines)
</div>


1
これにより、上部のdivのサイズが変更されます。これは基本的なテキストレイアウトでは機能しますが、背景や色、サイズを尊重する必要がある場合には機能しません。
Mozfet

0

試してください:

div.myclass { margin-top: 100%; }

%を変更して修正してください。例:120%または90%...など。


1セットのコンテンツで問題なく動作しますが、コンテンツが変更された場合は調整する必要があります。動的なコンテンツの場合は、使用しないでください。
マイクグラフ

0

私がクライアントに対して行ったばかりのサイトは、フッターのテキストが高いボックスであるように要求しました。下部のテキストは単純なパディングでこれを実現しましたが、すべてのブラウザーで機能するはずです。

<div id="footer">
  some text here
</div>
#footer {
  padding: 0 30px;
  padding-top: 60px;
  padding-bottom: 8px;
}

1
最初の宣言padding: 0 30pxは少し冗長ですがpadding: 30px、他の2つの宣言を配置することもできます。
Andrew

確かにそうですが、私は職場の慣習に従っています。
Nicki L. Hansen

6
本当に?、それは明らかに悪い習慣のようです。省略形を使用するか、どこでも明確にしてください。padding: 60px 30px 8px;padding: 60px 30px 8px 30px;4つの明示的なpadding-ルール、あるいはTheWaxMannの提案@すべて優れている-と私は1つ;-)だと主張して喜んでとができるよ
ザックLysobey

-3

完璧なクロスブラウザの例は、おそらくここにあります:

http://www.csszengarden.com/?cssfile=/213/213.css&page=0

アイデアは、divを下部に表示することと、そこに固定することの両方です。多くの場合、シンプルなアプローチでは、スティッキーなdivがメインコンテンツとともに上にスクロールします。

以下は完全に機能する最小限の例です。div埋め込みのトリックは必要ないことに注意してください。多くのBRは、スクロールバーを強制的に表示するためのものです。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        #floater {
            background: yellow;
            height: 200px;
            width: 100%;
            position: fixed;
            bottom: 0px;
            z-index: 5;
            border-top: 2px solid gold;
        }

    </style>
</head>


<body>
    <br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
    <br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
    <br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
    <br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>


    <div id="floater"></div>
</body>
</html>

コードがIEで機能していないのではないかと思っている場合は、必ずDOCTYPEタグを先頭に追加してください。これがIEで動作することが重要です。また、これは最初のタグでなければならず、その上には何も表示されません。


28
文書をXHTML strictとして宣言しているので、<br />タグも自己閉鎖する必要があります...
Amos M. Carpenter

7
@KarlKildénaaamosからのコメントを参照している場合、それは間違いなくばかげたコメントではありません-上記のドキュメントを正しいcontent-typeヘッダーで提供すると、ブラウザーがXML解析エラーをスローします。
かみそり

7
これは悪い習慣です!代わりにCSSを使用してください!
m93a 2013

-4

働いているようです:

#content {
    /* or just insert a number with "px" if you're fighting CSS without lesscss.org :) */
    vertical-align: -@header_height + @content_height;

    /* only need it if your content is <div>,
     * if it is inline (e.g., <a>) will work without it */
    display: inline-block;
}

lessを使用すると、CSSパズルを解くのが好きになるよりもコーディングのようになります...私はCSSが大好きです。1つのパラメーターを変更するだけでレイアウト全体を(それを壊すことなく)変更できるのは、本当に嬉しいことです。


-7

2015ソリューション

<div style='width:200px; height:60px; border:1px solid red;'>

    <table width=100% height=100% cellspacing=0 cellpadding=0 border=0>
        <tr><td valign=bottom>{$This_text_at_bottom}</td></tr>
    </table>

</div>

http://codepen.io/anon/pen/qERMdx

どういたしまして


3
このためのテーブルレイアウトには問題がある可能性があります。代わりにCSSをお勧めします。valignプロパティもHTML5ではサポートされていません。(w3schools.com/tags/att_td_valign.aspを参照)
紛れもなく
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.