Як центрувати діл вертикально всередині абсолютно розташованого батьківського діва


146

Я намагаюся отримати синій контейнер посеред рожевого, однак, здається, 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>

Результат:

введіть тут опис зображення

Очікування:

введіть тут опис зображення

Підкажіть, будь ласка, як я можу цього досягти.

Jsfiddle


1
Чи є причина, чому ви використовуєте position: absoluteвсюди?
Вучко

то vertical-align: middle;працює з display: inline-blockабо сервірування столу
ctf0

перевірте це посилання: vanseodesign.com/css/vertical-centering ;)
Жорді Кастілья

@Vucko так - це обов’язкова умова, оскільки це просто спрощена версія дуже складної верстки, але абсолютна позиція в обох головних дивах є ключовою справою.
Владимир

@Vladimirs Я можу лише подумати margin-top: calc((56px - 16px) / 2), де 56px - parent height, 16px - element height/font-size- JSFiddle
Вучко

Відповіді:


332

Перш за все зауважте, що 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>

Ключовим моментом є те, що значення процентного співвідношення по topвідношенню до heightблоку, що містить; Тоді як значення відсотка на transforms відносно розміру самого поля (обмежувального поля).

Якщо у вас виникли проблеми із візуалізацією шрифту (розмитий шрифт), виправлення полягає в тому, щоб додати perspective(1px)до transformдекларації, щоб воно стало:

transform: perspective(1px) translateY(-50%);

Варто зазначити, що CSS transform підтримується в IE9 + .

2. Використання inline-block(псевдо-) елементів

У цьому способі у нас є два брати, inline-blockякі вирівнюються вертикально посередині по vertical-align: middleоголошенню.

Один з них має heightвід 100%свого батька , а інший наш шуканий елемент якого ми хотіли , щоб вирівняти його по центру.

.parent {
    text-align: left;
    position: absolute;
    height: 56px;
    background-color: pink;
    white-space: nowrap;
    font-size: 0; /* remove the gap between inline level elements */
}

.dummy-child { height: 100%; }

.valign {
    font-size: 16px; /* re-set the font-size */
}

.dummy-child, .valign {
    display: inline-block;
    vertical-align: middle;
}
<div style="position: absolute; left: 50px; top: 50px;">
    <div class="parent">
        <div class="dummy-child"></div>
        <div class="valign" style="background-color: lightblue;">test</div>
    </div>
</div>

Нарешті, нам слід скористатися одним із доступних методів для усунення розриву між елементами вбудованого рівня .


Дякуємо за ці корисні поради. Це працювало на мій проект. Хороші справи.
Седат Кумку

Першим valignелементом методу має бутиdisplay: block
Олег

transform: translateY(-50%);Ніколи цього не бачив, але працює бездоганно. Реальне збереження життя.
Бенні Боттема

55

використовуй це :

.Absolute-Center {
    margin: auto;
    position: absolute;
    top: 0; left: 0; bottom: 0; right: 0;
}

перейдіть за цим посиланням: https://www.smashingmagazine.com/2013/08/absolute-horizontal-vertical-centering-css/


Як це не головне рішення? Так просто і це працює!
Мейсон

21
Майте на увазі, що для цього heightпотрібно визначити властивість (у px, em тощо).
Вайдас

Що робити, якщо в батьків є кілька дівок? Чи не всі будуть розміщені один на одного?
psykid

це не працює, якщо є ще одна дитина на тому ж рівні з "абсолютним центром"
Паскут

18

Використовуйте флекс-блокс у своєму абсолютно розміщеному розділі, щоб зосереджувати його вміст.

Див. Приклад 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;
}

11

По центру вертикально і горизонтально:

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

3

Ви можете використовувати 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>


Дякую, ваш приклад працює ідеально, однак .bвідсутній, position: absolute;що важливо, щоб інші речі відображалися властивістю, яку я не включав, щоб зберегти код чіткішим. Я знаю, що немає сенсу абсолютно розміщувати комірки таблиці, але, можливо, є інший підхід, який дозволить зберегти position: absolute;в обох .aі .bкласах?
Владимир

якщо a - абсолютна позиція, а b (дитина) надає йому розмір, b знаходиться в абсолютній позиції щодо решти змісту. якщо а не припустимо залишитися незмінним, я не розумію цілі абсолютного всередині абсолютного?
G-Cyrillus

1

Ось простий спосіб використання Top об’єкта.

наприклад: Якщо розмір абсолютного елемента становить 60 пікс.

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

2
Використання calcкорисно, хоча це повинно бути top: calc(50% - 30px)фактично по центру.
мішечок

1

Додаткове просте рішення

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;  
}

0

Перевірте цю відповідь на подібне питання.

Це, безумовно, найпростіший спосіб, який я знайшов.

https://stackoverflow.com/a/26079837/4593442

ПРИМІТКА. Я використовував дисплей: -webkit-flex; замість дисплея: flex; для тестування всередині сафарі.

ФОТОТ. Я лише початківець, де ділюся допомогою того, хто явно досвідчений.


0

Ви можете це зробити, використовуючи display:table;в батьківському діві та 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>


3
можливо, ваша відповідь хороша, але ви можете дуже вдосконалити її, додавши опис того, що робить ваш код ...
DaFois
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.