如何将内部<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上方?是否动态添加了图像和文本?有什么具体问题?
justkt 2010年

Answers:


216

这是一种方法

<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对象,并将其设置为“ clear:both”。


1
感谢您的解释和IE Hack(如果我没记错,您添加了** width:IE Hack的100%)。
uzay95 2010年

1
不,宽度:100%在您的原件中-我没有添加。
乔恩·斯莫克

1
我尝试将更改的部分加粗,但Markdown不适用于代码块内:-P
Jon Smock 2010年

:)实际上我无法理解我们如何用符号来入侵IE,这就是为什么我认为它是IE入侵:)
uzay95'1

请记住,如果父容器是浮动的,则此方法将不起作用。
klewis 2014年

84

一种flexbox方式。

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指南

浏览器对flexbox的支持-Caniuse


4
OMG,您一生都在哪里?;)我喜欢它是如此简单并且不会与位置混淆,并且似乎可以在所有浏览器中正常工作:caniuse.com/#feat=flexbox。这应该是现代编程的解决方案和公认的答案。
Sablefoste

1
如今,Flexbox通常是“简便方法”,并且具有(近乎)强大的浏览器支持和文档。将caniuse链接添加到答案。
富兰克林·塔特

80

设置外部div position="relative"和内部div position="absolute"并将其设置为bottom="0"


8
还有width=100%
凯文

6
是的,这可行,但是绝对定位会破坏“自然布局”。内部div的高度不会作为父级的高度包括在内,并且随着外部div的变窄,您可能会看到与外部div中的其他内容重叠。
Ayush Gupta 2014年

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

1
这对我来说是最好的答案
Russell Chisholm

大!另一种flex解决方案将我所有的内容移出了位置,这将您要放置在底部的对象与其余对象隔离开。很好的解决方案!
亚历杭德罗(AlejandroAristizábal)

8

您可能不希望使用绝对定位,因为它会中断重排:在某些情况下,更好的解决方案是制作grandparent元素display:table;和parent元素display:table-cell;vertical-align:bottom;。完成此操作后,您应该能够为子元素提供元素display:inline-block;,它们将自动流向父元素的底部。


8

注意:这绝不是最好的方法!

情况:我只能做同样的事情,因为我无法添加任何额外的div,因此我坚持使用我拥有的东西,而不是删除innerHTML并通过javascript创建另一个,就像2个渲染器一样,我需要在底部(动画条)。

解决方案: 考虑到我当时很累,甚至想到这种方法似乎很正常,但是我知道我有一个父DOM元素,该条的高度是从此开始的。

而不是进一步搞乱JavaScript,我使用了(并非总是很好的想法)CSS答案!:)

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

是的,这是正确的,我没有将DOM定位,而是将其父代在CSS中颠倒了。

对于我的情况,它将起作用!可能也是别人的!没有火焰!:)


1
这可能不是最好的方法,但这是一种很棒的,非常有创意的方法。今天,我本人一直在努力解决这一问题,我的主要重点是:没有设定的高度,必须完全流畅(没有足够的字符来解释为什么显示:表格不起作用)。这样可以很好地处理一切。发生这种情况时,div内的图像也会被翻转,因此我只是在这些元素上使用了类来将它们翻转回去。看起来完全一样,没有设置高度。有点hacky,但是嘿,有时候没有更好的选择了。做得好!
tganyan

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>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.