вертикальное выравнивание по центру в <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>

Sickest
источник

Ответы:

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 в соответствии со своими потребностями. Надеюсь это поможет

Hondaman900
источник
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%);
}

нилеш павар
источник