Вопрос

Я хочу сосредоточить div вертикально с помощью CSS.Мне не нужны таблицы или JavaScript, а только чистый CSS.Я нашел несколько решений, но во всех них отсутствует поддержка Internet Explorer 6.

<body>
    <div>Div to be aligned vertically</div>
</body>

Как я могу центрировать div вертикально во всех основных браузерах, включая Internet Explorer 6?

Это было полезно?

Решение

Ниже приведено лучшее комплексное решение, которое я мог бы создать для вертикального и горизонтального центрирования фиксированной ширины, гибкая высота поле содержимого.Он был протестирован и работает для последних версий Firefox, Opera, Chrome и Safari.

.outer {
  display: table;
  position: absolute;
  top: 0;
  left: 0;
  height: 100%;
  width: 100%;
}

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

.inner {
  margin-left: auto;
  margin-right: auto;
  width: 400px;
  /*whatever width you want*/
}
<div class="outer">
  <div class="middle">
    <div class="inner">
      <h1>The Content</h1>
      <p>Once upon a midnight dreary...</p>
    </div>
  </div>
</div>

Просмотр рабочего примера С динамическим содержимым

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

Другие советы

Еще один, которого я не вижу в списке:

.Center-Container {
  position: relative;
  height: 100%;
}

.Absolute-Center {
  width: 50%;
  height: 50%;
  overflow: auto;
  margin: auto;
  position: absolute;
  top: 0; left: 0; bottom: 0; right: 0;
  border: solid black;
}
  • Кроссбраузерный (включая Internet Explorer 8 - Internet Explorer 10 без взломов!)
  • Реагирует с процентами и минимальным / максимальным-
  • Центрируется независимо от заполнения (без изменения размера коробки!)
  • height должен быть объявлен (см. Переменная Высота)
  • Рекомендуемая настройка overflow: auto чтобы предотвратить утечку содержимого (см. раздел Переполнение)

Источник: Абсолютное Горизонтальное И Вертикальное Центрирование В CSS

Самым простым способом было бы следующее 3 линии из CSS:

1) должность:относительный;

2) верхняя часть:50%;

3) трансформировать:Точность перевода (-50%);

Ниже приводится ПРИМЕР:

div.outer-div {
  height: 170px;
  width: 300px;
  background-color: lightgray;
}

div.middle-div {
  position: relative;
  top: 50%;
  -webkit-transform: translateY(-50%);
  -ms-transform: translateY(-50%);
  transform: translateY(-50%);
}
<div class='outer-div'>
  <div class='middle-div'>
    Test text
  </div>
</div>

На самом деле вам нужны два div для вертикального центрирования.div, содержащий содержимое, должен иметь ширину и высоту.

#container {
  position: absolute;
  top: 50%;
  margin-top: -200px;
  /* half of #content height*/
  left: 0;
  width: 100%;
}

#content {
  width: 624px;
  margin-left: auto;
  margin-right: auto;
  height: 395px;
  border: 1px solid #000000;
}
<div id="container">
  <div id="content">
    <h1>Centered div</h1>
  </div>
</div>

Вот этот Результат

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

.container{
    display: flex;
    align-items: center;
    justify-content: center;
    height: 100%;
    background:green;
}

body, html{
  height:100%;
}
<div class="container">
    <div>Div to be aligned vertically</div>
</div>

Это самый простой метод, который я нашел, и я использую его постоянно (Демонстрация jsFiddle здесь)

Поблагодарите Криса Койера из CSS Tricks за эта статья.

html, body{
  height: 100%;
  margin: 0;
}
.v-wrap{
    height: 100%;
    white-space: nowrap;
    text-align: center;
}
.v-wrap:before{
    content: "";
    display: inline-block;
    vertical-align: middle;
    width: 0;
    /* adjust for white space between pseudo element and next sibling */
    margin-right: -.25em;
    /* stretch line height */
    height: 100%; 
}
.v-box{
    display: inline-block;
    vertical-align: middle;
    white-space: normal;
}
<div class="v-wrap">
    <article class="v-box">
        <p>This is how I've been doing it for some time</p>
    </article>
</div>

Поддержка начинается с IE8.

После долгих исследований я, наконец, нашел окончательное решение.Это работает даже для плавающих элементов. Просмотреть Источник

.element {
    position: relative;
    top: 50%;
    transform: translateY(-50%); /* or try 50% */
}

Чтобы расположить div по центру страницы, проверьте ссылку на скрипку.

#vh {
    margin: auto;
    position: absolute;
    top: 0;
    left: 0;
    bottom: 0;
    right: 0;
}
.box{
    border-radius: 15px;
    box-shadow: 0 0 8px rgba(0, 0, 0, 0.4);
    padding: 25px;
    width: 100px;
    height: 100px;
    background: white;
}
<div id="vh" class="box">Div to be aligned vertically</div>

Другой вариант - использовать flex box, проверьте ссылку на скрипку.

.vh {
    background-color: #ddd;
    height: 400px;
    align-items: center;
    display: flex;
}
.vh > div {
    width: 100%;
    text-align: center;
    vertical-align: middle;
}
<div class="vh">
    <div>Div to be aligned vertically</div>
</div>

Другой вариант - использовать преобразование CSS 3:

#vh {
    position: absolute;
    top: 50%;
    left: 50%;
    /*transform: translateX(-50%) translateY(-50%);*/
    transform: translate(-50%, -50%);
}
.box{
    border-radius: 15px;
    box-shadow: 0 0 8px rgba(0, 0, 0, 0.4);
    padding: 25px;
    width: 100px;
    height: 100px;
    background: white;
}
<div id="vh" class="box">Div to be aligned vertically</div>

Решение Flexbox

Примечания
1.Родительскому элементу присваивается имя класса.
2.Добавьте префиксы поставщика flex, если это требуется вашим поддерживаемые браузеры.

.verticallyCenter {
  display: flex;
  align-items: center;
}
<div class="verticallyCenter" style="height:200px; background:beige">
    <div>Element centered vertically</div>
</div>

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

Для браузеров, совместимых со стандартами, таких как Mozilla, Opera, Safari и т.д.вам нужно настроить внешний div так, чтобы он отображался в виде таблица и внутренний div, который будет отображаться в виде таблица-ячейка — который затем может быть центрирован по вертикали.Для Internet Explorer вам необходимо положение внутренний div абсолютно внутри внешнего div, а затем укажите Наверх как 50%.На следующих страницах хорошо объясняется этот метод, а также приводятся некоторые примеры кода:

Существует также способ выполнить вертикальное центрирование с помощью JavaScript. Вертикальное выравнивание содержимого с помощью JavaScript и CSS демонстрирует это.

Если кому-то нужен только Internet Explorer 10 (и более поздних версий), используйте flexbox:

.parent {
    width: 500px;
    height: 500px;
    background: yellow;

    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;

    -webkit-justify-content: center;
    -ms-flex-pack: center;
    justify-content: center;

    -webkit-align-items: center;
    -ms-flex-align: center;
    align-items: center;
}

.centered {
    width: 100px;
    height: 100px;
    background: blue;
}
<div class="parent">
    <div class="centered"></div>
</div>

Поддержка Flexbox: http://caniuse.com/flexbox

Самое простое решение приведено ниже:

.outer-div{
  width: 100%;
  height: 200px;
  display: flex;
  border:1px solid #000;
}
.inner-div{
  margin: auto;
  text-align:center;
  border:1px solid red;
}
<div class="outer-div">
  <div class="inner-div">
    Hey there!
  </div>
</div>

Современным способом центрирования элемента по вертикали было бы использовать flexbox.

Вам нужен родитель, чтобы определить высоту, и потомок, чтобы центрировать.

В приведенном ниже примере div будет центрирован по центру в вашем браузере.Что важно (в моем примере), так это установить height: 100% Для body и html и тогда min-height: 100% к вашему контейнеру.

body, html {
  background: #F5F5F5;
  box-sizing: border-box;
  height: 100%;
  margin: 0;
}

#center_container {
  align-items: center;
  display: flex;
  min-height: 100%;
}

#center {
  background: white;
  margin: 0 auto;
  padding: 10px;
  text-align: center;
  width: 200px;
}
<div id='center_container'>
  <div id='center'>I am center.</div>
</div>

Центрирование только по вертикали

Если вас не интересуют Internet Explorer 6 и 7, вы можете использовать метод, который включает в себя два контейнера.

Внешний контейнер:

  • должен был иметь display: table;

Внутренний контейнер:

  • должен был иметь display: table-cell;
  • должен был иметь vertical-align: middle;

Поле содержимого:

  • должен был иметь display: inline-block;

Вы можете добавить любой контент, который вы хотите, в поле содержимого, не заботясь о его ширине или высоте!

ДЕМОНСТРАЦИЯ:

body {
    margin: 0;
}

.outer-container {
    position: absolute;
    display: table;
    width: 100%; /* This could be ANY width */
    height: 100%; /* This could be ANY height */
    background: #ccc;
}

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

.centered-content {
    display: inline-block;
    background: #fff;
    padding: 20px;
    border: 1px solid #000;
}
<div class="outer-container">
   <div class="inner-container">
     <div class="centered-content">
        Malcolm in the Middle
     </div>
   </div>
</div>

Смотрите также эта Скрипка!


Центрирование по горизонтали и вертикали

Если вы хотите центрировать как по горизонтали, так и по вертикали, вам также необходимо следующее.

Внутренний контейнер:

  • должен был иметь text-align: center;

Поле содержимого:

  • следует заново настроить выравнивание текста по горизонтали, например text-align: left; или text-align: right;, если только вы не хотите , чтобы текст был центрирован

ДЕМОНСТРАЦИЯ:

body {
    margin: 0;
}

.outer-container {
    position: absolute;
    display: table;
    width: 100%; /* This could be ANY width */
    height: 100%; /* This could be ANY height */
    background: #ccc;
}

.inner-container {
    display: table-cell;
    vertical-align: middle;
    text-align: center;
}

.centered-content {
    display: inline-block;
    text-align: left;
    background: #fff;
    padding: 20px;
    border: 1px solid #000;
}
<div class="outer-container">
   <div class="inner-container">
     <div class="centered-content">
         Malcolm in the Middle
     </div>
   </div>
</div>

Смотрите также эта Скрипка!

.center {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%); /* (x, y)  => position */
  -ms-transform: translate(-50%, -50%); /* IE 9 */
  -webkit-transform: translate(-50%, -50%); /* Chrome, Safari, Opera */    
}

.vertical {
  position: absolute;
  top: 50%;
  //left: 0;
  transform: translate(0, -50%); /* (x, y) => position */
}

.horizontal {
  position: absolute;
  //top: 0;
  left: 50%;
  transform: translate(-50%, 0); /* (x, y)  => position */
}

div {
  padding: 1em;
  background-color: grey; 
  color: white;
}  
<body>
  <div class="vertical">Vertically left</div>
  <div class="horizontal">Horizontal top</div>
  <div class="center">Vertically Horizontal</div>  
</body>

Похожие: Центрируйте изображение

Это всегда то место, куда я иду, когда мне нужно вернуться в этот вопрос.

Для тех, кто не хочет совершать прыжок:

  1. Укажите родительский контейнер как position:relative или position:absolute.
  2. Укажите фиксированную высоту дочернего контейнера.
  3. Установить position:absolute и top:50% на дочернем контейнере переместите верхнюю часть вниз к середине родительского.
  4. Установите margin-top:-yy, где yy - половина высоты дочернего контейнера, чтобы сместить элемент вверх.

Пример этого в коде:

<style type="text/css">
    #myoutercontainer {position:relative}
    #myinnercontainer {position:absolute; top:50%; height:10em; margin-top:-5em}
</style>
...
<div id="myoutercontainer">
    <div id="myinnercontainer">
        <p>Hey look! I'm vertically centered!</p>
        <p>How sweet is this?!</p>
    </div>
</div>

Я только что написал этот CSS, и чтобы узнать больше, пожалуйста, ознакомьтесь: Эта статья с вертикальным выравниванием чего угодно с помощью всего 3 строк CSS.

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

Используя свойство flex из CSS.

.parent {
    width: 400px;
    height:200px;
    background: blue;
    display: flex;
    align-items: center;
    justify-content:center;
}

.child {
    width: 75px;
    height: 75px;
    background: yellow;
}
<div class="parent">
    <div class="child"></div>
</div>

или с помощью используя display: flex; и margin: auto;

.parent {
    width: 400px;
    height:200px;
    background: blue;
    display: flex;
}

.child {
    width: 75px;
    height: 75px;
    background: yellow;
    margin:auto;
}
<div class="parent">
    <div class="child"></div>
</div>

показать текстовый центр

.parent {
    width: 400px;
    height: 200px;
    background: yellow;
    display: flex;
    align-items: center;
    justify-content:center;
}
<div class="parent">Center</div>

Используя процентную величину (%) по высоте и ширине.

.parent {
    position: absolute;
    height:100%;
    width:100%;
    background: blue;
    display: flex;
    align-items: center;
    justify-content:center;
}

.child {
    width: 75px;
    height: 75px;
    background: yellow;
}
<div class="parent">
    <div class="child"></div>
</div> 

Ответ от Billbad работает только с фиксированной шириной .inner див.Это решение работает для динамической ширины путем добавления атрибута text-align: center к тому .outer див.

.outer {
  position: absolute;
  display: table;
  width: 100%;
  height: 100%;
  text-align: center;
}
.middle {
  display: table-cell;
  vertical-align: middle;
}
.inner {
  text-align: center;
  display: inline-block;
  width: auto;
}
<div class="outer">
  <div class="middle">
    <div class="inner">
      Content
    </div>
  </div>
</div>

Следующая ссылка представляет простой способ сделать это, используя всего 3 строки в вашем CSS:

Выровняйте что-либо по вертикали всего с помощью 3 строк CSS.

Кредиты для: Sebastian Ekström.

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

Не отвечая на вопрос о совместимости с браузером, но также упоминая новую сетку и не такую уж новую функцию Flexbox.

Сетка

От: Mozilla - Документация по сетке - Выровнять Div по вертикали

Поддержка браузера: Поддержка браузера Grid

CSS - файл:

.wrapper {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  grid-gap: 10px;
  grid-auto-rows: 200px;
  grid-template-areas: 
    ". a a ."
    ". a a .";
}
.item1 {
  grid-area: a;
  align-self: center;
  justify-self: center;
}

HTML:

<div class="wrapper">
 <div class="item1">Item 1</div>
</div>

Гибкий ящик

Поддержка браузера: Поддержка браузера Flexbox

CSS - файл:

display: -webkit-box;
display: -moz-box;
display: -ms-flexbox;
display: -webkit-flex;
display: flex;
align-items: center;
justify-content: center;

Три строки кода, использующие transform работает практически в современных браузерах и Internet Explorer:

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

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

  1. 'position' relative портит стиль, если текущий div находится в теле и не имеет контейнера div.Однако "исправлено", похоже, работает, но это, очевидно, исправляет содержимое в центре окна просмотра position: relative

  2. Также я использовал этот стиль для центрирования некоторых наложенных разделов и обнаружил, что в Mozilla все элементы внутри этого преобразованного div потеряли свои нижние границы.Возможно, проблема с рендерингом.Но добавление только минимального отступа к некоторым из них сделало это правильно.Chrome и Internet Explorer (что удивительно) отображали поля без какой-либо необходимости в заполнении mozilla without inner paddings mozilla with paddings

Я думаю, что надежное решение для всех браузеров без использования flexbox - "align-items:центр;" представляет собой комбинацию отображения:таблица и выравнивание по вертикали:середина;.

CSS - файл

.vertically-center
{
    display: table;

    width: 100%;  /* optional */
    height: 100%; /* optional */
}

.vertically-center > div
{
    display: table-cell;
    vertical-align: middle;
}

HTML

<div class="vertically-center">
    <div>
        <div style="border: 1px solid black;">some text</div>
    </div>
</div>

‣демо: https://jsfiddle.net/6m640rpp/

CSS Сетка

body, html { margin: 0; }

body {
  display: grid;
  min-height: 100vh;
  align-items: center;
}
<div>Div to be aligned vertically</div>

Я сделал это с помощью этого (измените ширину, высоту, margin-top и margin-left соответственно):

.wrapper {
    width:960px;
    height:590px;
    position:absolute;
    top:50%;
    left:50%;
    margin-top:-295px;
    margin-left:-480px;
}

<div class="wrapper"> -- Content -- </div>

Специально для родительских разделов с относительной (неизвестной) высотой, сосредоточение на неизвестном решение отлично подходит для меня.В статье есть несколько действительно хороших примеров кода.

Он был протестирован в Chrome, Firefox, Opera и Internet Explorer.

/* This parent can be any width and height */
.block {
  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
   also be of any width and height */ 
.centered {
  display: inline-block;
  vertical-align: middle;
  width: 300px;
}
<div style="width: 400px; height: 200px;">
   <div class="block" style="height: 90%; width: 100%">
  <div class="centered">
	 <h1>Some text</h1>
	 <p>Any other text..."</p>
  </div> 
   </div>
</div>

Есть один трюк, о котором я недавно узнал:Вам нужно использовать top 50% и затем вы делаете translateY(-50%)

.outer-div {
  position: relative;
  height: 150px;
  width: 150px;
  background-color: red;
}

.centered-div {
  position: absolute;
  top: 50%;
  -webkit-transform: translateY(-50%);
  -ms-transform: translateY(-50%);
  transform: translateY(-50%);
  background-color: white;
}
<div class='outer-div'>
  <div class='centered-div'>
    Test text
  </div>
</div>

Для новичков, пожалуйста, попробуйте

display: flex;
align-items: center;
justify-content: center;

Я нахожу это наиболее полезным..это дает наиболее точную компоновку "H" и очень просто для понимания.

Преимущество этой разметки заключается в том, что вы определяете размер своего контента в одном месте -> "PageContent".
Цвета фона страницы и ее горизонтальных полей определяются в соответствующих разделах.

<div id="PageLayoutConfiguration" 
     style="display: table;
     position:absolute; top: 0px; right: 0px; bottom: 0px; left: 0px;
     width: 100%; height: 100%;">

        <div id="PageBackground" 
             style="display: table-cell; vertical-align: middle;
             background-color: purple;">

            <div id="PageHorizontalMargins"
                 style="width: 100%;
                 background-color: seashell;">

                <div id="PageContent" 
                     style="width: 1200px; height: 620px; margin: 0 auto;
                     background-color: grey;">

                     my content goes here...

                </div>
            </div>
        </div>
    </div>

И здесь с помощью CSS разделен:

<div id="PageLayoutConfiguration">
     <div id="PageBackground">
          <div id="PageHorizontalMargins">
               <div id="PageContent">
                     my content goes here...
               </div>
          </div>
     </div>
</div>

#PageLayoutConfiguration{
   display: table; width: 100%; height: 100%;
   position:absolute; top: 0px; right: 0px; bottom: 0px; left: 0px;
}

#PageBackground{
   display: table-cell; vertical-align: middle;
   background-color: purple;
}

#PageHorizontalMargins{
   style="width: 100%;
   background-color: seashell;
}
#PageContent{
   width: 1200px; height: 620px; margin: 0 auto;
   background-color: grey;
}

Содержимое можно легко центрировать с помощью flexbox.Следующий код показывает CSS для контейнера, внутри которого содержимое должно быть центрировано:

.absolute-center {
    display: -ms-flexbox;
    display: -webkit-flex;
    display: flex;

    -ms-flex-align: center;
    -webkit-align-items: center;
    -webkit-box-align: center;

    align-items: center;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top