2011-01-24 2 views
7

У меня есть img в floated div, и я не знаю, как центрировать его по вертикали.CSS вертикальное выравнивание

<div style="height: 300px"> 
    <img style="height: 50px" src="something" /> 
</div> 

вертикальный вылет: средний конечно не работает.

http://jsfiddle.net/wKQYj/

+1

Два способа, упомянутых в этой статье, были предоставлены уже как отдельные ответы, но вы были бы лучше CSSer, если бы знали, для чего фактически использовался вертикальный выравнивание: http://phrogz.net/css/vertical-align/ – scragz

+0

@scragz - Это хорошая ссылка. Хотя, я бы не использовал 'display: table-cell'. Конечно, я бы не использовал свой предложенный ответ '

'. Ха. – Jason

+0

https://pbs.twimg.com/media/B2mW8NiCQAA6IIP.jpg – walv

ответ

15

вертикально выравнивать текст в родительском элементе, и имейте в виду, что img это инлайн -элементное и так ведет себя аналогично к тексту, вы можете просто установить line-height к height родительского элемента:

div { 
    height: 300px; 
    line-height: 300px; 
} 

JS Fiddle demo.

3

vertical-align свойство только действительно хорошо на td элементов. Попробуйте что-то вроде:

<table> 
<tr> 
    <td style='height:300px; vertical-align:center'> 
    <img src='something'> 
    </td> 
</tr> 
</table> 

ИЛИ, так как вы знаете, высоту и ширину img:

<div style='height:300px;'> 
<img style='height:50px; position:relative; top:50%; margin-top:-25px'> 
</div> 
+2

ZOMG, ни один из вышеперечисленных мне не подходит, я имею в виду, что в css есть серьезная дыра, они развивают тени и т. Д., И мы должны использовать таблицы еще или на divs в divs, чтобы центрировать по вертикали ... Святая корова. Я должен использовать divs. И я не могу использовать второй код, потому что высота div будет изменена пользователями. Поэтому я потерян. – anonymous

+0

@ anonymous: можете ли вы использовать JavaScript или любые JS-библиотеки (MooTools, Scriptaculous, jQuery, Glow ...)? –

11

Стиль vertical-align CSS определяет выравнивание текста в его текстовой строке. Это позволяет, например, указать текст в виде верхнего или нижнего индекса.

Таким образом, он фактически не предназначен для вертикального выравнивания элемента внутри коробки.

Существует явное исключение из этого правила, однако - ячейки таблицы (т.е. <td> и <th> элементов) используют vertical-align стиль, чтобы сделать именно это: выравнивание содержимого ячейки внутри клетки.

Это исключение является чем-то вроде причуды - этого действительно не должно существовать. Дизайнеры CSS разместили его там, чтобы позволить CSS воспроизводить атрибут таблицы, который обычно использовался дизайнерами в темные дни табличных макетов.

Для других элементов, выравнивание содержимого коробки вертикально посередине, это может быть немного изобразительного искусства. Есть несколько способов:

  1. Для отдельных строк текста, просто сделать line-height такой же, как высота всей коробки. Для этого вам, вероятно, даже не понадобится vertical-align.

  2. Используйте display:table-cell;, чтобы элемент имитировал ячейку таблицы, а затем используйте vertical-align. Это работает, но может иметь непреднамеренные последствия (есть другие атрибуты ячеек таблицы, которые вы, возможно, не захотите имитировать).

  3. Если вы знаете высоту элемента, который вы хотите вертикального выравнивания, вы можете поместить его на 50% минус половину своей высоты, как это:

    position:absolute; 
    top:50%; 
    height:200px; 
    margin-top:-100px; /* half the height */ 
    

Есть несколько других, но они должны вас начать.

Надеюсь, что это поможет.

1

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

$(function(){ 
    var containerHeight = $('#container').outerHeight(); 
    var imgHeight = $('#logo img').outerHeight(); 

    var difference = (containerHeight - imgHeight)/2; 
    $('#logo img').css({'position' : 'relative', 'top' : difference + 'px'}); 

});

+0

Значит, ему нужно включить полную библиотеку jQuery, плюс этот скрипт? Кажется, немного переборщил, чтобы что-то сосредоточить. – Jason

+0

, если ему нужно сосредоточиться на чем-то более чем несколько раз, и если он не знает A), какова высота родительского div, а B) какова высота изображения, это будет работать каждый раз и в каждом case – heymrcarter

4

Для более современного (IE8 +) решения, которое не использует таблицы, мне нравится this one.

<style> 
/* Can be any width and height */ 
.block { 
    height:500px; 
    text-align: center; 
} 

/* The ghost, nudged to maintain perfect centering */ 
.block:before { 
    content: ''; 
    display: inline-block; 
    height: 100%; 
    vertical-align: middle; 
    margin-right: -0.25em; /* Adjusts for spacing */ 
} 

/* The element to be centered, can be any width or height */ 
.centered { 
    display: inline-block; 
    vertical-align: middle; 
    width: 300px; 
} 
</style> 

<div class="block"><div class="centered">Centered Content</div></div> 
+1

Лучшее решение, так как ему не нужно знать высоту содержимого и не использовать css-таблицы. Спасибо, что поделился! – Sygmoral

+1

+1 Умный трюк! Это должен быть принятый ответ ИМО. – Passerby

+0

есть способ сделать это, имея процентную ширину (на самом деле это 100%). –

2

Я использую дисплей: свойство коробки:

#container { 
    display: box; 
    box-orient: vertical; 
    box-pack: center; 
} 

#text { 
    vertical-align: middle; 
} 

ВИДЕТЬ JS-скрипку здесь: verical align js-fiddle

1

Используйте свойство translate, это просто и работает даже в IE:

img { 
    position: relative; 
    top: 50%; 
    transform: translateY(-50%); 
} 
+1

Очень красивый и короткий путь! Благодаря! –