Выровняйте DIV по нижней или базовой линии


97

Я пытаюсь выровнять дочерний тег div по нижней или базовой линии родительского тега div.

Все, что я хочу сделать, это иметь дочерний Div на базовой линии родительского Div, вот как он выглядит сейчас:

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

Заметка

У меня будет несколько childDivs с разной высотой, и мне нужно, чтобы все они выровнялись по базовой линии / низу.


даже не думал! Я только что удалил высоту для parentDiv, и все childDiv теперь находятся на базовой линии. Я просто глупая выходка!
sia

Но если вы хотите, чтобы у него была определенная высота - вы должны использовать absoluteпозиционирование по родителю.
Y. Shoham

Ответы:


159

Вам нужно добавить это:

#parentDiv {
  position: relative;
}

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

При объявлении absoluteэлемента он позиционируется в соответствии с его ближайшим родительским элементом, которым не является static(он должен быть absolute, relativeили fixed).


7
Я сомневаюсь, что это делает то, что он хочет, в настоящее время это расположит все (похоже, будет несколько дочерних элементов, если это динамическая гистограмма) друг над другом.
crmepham

54

Семь лет спустя поиски вертикального выравнивания все еще вызывают этот вопрос, поэтому я опубликую еще одно решение, которое у нас есть сейчас: позиционирование flexbox. Просто установите display:flex; justify-content: flex-end; flex-direction: columnродительский div (также продемонстрированный в этой скрипке ):

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

1
Просто. Именно то, что я хотел. Используйте, align-items: flex-start;если вы не хотите растягивать предметы.
Madhan

Это лучший ответ на сегодняшний день!
Ренс Гроенвельд,

justify-content: flex-end исчезает из моей полосы прокрутки
kta

12

Используйте отображаемые значения CSS таблицы и ячейки таблицы:

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

Я создал демонстрацию JSBin здесь: http://jsbin.com/INOnAkuF/2/edit

В демонстрации также есть пример выравнивания по вертикали по центру с использованием той же техники.


1
Для столько дерьма, сколько таблиц, иногда это лучшее решение
Sean256 03

это было лучшее решение для меня
Bowlerae

Это действительно лучшее решение, поскольку использование абсолютно позиционированных элементов обычно изменяет высоту родительского элемента
hamncheez

7

это работает (я тестировал только ie & 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>

надеюсь, это поможет.


5

Ответ, опубликованный Я. Шохамом (с использованием абсолютного позиционирования), кажется самым простым решением в большинстве случаев, когда контейнер имеет фиксированную высоту, но если родительский DIV должен содержать несколько DIV и автоматически настраивать его высоту на основе динамического содержимого, тогда может быть проблема. Мне нужно было иметь два блока динамического контента; один выровнен по верху контейнера, а другой по дну, и хотя я мог бы настроить контейнер под размер верхнего DIV, если бы DIV, выровненный по нижнему краю, был выше, он не изменил бы размер контейнера, но вытянулся бы за пределы . Метод, описанный выше Ромием с использованием позиционирования в стиле таблицы, хотя и немного более сложен, но более надежен в этом отношении и позволяет выравнивать по дну и корректировать автоматическую высоту контейнера.

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>

пример

Я понимаю, что это не новый ответ, но я хотел прокомментировать этот подход, поскольку он заставил меня найти свое решение, но как новичку мне не разрешили комментировать, только публиковать.


3

Вероятно, вам придется установить дочерний div position: absolute.

Обновите свой детский стиль до

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

Я пробовал это, но мне нужно, чтобы нижняя часть childDiv располагалась внизу parentDiv, график должен быть динамическим, а высота будет варьироваться от каждого childDiv к следующему ... позиционирование может работать, но у меня нет бросить выяснил кое-что твердое ...
sia

5
не рекомендуется устанавливать верхнее значение 207 (какое-то произвольное число), лучше установить нижнее значение: 0
pstanton 06

2

Старый пост, но подумал, что поделюсь ответом для всех, кто ищет. И потому что при использовании absoluteвсе может пойти не так. Что бы я сделал

HTML

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

CSS

parentDiv{

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

И это просто поместит этот нижний div обратно в родительский div. безопасно и для большинства браузеров


Это сделает childDiv половиной внизу parentDiv. Вам нужно как минимум использовать -40 пикселей на верхнем поле. Также рекомендуется использовать position: relative; в этом случае для обоих div.
Augus

1

У меня было что-то похожее, и я заставил его работать, эффективно добавив дочернему элементу padding-top .

Я уверен, что некоторые из других ответов здесь дойдут до решения, но я не мог заставить их легко работать через много времени; Вместо этого я остановился на решении padding-top, которое элегантно в своей простоте, но кажется мне хакерским (не говоря уже о том, что значение пикселя, которое он устанавливает, вероятно, будет зависеть от родительской высоты).


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>

Это мое решение


-6

Если у вас есть несколько дочерних Div внутри родительского Div, вы можете использовать свойство vertical-align, как показано ниже:

.Parent div
{
  vertical-align : bottom;
}

Почему так много "против" без комментариев? Это не решает проблему? Исследования в Интернете показывают, что это необходимо.
sholsapp
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.