вертикальное выравнивание по центру в <div>


126

Я хочу , чтобы сохранить высоту #abc divв 50pxи текст для выравнивания по вертикали в середине div.

body{
  padding: 0;
  margin: 0;
  margin: 0px auto;
}

#main{
  position: relative;
  background-color:blue;
  width:500px;
  height:500px;
}

#abc{
  font:Verdana, Geneva, sans-serif;
  font-size:18px;
  text-align:left;
  background-color:#0F0;
  height:50px;
  vertical-align:middle;
}
<div id="main">
 <div id="abc">
     asdfasdfafasdfasdf
 </div>
</div>

Ответы:


183

Можно использовать line-height: 50px;, там не нужно vertical-align: middle;.

демонстрация


Вышеупомянутое не удастся, если у вас несколько строк, поэтому в этом случае вы можете обернуть свой текст, используя spanи, чем использовать display: table-cell;и display: table;вместе с vertical-align: middle;, также не забудьте использовать width: 100%;для#abc

демонстрация

#abc{
  font:Verdana, Geneva, sans-serif;
  font-size:18px;
  text-align:left;
  background-color:#0F0;
  height:50px;
  display: table;
  width: 100%;
}

#abc span {
  vertical-align:middle;
  display: table-cell;
}

Другое решение, которое я могу придумать, - использовать transformсвойство, translateY()где, Yочевидно, означает ось Y. Это довольно просто ... Все, что вам нужно сделать, это установить положение элемента, absoluteа затем положение 50%от topоси и перевести от оси с отрицательным-50%

div {
  height: 100px;
  width: 100px;
  background-color: tomato;
  position: relative;
}

p {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
}

демонстрация

Обратите внимание , что это не будет поддерживаться на старых браузерах, например , IE8, но вы можете сделать IE9 и другие версии старых браузеров , хромовых и Firefox с помощью -ms, -mozи -webkitпрефиксы соответственно.

Для получения дополнительной информации transformвы можете обратиться сюда .


Мне нужно было знать это простое решение с высотой линии всю мою профессиональную жизнь, и я узнал о нем только сейчас. Спасибо, мистер Чужой.
Натан Бич,

94

Это просто: дайте родительскому div следующее:

display: table;

и дайте дочернему div (s) это:

display: table-cell;
vertical-align: middle;

Это оно!

.parent{
    display: table;
}
.child{
    display: table-cell;
    vertical-align: middle;
    padding-left: 20px;
}
<div class="parent">
    <div class="child">
        Test
    </div>
    <div class="child">
        Test Test Test <br/> Test Test Test
    </div>
    <div class="child">
        Test Test Test <br/> Test Test Test <br/> Test Test Test
    </div>
<div>


6
это плохо, поскольку здесь используется таблица в качестве взлома, это может сработать в большинстве случаев, но когда вы хотите изменить ширину `` таблицы '', она не будет работать должным образом (что у меня сейчас проблема с этим решением )
Кевин Симпл

Мне не нужно было добавлять display:table;родительский элемент, чтобы он работал.
VincentPerrin.com

Возможно, это взлом ... но он РАБОТАЕТ, и большинство других решений работают только в определенных случаях и часто не годятся для использования в нашем случае.
Джерри

Преимущество этого решения: работает со всеми типами содержимого (не только для текста и не только для одной строки ...)
Джерри

77

Старый вопрос , но в настоящее время CSS3 делает вертикальное выравнивание очень просто !

Просто добавьте #abcв следующий css:

display:flex;
align-items:center;

Простая демонстрация

Демо-версия исходного вопроса обновлена

Простой пример:

.vertical-align-content {
  background-color:#f18c16;
  height:150px;
  display:flex;
  align-items:center;
  /* Uncomment next line to get horizontal align also */
  /* justify-content:center; */
}
<div class="vertical-align-content">
  Hodor!
</div>


3
Я бы также посоветовал: display: grid; ALIGN-элементы: центр; Это работает лучше, когда у вас есть несколько объектов, которые нужно выровнять по вертикали,
Леонардо Дага

Какие браузеры поддерживают CSS3 ?
Kiquenet

@Kiquenet, 92% мирового рынка caniuse.com/#search=align-items
Дэниел Кучал

Perfekt! Просто и легко .. просто добавь в контейнер
Удджвал Сингх

47

Я нашел это решение от Себастьяна Экстрёма. Это быстро, грязно и очень хорошо работает. Даже если вы не знаете рост родителя:

.element {
  position: relative;
  top: 50%;
  -webkit-transform: translateY(-50%);
  -ms-transform: translateY(-50%);
  transform: translateY(-50%);
}

Читайте полную статью здесь .


3
Это может размыть объекты, потому что в результате преобразований объекты могут располагаться на полпикселя.
Кевин Уиллер,

1
Есть обновление публикации, посвященной этой проблеме. По родителю transform-style: preserve-3d;:!
Andry

8

Вы можете использовать высоту строки, равную высоте div. Но для меня лучшее решение - это ->position:relative; top:50%; transform:translate(0,50%);


4

Как насчет добавления line-height?

#abc{
  font:Verdana, Geneva, sans-serif;
  font-size:18px;
  text-align:left;
  background-color:#0F0;
  height:50px;
  vertical-align:middle;
  line-height: 45px;
}

Скрипка, высота строки

Или paddingдальше #abc. Это результат с заполнением

Обновить

Добавьте в свой css:

#abc img{
   vertical-align: middle;
}

Результат . Надеюсь, это то, что вы ищете.


не совсем работает так, как я хочу, чтобы он работал, когда вы меняете высоту или высоту строки, что-то не так. уже получил ответ, все равно спасибо
Sickest

2

Попробуй это:

.main_div{
    display: table;
    width: 100%;
}
.cells {
    display: table-cell;
    vertical-align: middle;
}

Другой метод центрирования div:

<div id="parent">
    <div id="child">Content here</div>
</div>

#parent {position: relative;}

#child {
    position: absolute;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    width: 50px;
    height: 100px;
    margin: auto;
}

2

 div {
    height:200px;
    text-align: center;
    padding: 2px;
    border: 1px solid #000;
    background-color: green;
}

.text-align-center {
    display: flex;
    align-items: center;
    justify-content: center;
}
<div class="text-align-center"> Align center</div>


Объясните пожалуйста!
Szabolcs

1

Используйте свойство CSS translateY для вертикального центрирования текста в его контейнере.

<style>
.centertext{

    position: relative;
    top: 50%;
    transform: translateY(40%);

}
</style>

А затем примените его к содержащему DIV

  <div class="centertext">
        <font style="color:white; font-size:20px;">   Your Text Here </font>
  </div>

Отрегулируйте процент translateY в соответствии со своими потребностями. Надеюсь это поможет


1

Этот код предназначен для вертикального среднего и горизонтального выравнивания по центру без указания фиксированной высоты:

.parent-class-name {
  position: relative;
}

.className {
  position: absolute;
  top: 50%;
  left: 0;
  right: 0;
  margin: 0 auto;
  transform: translateY(-50%);
  -moz-transform: translateY(-50%);
  -webkit-transform: translateY(-50%);
}

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.