Как вертикально выровнять по центру содержимого div с определенной шириной / высотой?

95

Каким будет правильный метод вертикального центрирования любого содержимого с определенной шириной / высотой div.

В примере есть два содержимого с разной высотой, как лучше всего центрировать по вертикали оба с помощью класса .content. (и это работает для любого браузера и без решения table-cell)

У вас есть некоторые решения, но хотелось бы узнать другие идеи, один из которых использует position:absolute; top:0; bottom: 0;и margin auto.

Рикардо Родригес
источник
2
Ваши вопросы должны быть полностью самостоятельными. В противном случае, когда URL не работает, это бесполезно.
Sparky
1
Возможный дубликат: как я могу вертикально
центрировать
Возможно, но в тот раз не было решения, которое я хочу ... это предлагает больше возможностей
Рикардо Родригес
1
Т.Л., др в 2020 году : display: flex; align-items: center;. Если вы не хотите, чтобы он также располагался по центру по горизонтали, добавьте flex-direction: column;.
Девин Берк,

Ответы:

131

Я немного исследовал это и из того, что я обнаружил, у вас есть четыре варианта:

Версия 1: Родительский div с отображением в виде ячейки таблицы

Если вы не против использования display:table-cellродительского div, вы можете использовать следующие параметры:

.area{
    height: 100px;
    width: 100px;
    background: red;
    margin:10px;
    text-align: center;
    display:table-cell;
    vertical-align:middle;
}​

Живая ДЕМО


Версия 2: Родительский div с блоком отображения и ячейкой таблицы отображения содержимого

.area{
    height: 100px;
    width: 100px;
    background: red;
    margin:10px;
    text-align: center;
    display:block;
}

.content {
    height: 100px;
    width: 100px;
    display:table-cell;
    vertical-align:middle;    
}​

Живая ДЕМО


Версия 3: родительский div с плавающей точкой и контентный div в виде ячейки таблицы отображения

.area{
    background: red;
    margin:10px;
    text-align: center;
    display:block;
    float: left;
}

.content {
    display:table-cell;
    vertical-align:middle;
    height: 100px;
    width: 100px;
}​

Живая ДЕМО


Версия 4: относительная позиция родительского div и абсолютная позиция содержимого

Единственная проблема, с которой я столкнулся с этой версией, заключается в том, что, похоже, вам придется создавать CSS для каждой конкретной реализации. Причина этого в том, что div содержимого должен иметь заданную высоту, которую будет заполнять ваш текст, и верхний край поля будет рассчитан из этого. Эту проблему можно увидеть в демонстрации. Вы можете заставить его работать для каждого сценария вручную, изменив% высоты вашего div содержимого и умножив его на -5, чтобы получить значение верхнего предела маржи.

.area{
    position:relative; 
    display:block;
    height:100px;
    width:100px;
    border:1px solid black;
    background:red;
    margin:10px;
}

.content { 
    position:absolute;
    top:50%; 
    height:50%; 
    width:100px;
    margin-top:-25%;
    text-align:center;
}​

Живая ДЕМО

Джош Майн
источник
@JoshMein: Еще несколько решений: как я могу вертикально
центрировать
1
Версия 2 - это то, что я ищу, однако контент не центрируется по вертикали. Имеет значение, что areaв нем содержится или каково его contentсодержание?
Shimmy Weitzhandler
64

Это также можно сделать, используя display: flexвсего несколько строк кода. Вот пример:

.container {
  width: 100px;
  height: 100px;
  display: flex;
  align-items: center;
}

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

martin36
источник
1
@nihiser Только если вы тоже хотите центрировать его по горизонтали, или если бы вы установилиflex-direction: column
martin36
32

Я нашел это решение в этой статье

.parent-element {
  -webkit-transform-style: preserve-3d;
  -moz-transform-style: preserve-3d;
  transform-style: preserve-3d;
}

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

Это работает как шарм, если высота элемента не фиксирована.

N Kumar
источник
1
JFYI, я нашел ту же статью и использовал этот подход. Мне пришлось изменить положение на абсолютное, чтобы оно работало в Chrome.
Джек А.
@JackA. работает с position: relativeChrome 62. Не знаю, как давно это было.
Джаред Смит
0

Простой трюк для вертикального центрирования содержимого div - это установить высоту строки, равную высоте:

<div>this is some line of text!</div>
div {
width: 400px
height: 50px;
line-height: 50px;
}

но это работает только для одной строки текста!

Лучший подход - с div в качестве контейнера и диапазона со значением в нем:

.cont {
  width: 100px;
  height: 30px;
  display: table;
}

.val {
  display: table-cell;
  vertical-align: middle;
}

    <div class="cont">
      <span class="val">CZECH REPUBLIC, 24532 PRAGUE, Sesame Street 123</span>
    </div>
я-и-вий
источник
-7

маржа: all_four_margin

предоставив 50% all_four_margin, поместит элемент в центр

style="margin: 50%"

вы также можете применить это для следующих

маржа: верхний правый нижний левый

маржа: вверху справа и слева внизу

поля: верхнее и нижнее правое и левое

задавая соответствующий%, мы получаем элемент, где захотим.

Локеш
источник
5
пожалуйста, поясните, ваши формулировки кажутся несколько разрозненными и бессвязными.
Бенджамин Трент,
Нечеткий ответ с неправильной формулировкой и ограничен списком возможных значений для margin.
nuno