2014-02-03 2 views
2

Я знаю, что есть много способов сосредоточиться на CSS. Центрирование чего угодно горизонтально довольно прямолинейно. Однако, если вы собираетесь центрировать все по вертикали, это совершенно новая история. Я просто хочу знать, почему мы не можем просто сказать нижний выровнять: auto; топ-Align: авто; как мы делаем, когда хотим что-то по центру горизонтально? Почему что-то, что кажется таким простым, как центрирование чего-то, кажется настолько сложным, что центрирование чего-то горизонтально настолько простое? Я знаю, что существует много способов, но давайте просто скажем, что у вас есть элемент неизвестного размера, который вы хотите центрировать внутри другого элемента неизвестного размера.Вертикальный центр с CSS

Я сижу с этим в течение почти двух дней, не нахожу хороший вопрос по этому вопросу, у нас есть тонны различных способов центрирования предметов по горизонтали, но почему нет ни одного стандарта CSS, способного центрировать это вертикально? Это плохо? Это заставляет людей плакать или беспорядочно вступать в труд? Плавит ли он ядерные реакторы?

Мы живем в 2014 году. Мне кажется, что вам не нужно использовать Javascript, чтобы сделать что-то простое, чтобы центрировать что-то внутри другого элемента.

Edit: код пример того, что я имею в виду: http://jsfiddle.net/VsakD/

CSS:

div.parentbox 
{ 
    width:500px; 
    height:500px; 
    border-style:solid; 
} 

div.childbox 
{ 
    width:300px; 
    height:300px; 
    border-style:solid; 
    margin-left:auto; 
    margin-right:auto; 
    margin-top:auto; 
    margin-bottom:auto; 
} 

HTML:

<div class="parentbox"> 
    <div class="childbox"> 
     I shall be in the middle of parentbox regardless of its size! 
    </div> 
</div> 
+1

некоторый код пожалуйста. Мы понимаем код лучше, чем рассказ – Satpal

+0

display: flex for the win – codeaddict

+1

работает с вертикальным выравниванием для содержимого внутри таблицы-ячейки (td или display as) или между встроенным ящиком, используя их базовую линию в качестве ссылки. display: table-cell работает в IE8, и это делает вещи очень легкими :) –

ответ

2

Может кто-то пожалуйста, выделите точно, почему я не могу просто сказать margin-top:auto; margin-bottom:auto; вертикальной совместятся, что было бы логично предположить, будет работать, так как вы margin-left:auto; margin:right:auto; горизонтально выровнять?

Согласно Spec (10.6.2):

Инлайн заменены элементы, на уровне блоков заменены элементы в нормальном потоке , «встроенный блок» заменены элементы в нормальном потоке и плавающие заменяемые элементы

Если «margin-top» или «margin-bottom» равны 'auto', их используемое значение: .

Именно поэтому использование сверху/снизу margin в этом случае, не вносит изменения.

Кстати, для того, чтобы выровнять Div элемент (с неизвестными размерами) вертикально внутри контейнера, вы могли бы следовать this approach:

.parentbox {   
    text-align: center; /* Align inline elements center horizontally */ 
    font: 0/0 a; /* <-- remove the gap between inline(-block) elements */ 
} 

.parentbox:before { 
    content: ' '; 
    display: inline-block; 
    vertical-align: middle; 
    height: 100%; 
} 

.childbox { 
    display: inline-block; 
    vertical-align: middle; 
    font: 1rem/1 Arial, sans-serif; /* <-- Reset the font */ 
} 

WORKING DEMO

-1

Автор код с модификациями Я буду в середине родительского стола независимо от его размер!

div.parentbox 
{ 
    width:500px; 
    height:500px; 
    border-style:solid; 
    display: table; //added this line 
} 

div.childbox 
{ 
    width:300px; 
    height:300px; 
    border-style:solid; 
    margin-left:auto; 
    margin-right:auto; 
    margin-top:auto; 
    margin-bottom:auto; 
    display: table-cell; //added this line 
    vertical-align: middle; 
    text-align: center; 
} 
+0

Проводка кода не поможет никому понять ваш ответ. Пожалуйста, объясните, какая часть вашего кода является ответом – Askanison4

+0

Я хочу сосредоточиться на CSS, а не на таблицах. Я знаю, что веб-разработчики пострадают, когда кто-то использует таблицы для чего-либо, не предназначенного для форматирования таблицы. – Martin

+0

Боже мой! display: table is not

, это только отображение defaut таблицы, например list-item для lis или block для div, не смешивать CSS и HTML ... –

0

Вы можете легко найти старые методы, чтобы сделать это, но есть новая техника обсуждается здесь: http://zerosixthree.se/vertical-align-anything-with-just-3-lines-of-css/

Он работает в IE9 + и всех других браузеров. Преимущество использования этого - не знать высоту элемента или использовать абсолютное позиционирование. Метод линий линии не влияет на несколько строк текста.

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

display: table подход является одним из способов, но это также можно воспользоваться CSS-преобразований. В отличие от многих других свойств CSS, таких как «верх», для которых проценты фигурируют относительно , содержащего элемент, преобразования CSS применяют проценты к самому элементу. Таким образом, вы можете поместить элемент 50% пути вниз внутри контейнера, а затем преобразовать его на 50% от его собственного размера:

.center-me { 
    position: relative; 
    top: 50%; 
    transform: translateY(-50%); 
    margin-left: auto; margin-right: auto; 
    width: 300px; /* or whatever */ 
} 

<div class=center-me> Hello World! </div> 

Thanks go to the great Dave Walsh.Here is a jsfiddle to demonstrate.

0

Лучшим способом я достигнута техника, которую вы хотите, - это использование правил tabledisplay.

<div class="parent-container'> 
    <div class="child-container"> 
     This is vertically centered text! 
    </div> 
</div> 

Фокус в том, в CSS

.parent-container { 
     display: table; 
     width: 100%; 
     height: 300px; 
     background-color: #ff0000; 
    } 

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

Делая дисплей родительского контейнера в качестве table, и ребенок дисплей в качестве cell, то одни и те же вертикальные правила выравнивания как table, потому это то, что вы говорите, чтобы признать себя.

Вот моя скрипка JS для справки. Я установил фиксированную высоту, чтобы показать вертикальное выравнивание в действии, но на самом деле он будет работать с процентными высотами или вычисленными высотами от заполнения. http://jsfiddle.net/JTVeG/

+0

Если вы прочитали мой вопрос, я спрашиваю, почему текст не будет центрирован, когда я использую margin-top: auto; и margin-bottom: auto; и почему такая простая задача должна быть настолько сложной для решения. – Martin

Смежные вопросы