Вирівняйте DIV за нижньою або базовою лінією


95

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

Все, що я хочу зробити, це мати дочірню Div на базовій лінії Parent 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

Відповіді:


154

Вам потрібно додати це:

#parentDiv {
  position: relative;
}

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

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


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

52

Через сім років пошуки вертикального вирівнювання все ще піднімають це питання, тому я опублікую ще одне рішення, яке ми маємо зараз: позиціонування 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;якщо ви не хочете розтягувати предмети.
Мадхан

Це найкраща відповідь у наші дні!
Ренс Гроенвельд,

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,

це було найкраще рішення для мене
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, вирівняний до нижньої частини, був вищим, він не змінює розмір контейнера, а виходить за межі . Метод, викладений вище romiem з використанням позиціонування стилю таблиці, хоча і дещо складніший, але в цьому відношенні є більш надійним і дозволяє вирівнювати дно та корегувати автоматичну висоту контейнера.

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

2

Стара публікація, але я думав, що поділюсь відповіддю для тих, хто шукає. І тому, що коли ви використовуєтеabsolute речі можуть піти не так. Що б я зробив, це

HTML

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

Css

parentDiv{

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

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


Це зробить childDiv наполовину внизу parentDiv. Вам потрібно щонайменше використовувати -40px на полі зверху. Також це найкраща практика використання позиції: відносна; у цьому випадку для обох div.
Augus

1

У мене було щось подібне, і я змусив це запрацювати, ефективно додавши якийсь відступ дитині .

Я впевнений, що деякі інші відповіді тут могли б дійти до рішення, але я не міг змусити їх легко працювати через багато часу; Натомість я закінчив рішенням 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, тоді ви можете використовувати властивість вертикального вирівнювання приблизно так, як показано нижче:

.Parent div
{
  vertical-align : bottom;
}

Чому так багато голосів проти цього без коментарів? Чи це не вирішує проблему? Дослідження в Інтернеті показують, що це потрібно.
sholsapp
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.