Чому вертикальне вирівнювання: середина не працює на моєму прольоті чи ділі?


247

Я намагаюся вертикально центрировать a spanабо divелемент в іншому divелементі. Однак коли я кажу vertical-align: middle, нічого не відбувається. Я спробував змінити displayвластивості обох елементів, і, здається, нічого не працює.

Це те, що я зараз роблю на своїй веб-сторінці:

.main {
  height: 72px;
  vertical-align: middle;
  border: 1px solid black;
  padding: 2px;
}
    
.inner {
  vertical-align: middle;
  border: 1px solid red;    
}
    
.second {
  border: 1px solid blue; 
}
<div class="main">
  <div class="inner">
    This box should be centered in the larger box
    <div class="second">Another box in here</div>
  </div>
</div>

Ось jsfiddle реалізації, що показує, що вона не працює: http://jsfiddle.net/gZXWC/

Відповіді:


207

Це здається найкращим способом - минуло деякий час з мого початкового посту, і ось що слід зробити зараз: http://jsfiddle.net/m3ykdyds/200

/* CSS file */

.main {
    display: table;
}

.inner {
    border: 1px solid #000000;
    display: table-cell;
    vertical-align: middle;
}

/* HTML File */
<div class="main">
    <div class="inner"> This </div>
</div>

2
То як хтось робить те, що хоче зробити ОП?
Райан Мортенсен

Будь-які ідеї щодо змінних рядків рядків? тобто. якщо немає способу дізнатися, буде це один чи два рядки. Чи потрібно мені тоді користуватися jQuery?
foochow

Що робити, якщо висота повинна бути динамічною, яке рішення?
Мурхаф Суслі

не повинно бути прийнятою відповіддю, покладається на знання висоти ".inner", тож не точно те, про що просила ОП, а деякі набагато кращі відповіді нижче див. @timbergus або відповіді Тіма Перкінса внизу внизу.
Майк-джерело

@ Майк-джерело, знаючи висоту внутрішньої, можливо на 100%, навіть якщо висота є динамічною, оскільки трохи JavaScript може визначити це і динамічно змінити правило CSS для цього об'єкта DOM.
Чарльз Аддіс

143

Використання CSS3:

<div class="outer">
   <div class="inner"/>
</div>

Css:

.outer {
  display : flex;
  align-items : center;
  justify-content: center;
}

Примітка. Це може не працювати в старих IE


16
Це підтримується всіма основними сучасними браузерами та найпростішим та найчистішим рішенням.
Сем

2
Також пам’ятайте, що inline-flexвсередині внутрішнього елемента є кілька елементів підряд.
Дан Ніссенбаум

1
У моєму випадку, оскільки я хотів також зосереджувати вміст .inner горизонтально, мені довелося додати .inner { width: 100%; }. Таким чином, здається, він працює як, .outer { display: table; } .inner { display: table-cell; vertical-align: middle; }але не примушуючи до мінімальної ширини.
Bart S

Раніше я justify-content: center;вирівнював горизонтально, що чудово спрацювало
Рут Янг

140

Спробуйте це, працює для мене дуже добре:

/* Internet Explorer 10 */
display:-ms-flexbox;
-ms-flex-pack:center;
-ms-flex-align:center;

/* Firefox */
display:-moz-box;
-moz-box-pack:center;
-moz-box-align:center;

/* Safari, Opera, and Chrome */
display:-webkit-box;
-webkit-box-pack:center;
-webkit-box-align:center;

/* W3C */
display:box;
box-pack:center;
box-align:center;

4
відмінна відповідь, це дало мені цілком працююче рішення, яке не спричиняло інших проблем, що виникають (додаток, що використовує jquerymobile + phonegap та всі інші рішення, призвели до проблем із розміщенням css і div). Просто щоб вказати на те , що ці параметри повинні бути додані в CSS блок специфічного для елементів , які будуть зосереджено / мідл, наприклад: #element span {height:100%;display:-webkit-box;-webkit-box-pack:center;-webkit-box-align:center;}- примітка висоти важлива забезпечити пролітну успадковані всю висоту контейнера (ймовірно, ДІВ) , інакше ви все одно не отримаєте вертикальне центрування!
Енді Лоренц

BTW, ви можете написати стандартний код флексокса без префіксів браузера, а потім отримати префікс браузера за допомогою autoprefixer github.com/postcss/autoprefixer або через онлайн-демонстрацію simevidas.jsbin.com/gufoko/quiet
starikovs

2
недійсна вартість нерухомості boxвdisplay
Joaquinglezsantos

Також відповідь @ user1782556 працює краще, коли у зовнішній коробці є прокладки.
iautomation

34

Налаштування висоти рядка на тій же висоті, що вона містить div, також буде працювати

DEMO http://jsfiddle.net/kevinPHPkevin/gZXWC/7/

.inner {
    line-height:72px;
    border: 1px solid #000000;
}

1
Я розмістив посилання, в якому пояснив цей метод. Хоча це не мій кращий метод, якщо решта макета не має фіксованого розміру - я зіткнувся з проблемами з різними розмірами вікон перегляду за допомогою цього методу.
Чарльз Аддіс

2
так, техніка висоти рядків працює добре, але ТОЛЬКО, якщо ви маєте однорядковий вміст. Додаткові лінії будуть втрачені / проллються поза контейнером, і вам потрібно буде починати заново
Енді Лоренц

а) line-heightтакож змінить висоту внутрішнього елемента. б) Внутрішній елемент все ще не точно вертикально по центру. в) Він не працює над елементами, які не містять тексту, наприклад: <img>або елементами з фіксованою висотою.
Alph.Dev

Він також може вийти з ладу між ОС (Windows / Mac) через різницю в візуалізації шрифту
LocalPCGuy

1
Це дуже непередбачувано і часто призводить до додаткової висоти на контейнері.
Недистракція

25

Якщо ви не можете покластися на flexbox ... Помістіть .childу .parentцентр. Працює, коли розміри пікселів невідомі (іншими словами, завжди) і немає проблем з IE9 +.

.parent { position: relative; }

.child {
    position: absolute;
    top : 50%;
    left: 50%;
    -ms-transform: translate(-50%, -50%);
    transform    : translate(-50%, -50%);    
}
<div class="parent" style="background:lightyellow; padding:6em"> 
  <div class="child" style="background:gold; padding:1em">&mdash;</div> 
</div>


Це насправді найбільш добре зроблене рішення, тим більше, що більшість проектів, які я бачив до цього часу, потребують сумісності з IE9
Jabberwocky

21

Вам слід надіти vertical-align: middleвнутрішній елемент, а не зовнішній елемент. Встановіть line-heightвластивість зовнішнього елемента, щоб він відповідав heightзовнішньому елементу. Потім встановіть display: inline-blockі line-height: normalна внутрішній елемент. Роблячи це, текст на внутрішньому елементі загортається з нормальною висотою рядка. Працює в Chrome, Firefox, Safari та IE 8+

.main {
    height: 72px;
    line-height:72px;
    border: 1px solid black;
}
.inner {
    display: inline-block;
    vertical-align: middle;
    line-height: normal;
}
<div class="main">
    <div class="inner">Vertically centered text</div>
</div>

Скрипка


Це, мабуть, найпростіший спосіб ... всі інші відповіді на цій сторінці зайво незграбні / хиткі, АБО не підтримуються у старих браузерах АБО покладаються на знання висоти внутрішнього елемента. Вам насправді не потрібно line-height: normal;і display:inline;працює. Бонусом цього методу є те, що він не заважає, з text-align:center;використанням якого display: table-cell;можна створювати проблеми. Досить часто ми хочемо вирівняти як горизонтально, так і вертикально. Дивіться цю відредаговану скрипку: jsfiddle.net/br090prs/36
mike-source

2
@ Майк-джерело причина використовувати line-height: normalта display: inline-blockполягає в тому, що внутрішній текст буде обернутись належним чином. Якщо ви впевнені, що текст у внутрішньому розділі ніколи не загортається, ці властивості не потрібні.
Тім Перкінс

З тих пір, як Microsoft закінчила підтримку старих версій IE, я використовував flexbox для подібних речей (як @ user1782556 запропонував). Моя оригінальна відповідь - це шлях, якщо вам все-таки потрібно підтримувати IE 10 або старші.
Тім Перкінс

100% погоджуюся, але я б особисто не звертався до флексу, але лише 76% браузерів повністю підтримують його станом на травень 2016 року (94%, якщо ви включили часткову підтримку), див.: Caniuse.com/#search=ffleksi 20box . Це дуже близьке до того, щоб бути найбільш розумним варіантом, хоча, залежно від вашої бази користувачів.
Майк-джерело

10

Я використовував це, щоб вирівняти все, що знаходиться в центрі оболонки, якщо це комусь допомагає - я вважав, що це найпростіше:

div.wrapper {
  /* --- This works --- */
  display: flex;
  /* Align Vertically */
  align-items: center;
  /* Align Horizontally */
  justify-content: center;
  /* --- ---------- ----- */
  width: 100%;
  height:100px;
  background-color: blue;
}
div.inner {
  width: 50px;
  height: 50px;
  background-color: orange;
}
<div class="wrapper">
  <div class="inner">
  </div>
</div>


7

Тут ви маєте приклад двох способів вертикального вирівнювання. Я їх використовую, і вони працюють досить добре. Один використовує абсолютне позиціонування, а другий використовує флексбокс .

Приклад вертикального вирівнювання

Використовуючи flexbox, ви можете вирівняти елемент самостійно всередині іншого елемента за display: flex;допомогою align-self. Якщо вам потрібно вирівняти його також горизонтально, можна використовувати align-itemsі justify-contentв контейнері.

Якщо ви не хочете використовувати flexbox, ви можете використовувати властивість позиції. Якщо ви зробите контейнер відносним та вмістом абсолютним, вміст зможе вільно переміщатися всередині контейнера. Тож якщо ви використовуєте top: 0;і left: 0;вміст, він буде розташований у верхньому лівому куті контейнера.

Абсолютне позиціонування

Потім, щоб вирівняти його, потрібно просто змінити верхню і ліву посилання на 50%. Це розмістить вміст у центрі контейнера у верхньому лівому куті вмісту.

Вирівняйте посередині ємності

Тому вам потрібно виправити цей переклад вмісту наполовину його розміру вліво і вгорі.

Абсолютний центр


5

ось чудова стаття про те, як вестично вирівняти .. Мені подобається поплавковий шлях.

http://www.vanseodesign.com/css/vertical-centering/

HTML:

<div id="main">
    <div id="floater"></div>
    <div id="inner">Content here</div>
</div>

І відповідний стиль:

#main {
   height: 250px;
}

#floater {
   float: left;
   height: 50%;
   width: 100%;
   margin-bottom: -50px;
}

#inner {
   clear: both;
   height: 100px;
}

3
Я думаю, що якщо визначити висоту блоку #inner, це приводить до недійсності концепції правильного вертикального центрування. OPS просив зробити це автоматично, тому я міг би уявити, що означає, що висота внутрішньої коробки не відома під час зачаття.
Алексіс Вільке

5

HTML

<div id="myparent">
  <div id="mychild">Test Content here</div>
</div>

CSS

#myparent {
  display: table;
}
#mychild {
  display: table-cell;
  vertical-align: middle;
}

Ми встановлюємо батьківський div для відображення у вигляді таблиці, а дочірнє діло для відображення у вигляді комірки таблиці. Потім ми можемо використовувати вертикальне вирівнювання дочірнього діва та встановити його значення на середину. Все, що знаходиться всередині цього дочірнього діва, буде вертикально по центру.


4

Це просто. Просто додайте display:table-cellу свій основний клас.

.main {
  height: 72px;
  vertical-align: middle;
  display:table-cell;
  border: 1px solid #000000;
}

Перевірте цю jsfiddle !


4

Ось останнє найпростіше рішення - не потрібно нічого змінювати, просто додайте три рядки правил CSS у свій контейнер діва, куди ви хочете зосередитись. Я люблю Flex Box#LoveFlexBox

.main {
  /* I changed height to 200px to make it easy to see the alignment. */
  height: 200px;
  vertical-align: middle;
  border: 1px solid #000000;
  padding: 2px;
  
  /* Just add the following three rules to the container of which you want to center at. */
  display: flex;
  flex-direction: column;
  justify-content: center;
  /* This is true vertical center, no math needed. */
}
.inner {
  border: 1px solid #000000;
}
.second {
  border: 1px solid #000000;
}
<div class="main">
  <div class="inner">This box should be centered in the larger box
    <div class="second">Another box in here</div>
  </div>
  <div class="inner">This box should be centered in the larger box
    <div class="second">Another box in here</div>
  </div>
</div>

Бонус

justify-contentзначення може бути встановлено в наступні кілька варіантів:

  • flex-start, яка вирівняє дочірню поділку до місця, де починається гнучкий потік у його батьківському контейнері. У цьому випадку він залишиться на вершині.

  • center, яка вирівняє дочірню поділку до центру її батьківського контейнера. Це дійсно акуратно, тому що вам не потрібно додавати додатковий дів, щоб обгортати всіх дітей, щоб помістити обгортку в батьківський контейнер, щоб центрировать дітей. Через це, це справжній вертикальний центр ( column flex-directionаналогічно, якщо ви зміните flow-directionна row, він стане горизонтально центрованим.

  • flex-end, яка вирівняє дочірню поділку до місця, де закінчується потік згину в його батьківському контейнері. У цьому випадку він переміститься вниз.

  • space-between, яка поширить усіх дітей від початку потоку до кінця потоку. Якщо в демонстраційній версії я додав ще одну дітку, щоб показати, що вони розповсюджені.

  • space-around, подібний до space-between, але з половиною місця на початку та в кінці потоку.


Ідеальне рішення. Несумісні веб-переглядачі можуть приймати вміст нерівномірно, і користувач повинен мати справу з ним або оновити його.
doublejr

0

Оскільки vertical-alignпрацює, як очікувалося, на а td, ви можете поставити одну клітинку tableв, divщоб вирівняти її вміст.

<div>
    <table style="width: 100%; height: 100%;"><tr><td style="vertical-align: middle; text-align: center">
        Aligned content here...
    </td></tr></table>
</div>

Клункі, але працює, наскільки я можу сказати. Це може не мати недоліків інших обхідних шляхів.


5
Ні, будь ласка, більше немає таблиць. CSS може це зробити чистим способом. У цьому випадку не потрібно використовувати <table>.
enguerranws

0

Просто помістіть вміст всередину таблиці висотою 100% і встановіть висоту для головного поділу

<div style="height:80px;border: 1px solid #000000;">
<table style="height:100%">
<tr><td style="vertical-align: middle;">
  This paragraph should be centered in the larger box
</td></tr>
</table>
</div>

0

Щоб вертикально зафіксувати проміжок або елемент div в іншому ділі, додайте положення відносно батьківського діва та абсолютне положення дочірнього поділу. Тепер дочірній дів може бути розміщений у будь-якому місці всередині div.Приклад нижче центрів як горизонтально, так і вертикально.

<div class="parent">
    <div class="child">Vertically and horizontally centered child div</div>
</div>

css:

.parent{
    position: relative;
}
.child{
    position: absolute;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    margin: auto;
}

0

Це сучасний підхід, і він використовує функціонал CSS Flexbox. Тепер ви можете вертикально вирівняти вміст у своєму батьківському контейнері, просто додавши ці .mainконтейнери до цього контейнера

.main {
        display: flex;
        flex-direction: column;
        justify-content: center;
}

І вам добре піти!

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