Вирівняйте вертикально за допомогою CSS 3


74

Чи є у CSS 3 спосіб вертикального вирівнювання елемента блоку? У вас є приклад? Дякую.


1
Це не CSS 3 шлях ...
Тхо

2
@Так так. CSS 3 - це надмножина CSS 2.
Шіме Відас

3
Гаразд, ви праві, я погоджуюсь із вашим твердженням ... але css3 надає щось простіше? Дякую.
Тхо

1
Ще один приклад того, як CSS3 є надмірно розмовленим словом. CSS3 - це просто рівень CSS 3. Будь-який код CSS1 та CSS2.x також є дійсним CSS3, переборте його .
BoltClock

Відповіді:


87

Нещодавно розглядав цю проблему і намагався:

HTML:

<body>
    <div id="my-div"></div>
</body>

CSS:

#my-div {               
    position: absolute;
    height: 100px;
    width: 100px;    
    left: 50%;
    top: 50%;
    background: red;
    transform: translate(-50%, -50%);    
    -webkit-transform: translate(-50%, -50%);
    -moz-transform: translate(-50%, -50%);
    -ms-transform: translate(-50%, -50%);
}

Ось скрипка:

http://jsfiddle.net/sTcp9/6/

Це навіть працює, коли використовується "width / height: auto", замість фіксованих розмірів. Перевірено на останніх версіях Firefox, Chrome та IE (* задишка *).


3
Найкраще рішення. Не забудьте скористатися виявленням csstransforms Modernizr :-)
myfreeweb

9
Будьте дуже обережні з таким підходом. Для перекладу елемента використовується графічний процесор, який в кінцевому підсумку обчислює пікселі як плаваючі крапки. Таким чином, ви можете в кінцевому підсумку перемістити об'єкт із значенням пікселя та отримати розмиті результати. Ознайомтесь із цією статтею для більш детальної інформації: martinkool.com/post/27618832225/beware-of-half-pixels-in-css
Laith

Щоб уникнути розмитих результатів через проблему " півпікселя ", спробуйте додати transform-style: preserve-3d;до батьківського елемента (джерело: zerosixthree.se/… ).
nickb

12
здається, w3.org подобається вашому методу. вони розмістили це на своєму сайті w3.org/Style/Examples/007/center.en.html#vertical Хороше рішення товариш :)
trve.fa7ad

1
@ n611x007 не потрібно встановлювати лівий стиль вертикальним вирівнюванням. встановивши ліворуч і translateX вирівняє вміст горизонтально, а встановивши верх і translateY вирівняє вміст вертикально.
1,21 гігават

34

Примітка: Цей приклад використовує чорнову версію модуля гнучкого розміщення коробки . Його замінила несумісна сучасна специфікація.

Відцентруйте дочірні елементи поля div за допомогою властивостей box-align та box-pack разом.

Приклад:

div
{
width:350px;
height:100px;
border:1px solid black;

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

1
Це те, що я шукав: нові доповнення до CSS (тобто CSS3), які роблять це простішим, ніж усі старі злому CSS1 / 2. Дякую.
thaddeusmt

34

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

<style>
  .container {
    display: flex;
    align-items: center; /* Vertical align */
    justify-content: center; /* Horizontal align */
  }
</style>

<div class="container">
  <div class="block"></div>
</div>

Центри blockвсередині containerвертикально (і горизонтально).

Підтримка браузера: http://caniuse.com/flexbox


9

кілька способів:

1. Абсолютне позиціонування - для роботи потрібно мати задекларовану висоту:

<div>
   <div class='center'>Hey</div>
</div>

div {height: 100%; width: 100%; position: relative}
div.center {
     width: 100px;
     height: 100px;
     top: 50%;
     margin-top: -50px;
}

* 2. Використовуйте дисплей: таблиця http://jsfiddle.net/B7CpL/2/ *

<div>
     <img src="/img.png" />
     <div class="text">text centered with image</div>
</div>


div {
     display: table;
     vertical-align: middle
}

div img,
div.text {
     display: table-cell;
     vertical-align: middle
}
  1. Більш детальне керівництво за допомогою display: table

http://css-tricks.com/vertically-center-multi-lined-text/


3

Існує простий спосіб вирівняти div по вертикалі та горизонталі в css.

Просто встановіть висоту вашого div і застосуйте цей стиль

.hv-center {
    margin: auto;
    position: absolute;
    top: 0; left: 0; bottom: 0; right: 0;
}

Сподіваюся, це допомогло.


Це вимагає розташування батьківського (тобто position: relative).
alxs

2

Я завжди використовую підручник з цієї статті для центрування речей. Це чудово

div.container3 {
   height: 10em;
   position: relative }              /* 1 */
div.container3 p {
   margin: 0;
   position: absolute;               /* 2 */
   top: 50%;                         /* 3 */
   transform: translate(0, -50%) }   /* 4 */

Основними правилами є:

  1. Зробіть контейнер відносно позиціонованим, що оголошує його контейнером для абсолютно розташованих елементів.
  2. Зробіть сам елемент абсолютно позиціонованим.
  3. Помістіть його наполовину контейнера з написом "зверху: 50%". (Зверніть увагу, що тут 50% означає 50% висоти контейнера.)
  4. За допомогою перекладу перемістіть елемент вгору на половину власної висоти. ("50%" у "перекласти (0, -50%)" стосується висоти самого елемента.)

1
Ви можете використовувати translateY (-50%), щоб просто встановити вісь Y. Встановити стиль перетворення: зберегти-3d; щоб запобігти розмитості тексту на півпіксельних значеннях і обов’язково включайте префікси постачальника для перетворення та стилю перетворення.
1,21 гігават

Знайшли цю відповідь, знайшовши приклад центру w3 .. потім знайшли приклад центру w3, знайшовши цю відповідь. Excel сказав, що це найкраще; Циркулярне посилання виявлено!
panhandel

0

Спробуйте це також чудово працювати:

html:

   <body>
    <div id="my-div"></div>
   </body>

css:

#my-div {               
    position: absolute;
    height: 100px;
    width: 100px;    
    left: 50%;
    top: 50%;
    background: red;
    display: table-cell;
    vertical-align: middle

}

-1

Ви можете вирівняти по вертикалі, встановивши елемент для відображення: inline-block, а потім встановивши вертикальне вирівнювання: посередині;


1
Насправді це не за горами. Ви можете додати інший елемент перед цим (або використовувати a: before psuedo елемент на батьківському). Тоді нехай цей новий елемент має 100% висоту та 1px ширину та поле зліва: -1px. Потім надайте йому властивість inline-block та vertical-align: middle css. Тоді ви повинні переконатися, що батьківський елемент має визначену висоту.
Artvader
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.