親<div>の下部に内部<div>を送信するにはどうすればよいですか?


184

以下の別のdiv画像とコード内のdiv。親divのテキストと画像があるからです。そして、赤いdivは親divの最後の要素になります。

代替テキスト

<div style="width: 200px; height: 150px; border: 1px solid black;">
    <div style="width: 100%; height: 50px; border: 1px solid red;">
    </div>
</div>

それで、親divからのコードは論理的に子divの上に配置されますか?画像とテキストは動的に追加されますか?具体的な質問は何ですか?
10

回答:


218

これは片道です

<div style="position: relative; 
            width: 200px; 
            height: 150px; 
            border: 1px solid black;">

    <div style="position: absolute; 
                bottom: 0; 
                width: 100%; 
                height: 50px; 
                border: 1px solid red;">
    </div>
</div>

ただし、内側のdivは絶対的に配置されるため、外側のdiv内の他のコンテンツがそれに重なることを常に心配する必要があります(常に、高さを固定に設定する必要があります)。

できる場合は、その内側のdivを外側のdivの最後のDOMオブジェクトにして、「クリア:両方」に設定することをお勧めします。


1
説明とIEハックに感謝します(私が間違っていない場合は、** width:100%for IE Hack)を追加しました。
uzay95

1
いいえ、幅:オリジナルには100%ありました。追加しませんでした。
Jon Smock、2010年

1
私は変更したセクションを太字にしようとしましたが、Markdownはコードブロック内では適用されません:-P
Jon Smock

:)実際、私はIEをシンボルでハッキングする方法を取得できませんでした。そのため、IEハッキングだと思いました:)
uzay95

親コンテナがフローティングの場合、このアプローチは機能しないことに注意してください。
クレウィス2014年

84

フレックスボックスの方法。

HTML:

<div class="parent">
  <div>Images, text, buttons oh my!</div>
  <div>Bottom</div>
</div>

CSS:

.parent {
  display: flex;
  flex-direction: column;
  justify-content: space-between;
}

/*  not necessary, just to visualize it */

.parent {
  height: 500px;
  border: 1px solid black;
}


.parent div {
  border: 1px solid red;
}

ここに画像の説明を入力してください

編集:

ソース-Flexboxガイド

フレックスボックスのブラウザサポート-Caniuse


4
OMG、あなたは私の[プログラミング]人生のどこにいましたか?;)これは非常にシンプルで、配置に支障がないことが大好きです。すべてのブラウザーで動作するようです:caniuse.com/#feat=flexbox。これは、現代のプログラミングの解決策であり、認められた答えになるはずです。
Sablefoste 2016年

1
Flexboxは通常、「簡単な方法」であり、(ほぼ)優れたブラウザサポートとドキュメントを備えています。回答にカヌースリンクを追加します。
フランクリンターター2017年

80

外側のdiv position="relative"と内側のdivを作成しposition="absolute"、に設定しbottom="0"ます。


8
そしてwidth=100%あまりにも。
ケビン

6
はい、これは機能しますが、絶対配置は「自然なレイアウト」を壊します。内側のdivの高さは親の高さとして含まれません。外側のdivが狭くなると、外側のdivの他の要素との重なりが見られる場合があります。
Ayush Gupta

15

これは、要素のフローに影響を与えない別の純粋なCSSトリックです。

#parent {
  min-height: 100vh; /* set height as you need */
  display: flex;
  flex-direction: column;
  background: grey;
}
.child {
  margin-top: auto;
  background: green;
}
<div id="parent">
  <h1>Positioning with margin</h1>
  <div class="child">
    Content to the bottom
  </div>
</div>


親divに高さを設定したくない場合は、すばらしいものです。ありがとうございました!
Johan Nordli 2017年

1
これが私にとって最良の答えでした
ラッセルチザム

すごい!もう1つのフレックスソリューションは、すべてのコンテンツを適切な場所に移動しました。これにより、下部に配置したいオブジェクトが残りのオブジェクトから分離されます。素晴らしい解決策!
AlejandroAristizábal

8

絶対配置はリフローを妨げるので望ましくない場合があります。状況によっては、祖父母要素display:table;と親要素を作成することをお勧めしますdisplay:table-cell;vertical-align:bottom;。これを実行すると、子要素を指定できるようになり、display:inline-block;自動的に親の下部に向かって流れます。


8

注:これは、決して最良の方法ではありません!

状況:私は余分なdivを追加できなかったのと同じように同じことをしなければならなかったので、innerHTMLを削除して、2つのレンダリングとほとんど同じようにjavascriptを介して別のhtmlを作成するのではなく、下部(アニメーションバー)。

解決策: 当時私がどれほど疲れていたかを考えると、そのような方法を考えることも普通のようですが、バーの高さの開始点である親DOM要素があることを知っていました。

JavaScriptをいじるのではなく、(常に良いアイデアではない)CSSの回答を使用しました!:)

-moz-transform:rotate(180deg);
-webkit-transform:rotate(180deg);
-ms-transform:rotate(180deg);

はい、そうです。DOMを配置する代わりに、CSSで親を上下逆にしました。

私のシナリオではそれはうまくいきます!おそらく他の人にも!フレームなし!:)


1
これは最善の方法ではないかもしれませんが、これは非常に素晴らしい、非常に創造的なアプローチです。私自身、今日この問題にしばらく取り組んでいます。私の主な問題:高さが設定されていない、完全に流動的である必要があります(表示:テーブルが機能しなかった理由を説明するのに十分な文字がありません)。これはすべてを美しく処理しました。これが発生すると、div内の画像も反転されるため、これらの要素のクラスを使用して、それらを元に戻しました。高さが設定されていないため、見た目とまったく同じです。ちょっとハッキーですがねえ、時々より良い代替手段がありません。よくやった!
tganyan 2015年

4

親の身長がわかっている場合、絶対divとテーブルを回避する方法は次のとおりです。

<div class="parent">
    <div class="child"> <a href="#">Home</a>
    </div>
</div>

CSS:

.parent {
    line-height:80px;
    border: 1px solid black;
}
.child {
    line-height:normal;
    display: inline-block;
    vertical-align:bottom;
    border: 1px solid red;
}

JsFiddle:


0
<div style="width: 200px; height: 150px; border: 1px solid black;position:relative">
    <div style="width: 100%; height: 50px; border: 1px solid red;position:absolute;bottom:0">
    </div>
</div>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.