Вертикальное центрирование div внутри другого div
Я хочу центрировать div, который находится внутри другого div. Вот разметка:
<div id="outerDiv">
<div id="innerDiv">
</div>
</div>
Это CSS, который я сейчас использую:
#outerDiv {
width: 500px;
height: 500px;
position: relative;
}
#innerDiv {
width: 284px;
height: 290px;
position: absolute;
top: 50%;
left: 50%;
margin-top: -147px;
margin-left: -144px;
}
Как видно, мой текущий подход зависит от ширины и высоты #innerDiv
. Если ширина или высота изменится, мне придется изменять значения margin-top
и margin-left
. Существует ли универсальное решение, которое позволит мне центрировать #innerDiv
независимо от его размера?
Я понял, что использование margin: auto
может горизонтально выровнять #innerDiv
по центру. Но как насчет вертикального выравнивания?
5 ответ(ов)
Вместо того чтобы запутываться в сложном CSS, который трудно писать и поддерживать, а также требует тщательно проверки кроссбраузерной совместимости, я считаю лучшим вариантом отказаться от CSS и использовать удивительно простой HTML 1.0:
<table id="outerDiv" cellpadding="0" cellspacing="0" border="0">
<tr>
<td valign="middle" id="innerDiv">
</td>
</tr>
</table>
Это решение выполняет все задачи, которые хотел первоначальный автор вопроса, и при этом остается надежным и легким в поддержке.
Я лично предпочитаю использовать трюк с скрытым псевдоэлементом, чтобы охватить всю высоту внешнего контейнера и вертикально выровнять его с другим содержимым. У Криса Койера есть отличная статья по этой технике: http://css-tricks.com/centering-in-the-unknown/. Огромное преимущество этого подхода заключается в масштабируемости. Вам не нужно знать высоту содержимого или беспокоиться о том, что оно будет расти или уменьшаться. Это решение хорошо масштабируется 😃.
Вот пример с кодом CSS, который вам понадобится, и рабочим примером: http://jsfiddle.net/m5sLze0d/.
.center:before {
content: ""; /* Создаем дополнительное пространство над элементом */
display: inline-block;
height: 100%;
margin-right: -0.3em;
vertical-align: middle;
}
.center_element {
display: inline-block;
float: none;
vertical-align: middle;
white-space: normal;
text-align: left;
}
Если у вас есть вопросы или нужна помощь, не стесняйтесь задавать их!
Вертикальное центрирование элементов div внутри другого div
Просто установите для контейнера display: table
, а для внутренних элементов — display: table-cell
. Установите height
для контейнера, а затем задайте vertical-align: middle
для внутренних элементов. Этот метод совместим с браузерами начиная с IE9.
Имейте в виду, что вертикальное выравнивание будет зависеть от высоты родительского контейнера.
.cn {
display: table;
height: 80px;
background-color: #555;
}
.inner {
display: table-cell;
vertical-align: middle;
color: #FFF;
padding-left: 10px;
padding-right: 10px;
}
<div class="cn">
<div class="inner">Элемент 1</div>
<div class="inner">Элемент 2</div>
</div>
Когда высота вашего внешнего элемента не задана (по умолчанию auto), вы можете задать отступы (padding) для внутреннего див элемента сверху и снизу, чтобы сделать его вертикально центрированным:
<div>
<div style="padding-top:20px; padding-bottom:20px">
<!--контент-->
</div>
</div>
Таким образом, отступы сверху и снизу создадут эффект центровки контента внутри родительского элемента.
Вертикальное центрирование div
внутри другого div
Для того чтобы вертикально центрировать элемент (в данном случае #innerDiv
) внутри родительского элемента (#outerDiv
), вы можете использовать CSS-свойство transform
совместно с position: absolute
. Вот пример кода:
#outerDiv {
width: 500px;
height: 500px;
position: relative;
background-color: lightgrey;
}
#innerDiv {
width: 284px;
height: 290px;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
-ms-transform: translate(-50%, -50%); /* IE 9 */
-webkit-transform: translate(-50%, -50%); /* Chrome, Safari, Opera */
background-color: grey;
}
<div id="outerDiv">
<div id="innerDiv"></div>
</div>
Объяснение
position: relative
у родительскогоdiv
(#outerDiv
) устанавливает контекст позиционирования для внутреннегоdiv
(#innerDiv
).position: absolute
у внутреннегоdiv
позволяет ему позиционироваться относительно родителя с использованием свойствtop
иleft
.top: 50%
иleft: 50%
устанавливают начальную позицию внутреннегоdiv
в центр родительскогоdiv
, но не учитывают его размер.transform: translate(-50%, -50%)
сдвигает внутреннийdiv
на половину его ширины и высоты, что помогает добиться истинного центрирования.
Таким образом, этот подход обеспечивает адаптивное центрирование элементa в родительском контейнере любой высоты и ширины.
Получить координаты (X,Y) HTML-элемента
"Как сделать div на 100% высоты окна браузера"
Как создать ненумерованный список без маркеров?
Стилизация кнопки input type="file"
Изменение цвета элемента hr