Вертикальное центрирование диапазона в div

У меня есть div, содержащий span, и я хочу, чтобы span выровнялся по вертикали и горизонтали по центру моего div.

Вот скрипка: http://jsfiddle.net/RhNc2/1/

Я пробовал margin:auto на span и vertical-align на div, но это не работает

РЕДАКТИРОВАТЬ: мой div и мой диапазон не имеют фиксированной высоты, это зависит от содержимого, я установил его на скрипке, чтобы показать вам


person GregM    schedule 10.11.2011    source источник
comment
возможный дубликат Как вертикально центрировать ‹span› внутри div ?   -  person mercator    schedule 11.11.2011
comment
Удивительно. У меня есть одно из двух рабочих решений, но у меня есть 3 отрицательных голоса? Пойди разберись :) У меня возникает соблазн просто удалить его и получить значок давления со стороны сверстников.   -  person James Johnson    schedule 11.11.2011
comment
@mercator не уверен в дубликате, потому что решение в ссылке предлагает верх: 50%, и здесь в комментарии они говорят, что это не очень хорошая техника. И я сделал небольшую правку.   -  person GregM    schedule 11.11.2011
comment
@GregM: Здесь много таких вопросов, но, насколько мне известно, они не приняты. Я не считаю это дубликатом.   -  person James Johnson    schedule 11.11.2011
comment
comment
@NGLN Это не дубликат решения, которое они дают, оно не работает ... решение для высоты строки - это грязный трюк, который не работает везде.   -  person GregM    schedule 11.11.2011
comment
@GregM Это только принятый ответ, на который вы ссылаетесь, но есть еще десять! Особенно ответ kizu обещает быть вам полезным.   -  person NGLN    schedule 11.11.2011
comment
@NGLN Не уверен, что встроенный блок работает в старом браузере.   -  person GregM    schedule 11.11.2011


Ответы (5)


Выравнивание по вертикали — сложное дело, и я не знаю, есть ли какой-нибудь проверенный способ. Самый надежный метод, доступный за последние пару лет, — это использование макета таблицы CSS. Единственным недостатком этого подхода является то, что он может не работать в устаревших браузерах. Тем не менее, по моему опыту, это, вероятно, лучшее общее решение. Смотрите мой пример ниже:

<style type="text/css">
    #container {    
        display:table;    
        border-collapse:collapse;  
        height:200px;  
        width:100%;
        border:1px solid #000;
    }         
    #layout {    
        display:table-row;   
    }           
    #content {    
        display:table-cell;  
        text-align:center; 
        vertical-align:middle;    
    }           
</style>

<div id="container">    
    <div id="layout">    
        <div id="content"> 
            Hello world! 
        </div>     
    </div>   
</div> 

Вот jsFiddle: http://jsfiddle.net/aGKfd/2/

Есть еще один метод, но он не так надежен, как описанный выше. Он включает в себя два контейнера, для внешнего контейнера задано относительное положение, а для внутреннего — абсолютное. Используя абсолютное позиционирование во внутреннем контейнере, вы можете приблизиться, но для этого требуется некоторая настройка:

<style type="text/css">
    #vertical{ 
        position:absolute; 
        top:50%;     
        left:0; 
        width:100%; 
        text-align:center;
    } 
    #container {
        position:relative;
        height:200px;
        border:1px solid #000;
    }
</style>         
<div id="container"> 
    <div id="vertical"> 
        Hello world! 
    </div>               
</div> 

Вот jsFiddle: http://jsfiddle.net/6SWPe/

person James Johnson    schedule 10.11.2011
comment
Я не минусовал вас, но ваш второй пример центрирует вертикально только верхнюю часть поля #vertical, а не поле в целом. - person Ben; 11.11.2011
comment
-1. верхние 50% - не центр. вам нужно - margin-top = высота/2 - person bravedick; 11.11.2011
comment
так что не понижайте мое решение, если ВАШЕ решение ТАКЖЕ не идеально;) - person bravedick; 11.11.2011
comment
Для этой конкретной проблемы нет идеальных решений, но мое лучшее решение настолько хорошо, насколько это возможно. - person James Johnson; 11.11.2011
comment
@TarasNeporozhniy: Вы должны помнить, что это не про вас или меня, это про спрашивающего. Я не понизил ваш ответ, потому что вы мне не нравитесь. Я проголосовал за него, потому что line-height не является хорошим решением. Когда вы говорите о таком содержании, как «Привет, мир» и о чем-то еще, вас легко одурачить, но как только реальный контент входит в уравнение, line-height сбрасывает огромную бомбу. - person James Johnson; 11.11.2011
comment
@TarasNeporozhniy: Разница между нашими решениями в том, что мое не сломает весь дизайн, а ваше сломает. Это должно быть приоритетом №1 при ответе на вопрос CSS. - person James Johnson; 11.11.2011

Добавьте это в div CSS:

display:table-cell; text-align:center

рабочая скрипка находится здесь: http://jsfiddle.net/sdoking/DCT85/

CSS:

#myDiv {
border:1px solid black;
height:50px;
width:200px;
vertical-align:middle;
display:table-cell; 
text-align:center
}

#mySpan {
width:100%;
border:thin blue solid
}

Границы для ясности :)

person sdo    schedule 10.11.2011
comment
Это нормально, но несовместимо с некоторыми браузерами (например, с некоторыми популярными версиями IE). Вы можете узнать больше о вертикальном центрировании здесь: jakpsatweb.cz/css/css -vertical-center-solution.html - person David Brainer; 11.11.2011
comment
Это в дополнение к его текущему CSS, который уже включает выравнивание по вертикали: посередине — см. скрипку - person sdo; 11.11.2011
comment
Вам повезло с минусами, но это последнее редактирование опасно близко к моему первому решению. - person James Johnson; 11.11.2011
comment
Ну .. разве что я опубликовал свое решение на 3 минуты раньше вашего? Все, что я сделал в своем редактировании, это переместил код из скрипки в пост. - person sdo; 11.11.2011
comment
но это последнее редактирование опасно близко подходит к моему первому решению. - person James Johnson; 11.11.2011

используйте высоту строки = высота: http://jsfiddle.net/RhNc2/8/

person bravedick    schedule 10.11.2011

Вы также можете просто применить эти стили к содержащему файлу <div>. Решение line-height предполагает, что вам нужна только одна строка текста для центрирования.

#myDiv{
    border:1px solid black;
    height:50px;
    width:200px;
    text-align:center;
    line-height:50px;
}
person Ben    schedule 10.11.2011
comment
Одна строка может быть всем, что нужно - person Ben; 11.11.2011
comment
Это опасное предположение. Есть много переменных, которые могут повлиять на это решение: изменение разрешения, уменьшение размера окна и т. д. - person James Johnson; 11.11.2011
comment
Не тогда, когда вы жестко кодируете свои размеры, как это сделал ОП в своей скрипке. - person Ben; 11.11.2011
comment
В общем, line-height не лучшее решение для вертикального выравнивания. Я знаю, что варианты ограничены, но когда line-height ломается, это действительно ломается. - person James Johnson; 11.11.2011

Вот

#myDiv{
    border:1px solid black;
    height:50px;
    width:200px;
}

#mySpan{
    display:block;
    text-align:center;
    line-height:50px;
}

И jsFiddle: http://jsfiddle.net/Simo990/RhNc2/9/

Редактировать: поскольку высота вашего div и span зависит от содержимого, мое решение не будет работать, потому что ему нужна фиксированная высота и только одна строка текста. Просто ищите решение с помощью position:absolute.

person Simone    schedule 10.11.2011