Подтвердить что ты не робот

Каков наименее ужасный способ центрировать элемент с помощью CSS?

У меня есть html, который выглядит так:

<!DOCTYPE html> 
<head>
    <meta charset="utf-8">

    <!--[if lte IE 8]>
    <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
    <![endif]-->
</head> 

<body>

<header>
  <h1>Some title thing, who knows</h1>
  <nav>
    <ul>
      <li><a href="one/">One</a></li>
      <li><a href="two/">Two</a></li>
      <li><a href="three/">Three</a></li>
    </ul>
  </nav>
</header>

</body>
</html>

Если я даю header автоматическое поле и ширину, он будет располагаться по горизонтали. Какой наименее ужасный способ обеспечить его вертикальное центрирование?

Я знаю следующие статьи, которые дают некоторое обсуждение темы:

4b9b3361

Ответ 1

Поскольку этот вопрос был помечен CSS3, здесь "наименее ужасное" решение с использованием CSS3 "flexbox". К сожалению, только последние версии Safari, Chrome и Firefox поддерживают его.

html, body {
  margin:0;
  padding:0;
  height:100%;
  background:#eee;
}
header {
  width:30em;
  background:#fff;
}
body {  
  display:box;
  box-pack:center;
  box-align:center;
  box-orient:horizontal;
}

Более полное демо можно найти здесь.

Ответ 2

Если вы НЕ знаете высоту header, единственный способ, которым я часто пользуюсь, требует дополнительного html, если все сделано правильно, вы можете обойтись без него.

Вы делаете заголовок vertical-align: middle, делая его table-cell

html{
    height: 100%;
}      
body {
    display: table;
    height: 100%;
    margin: 0 auto;
    padding: 0;
}
header {
    display: table-cell;
    vertical-align: middle;
}

Заметьте, что я установил высоту 100% на html node, который действительно не является правильным css, насколько я знаю, он должен быть на теле, а заголовок должен быть в инкапсулирующем div, у которого display: table http://jsfiddle.net/bgYPR/2/

Ответ 3

К сожалению, по-прежнему нет ничего элегантного для вертикального выравнивания, только хаки.

Ответ 4

Я не знаю, есть ли лучший способ, но существует множество разных способов (в зависимости от вашей ситуации), и многие из них подробно обсуждаются в этой статьи.

Ответ 5

Обычно, когда мне нужно вертикальное центрирование, я использую пару элементов встроенного блока. У вас есть один элемент, который является полной высотой контейнера, и второй элемент, который является только высотой содержимого, которое будет центрировано. Оба параметра display:inline-block;vertical-align:middle.

Мне нравится использовать для этого теги b, потому что они не имеют смыслового значения и крошечные:

<style>
    .mycontainer {text-align:center;}
    b.vcenter {display:inline-block;height:100%;width:1px;vertical-align:middle;}
    b.vcenter+b {display:inline-block;vertical-align:middle;}
</style>

<div class="mycontainer">
    <b class="vcenter"></b><b>This is my centered content<br>It makes me happy!</b>
</div>

Помните, этот конкретный пример кода не работает в IE7 из-за отсутствия селекторов inline-block и sibling (+), но тот же метод может быть выполнен с использованием более сложного кода, который будет обрабатывать IE7.

Ответ 6

Я обычно не был бы вертикально центрирован, но указывал бы малый верхний край, такой как 20px. Мы не всегда достаточно знаем о оборудовании конечного пользователя, чтобы сделать предположение о том, что удобно или можно использовать для платформы, на которой они просматривают сайт.