Flexbox ile bir öğeyi alta hizalama


375

Bir var divbazı çocuklarla:

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

ve aşağıdaki düzeni istiyorum:

 -------------------
|heading 1          |
|heading 2          | 
|paragraph text     |
|can have many      |
|rows               |
|                   |
|                   |
|                   | 
|link-button        |
 -------------------

Ne kadar metin olursa olsun p, .buttonher zaman alttan akıştan çıkarmadan yapıştırmak istiyorum . Bunun Flexbox ile elde edilebileceğini duydum ama çalışamıyorum.


7
Sadece ver postition: absolute; bottom 0;?
Jonathan

12
@Jonathan sargının sabit bir yüksekliği yoktur. Akışı çıkarırsam metnin üzerine
biner

2
@supersize eski Q ama sarıcı vermiş olabilirsiniz position:relative- bu aptalca çünkü varsayılan olarak göreceli ama çocuğun mutlak konumunun içerilmesi için SET'i ayarladınız . Sonra bottom:0floş sığacak.
Jacksonkr

Jacksonkr haklı, bu EN İYİ çözüm, diğerleri çok uzun, çok kıvrımlı veya doğru şekilde çalışmıyor
Barbz_YHOOL

2
@ Jacksonson div varsayılan konumu staticdeğil relative.
supersize

Yanıtlar:


641

Otomatik kenar boşluklarını kullanabilirsiniz

İle hizalanabilmektedir önce justify-contentve align-selfherhangi bir pozitif serbest alanının boyutunun otomatik kenar dağıtılır.

Böylece bunlardan birini (veya her ikisini de) kullanabilirsiniz:

p { margin-bottom: auto; } /* Push following elements to the bottom */
a { margin-top: auto; } /* Push it and following elements to the bottom */

Alternatif olarak, amevcut alanı doldurmak için öğeyi büyümeden önce yapabilirsiniz :

p { flex-grow: 1; } /* Grow to fill available space */


2
Benim için bu Chrome'da çalışıyor, ancak iOS 10.2'deki Safari'de çalışmıyor. Herkes onaylayabilir mi?
Matthew

@Oriol Bu yaklaşımı seviyorum, ancak çökme marjlarını kaybetmenin yan etkisi değil, bu konuda ne yapardınız?
Neil

11
flex-grow benim için çalıştı. İşte böyle yaptımhtml { height: 100%; } body { min-height: 100%; display: flex; flex-direction: column; } #site-content { flex: 1; }
protoEvangelion

2
Ayrıca bir yan not, height: 100%bir şeyi aşağıya doğru itmeye çalıştığınız ana öğeyi unutmayınmargin-top: auto;
skolind

1
"herhangi bir pozitif boş alan, bu boyuttaki otomatik kenar boşluklarına dağıtılır." bu kadar zarif olan küçük şeyler, benim için bu çözüm cevabınıza göre 2 satırlık koddu. teşekkür ederim :)
danjah

146

Bir öğeyi alta yerleştirmek için display: flex komutunu kullanabilirsiniz, ancak bu durumda tüm öğelerinizi etkileyeceğinden flex kullanmak istediğinizi düşünmüyorum.

Flex kullanarak bir öğeyi alta yerleştirmek için şunu deneyin:

.container {
  display: flex;
}

.button {
  align-self: flex-end;
}

En iyi seçeneğiniz pozisyonu ayarlamaktır: düğmeye mutlak olarak ayarlayın ve bunu ayarlayın bottom: 0veya düğmeyi kabın dışına yerleştirip negatif olarak transform: translateY(-100%)kullanarak kabın içine şu şekilde getirebilirsiniz:

.content {
    height: 400px;
    background: #000;
    color: #fff;
}
.button {
    transform: translateY(-100%);
    display: inline-block;
}

Bu JSFiddle'ı kontrol edin


6
alt kısımda olmasını istiyorsanız, esneme yönünü sütuna ayarladığınızdan emin olun.
Viliami

3
Yüksekliği sağlayamazsam ne olur?
Mark

Benim için işe yarayan sadece şuydu: ``. içerik {display: flex; esnek yön: sütun; bloklama içeriği: flex-end; } <div class = "content"> <a class="bottom"> Bir şey </a> </div> ``
gsalgadotoledo

84

İle çözüm align-self: flex-end;benim için işe yaramadı ama flex kullanmak istiyorsanız bu bir yaptı:

Sonuç

 -------------------
|heading 1          |
|heading 2          | 
|paragraph text     |
|                   |
|                   |
|                   | 
|link button        |
 -------------------

kod

Not: "Kod snippet'ini çalıştırırken" bağlantıyı aşağıdan görmek için aşağı kaydırmanız gerekir.

.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
içerik, justify-content ile birlikte 2 konteyner daha içerdiği sütun kabıdır: arasındaki boşluk; flexbox'a kabı olabildiğince uzağa itmesini söylersiniz (bu durumda içerik kabının yüksekliği ile sınırlıdır)
ConquerorsHaki

bu gerçek sonuç değil, her öğe arasında boşluk olacak (dolayısıyla adı)
Barbz_YHOOL

1
@Barbz_YHOOL Hayır, kap yüksekliğini artırırsanız çalışır (güncellenmiş örneğe bakın)
Timo

1
Çok aradıktan sonra, bu sadece mükemmel! Teşekkür ederim.
Rudy

1
Küçük bir değişiklikle, bu cevap benim için mükemmel çalıştı, teşekkür ederim
RealMJDev

2

Flexbox hakkında emin değilim ama position özelliğini kullanarak yapabilirsiniz.

ayarlanan ebeveyn div position: relative bir olabilir ve alt öğe <p>veya <h1>vs .. set position: absoluteve bottom: 0.

Misal:

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;
}

Kod kalemi buraya.


1
position:fixedişe yaramaz çünkü o zaman içinde bulunduğu konteynere göreceli olmaz. Belki de demek istediniz position:absolute?
Sensoray

1
Bu kod soruyu cevaplayabilirken, bu kodun soruyu neden ve / veya nasıl cevapladığı konusunda ek bağlam sağlamak uzun vadeli değerini arttırır.
rollstuhlfahrer

1
Cevap güncellendi.
Sanjay Shr

1

resim açıklamasını buraya girin

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

Demo: https://codepen.io/ferittuncer/pen/YzygpWX


0

Ekranınızı esneyecek şekilde ayarlarken, flexhangi içeriğin büyüyebileceğini ve hangi içeriğin büyüyemeyeceğini işaretlemek için özelliği kullanabilirsiniz .

Flex özelliği

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

Bunu dene

.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

Bunun için bir çözüm buldum.

verilen cevaplardan memnun olmayanlar için flexbox ile bu yaklaşımı deneyebilirler

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>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.