使用flexbox将元素对齐到底部


374

我有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;吗?
Jonathan

12
@Jonathan包装纸没有固定的高度。如果我将其删除,它将与文本重叠
放大

2
@supersize老Q,但是您可以给它包装器position:relative-它很愚蠢,因为我认为默认情况下它是相对的,但是您可以对其进行设置,以便包含孩子的绝对位置。然后bottom:0将适合冲洗。
杰克逊(Jacksonkr)

杰克逊(Jacksonkr)是对的,这是BEST的解决方案,其他解决方案则太长,太复杂或无法正确运行
Barbz_YHOOL

2
@Jacksonkr div的默认位置static不是relative
超大

Answers:


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。谁能确认?
马修

@Oriol我喜欢这种方法,但是不喜欢损失利润率下降的副作用,对此您会怎么做?
尼尔

11
flex-grow为我工作。这是我的操作方式html { height: 100%; } body { min-height: 100%; display: flex; flex-direction: column; } #site-content { flex: 1; }
世纪福音战士

2
还要注意一点,请记住要height: 100%尝试使用以下元素的父元素margin-top: auto;
skolind '18

1
“任何正的可用空间都会分配给该维度上的自动边距。” 像这样的小东西是如此优雅,对我而言,此解决方案是基于您的回答的两行代码。谢谢:)
danjah

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
如果要在底部显示,请确保将flex-direction设置为column。
Viliami

3
如果我不能提供身高怎么办?
标记

对我有用的只是:内容{display:flex; flex-direction:列; 证明内容: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是它容纳另外两个容器的列容器,其中justify-content:space-between;您告诉flexbox将容器彼此推开尽可能多的距离(在这种情况下,受内容容器的高度限制)
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

1
尽管此代码可以回答问题,但提供有关此代码为何和/或如何回答问题的其他上下文,可以改善其长期价值。
rollstuhlfahrer

1
更新的答案。
Sanjay Shr

0

在此处输入图片说明

<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

我刚刚找到了解决方案。

对于那些对给定答案不满意的人,可以尝试使用flexbox这种方法

的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>
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.