如何让一个div浮动到其容器的底部?

315

我曾经多次使用 float:right (或left)将图像和嵌入框浮动在容器顶部。现在,我需要将一个 div 浮动到另一个 div 的右下角,并使用 float 正常的文本环绕效果(只有上方和左侧文本环绕)。

我认为这应该相对容易,尽管 float 没有 bottom 值,但是我使用了许多技术,搜索网络也没有找到其他方法,除了使用绝对定位,但这不会给出正确的文字换行行为。

我原以为这是非常普遍的设计,但显然不是这样。如果没有人有建议,我将不得不将文本分成单独的框,并手动对齐 div,但这相当不稳定,我不想在每个需要它的页面上都这样做。


180
只要我想出如何让某物浮到最上面,就会着手解决“浮动到底部”的问题...;-) - Shog9
40
@Shog9的结论是:CSS需要一个“sink”元素。 - gailbear
1
这里大多数答案都没有考虑文本需要环绕和位于“沉没”元素之上的要求。但是Stu的答案(使用JQuery)有效。 - Steve Bennett
1
我并不觉得这很有趣,我想知道你是如何在现实生活中先左后右地漂浮的...这完全是基于 Z 轴的漂浮视角。 - Whimusical
1
使用flexboxes - https://dev59.com/9XRB5IYBdhLWcg3wv5o_#27812717 - Josh Crozier
这个回答解决了你的问题吗?如何将我的div定位在其容器底部? - Jim G.
37个回答

331

将父级

设置为position:relative,然后将内部
设置为...

position: absolute; 
bottom: 0;

...然后你就做到了 :)


129
我认为这也是正确的方法,但当你将位置设置为absolute时,元素不再参与包含元素的布局,因此没有换行,底部角落的文本被遮挡了。 - Stephen Martin
3
也许你可以使用浮动的包含 div 和相对/绝对定位技术的组合。 - dylanfm
1
将浮动设置为右侧,然后应用负的相对顶部位置,会导致图像在容器中的文本呈现之前被推到上方/下方。 - Felix Lamouroux
8
很遗憾,绝对定位被提及为不可接受的解决方案。 - Vitaly
2
不行,这样做不起作用。它会定位到整个页面的底部。 - Erik Aronesty
显示剩余3条评论

81

使它正常工作的方法如下:

  • 像平常一样将您的元素向左浮动
  • 使用

    rotate(180deg)

    旋转父级div 180度

-moz-transform:rotate(180deg);
-webkit-transform:rotate(180deg);
-o-transform:rotate(180deg);
-ms-transform:rotate(180deg);
filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);

JSFiddle: http://jsfiddle.net/wcneY/

  • 现在旋转所有向左浮动的元素(给它们添加一个类)180度使它们再次变直。大功告成!它们会浮到底部。


  • 2
    虽然这是一个很棒的解决方案,但它会破坏我的Firefox Nightly开发者工具:div选择器似乎忽略了旋转的div和其中的所有内容。 - ASA
    1
    无法将文本环绕在右下角的框中:所有字母都倒过来,并从底部向上阅读。http://jsfiddle.net/xu8orw5L/ - robert4
    1
    这太疯狂了!如果你不介意一切颠倒,它是可以工作的。 - MQ87
    8
    这是恶魔的作品,我会立即使用它。 - Stumblor
    2
    仅供参考,截至2019年,即使您删除前缀,在Firefox和Chrome中jsfiddle已经完全无法使用。 - sp00n
    显示剩余2条评论

    55

    经过几天的尝试,我不得不说这似乎是不可能的,即使使用JavaScript(我不想这样做)也看起来不可能。

    为了澄清那些可能不理解的人-这就是我要找的:在出版中,通常会布置一个插图、表格、图形等插图,以便其底部与块或页面的最后一行文本底部对齐,在插图上方和右侧或左侧流动自然的文本。在HTML/CSS中,使用float样式轻而易举地将插图的顶部与块的顶部对齐,但令我惊讶的是,尽管这是一项常见的布局任务,却似乎无法将文本和插图的底部对齐。

    除非有人有最后一分钟的建议,否则我想我将不得不重新考虑这个项目的设计目标。


    6
    不是印刷出版。使用仅有的HTML/CSS有些事情非常困难或不可能完成。 - Traingamer
    我知道这已经相当老了,但当我遇到同样的问题时,这个版本的问题弹出来了,我通过使用display: flex并设置一个具有非常高flex-grow数量的顶部容器来解决它,而我想要浮动到底部的容器只需简单地设置为flex-grow: 1。当然,增长方向需要是列。 - Alexandra
    @Alexandra,右下角的框是否会像普通浮动元素一样推动文字绕过其角? “文本流”是OP的要求之一。 - Ejaz
    我之前遇到过这样的问题,我使用CSS网格来解决它。如果你能附上一个可视化的问题表示,或许这个问题在CSS Grid出现11年后就已经被解决了。 - Rakushoe
    @Rakushoe,你能分享一下使用CSS Grid的解决方案吗?我一直在尝试解决它,但没有成功。 - Waleed Ahmad
    我知道这是一个相当老的问题和答案。现在你可以做到,参见https://css-tricks.com/float-an-element-to-the-bottom-corner/ - rysson

    16

    我在jQuery中通过在浮动元素上方放置一个零宽度支撑元素,然后根据父元素高度减去浮动子元素的高度来调整支撑元素(或管道)的大小,来实现此目标。

    在JavaScript启动之前,我使用绝对定位方法,这种方法有效,但允许文字流穿过。因此,我切换到静态定位,以启用支撑元素方法。(标题是父元素,cutout是我想要的右下角元素,管道是我的支撑元素)

    $("header .pipe").each(function(){
        $(this).next(".cutout").css("position","static");       
        $(this).height($(this).parent().height()-$(this).next(".cutout").height());                                                 
    });
    

    CSS

    header{
        position: relative; 
    }
    
    header img.cutout{
        float:right;
        position:absolute;
        bottom:0;
        right:0;
        clear:right
    }
    header .pipe{
        width:0px; 
        float:right
    
    }
    

    管道必须首先出现,然后是裁剪区域,最后按照HTML的顺序放置文本。


    2
    这是一项繁重的工作,使用JavaScript进行样式设计总是最后的备选方案,因为如果稍后更改CSS,它很容易出错。但是,是的,这确实有效,所以如果必须让该div与换行对齐,请尝试使用它。 - Wytze
    2
    这对我起作用了,但我无法让它完全准确。我想.height()可能是罪魁祸首。似乎当有大量块级文本(如多个div和段落)围绕浮动块时,.height()会根据文本断行方式而有所变化。 - atwixtor
    我采用了另一种方法,检查了容器(标题)和需要包装的唯一内容(徽标)的宽度,并在绝对定位的内容(导航)上设置了最大宽度。没有浮动和额外的元素。仍然需要JS并且取决于您需要包装的内容。 - icrf
    这个可以用。只要记得把它作为窗口调整处理程序,我还需要手动减去内部框的边距。 - dspeyer

    14

    这将在页面底部放置一个固定的div,当您向下滚动时会固定在底部

    #div {
        left: 0;
        position: fixed;
        text-align: center;
        bottom: 0;
        width: 100%;
    }
    

    5
    这不能实现他试图要做的事情。@Timoty 和 @Yona 是正确的。 - Adam

    11
    将一个div放在另一个div中,然后将父div的样式设置为position:relative; 然后在子div上设置以下CSS属性:position:absolute; bottom:0;

    4
    请看我对提摩西的评论。您可以在这里查看:http://www.emsoft.ca/absolutebottomtest.html ,自动换行不起作用,部分内容被遮挡。 - Stephen Martin
    如果您不需要子div中的任何文本,则这是完美的解决方案。 - techfly
    不幸的是,文本换行在这个解决方案中无法使用,正如@Stephen Martin所提到的。 - Waleed Ahmad

    6
    如果您将父元素设置为position:relative,则可以将子元素设置为底部设置position:absolute;和bottom:0;

    #outer {
      width:10em;
      height:10em;
      background-color:blue;
      position:relative; 
    }
    
    #inner {
      position:absolute;
      bottom:0;
      background-color:white; 
    }
    <div id="outer">
      <div id="inner">
        <h1>done</h1>
      </div>
    </div>
      


    4
    使用 Flexbox 的引入,现在在没有太多麻烦的情况下,这变得非常容易。 在子元素上使用align-self: flex-end 将沿着交叉轴对齐。
    .container {
      display: flex;
    }
    .bottom {
      align-self: flex-end;
    }
    

    <div class="container">
      <div class="bottom">Bottom of the container</div>
    </div>
    

    输出:

    .container {
      display: flex;
      /* Material design shadow */
      box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12);
      height: 100px;
      width: 175px;
      padding: 10px;
      background: #fff;
      font-family: Roboto;
    }
    .bottom {
      align-self: flex-end;
    }
    <div class="container">
      <div class="bottom">Bottom of the container</div>
    </div>


    你似乎没有仔细阅读问题。将其定位到底部很容易,但这并不能实现所需的浮动行为。 - Dennis98
    很抱歉,我无法提供答案,因为我没有找到其他需要更正的错误。 - Dennis98
    @Dennis98 我同意你的评论。这个回答对于这个问题来说是错误的。我们能做些什么呢? :) - m4n0

    4

    4

    如果你只希望文本的最底部一行位于块的侧面(而不是完全围绕和在其下方,这是无法做到的,除非结束该块并开始一个新块),那么将块浮动到父块的一个底角并不是不可能的。如果你在块内放置一些内容,并希望将链接浮动到块的右下角,请将链接放置在段落块中,并将其设置为 float: right,然后在段落标签的结尾处放置一个 clear: both 设置的 div 标签。最后一个 div 是为了确保父标签包围浮动标签。

    <div class="article" style="display: block;">
        <h3>title</h3>
            <p>
                text content
                <a href="#" style="display: block;float: right;">Read More</a>
            </p>
        <div style="clear: both;"></div>
    </div>
    

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接