Dopasuj DIV do dołu lub linii bazowej


96

Próbuję wyrównać podrzędny znacznik DIV do dołu lub linii bazowej nadrzędnego znacznika DIV.

Wszystko, co chcę zrobić, to mieć element podrzędny Div na linii bazowej nadrzędnego elementu Div, oto jak to teraz wygląda:

HTML

<div id="parentDiv">
<div class="childDiv"></div>
</div>

CSS

#parentDiv
{
  width:300px;
  height:300px;
  background-color:#ccc;
  background-repeat:repeat
}
#parentDiv .childDiv
{
  height:100px;
  width:30px;
  background-color:#999;
}

Uwaga

Będę mieć wiele childDivs o różnych wysokościach i będę potrzebować ich wszystkich, aby wyrównać do linii bazowej / do dołu.


nawet nie myślałem! właśnie usunąłem wysokość z parentDiv i wszyscy childDiv siedzą teraz na linii bazowej. jestem po prostu głupią głupią!
sia

Ale jeśli chcesz, aby miał jakąś określoną wysokość - powinieneś zastosować absolutepozycjonowanie zgodnie z rodzicem.
Y. Shoham

Odpowiedzi:


157

Musisz to dodać:

#parentDiv {
  position: relative;
}

#parentDiv .childDiv {
  position: absolute;
  bottom: 0;
  left: 0;
}

Podczas deklarowania absoluteelementu, jest umieszczona w zależności od jego najbliższego wyjściowej, która nie jest static(musi być absolute, relativei fixed).


7
Wątpię, czy robi to, czego chce, obecnie to umieści wszystkie (wygląda na to, że będzie wiele elementów podrzędnych, jeśli jest to dynamiczny wykres słupkowy) jeden na drugim.
crmepham,

54

Siedem lat później poszukiwania wyrównania w pionie wciąż wywołują to pytanie, więc opublikuję inne rozwiązanie, które mamy teraz dostępne: pozycjonowanie flexbox. Po prostu ustaw display:flex; justify-content: flex-end; flex-direction: columnnadrzędny element div (również pokazany na tym skrzypcach ):

#parentDiv
{
  display: flex;
  justify-content: flex-end;
  flex-direction: column;
  width:300px;
  height:300px;
  background-color:#ccc;
  background-repeat:repeat
}

1
Prosty. Dokładnie to, czego chciałem. Użyj, align-items: flex-start;jeśli nie chcesz rozciągać elementów.
Madhan

To najlepsza odpowiedź w dzisiejszych czasach!
Rens Groenveld

justify-content: flex-end znika z mojego paska przewijania
kta

12

Użyj wyświetlanych wartości CSS tabeli i komórki tabeli:

HTML

<html>
<body>

  <div class="valign bottom">
    <div>

      <div>my bottom aligned div 1</div>
      <div>my bottom aligned div 2</div>
      <div>my bottom aligned div 3</div>

    </div>
  </div>

</body>
</html>

CSS

html,body {
    width: 100%;
    height: 100%;
}
.valign {
    display: table;
    width: 100%;
    height: 100%;
}
.valign > div {
    display: table-cell;
    width: 100%;
    height: 100%;
}
.valign.bottom > div {
    vertical-align: bottom;
}

Stworzyłem demo JSBin tutaj: http://jsbin.com/INOnAkuF/2/edit

Demo zawiera również przykład, jak wyśrodkować w pionie przy użyciu tej samej techniki.


1
Za tyle gówna, ile dostają stoły, czasami jest to najlepsze rozwiązanie
Sean 256,

to było dla mnie najlepsze rozwiązanie
bowlerae

To naprawdę najlepsze rozwiązanie, ponieważ użycie elementów pozycjonowanych absolutnie zazwyczaj zmienia wysokość elementu nadrzędnego
hamncheez

7

to działa (przetestowałem tylko ie i ff):

<html>
<head>
    <style type="text/css">
        #parent {
            height: 300px;
            width: 300px;
            background-color: #ccc;
            border: 1px solid red;
            position: relative;
        }
        #child  {
            height: 100px;
            width: 30px;
            background-color: #eee;
            border: 1px solid green;
            position: absolute;
            bottom: 0;
            left: 0;
        }
    </style>
</head>
<body>
    <div id="parent">parent
        <div id="child">child</div>
    </div>
    outside
</body>
</html>

mam nadzieję, że to pomoże.


5

Odpowiedź wysłana przez Y. Shohama (używając pozycjonowania bezwzględnego) wydaje się być najprostszym rozwiązaniem w większości przypadków, gdy kontener ma stałą wysokość, ale jeśli nadrzędny DIV musi zawierać wiele DIV i automatycznie dostosowywać wysokość na podstawie dynamicznej zawartości, to może być problem. Potrzebowałem dwóch bloków zawartości dynamicznej; jeden wyrównany do góry pojemnika i jeden do dołu i chociaż mógłbym dostosować pojemnik do rozmiaru górnego DIV, gdyby DIV wyrównany do dołu był wyższy, nie zmieniłby rozmiaru pojemnika, ale rozciągnąłby się na zewnątrz . Metoda nakreślona powyżej przez romiem wykorzystująca pozycjonowanie w stylu tabeli, choć nieco bardziej skomplikowana, jest pod tym względem solidniejsza i pozwoliła na wyrównanie do dna i poprawną automatyczną wysokość pojemnika.

CSS

#container {
        display: table;
        height: auto;
}

#top {
    display: table-cell;
    width:50%;
    height: 100%;
}

#bottom {
    display: table-cell;
    width:50%;
    vertical-align: bottom;
    height: 100%;
}

HTML

<div id=“container”>
    <div id=“top”>Dynamic content aligned to top of #container</div>
    <div id=“bottom”>Dynamic content aligned to botttom of #container</div>
</div>

Przykład

Zdaję sobie sprawę, że nie jest to nowa odpowiedź, ale chciałem skomentować to podejście, ponieważ doprowadziło mnie do znalezienia rozwiązania, ale jako nowicjusz nie pozwolono mi komentować, tylko pisać.


3

Prawdopodobnie musiałbyś ustawić podrzędny element div position: absolute.

Zaktualizuj styl swojego dziecka do

#parentDiv .childDiv
{
  height:100px;
  width:30px;
  background-color:#999;
  position:absolute;
  top:207px;
}

Próbowałem tego, ale potrzebuję dolnej części childDiv, aby usiąść na dole parentDiv, wykres ma być dynamiczny, a wysokości będą się różnić dla każdego dziecka Div do następnego ... pozycjonowanie może działać, ale nie mam przestałem wymyślić coś, co jest solidne ...
sia

5
nie jest dobrym pomysłem ustawienie góry na 207 (jakąś dowolną liczbę), lepiej ustawić dół: 0
pstanton

2

Stary post, ale pomyślałem, że podzielę się odpowiedzią dla każdego, kto szuka. A ponieważ kiedy używasz, absoluterzeczy mogą się nie udać. Co bym zrobił

HTML

<div id="parentDiv"></div>
<div class="childDiv"></div>

Css

parentDiv{

}
childDiv{
    height:40px;
    margin-top:-20px;
}

I to po prostu ustawiłoby ten dolny div z powrotem w nadrzędnym div. bezpieczny również dla większości przeglądarek


To sprawi, że childDiv będzie w połowie na dole parentDiv. Musisz przynajmniej użyć -40px na górze marginesu. Najlepszą praktyką jest również używanie pozycji: względna; w tym przypadku dla obu elementów div.
Augus

1

Miałem coś podobnego i sprawiłem, że zadziałało, skutecznie dodając dziecku trochę wyściółki .

Jestem pewien, że niektóre inne odpowiedzi przyniosłyby rozwiązanie, ale nie mogłem sprawić, by po długim czasie działały łatwo; Zamiast tego otrzymałem rozwiązanie padding-top, które jest eleganckie w swojej prostocie, ale wydaje mi się trochę hakerskie (nie wspominając o ustawionej przez siebie wartości piksela, która prawdopodobnie zależałaby od wysokości rodzica).


0

td {
  height: 150px;
  width: 150px;
  text-align: center;
}

b {
  border: 1px solid black;
}

.child-2 {
  vertical-align: bottom;
}

.child-3 {
  vertical-align: top;
}
<table border=1>
  <tr>
    <td class="child-1">
      <b>child 1</b>
    </td>
    <td class="child-2">
     <b>child 2</b>
    </td>
    <td class="child-3">
      <b>child 3</b>
    </td>
  </tr>
</table>

To jest moje rozwiązanie


-6

Jeśli masz wiele podrzędnych elementów Div w nadrzędnym bloku Div, możesz użyć właściwości wyrównania w pionie, jak poniżej:

.Parent div
{
  vertical-align : bottom;
}

Dlaczego tak wiele głosów „w dół” na to bez komentarzy? Czy to nie rozwiązuje problemu? Badania online sugerują, że powinno.
sholsapp,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.