Как центрировать div вертикально внутри абсолютно позиционированного родительского div

Я пытаюсь получить синий контейнер в середине розового, но, похоже, vertical-align: middle; не выполняет работу в этом случае.

<div style="display: block; position: absolute; left: 50px; top: 50px;">
    <div style="text-align: left; position: absolute;height: 56px;vertical-align: middle;background-color: pink;">
        <div style="background-color: lightblue;">test</div>
    </div>
</div>

Результат:

enter image description here

Expectation:

enter image description here

Пожалуйста, предложите, как я могу это достичь.

Jsfiddle

Ответ 1

Прежде всего, обратите внимание, что vertical-align применимо только к ячейкам таблицы и элементам линейного уровня.

Существует несколько способов достижения вертикальных выравниваний, которые могут или не могут удовлетворить ваши потребности. Однако я покажу вам два метода из моих избранных:

1. Использование transform и top

.valign {
    position: relative;
    top: 50%;
    transform: translateY(-50%);
    /* vendor prefixes omitted due to brevity */
}
<div style="position: absolute; left: 50px; top: 50px;">
    <div style="text-align: left; position: absolute;height: 56px;background-color: pink;">
        <div class="valign" style="background-color: lightblue;">test</div>
    </div>
</div>

Ответ 3

Используйте flex blox в своем абзацевом расположении div, чтобы центрировать его содержимое.

См. пример https://plnkr.co/edit/wJIX2NpbNhO34X68ZyoY?p=preview

.some-absolute-div {    
  display: -webkit-box;
  display: -webkit-flex;
  display: -moz-box;
  display: -moz-flex;
  display: -ms-flexbox;
  display: flex;

  -webkit-box-pack: center;
  -ms-flex-pack: center;
  -webkit-justify-content: center;
  -moz-justify-content: center;
  justify-content: center;

  -webkit-box-align: center;
  -ms-flex-align: center;
  -webkit-align-items: center;
  -moz-align-items: center;
  align-items: center;
}

Ответ 4

Центр по вертикали и по горизонтали:

.parent{
  height: 100%;
  position: absolute;
  width: 100%;
  top: 0;
  left: 0;
}
.c{
  position: absolute;
  top: 50%;
  left: 0;
  right: 0;
  transform: translateY(-50%);
}

Ответ 5

Вы можете использовать display:table/table-cell;

.a{
   position: absolute; 
  left: 50px; 
  top: 50px;
  display:table;
}
.b{
  text-align: left; 
  display:table-cell;
  height: 56px;
  vertical-align: middle;
  background-color: pink;
}
.c {
  background-color: lightblue;
}
<div class="a">
  <div  class="b">
    <div class="c" >test</div>
  </div>
</div>

Ответ 6

Пожалуйста, проверьте этот ответ на аналогичную проблему.

Это самый простой способ, который я нашел.

fooobar.com/questions/81661/...

Примечание. Я использовал display: -webkit-flex; вместо display: flex; для тестирования внутри сафари.

СНОСКА. Я только начинающий, помогая кому-то, кто явно переживает.

Ответ 7

Вот простой способ использования объекта Top.

Например: если абсолютный размер элемента равен 60 пикселей.

.absolute-element { 
    position:absolute; 
    height:60px; 
    top: calc(50% - 60px);
}

Ответ 8

Дополнительное простое решение

HTML:

<div id="d1">
    <div id="d2">
        Text
    </div>
</div>

CSS:

#d1{
    position:absolute;
    top:100px;left:100px;
}

#d2{
    border:1px solid black;
    height:50px; width:50px;
    display:table-cell;
    vertical-align:middle;
    text-align:center;  
}

Ответ 9

Вы можете сделать это с помощью display:table; в родительском div и display: table-cell; vertical-align: middle; display: table-cell; vertical-align: middle; в детской див

<div style="display:table;">
      <div style="text-align: left;  height: 56px;  background-color: pink; display: table-cell; vertical-align: middle;">
          <div style="background-color: lightblue; ">test</div>
      </div>
  </div>