Лучший способ центрировать ‹div› на странице по вертикали и горизонтали?

Лучший способ центрировать элемент <div> на странице как по вертикали, так и по горизонтали?

Я знаю, что margin-left: auto; margin-right: auto; будет центрироваться по горизонтали, но как лучше всего сделать это и по вертикали?


person Community    schedule 10.12.2008    source источник
comment
Вот простой, чистый и стабильный способ центрировать div в контейнере, используя только CSS. stackoverflow.com/a/31977476/3597276   -  person Michael Benjamin    schedule 13.08.2015
comment
Этот вопрос помечен как дубликат вопроса, заданного 5 лет спустя. О, переполнение стека.   -  person user9123    schedule 20.03.2021


Ответы (30)


Самый лучший и гибкий способ

Моя демонстрация на dabblet.com

Главный трюк в этой демонстрации заключается в том, что в обычном потоке элементы идут сверху вниз, поэтому margin-top: auto устанавливается равным нулю. Однако абсолютно позиционированный элемент действует так же для распределения свободного пространства и аналогичным образом может центрироваться по вертикали в указанных top и bottom (не работает в IE7).

Этот трюк будет работать с любыми размерами div.

div {
	width: 100px;
	height: 100px;
	background-color: red;
	
	position: absolute;
	top:0;
	bottom: 0;
	left: 0;
	right: 0;
  	
	margin: auto;
}
<div></div>

person Vladimir Starkov    schedule 13.11.2012
comment
Это круто. Я так долго думал, как это сделать. Я пробовал это с top: 0; и слева: 0;, но кажется, что добавление снизу: 0; и справа: 0; сделать разницу. Спасибо. - person user981178; 11.01.2013
comment
Трюк @Prembo работает везде, кроме IE7 - person Vladimir Starkov; 12.01.2013
comment
Это решение работает, только если ваш элемент имеет фиксированную высоту. См. ответ tombul для двух решений, которые не изменяют естественную высоту элемента. - person Stuart P. Bentley; 09.10.2013
comment
Чтобы избежать эффектов вложенности любых других элементов DOM, вы должны использовать position:fixed; - person alias51; 26.11.2013
comment
@alias51 что? Вы можете объяснить? - person Vladimir Starkov; 27.11.2013
comment
Не работает с динамическим контентом - person ; 07.09.2014
comment
Я собирался сказать, что это лучший, но меня раздражает, что вы должны установить фиксированные размеры div. Вы всегда можете использовать фиксированные поля, чтобы сделать его центральным (плохая идея!!!). Это решение (даже если оно принадлежит мне), кажется, намного лучше. Я просто пытаюсь быть честным и подводить других пользователей к лучшему решению, а не к тому, которое имеет наибольшее количество баллов из-за времени. Извините, но -1... и я бы поставил -100, если бы мог, потому что грустно, что не лучший ответ набрал около 200+ баллов. Приводит к непониманию. - person Flash Thunder; 10.01.2015
comment
@FlashThunder вы предлагаете таблицы для нетабличных данных, не так ли? - person Vladimir Starkov; 10.01.2015
comment
@FlashThunder также мое решение не о фиксированном положении, а о фиксированном размере коробки - person Vladimir Starkov; 10.01.2015
comment
Отлично! Я даже не знал, что bottom: и right: существуют в css... - person Louis van Tonder; 14.06.2017
comment
фоновый цвет не принадлежит ему - person hanshenrik; 24.10.2017
comment
Если ваша страница прокручивается (выше или шире окна), элемент div может прокручиваться вне поля зрения, position: fixed чтобы убедиться, что он остается в центре окна просмотра. - person bavo; 02.12.2017
comment
Не забудьте записать margin:auto, иначе это не подействует. - person Stephen.W; 12.09.2019
comment
Также можно использовать position: fixed. С этим тоже работает., - person hrabinowitz; 12.02.2021

Несмотря на то, что это не сработало, когда ОП задал этот вопрос, я думаю, по крайней мере, для современных браузеров лучшим решением является использование display: flex или псевдоклассы.

Вы можете увидеть пример в следующей скрипте. Вот обновленная скрипта.

Примером псевдоклассов может быть:

.centerPseudo {
    display:inline-block;
    text-align:center;
}

.centerPseudo::before{
    content:'';
    display:inline-block;
    height:100%;
    vertical-align:middle;
    width:0px;
}

Использование display: flex согласно css-tricks и MDN следует:

.centerFlex {
  align-items: center;
  display: flex;
  justify-content: center;
}

Существуют и другие атрибуты, доступные для flex, которые объясняются в вышеупомянутых ссылках с дополнительными примерами.

Если вам нужно поддерживать старые браузеры, которые не поддерживают css3, вам, вероятно, следует использовать javascript или решение с фиксированной шириной/высотой, показанное в других ответах.

person tombul    schedule 04.09.2013
comment
Все браузеры с 2012 по 2013 год и выше поддерживают flex-боксы. С сегодняшней точки зрения он должен быть достаточно безопасным, чтобы использовать его для новых приложений в большинстве случаев. Единственная ситуация, в которой, на мой взгляд, следует отдавать предпочтение старой модели, — это бизнес-клиенты, которые полагаются на старую инфраструктуру и не могут ее обновить. - person Rafael Bugajewski; 23.08.2015

Простота этого метода ошеломляет:
(Хотя этот метод имеет свои последствия, но если вам нужно только центрировать элемент, независимо от потока остального контента, это нормально. Используйте с осторожностью)

Разметка:

<div>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum accumsan tellus purus, et mollis nulla consectetur ac. Quisque id elit at diam convallis venenatis eget sed justo. Nunc egestas enim mauris, sit amet tempor risus ultricies in. Sed dignissim magna erat, vel laoreet tortor bibendum vitae. Ut porttitor tincidunt est imperdiet vestibulum. Vivamus id nibh tellus. Integer massa orci, gravida non imperdiet sed, consectetur ac quam. Nunc dignissim felis id tortor tincidunt, a eleifend nulla molestie. Phasellus eleifend leo purus, vel facilisis massa dignissim vitae. Pellentesque libero sapien, tincidunt ut lorem non, porta accumsan risus. Morbi tempus pharetra ex, vel luctus turpis tempus eu. Integer vitae sagittis massa, id gravida erat. Maecenas sed purus et magna tincidunt faucibus nec eget erat. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc nec mollis sem.</div>

И CSS:

div {
  color: white;
  background: red;
  padding: 15px;
  position: absolute;
  top: 50%;
  left: 50%;
  -ms-transform: translateX(-50%) translateY(-50%);
  -webkit-transform: translate(-50%,-50%);
  transform: translate(-50%,-50%);
}   

Это также отцентрирует элемент по горизонтали и вертикали. Никаких отрицательных полей, только сила преобразований. Также мы должны уже забыть о IE8, не так ли?

person robjez    schedule 16.01.2015
comment
Да, я часто использовал этот метод... но проблема возникает, если элемент намного выше высоты экрана (где height неизвестен)... верхняя часть центрированного элемента будет обрезана. Даже если элемент помещается в родительский элемент, где overflow имеет значение auto или scroll. Та же проблема с использованием flex. К сожалению, в крайнем случае я использую table, чтобы обойти эту проблему. Только когда центрированный элемент будет намного выше (динамически заполняется). - person nelek; 27.10.2015
comment
Мне пришлось установить относительную позицию, вероятно, потому, что мой div плавает правильно. - person Souradeep Nanda; 28.02.2016
comment
Nelek - если родительский элемент имеет фиксированную ширину и высоту, вы можете добавить к изображению максимальную ширину: 100% и максимальную высоту: 100% и предотвратить расширение родительского элемента. - person jan199674; 09.01.2017
comment
Пожалуйста, проверьте это в модели коробки. он не идет по центру. он отображается как центр, но его точные значения пикселей отсутствуют. - person Sarbasish Mishra; 02.09.2020

Я бы использовал translate:

Сначала поместите верхний левый угол div в центр страницы (используя position: fixed; top: 50%; left: 50%). Затем translate перемещает его вверх на 50% высоты div, чтобы отцентрировать его по вертикали на странице. Наконец, translate также перемещает div вправо на 50% от его ширины, чтобы центрировать его по горизонтали.

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

translate в некоторых сценариях лучше, чем translate3d, поскольку поддерживается большим количеством браузеров. https://caniuse.com/#feat=transforms2d

Подводя итог, этот метод поддерживается во всех версиях Chrome, Firefox 3.5+, Opera 11.5+, всех версиях Safari, IE 9+ и Edge.

.centered {
  position: fixed;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  -webkit-transform: translate(-50%, -50%);
  -moz-transform: translate(-50%, -50%);
  -o-transform: translate(-50%, -50%);
  -ms-transform: translate(-50%, -50%);
  
  font-size: 20px;
  background-color: cyan;
  border: darkgreen 5px solid;
  padding: 5px;
  z-index: 100;
}

table {
    position: absolute;
    top: 0;
    left: 0;
}

td {
    position: relative;
    top: 0;
    left: 0;
}
<table>
<tr>
    <td>
        <div class="centered">This div<br />is centered</div>
        <p>
            Lorem ipsum dolor sit amet, nam sint laoreet at, his ne sumo causae, simul decore deterruisset ne mel. Exerci atomorum est ut. At choro vituperatoribus usu. Dico epicurei persequeris quo ex, ea ius zril phaedrum eloquentiam, duo in aperiam admodum fuisset. No quidam consequuntur usu, in amet hinc simul eos. Ex soleat meliore percipitur mea, nihil omittam salutandi ut eos. Mea et impedit facilisi pertinax, ea viris graeci fierent pri, te sonet intellegebat his. Vis denique albucius instructior ad, ex eum iudicabit elaboraret. Sit ea intellegam liberavisse. Nusquam quaestio maiestatis ut qui, eam decore altera te. Unum cibo aliquip ut qui, te mea doming prompta. Ex rebum interesset nam, te nam zril suscipit, qui suavitate explicari appellantur te. Usu brute corpora mandamus eu. Dicit soluta his eu. In sint consequat sed, quo ea tota petentium. Adhuc prompta splendide mel ad, soluta delenit nec cu.
        </p>
    </td>
    <td>
        <p>
            Lorem ipsum dolor sit amet, dico choro recteque te cum, ex omnesque consectetuer sed, alii esse utinam et has. An qualisque democritum usu. Ea has habeo labores, laoreet intellegat te mea. Eius equidem inermis vel ne. Ne eum sonet labitur, nec id natum munere. Primis graecis est cu, quis dictas eu mea, eu quem offendit forensibus nec. Id animal mandamus his, vis in sonet tempor luptatum. Ne civibus oporteat comprehensam vix, per facete discere atomorum eu. Mucius probatus volutpat sit an, sumo nominavi democritum eam ut. Ea sit choro graece debitis, per ex verear voluptua epicurei. Id eum wisi dicat, ea sit velit doming cotidieque, eu sea amet delenit. Populo tacimates dissentiunt has cu. Has wisi hendrerit at, et quo doming putent docendi. Ea nibh vide omnium usu.
        </p>
    </td>
</tr>
</table>

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


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

.centered {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  -webkit-transform: translate(-50%, -50%);
  -moz-transform: translate(-50%, -50%);
  -o-transform: translate(-50%, -50%);
  -ms-transform: translate(-50%, -50%);

  font-size: 20px;
  background-color: cyan;
  border: darkgreen 5px solid;
  padding: 5px;
  z-index: 100;
}

table {
    position: absolute;
    top: 0;
    left: 0;
}

td {
    position: relative;
    top: 0;
    left: 0;
}
<table>
<tr>
    <td>
        <div class="centered">This div<br />is centered</div>
        <p>
            Lorem ipsum dolor sit amet, nam sint laoreet at, his ne sumo causae, simul decore deterruisset ne mel. Exerci atomorum est ut. At choro vituperatoribus usu. Dico epicurei persequeris quo ex, ea ius zril phaedrum eloquentiam, duo in aperiam admodum fuisset. No quidam consequuntur usu, in amet hinc simul eos. Ex soleat meliore percipitur mea, nihil omittam salutandi ut eos. Mea et impedit facilisi pertinax, ea viris graeci fierent pri, te sonet intellegebat his. Vis denique albucius instructior ad, ex eum iudicabit elaboraret. Sit ea intellegam liberavisse. Nusquam quaestio maiestatis ut qui, eam decore altera te. Unum cibo aliquip ut qui, te mea doming prompta. Ex rebum interesset nam, te nam zril suscipit, qui suavitate explicari appellantur te. Usu brute corpora mandamus eu. Dicit soluta his eu. In sint consequat sed, quo ea tota petentium. Adhuc prompta splendide mel ad, soluta delenit nec cu.
        </p>
    </td>
    <td>
        <p>
            Lorem ipsum dolor sit amet, dico choro recteque te cum, ex omnesque consectetuer sed, alii esse utinam et has. An qualisque democritum usu. Ea has habeo labores, laoreet intellegat te mea. Eius equidem inermis vel ne. Ne eum sonet labitur, nec id natum munere. Primis graecis est cu, quis dictas eu mea, eu quem offendit forensibus nec. Id animal mandamus his, vis in sonet tempor luptatum. Ne civibus oporteat comprehensam vix, per facete discere atomorum eu. Mucius probatus volutpat sit an, sumo nominavi democritum eam ut. Ea sit choro graece debitis, per ex verear voluptua epicurei. Id eum wisi dicat, ea sit velit doming cotidieque, eu sea amet delenit. Populo tacimates dissentiunt has cu. Has wisi hendrerit at, et quo doming putent docendi. Ea nibh vide omnium usu.
        </p>
    </td>
</tr>
</table>

person MDTech.us_MAN    schedule 19.04.2016
comment
Это имеет раздражающие побочные эффекты, когда поле, которое вы хотите центрировать, имеет ширину или высоту, превышающую половину окна просмотра. - person Noldorin; 25.04.2019

Простое решение с использованием Flex Display

 <div style = 'display:flex; position:absolute; top:0; bottom:0; right:0; left:0; '>
      <div id = 'div_you_want_centered' style = 'margin:auto;'> 
           This will be Centered 
      </div>
 </div>

Проверьте http://css-tricks.com/snippets/css/a-guide-to-flexbox/

Первый div занимает весь экран и имеет display:flex для каждого браузера. Второй div (центрированный div) использует преимущества display:flex div, где margin:auto работает блестяще.

Обратите внимание на совместимость с IE11+. (IE10 с префиксом).

person Ulad Kasach    schedule 09.01.2015
comment
Ого... IE11+! Нет, спасибо! - person Flash Thunder; 10.01.2015
comment
Я бы предложил использовать автоматический префикс при наличии большого количества -webkit- в css :) - person Radex; 25.10.2016

Я думаю, что есть два способа выровнять центр div через CSS.

.middleDiv {
    position : absolute;    
    width    : 200px;
    height   : 200px;
    left     : 50%;
    top      : 50%;
    margin-left : -100px; /* half of the width  */
    margin-top  : -100px; /* half of the height */
}

Это самый простой и лучший способ. для демонстрации перейдите по ссылке ниже:

http://w3webpro.blogspot.in/2013/07/how-to-make-div-horizontally-and.html

person user2555501    schedule 06.07.2013

Если вы смотрите на новые браузеры (IE10+),

затем вы можете использовать свойство преобразования, чтобы выровнять div по центру.

<div class="center-block">this is any div</div>

И css для этого должен быть:

.center-block {
  top:50%;
  left: 50%;
  transform: translate3d(-50%,-50%, 0);
  position: absolute;
}

Подвох здесь в том, что вам даже не нужно указывать высоту и ширину div, так как он сам позаботится об этом.

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

Как это работает:

Когда вы указываете left и top на 50%, элемент div помещается в нижнюю правую четверть страницы, а его верхний левый конец закрепляется в центре страницы. Это связано с тем, что левые/верхние свойства (если они указаны в %) рассчитываются на основе высоты внешнего div (в вашем случае окна).

Но преобразование использует высоту/ширину элемента для определения перевода, поэтому ваш элемент div будет перемещаться влево (50% ширины) и вверх (50% его высоты), поскольку они даны в негативах, тем самым выравнивая его по центру страницы.

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

person Kop4lyf    schedule 26.07.2015

position: absolute;
left: 50%;
top: 50%;
-webkit-transform: translate(-50%, -50%);
-ms-transform: translate(-50%, -50%);
transform: translate(-50%, -50%);

Объяснение:

Дайте ему абсолютное позиционирование (у родителя должно быть относительное позиционирование). Затем левый верхний угол перемещается в центр. Поскольку вы еще не знаете ширину/высоту, вы используете преобразование css для перевода положения относительно середины. translate(-50%, -50%) уменьшает положение x и y верхнего левого угла на 50% ширины и высоты.

person AmazingTurtle    schedule 25.07.2016
comment
Хотя этот код может помочь решить проблему, предоставление дополнительного контекста относительно того, почему и/или как он отвечает на вопрос, значительно улучшит его долгосрочную ценность. Пожалуйста, отредактируйте свой ответ, чтобы добавить некоторые пояснения. - person Toby Speight; 25.07.2016
comment
Но если мы также добавим width: 100%, ширина этого элемента div также сохранится. - person Akshay Pratap Singh; 04.09.2016
comment
Я сталкиваюсь с проблемой размытия, используя эту технику на некоторых экранах. есть ли решение для этого? - person kapil; 22.12.2016

Использование Flex-box, на мой взгляд:

#parent {
  display: flex;
  justify-content: center;
  align-items: center;
}
<div id="parent">
  <div id="child">Hello World!</div>
</div>

Вы видите, что есть только три свойства CSS, которые вы должны использовать для центрирования дочернего элемента по вертикали и горизонтали. display: flex; Выполните основную часть, просто активировав отображение Flex-box, justify-content: center; отцентрируйте дочерний элемент по вертикали и align-items: center; отцентрируйте его по горизонтали. Чтобы увидеть наилучший результат, я просто добавляю несколько дополнительных стилей:

#parent {
  display: flex;
  justify-content: center;
  align-items: center;
  height: 500px;
  width: 500px;
  background: yellow;
}

#child {
  width: 100px;
  height: 100px;
  background: silver;
}
<div id="parent">
  <div id="child">Hello World!</div>
</div>

Если вы хотите узнать больше о Flex-box, вы можете посетить W3Schools, MDN или CSS-Tricks для получения дополнительной информации.

person Morteza Sadri    schedule 10.09.2018

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

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

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

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

  • должно быть display: table-cell;
  • должно быть vertical-align: middle;
  • должно быть text-align: center;

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

  • должно быть display: inline-block;
  • следует перенастроить горизонтальное выравнивание текста, например. 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">
        You can put anything here!
     </div>
   </div>
</div>

См. также эту скрипту!


РЕДАКТИРОВАТЬ

Да, я знаю, что вы можете добиться более или менее такой же гибкости с помощью transform: translate(-50%, -50%); или transform: translate3d(-50%,-50%, 0);, метод, который я предлагаю, гораздо лучше поддерживается браузерами. Даже с префиксами браузеров, такими как -webkit, -ms или -moz, transform не предлагает такой же поддержки браузера.

Поэтому, если вам нужны старые браузеры (например, IE9 и ниже), вам не следует использовать transform для позиционирования.

person John Slegers    schedule 25.02.2016
comment
Это работает только в том случае, если на странице есть контейнер div и он намного сложнее, чем translate. - person MDTech.us_MAN; 25.10.2016
comment
@MDTech.us_MAN: Хотя вам действительно нужно больше HTML-разметки, этот подход работает даже в довольно старых браузерах! Даже с такими префиксами браузеров, как -webkit, -ms или -moz, transform: translate(-50%, -50%); почти не поддерживается браузерами! → Я добавил эту информацию внизу своего ответа - person John Slegers; 26.10.2016
comment
Я знаю, но сейчас 2017 год, и на самом деле это не должно вызывать особого беспокойства... IE9 был выпущен еще в 2011 году. caniuse.com/#search=translate говорит, что 95 % Интернета должны поддерживать transform. - person MDTech.us_MAN; 30.05.2017

Вот скрипт, который я написал некоторое время назад (он написан с использованием библиотеки jQuery):

var centerIt = function (el /* (jQuery element) Element to center */) {
    if (!el) {
        return;
    }
    var moveIt = function () {
        var winWidth = $(window).width();
        var winHeight = $(window).height();
        el.css("position","absolute").css("left", ((winWidth / 2) - (el.width() / 2)) + "px").css("top", ((winHeight / 2) - (el.height() / 2)) + "px");
    }; 
    $(window).resize(moveIt);
    moveIt();
};
person Andreas Grech    schedule 10.12.2008
comment
К сожалению, OP не просил решения JavaScript/jQuery. - person Blazemonger; 01.07.2014
comment
Не лучше ли использовать externalHeight(true) и externalWidth(true) вместо height() и width(), так как external учитывает все возможные поля и отступы - person Maria; 06.09.2014
comment
Очень удобно, когда вы заранее не знаете высоту/ширину div. :о) - person Miros; 06.01.2015

Это лучший код для центрирования бота div по горизонтали и вертикали.

div
{
  position:absolute;
  top:50%;
  left:50%;
  transform:translate(-50%,-50%);
}

person siawo    schedule 28.07.2017

Я знаю, что опаздываю на вечеринку, но вот способ центрировать div с неизвестным размером внутри родителя с неизвестным размером.

стиль:

<style>

    .table {
      display: table;
      height: 100%;
      margin: 0 auto;
    }
    .table-cell {
      display: table-cell;
      vertical-align: middle;      
    }
    .centered {
      background-color: red;
    }
  </style>

HTML:

<div class="table">
    <div class="table-cell"><div class="centered">centered</div></div>
</div>

ДЕМО:

Посмотрите эту демонстрацию.

person Asur    schedule 24.07.2014
comment
Мне это нравится, но использование реальной таблицы кажется более чистым и достоверным, хотя и генерирует немного больше кода. - person Flash Thunder; 10.01.2015

Хоть я и опоздал, но это очень легко и просто. Центр страницы всегда слева 50%, а вверху 50%. Итак, минус ширина и высота div 50% и установить левое поле и правое поле. Надеюсь, это работает везде -

body{
  background: #EEE;
}
.center-div{
  position: absolute;
  width: 200px;
  height: 60px;
  left: 50%;  
  margin-left: -100px;
  top: 50%;
  margin-top: -30px;
  background: #CCC;
  color: #000;
  text-align: center;
}
<div class="center-div">
  <h3>This is center div</h3>
</div>

person Mahfuzur Rahman    schedule 26.04.2018

div {
    border-style: solid;
    position: fixed;
    width: 80%;
    height: 80%;
    left: 10%;
    top: 10%;
}

Отрегулируйте слева и сверху по ширине и высоте, то есть (100% - 80%) / 2 = 10%

person winuxde    schedule 22.07.2014

На самом деле есть решение с использованием css3, которое может вертикально центрировать div неизвестной высоты. Хитрость заключается в том, чтобы переместить div вниз на 50%, а затем использовать transformY, чтобы вернуть его в середину. Единственным предварительным условием является наличие родителя у элемента, который должен быть центрирован. Пример:

<div class="parent">
    <div class="center-me">
        Text, images, whatever suits you.
    </div>
</div>

.parent { 
    /* height can be whatever you want, also auto if you want a child 
       div to be responsible for the sizing */ 
    height: 200px;
}

.center-me { 
    position: relative;
    top: 50%;
    transform: translateY(-50%);
    /* prefixes needed for cross-browser support */
    -ms-transform: translateY(-50%);
    -webkit-transform: translateY(-50%);
}

Поддерживается всеми основными браузерами, а также IE 9 и более поздними версиями (не беспокойтесь об IE 8, так как он умер этой осенью вместе с win xp. Слава богу).

Демо JS Fiddle

person giorgio    schedule 22.09.2014
comment
Большинство браузеров не полностью поддерживают версии unitl novaday, поэтому это решение (по крайней мере, на мой взгляд) совершенно бесполезно, извините. - person Flash Thunder; 10.01.2015
comment
Эм... Вообще-то я не совсем понимаю, что вы говорите. Поскольку браузеры не поддерживали его полностью, он был (не совсем) бесполезен. Поскольку современные браузеры (все основные и IE9+) полностью поддерживают его, это жизнеспособное решение прямо сейчас, не так ли? Также проверьте CanIUse. - person giorgio; 12.01.2015
comment
Это элегантное решение, которое работает с содержимым любого размера, даже если размеры элемента DIV динамически изменяются (например, если вы используете jQuery для изменения содержимого и высота DIV должна корректироваться). ОДНАКО, в некоторых средах все еще есть ошибки, когда использование преобразования приводит к размытию текста. Пожалуйста, будьте осторожны при использовании этого решения. - person baohouse; 27.01.2015
comment
Спасибо @BaoNgo, ценное дополнение. Возможно, вы знаете, в какой среде (браузер? ОС? устройство?) возникает эта проблема? Я изменю ответ соответственно! - person giorgio; 28.01.2015

Способ 2018 года с использованием CSS Grid:

.parent{
    display: grid;
    place-items: center center;
}

Проверьте поддержку браузера, Caniuse предполагает, что он работает с Chrome 57, FF 52, Opera 44, Safari. 10.1, Edge 16. Сам не проверял.

См. фрагмент ниже:

.parent{
    display: grid;
    place-items: center center;
    /*place-items is a shorthand for align-items and justify-items*/
    
    height: 200px;
    border: 1px solid black;
    background: gainsboro;
}

.child{
    background: white;
}
<div class="parent">
    <div class="child">Centered!</div>
</div>

person 1valdis    schedule 28.01.2018
comment
это вообще не по центру края - person JFFIGK; 21.10.2018

Еще один метод (пуленепробиваемый), взятый из здесь с использованием правила display:table:

Разметка

<div class="container">
  <div class="outer">
    <div class="inner">
      <div class="centered">
        ...
      </div>
    </div>
  </div>
</div>

CSS:

.outer {
  display: table;
  width: 100%;
  height: 100%;
}
.inner {
  display: table-cell;
  vertical-align: middle;
  text-align: center;
}
.centered {
  position: relative;
  display: inline-block;

  width: 50%;
  padding: 1em;
  background: orange;
  color: white;
}
person robjez    schedule 09.10.2014
comment
Я знаю, что это тот же комментарий, что и ниже, но это просто повторяющийся ответ, поэтому... Мне это нравится, но с использованием реальной таблицы выглядит чище и валиднее, хотя и генерирует немного больше кода. - person Flash Thunder; 10.01.2015
comment
@FlashThunder - обновите свои знания (я получил второй ответ с новой техникой использования преобразований внизу) и, в конце концов, перестаньте использовать таблицы для макета;) - person robjez; 16.01.2015

Я просматривал файл представления Laravel и заметил, что они идеально центрируют текст посередине. Я сразу вспомнил об этом вопросе. Вот как они это сделали:

<html>
<head>
    <title>Laravel</title>

    <!--<link href='//fonts.googleapis.com/css?family=Lato:100' rel='stylesheet' type='text/css'>-->

    <style>
        .container {
            margin: 0;
            padding: 0;
            width: 100%;
            height: 100%;
            display: table;

        }

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


    </style>
</head>
<body>
    <div class="container">
            <div class="inside">This text is centered</div>
    </div>
</body>

Result looks so:

введите здесь описание изображения

person Tebe    schedule 24.03.2015
comment
Я думаю, это работает только тогда, когда это единственное. Добавьте больше div и другого контента, и он больше не работает. - person ADTC; 25.08.2015

Решение

Используя всего две строки CSS, используя волшебную силу Flexbox

.parent { display: flex; }
.child { margin: auto }
person Community    schedule 14.08.2017
comment
В какой версии CSS был добавлен тип отображения «flex»? - person Omnifarious; 15.08.2017

Альтернативным ответом может быть это.

<div id="container"> 
    <div id="centered"> </div>
</div>

и CSS:

#container {
    height: 400px;
    width: 400px;
    background-color: lightblue;
    text-align: center;
}

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

#centered {
    width: 100px;
    height: 100px;
    background-color: blue;
    display: inline-block;
    vertical-align: middle;
    margin: 0 auto;
}
person István    schedule 11.12.2014
comment
Решение только для IE9+... не очень хорошее... +0 - person Flash Thunder; 10.01.2015
comment
@FlashThunder Решение только для IE9+... не очень хорошее... -- только если вы настаиваете на поддержке менее 1% явно устаревших -- и, по большей части, откровенно невежественны -- пользователи. Люди, которые так долго отказываются обновляться, уже привыкли к бесконечно неработающему веб-опыту. - person John Weisz; 17.10.2016

Я удивлен, что об этом еще не упоминалось, но самый простой способ сделать это - установить высоту, поля (и ширину, если хотите) с использованием размеров окна просмотра.
Как вы, возможно, знаете, общая высота области просмотра = 100vh.
Допустим, вы хотите, чтобы height вашего контейнера занимало 60% (60vh) экрана, вы можете разделить оставшуюся часть (40vh) поровну между верхними и нижнее поле, чтобы элемент автоматически выравнивался по центру.
Установка margin-left и margin-right на auto обеспечит центрирование контейнера по горизонтали.

.container {
         width: 60vw; /*optional*/
         height: 60vh;
         margin: 20vh auto;
         background: #333;
 }
<div class="container">
</div>

person Rocks    schedule 24.02.2018
comment
Каждый раз, когда вы хотите изменить высоту, вы должны пересчитывать поля, что не очень удобно. Также это не будет работать для элементов без фиксированного размера и привязано к высоте области просмотра. - person 1valdis; 25.02.2018

Если вы знаете определенный размер для div, вы можете использовать calc.

Живой пример: https://jsfiddle.net/o8416eq3/

Примечания: Это работает, только если вы жестко закодировали ширину и высоту вашего ``div` в CSS.

#target {
  position:fixed;
  top: calc(50vh - 100px/2);
  left: calc(50vw - 200px/2);
  width:200px;
  height:100px;
  background-color:red;
}
<div id='target'></div>

person GibboK    schedule 16.06.2016
comment
Слишком сложно. использование translate просто проще. Нет причин использовать дополнительные calc и vw/vh. - person MDTech.us_MAN; 25.10.2016

Использование display:grid для родительского элемента и установка margin:auto для центрального элемента сделают свое дело:

См. ниже фрагмент:

html,body {
  width :100%;
  height:100%;
  margin:0;
  padding:0;
}

.container {
  display:grid;
  height:90%;
  background-color:blue;
}

.content {
  margin:auto;
  color:white;
}
<div class="container">
  <div class="content"> cented div  here</div>
</div>

person Spring    schedule 17.08.2017

div {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    -ms-transform: translate(-50%, -50%); /* IE 9 */
    -webkit-transform: translate(-50%, -50%); /* Chrome, Safari, Opera */	    
}
<body>
    <div>Div to be aligned vertically</div>
</body>

позиция: абсолютный элемент div в основном документе

Элемент с позицией: absolute; позиционируется относительно ближайшего позиционированного предка (вместо позиционируется относительно области просмотра (тега body), например, fixed).

Тем не мение; если элемент с абсолютным позиционированием не имеет позиционированных предков, он использует тело документа и перемещается вместе с прокруткой страницы.

источник: позиция CSS

person antelove    schedule 23.09.2017

Если вы, ребята, используете JQuery, вы можете сделать это, используя .position();

<div class="positionthis"></div>

CSS

.positionthis {
    width:100px;
    height:100px;
    position: absolute;
    background:blue;
}

Javascript (JQuery)

$(document).ready(function () {
    $('.positionthis').position({
        of: $(document),
        my: 'center center',
        at: 'center center',
        collision: 'flip flip'
    });
});

JSFiddle: http://jsfiddle.net/vx9gV/

person Master Programmer    schedule 18.09.2013
comment
ОП попросил решение CSS. - person Blazemonger; 01.07.2014

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

position: absolute;
background-color: red;

width: 70%;     
height: 30%; 

/* The translate % is relative to the size of the div and not the container*/ 
/* 21.42% = ( (100%-70%/2) / 0.7 ) */
/* 116.666% = ( (100%-30%/2) / 0.3 ) */
transform: translate3d( 21.42%, 116.666%, 0);
person Sebastien Lorber    schedule 04.08.2015

Это решение сработало для меня

    .middleDiv{
        position : absolute;
        height : 90%;
        bottom: 5%;
    }

(или высота: 70% / низ: 15%

высота: 40% / низ: 30%...)

person Dany Y    schedule 24.08.2012
comment
Нет, это не так - он не центрирует элемент по горизонтали. Это половинчатое решение проблемы. - person robjez; 16.01.2015

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

div {
  position: absolute;
  left: 0;
  top: 0;
  right: 0;
  bottom: 0px;
  margin: auto;
  width: 100px;
  height: 100px;
}
person Suraj Kavade    schedule 06.10.2017
comment
Это почти то же самое, что и самый популярный ответ пятилетней давности. Основное отличие, этот ответ не имеет объяснения. - person Olaf Dietsche; 06.10.2017

Извините за поздний ответ лучший способ

  div {
      position: fixed;
      top: 50%;
      left: 50%;
      margin-top: -50px;
      margin-left: -100px;
    }

margin-top и margin-left должны соответствовать размеру вашего блока div.

person Ashish    schedule 16.10.2013
comment
Разве поля не должны быть в процентах и ​​25% в обоих случаях? Извините, но это решение, похоже, не работает (по крайней мере, на данный момент), -1 - person Flash Thunder; 10.01.2015