Как я могу центрировать абсолютно позиционированный элемент в div?

Мне нужно разместить элемент divposition:absolute;) в центре моего окна. Но у меня возникают проблемы, потому что ширина неизвестна.

Я пробовал это. Но его нужно отрегулировать, так как ширина отзывчивая.

.center {
  left: 50%;
  bottom: 5px;
}

Как я могу это сделать?


person Ish    schedule 21.11.2009    source источник
comment
У вас есть пример в Примеры абсолютного центра Это можно обобщить на разные ситуации.   -  person Mihai8    schedule 10.01.2013
comment
На этот вопрос есть лучший ответ на stackoverflow.com/questions/17976995/   -  person Andrew Swift    schedule 30.12.2014


Ответы (32)


Это работает для меня:

#content {
  position: absolute; 
  left: 0; 
  right: 0; 
  margin-left: auto; 
  margin-right: auto; 
  width: 100px; /* Need a specific value to work */
}
<body>
  <div>
    <div id="content">
      I'm the content
    </div>
  </div>
</body>

person Matthias Weiler    schedule 25.11.2011
comment
+1 Я просто использовал это для Chrome, Opera и Firefox и работал как шарм! отличный ответ - person BBog; 15.06.2012
comment
Я просто хочу подчеркнуть, что отрицательные поля - это совершенно допустимый CSS, и его не следует не рассматривать как грязный взлом. Отрицательные поля упоминаются в спецификации модели коробки W3C. Некоторые люди, кажется, произвольно решают, что это взлом, потому что они а) не знают их, или б) используют их, чтобы исправить свой плохой CSS. - person Joseph Ravenwolfe; 16.08.2012
comment
@JosephJaber: Спасибо. Я не очень много занимался CSS и не могу оценивать другие решения. С моей точки зрения непрофессионала это выглядело как грязный прием. Отредактирую свой ответ. - person Matthias Weiler; 21.08.2012
comment
Хорошо, ответ работает, но если бы вы могли потратить некоторое время, чтобы объяснить, почему это работает, это сделало бы это очень хорошим ответом. - person Brian Webster; 10.01.2013
comment
должна быть установлена ​​ширина центрируемого div - не будет работать автоматически, скажем, с кнопкой с текстом на ней. - person Stefan; 27.01.2013
comment
@Joshua Это будет только центрироваться по горизонтали, а не по вертикали, как другой ответ. - person ygoe; 31.01.2013
comment
Я предпочитаю это решение, поскольку оно не увеличивает размер области просмотра. - person iceydee; 04.03.2013
comment
Очень хорошее решение! Еще не знал, что обычно работает с относительным позиционированием, на этот раз вынужден делать абсолютное. Работает отлично! - person TheLD; 29.04.2013
comment
Мне тоже пришлось использовать display: table; с этим - person Chris Edwards; 22.01.2014
comment
Это не лучшее решение для всех случаев. См. Мой комментарий в принятом ответе. Обычно это очень хороший метод, и мы им часто пользовались. Но он специально перестал работать, когда я пытался навести элементы на карту Google, а невидимый полноширинный контейнер предотвращал переходы к элементам управления картой внизу. Таким образом, это работает и в некоторых случаях является предпочтительным методом для предотвращения дополнительной разметки, но следует помнить об ограничениях и других решениях. - person Andre; 26.01.2014
comment
@Andre - Следите за значением CSS для событий указателя. Это еще не официально, но может быть в CSS 4. Используя jQuery (или JS), вы можете зафиксировать щелчок и отправить его в нижний элемент. события-указатели: css-tricks.com/almanac/properties/p/pointer -events jQuery hacky way: $(".parentElement").bind("click", function(){ $(".parentElement").find("a").trigger("click"); }); Может показаться хакерским, но у меня это работает в производственной среде. Возможно, вам придется вызвать google.maps.events (щелчок) в вашем случае или другую комбинацию событий. - person Sean Kendle; 20.03.2014
comment
Для меня он заполняет всю ширину - person alex88; 01.04.2014
comment
Большое вам спасибо, боритесь с этим в течение 2 часов, задаваясь вопросом, почему margin: 0 auto; не будет центрировать мой div. Мне не хватало левого: 0 и правого: 0! - person mgrenier; 06.06.2014
comment
Для кроссбраузерной поддержки: width должно быть установлено на определенное значение, чтобы это работало. auto и 100% не будут центрировать элемент. display: block; обязательно. position: absolute; НЕ является обязательным. Все значения будут работать. Для position родительского элемента должно быть установлено значение, отличное от static. Устанавливать left и right на 0 не нужно. margin-left: auto; margin-right: auto; сделает всю работу. - person Onur Yıldırım; 27.06.2014
comment
@ OnurYıldırım СПАСИБО за подробный комментарий. Мне любопытно, «почему» стоит за каждым аспектом вашего ответа. Не могли бы вы подробнее остановиться на этом в отдельном ответе? Это кажется довольно сложным вопросом, и ваши рассуждения могут быть очень ценными для каждого, кто найдет эту страницу. (Кстати, ответ, который мы комментируем прямо сейчас, действительно работает для меня в Chrome и IE.) - person Ideogram; 25.07.2014
comment
Я пробовал сделать это таким образом, но ie10 это не нравится ... :( - person Riskbreaker; 05.11.2014
comment
если необходимо установить ширину центрируемого div, нам не нужно абсолютное положение - person Carlos; 27.03.2015
comment
Это работает не во всех случаях, особенно с адаптивными фреймворками. Если ширина родительского контейнера не определена явно, это, скорее всего, не удастся. - person Janaka Dombawela; 08.06.2015
comment
Только что выяснилось, что добавление text-align:center; сработает, если у этого div есть дочерние элементы, поскольку дочерние элементы будут выровнены по центру. - person Janaka Dombawela; 08.06.2015
comment
Работал у меня. Просто убедитесь, что центрируемый div имеет заданную ширину. - person Gene Kelly; 22.09.2015
comment
Это нормально, если ширина известна. Однако, как говорится в вопросе, ширина неизвестна. Таким образом, принятое решение - единственное, что у меня сработало. - person Craigo; 12.10.2015
comment
согласовано с другими кодировщиками, это будет работать, если вы установите ширину - person Brian Ogden; 06.11.2015
comment
Попробуйте использовать: margin: 0 auto; - person raison; 08.03.2016
comment
Для горизонтального и вертикального центрирования вы также можете добавить top: 0; bottom: 0; и использовать сокращение margin: auto. - person NaN; 28.07.2016
comment
Это не работает в Google Chrome с элементом таблицы и шириной: авто. Сегодня лучше вариант с left: 50%; transform: translate(-50%, 0); думаю. - person Alexander Goncharov; 17.08.2016
comment
Это не отвечает на исходный вопрос, в котором говорится, что решение должно работать для контейнера неизвестной / переменной ширины. - person Arvind Thyagarajan; 14.11.2017
comment
Хорошее решение для горизонтального центрирования. Спасибо - person Gendrith; 24.01.2018
comment
Потрясающее красивое решение. - person Abdullah; 28.02.2018
comment
В этом примере вы можете удалить стили полей и ширины и вместо этого использовать выравнивание текста по центру. Ширина должна автоматически совпадать с шириной относительного родительского элемента. - person Anthony McGrath; 20.07.2018
comment
Это не отвечает на вопрос, в котором прямо говорится, что «ширина неизвестна». - person jdgregson; 18.09.2018
comment
для меня он работает со 100% шириной. вам просто нужно расширить основную оболочку. это все. - person Anthony Kal; 25.09.2018
comment
Это абсолютно лучшее решение, и оно намного лучше, чем использование преобразований, которые создают различные проблемы. - person Peter Moore; 24.10.2019
comment
Мне это понравилось больше, чем принятое решение. Я полагаю, что оба ответа применимы в разных контекстах, и в конечном итоге ни один из них не лучше другого. - person JD Gamboa; 29.10.2019
comment
Также вам не нужно конкретное значение пикселя для ширины - вы также можете использовать max-content и min-content в большинстве браузеров. - person Peter Moore; 29.10.2019

Отзывчивое решение

Вот хорошее решение для адаптивного дизайна или неизвестных размеров в целом, если вам не нужна поддержка IE8 и ниже.

.centered-axis-x {
    position: absolute;
    left: 50%;
    transform: translate(-50%, 0);
}

.outer {
    position: relative; /* or absolute */
    
    /* unnecessary styling properties */
    margin: 5%;
    width: 80%;
    height: 500px;
    border: 1px solid red;
}

.inner {
    position: absolute;
    left: 50%;
    top: 50%;
    transform: translate(-50%, -50%);
    
    /* unnecessary styling properties */
    max-width: 50%;
    text-align: center;
    border: 1px solid blue;
}
<div class="outer">
    <div class="inner">I'm always centered<br/>doesn't matter how much text, height or width i have.<br/>The dimensions or my parent are irrelevant as well</div>
</div>

Вот скрипт JS

Подсказка в том, что left: 50% относится к родительскому элементу, а преобразование translate относится к ширине / высоте элементов.

Таким образом, у вас есть идеально центрированный элемент с гибкой шириной как для дочернего, так и для родительского элементов. Бонус: это работает, даже если ребенок больше родителя.

Вы также можете центрировать его по вертикали с помощью этого (и, опять же, ширина и высота родительского и дочернего элементов могут быть полностью гибкими (и / или неизвестными)):

.centered-axis-xy {
    position: absolute;
    left: 50%;
    top: 50%;
    transform: translate(-50%,-50%);
}

Имейте в виду, что вам также может потребоваться префикс transform vendor. Например -webkit-transform: translate(-50%,-50%);

person ProblemsOfSumit    schedule 30.04.2014
comment
Поскольку поддержка IE7 больше не нужна, это должно быть де-факто решением. Это решение лучше, чем метод left: 0 / right: 0, поскольку он делает элементы полной ширины, в то время как это сохраняет ширину и работает с элементами неизвестной ширины. - person aleemb; 21.11.2014
comment
Безусловно, лучший ответ: это работает, если блок, в котором содержится div, меньше дочернего. - person Case; 23.11.2014
comment
Если поддержка IE8 не требуется, это должно быть решением, но поддержка IE8 еще не прекращена большинством сайтов. - person Justin; 14.01.2015
comment
@Justin строит с помощью прогрессивного улучшения! Создайте решение IE8 и используйте его для новых браузеров, определенных функцией обнаружения (modernizr). - person ProblemsOfSumit; 23.01.2015
comment
@ChadJohnson, конечно, есть. Попробуйте использовать префикс webkit-, как я предлагал. - person ProblemsOfSumit; 12.02.2015
comment
Ах, я пропустил вашу заметку о -webkit. Потрясающие. - person Chad Johnson; 12.02.2015
comment
Есть ли красивое решение для IE8 без JS? Я обнаружил, что this работает с filter, но для этого требуется margin-left и margin-right, чтобы установить источник преобразования середина... - person cheich; 26.02.2015
comment
@Chris да, работать с функцией обнаружения (например, modernizr). Затем вы можете использовать решение margin: 0 auto для IE8 и решение transform для современных браузеров. Это, конечно, работает только для центрирования оси x. - person ProblemsOfSumit; 26.02.2015
comment
Я хотел, чтобы плавающие элементы содержимого (любой ширины) внутри .inner суммировались с рассчитанной внутренней шириной div. jsfiddle.net/b1tav6xx/6 Однако, когда ширина экрана мала, входные данные переносятся под кнопки. - person poshest; 14.03.2015
comment
@poshest это совсем другая проблема. Вам нужно использовать flexbox, таблицы или javascript. - person ProblemsOfSumit; 14.03.2015
comment
Спасибо, Сумит! :) Ты прав. jsfiddle.net/b1tav6xx/11, если кому-то интересно. - person poshest; 16.03.2015
comment
transform: translate, похоже, делает position: fixed непригодным для использования детьми. В этом случае принятый ответ работает лучше. - person dmvianna; 01.04.2015
comment
@dmvianna да, все transform свойства изменят поведение fixed детей. Это широко обсуждаемое поведение, но его легко обойти. - person ProblemsOfSumit; 01.04.2015
comment
Является ли принятый ответ рекомендуемым обходным путем или вы можете указать мне правильное направление? - person dmvianna; 01.04.2015
comment
@dmvianna ну, вы могли бы использовать другой способ центрировать элементы, НО я бы посоветовал вам переосмыслить структуру HTML, чтобы у вас не было вложенного элемента fixed. - person ProblemsOfSumit; 01.04.2015
comment
попробуйте это, если у вас есть sass / compass @include vendor(transform, translate(-50%, -50%)); - person Adam Spence; 01.04.2015
comment
Это именно то, что я ищу. Он обрабатывает элемент, ширина которого не равна ширине его родителя! Спасибо чувак ! - person C0ZEN; 03.04.2016
comment
Ссылки (якоря) у меня не работают, если я делаю это таким образом, я не могу нажимать на них. - person Jo Smo; 21.09.2016
comment
Мне пришлось обрабатывать несколько абсолютно позиционированных модалов разного размера, центрированных с разными окнами просмотра, и это сработало так прекрасно! ваше здоровье! - person jacoballenwood; 23.12.2016
comment
понравился только один модифицированный подход - person Alejandro Sanz Díaz; 12.01.2017
comment
Отличное решение, лучшее из того, что вам не нужно вкладывать ненужные DIV! - person Marcos Buarque; 28.07.2017
comment
Я бы изменил это на right: 50%; transform: translate(50%, 0);. Если div с предварительным преобразованием выходит за правый край страницы, это может вызвать появление горизонтальной полосы прокрутки, но не создает полосу прокрутки, если она выходит за левый край страницы. - person RandomEngy; 20.09.2017
comment
Благодаря нынешнему CSS3 это возможно без указания ширины !! - person Eric; 20.11.2017
comment
Возможно, мне здесь чего-то не хватает, но почему бы не использовать flexbox для центрирования элемента с абсолютным позиционированием в контейнере? stackoverflow.com/a/49743637/1010918 - person lowtechsun; 10.04.2018
comment
@lowtechsun, ты ничего не упускаешь. Когда я писал этот ответ, Flexbox не использовался (или широко не поддерживался) ;-) - person ProblemsOfSumit; 11.04.2018
comment
Это непреднамеренно установит максимальный размер внутреннего элемента на 50% от родительского. - person Anne van Rossum; 30.04.2019
comment
@AnnevanRossum нет, не будет. Как я уже писал, это работает, даже когда ребенок больше родителя. - person ProblemsOfSumit; 02.05.2019
comment
@ProblemsOfSumit Исправление. Он ограничен 50% области просмотра. - person Anne van Rossum; 06.05.2019
comment
@AnnevanRossum нет, это не так. Ни в чем нет предела. jsfiddle.net/x8pugz9a - person ProblemsOfSumit; 09.05.2019
comment
@AnnevanRossum отсутствовал ваш родитель position: relative; jsfiddle.net/8z9a3fbr Если вы имеете в виду поведение переноса текста, это нет предела. Вот текст в одну строку: jsfiddle.net/8z9a3fbr/1 Вы также можете дать ребенку любой witdth или min-width. Как я уже сказал, здесь нет ограничивающего фактора. - person ProblemsOfSumit; 11.05.2019
comment
Это отлично работает с обычными тегами, но при применении анимации CSS ломается. Тег смещается вправо и вниз на половину своей ширины и высоты соответственно. - person Paul Razvan Berg; 12.05.2019
comment
@ProblemsOfSumit с жестким кодированием nowrap, у вас внезапно будет другое поведение упаковки, переполняющее родительский / видовой экран, jsfiddle.net/b4esa580 Другими словами, у вас есть артефакты из-за сдвига в правую половину области просмотра и сдвига назад на половину рассчитанного размера компонента. - person Anne van Rossum; 15.05.2019
comment
@AnnevanRossum это был пример, показывающий вам, что при использовании этой техники нет ограничений. Как обычно, поведение упаковки зависит от потока содержимого и доступного пространства. - person ProblemsOfSumit; 24.05.2019
comment
Наименее хакерское решение. IE10, не говоря уже о IE8, в настоящее время нужно прекратить поддерживать. - person Amir Asyraf; 13.04.2020
comment
Если вы применяете этот CSS к перетаскиваемому элементу, в обработчике mousemove вам нужно установить draggableElement.style.transform = 'initial';. - person Ruby Tunaley; 24.10.2020
comment
Отличный ответ, особенно дополнение для вертикального выравнивания. - person Keinan Goichman; 21.07.2021

Я просто хотел добавить, что если кто-то хочет сделать это с помощью одного тега div, то вот выход:

Принимая width как 900px.

#styleName {
    position: absolute;
    left: 50%;
    width: 900px;
    margin-left: -450px;
}

В этом случае нужно заранее знать width.

person pratikabu    schedule 31.08.2012
comment
"because the width is unknown" ... это не ответ на вопрос - person Michel Ayres; 03.10.2013
comment
привет @Michel, на самом деле, когда вы ищете в Google что-то, связанное с центрированием абсолютного div, эта ссылка появляется как первая ссылка. Вот почему я добавил это решение, на случай, если кто-то вроде меня ищет вышеуказанное решение .. :) - person pratikabu; 23.10.2013
comment
Не очень полезно для адаптивного дизайна, но у меня это работало, пока я не начал делать адаптивный дизайн. Это правильный ответ для центрирования абсолютно позиционированных элементов известной ширины. - person Sean Kendle; 20.03.2014

Абсолютный центр

HTML:

<div class="parent">
  <div class="child">
    <!-- content -->
  </div>
</div>

CSS:

.parent {
  position: relative;
}

.child {
  position: absolute;
  
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;

  margin: auto;
}

Демо: http://jsbin.com/rexuk/2/

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

person Ijas Ameenudeen    schedule 30.01.2014
comment
Это не работает, проверьте следующий код: codepen.io/anon/pen/YqWxjJ - person Mark; 11.03.2016
comment
Извините, я думаю, что это сработает, но вам нужно указать фиксированную высоту и ширину codepen.io/anon/pen/ WwxEYQ - person Mark; 11.03.2016
comment
Я не понимаю, почему установка left и right на 0 означает в этом контексте, когда она используется с маржей auto. Не хочешь объяснить? - person Robert Rocha; 16.05.2021

<div style='position:absolute; left:50%; top:50%; transform: translate(-50%, -50%)'>
    This text is centered.
</div>

Это центрирует все объекты внутри div с типом положения статическим или относительным.

person Utkarsh Tyagi    schedule 20.06.2020
comment
На мой взгляд, это лучший способ сделать это .. а также наиболее часто используемый - person Utkarsh Tyagi; 20.06.2020
comment
Re 059%: Вы имеете в виду 50%? Если да, ответьте отредактируйте свой ответ, а не здесь, в комментариях. - person Peter Mortensen; 20.06.2020
comment
У меня немного другой случай, и я очень рад твоему намеку transform: translate()! - person BergListe; 16.11.2020

Это работает как по вертикали, так и по горизонтали:

#myContent{
    position: absolute;
    left: 0;
    right: 0;
    top: 0;
    bottom: 0;
    margin: auto;
}

И если вы хотите сделать элемент центром родительского элемента, установите положение родительского родственника:

#parentElement{
    position: relative
}
  • Для выравнивания по центру по вертикали установите высоту элемента. Спасибо Раулю.

  • Если вы хотите сделать элемент центром родительского элемента, установите положение родительского элемента относительно

person Mohsen Abdollahi    schedule 07.12.2014
comment
Думаю, вам нужно добавить высоту, чтобы вертикаль работала. - person Raul; 27.12.2014
comment
Похоже, это положение в центре страницы, а не в центре другого элемента. - person Günter Zöchbauer; 18.11.2015
comment
@ GünterZöchbauer: да, если вы хотите сделать элемент центром родительского элемента, установите положение родительского относительного элемента. - person Mohsen Abdollahi; 19.11.2015

Отзывчивое решение

Предполагая, что элемент в div - это еще один div ...

Это решение отлично работает:

<div class="container">
  <div class="center"></div>
</div>

Контейнер может быть любого размера (должен быть относительным):

.container {
    position: relative; /* Important */
    width: 200px; /* Any width */
    height: 200px; /* Any height */
    background: red;
}

Элемент (div) также может быть любого размера (должен быть меньше контейнера):

.center {
    position: absolute; /* Important */
    top: 50%; /* Position Y halfway in */
    left: 50%; /* Position X halfway in */
    transform: translate(-50%,-50%); /* Move it halfway back(x,y) */
    width: 100px; /* Any width */
    height: 100px; /* Any height */
    background: blue;
}

Результат будет таким. Запустите фрагмент кода:

.container {
    position: relative;
    width: 200px;
    height: 200px;
    background: red;
}

.center {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    width: 100px;
    height: 100px;
    background: blue;
}
<div class="container">
    <div class="center"></div>
</div>

Я нашел это очень полезным.

person Michiel J Otto    schedule 26.09.2019
comment
гений. почему другой не придумал это. - person mesqueeb; 18.05.2020
comment
Спасибо, удачного кодирования - person Michiel J Otto; 19.05.2020

Если вам нужно также центрировать по горизонтали и вертикали:

left: 50%;
top: 50%;
transform: translate(-50%, -50%);
person michal.jakubeczy    schedule 15.02.2019

В поисках решения я получил предыдущие ответы и смог сделать контент по центру Ответ Матиаса Вейлера, но с использованием text-align:

#content{
  position: absolute;
  left: 0;
  right: 0;
  text-align: center;
}

Он работал с Google Chrome и Firefox.

person cavila    schedule 29.05.2013
comment
Я думаю, вам не нужен text-align: center - person Tobias; 06.08.2013
comment
Это устранило мою проблему здесь. Спасибо! - person Volomike; 07.09.2016
comment
Мне нужен text-align: center, и это сработало там, где решение, предложенное @ProblemsOfSumit, не работало, поскольку оно заставляло мой текст переноситься. - person Nat; 13.12.2018

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

.container {
    position: relative;
}

.container .cat-link {
    position: absolute;
    left: 50%;
    top: 50%;
    transform: translate3d(-50%,-50%,0);
    z-index: 100;
    text-transform: uppercase; /* Forces CSS to treat this as text, not a texture, so no more blurry bugs */
    background-color: white;
}

.color-block {
  height: 250px;
  width: 100%;
  background-color: green;
}
<div class="container">
  <a class="cat-link" href="">Category</a>
  <div class="color-block"></div>
</div>

Он говорит, что дайте мне top: 50% и left: 50%, затем преобразуйте (создайте пространство) по обеим осям X / Y до значения -50%, в некотором смысле создайте зеркальное пространство.

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

Это будет:

  1. Работайте, не зная родительскую высоту / ширину.
  2. Работайте над отзывчивостью.
  3. Работайте по оси X или Y. Или оба, как в моем примере.
  4. Я не могу придумать ситуацию, когда это не сработает.
person Daniel Moss    schedule 26.11.2017
comment
Пожалуйста, дайте мне знать, если вы обнаружите ситуацию, когда это не сработает, чтобы я мог отредактировать вопрос с вашим участием. - person Daniel Moss; 26.11.2017
comment
transform / translate заставит сафари отображать текст размытым в определенном масштабе - person James Tan; 09.01.2018
comment
@DanielMoss есть ли причина не использовать translate(-50%,-50%);? - person Mark Baijens; 03.08.2018

Это смесь других ответов, которые сработали для нас:

.el {
   position: absolute;
   top: 50%;
   margin: auto;
   transform: translate(-50%, -50%);
}
person Crashalot    schedule 29.05.2019

Это работает с любой случайной неизвестной шириной элемента с абсолютным позиционированием, который вы хотите иметь в центре элемента контейнера:

Демо

<div class="container">
  <div class="box">
    <img src="https://picsum.photos/200/300/?random" alt="">
  </div>
</div>

.container {
  position: relative;
  width: 100%;
}

.box {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  display: flex;
  justify-content: center;
  align-items: center;
}
person lowtechsun    schedule 10.04.2018

Flexbox можно использовать для центрирования блока с абсолютным позиционированием.

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

.relative {
  width: 275px;
  height: 200px;
  background: royalblue;
  color: white;
  margin: auto;
  position: relative;
}

.absolute-block {
  position: absolute;
  height: 36px;
  background: orange;
  padding: 0px 10px;
  bottom: -5%;
  border: 1px solid black;
}

.center-text {
  display: flex;
  justify-content: center;
  align-items: center;
  box-shadow: 1px 2px 10px 2px rgba(0, 0, 0, 0.3);
}
<div class="relative center-text">
  Relative Block
  <div class="absolute-block center-text">Absolute Block</div>
</div>

person Dhaval Jardosh    schedule 03.02.2019
comment
на моем экране -Firefox 68.x, он просто не выравнивается, абсолютный блок появляется внизу относительного блока - person Webwoman; 18.03.2020
comment
Вы можете попробовать это display: -webkit-flex;? - person Dhaval Jardosh; 18.03.2020
comment
Это не сработает для absolute позиционированных элементов - person APu; 20.04.2021

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

Вы можете - если это работает в вашем сценарии - абсолютно позиционировать невидимый элемент со 100% шириной и высотой и центрировать элемент там, используя margin: auto и, возможно, vertical-align. В противном случае для этого вам понадобится JavaScript.

person Pekka    schedule 21.11.2009
comment
+1 за наценку: авто вещь. Я пробовал это раньше, чтобы горизонтально центрировать div с помощью поля линии: 0 auto - 0 применяется к вертикальным полям, а auto - по горизонтали. Я думаю, что это то, что StackOverflow использует для div самого верхнего уровня, чтобы получить две толстые белые границы по сторонам страницы. Однако на странице W3Schools на поле CSS указано значение auto. Результат этого зависит от браузера - я лично не пробовал его во многих разных браузерах, поэтому я не могу комментировать этот момент (но, очевидно, помогает в некоторых из них) - person Steg; 22.11.2009
comment
это возможно для неизвестной ширины (и высоты), если IE8 не является проблемой. Подробности смотрите в моем ответе. - person ProblemsOfSumit; 08.09.2014

Я хотел бы добавить к ответ Бобинса:

<body>
    <div style="position: absolute; left: 50%;">
        <div style="position: relative; left: -50%; border: dotted red 1px;">
            I am some centered shrink-to-fit content! <br />
            tum te tum
        </div>
    </div>
</body>

Улучшено: /// Это делает горизонтальную полосу прокрутки не отображаемой с большими элементами в центрированном div.

<body>
    <div style="width:100%; position: absolute; overflow:hidden;">
        <div style="position:fixed; left: 50%;">
            <div style="position: relative; left: -50%; border: dotted red 1px;">
                I am some centered shrink-to-fit content! <br />
                tum te tum
            </div>
        </div>
    </div>
</body>
person Vial    schedule 28.01.2013

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

/**
 * @author: Suissa
 * @name: Absolute Center
 * @date: 2007-10-09
 */
jQuery.fn.center = function() {
    return this.each(function(){
            var el = $(this);
            var h = el.height();
            var w = el.width();
            var w_box = $(window).width();
            var h_box = $(window).height();
            var w_total = (w_box - w)/2; //400
            var h_total = (h_box - h)/2;
            var css = {"position": 'absolute', "left": w_total + "px", "top":
h_total + "px"};
            el.css(css)
    });
};
person Ben Shelock    schedule 21.11.2009
comment
это лучший способ, особенно с отзывчивым дизайном. - person m4tm4t; 18.10.2012
comment
Было бы тривиально, если бы в любом случае использовался jQuery - person Code Whisperer; 13.01.2014
comment
это НЕ лучший способ. Всегда лучше использовать CSS, когда это возможно. Центрирование DIV возможно с помощью CSS по каждой оси, а также для адаптивных страниц. Нет необходимости в JavaScript! - person ProblemsOfSumit; 30.04.2014
comment
@yckart, и в данном случае это CSS. - person ProblemsOfSumit; 28.04.2015

Sass / Compass версии предыдущего адаптивного решения:

#content {
  position: absolute;
  left: 50%;
  top: 50%;
  @include vendor(transform, translate(-50%, -50%));
}
person Adam Spence    schedule 01.04.2015
comment
transform: translate(-50%, -50%) делает текст и весь другой контент размытым в OS X с помощью браузеров webkit. keithclark.co.uk/articles/gpu-text-rendering-in -webkit - person Yasha; 15.12.2015
comment
Просто используйте тот тип сглаживания, который вам нравится -webkit-font-smoothing: antialiased; Я почерпнул это из статьи, которую вы опубликовали, кстати! - person Adam Spence; 22.12.2015

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

<div class="container><p>My text</p></div>

.container{
    position: absolute;
    left: 0;
    right: 0;
    margin-left: auto;
    margin-right: auto;
}
person Alan    schedule 24.05.2016
comment
Это ответ @Matthias Weiler 5 лет спустя. - person aloisdg; 19.11.2016

Мой предпочтительный метод центрирования:

position: absolute;
margin: auto;
width: x%
  • абсолютное позиционирование блочного элемента
  • маржа авто
  • то же слева / справа, сверху / снизу

JSFiddle находится здесь.

person vp_arth    schedule 27.03.2014

HTML:

<div id='parent'>
  <div id='child'></div>
</div>

CSS:

#parent {
  display: table;
}
#child {
  display: table-cell;
  vertical-align: middle;
}

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

person Dustin Poissant    schedule 08.01.2015

Принятое решение этого вопроса в моем случае не сработало ...

Я делаю подпись для некоторых изображений и решил это с помощью этого:

top: 0;
left: 0;
right: 0;
margin-left: auto;
margin-right: auto;

display: flex;
align-items: center;

figure {
    position: relative;
    width: 325px;
    display: block
}


figcaption{
    position: absolute;
    background: #FFF;
    width: 120px;
    padding: 20px;

    -webkit-box-shadow: 0 0 30px grey;
    box-shadow: 0 0 30px grey;
    border-radius: 3px;
    display: block;

    top: 0;
    left: 0;
    right: 0;
    margin-left: auto;
    margin-right: auto;

    display: flex;
    align-items: center;
}
<figure>
    <img  src="https://picsum.photos/325/600">
    <figcaption>
        But as much
    </figcaption>
</figure>

person Marcogomesr    schedule 14.11.2018

HTML

<div id='parent'>
  <div id='centered-child'></div>
</div>

CSS

#parent {
  position: relative;
}
#centered-child {
  position: absolute;
  left: 0;
  right: 0;
  top: 0;
  bottom: 0;
  margin: auto auto;
}

http://jsfiddle.net/f51rptfy/

person Dustin Poissant    schedule 16.10.2014

Это решение работает, если элемент имеет width и height

.wrapper {
  width: 300px;
  height: 200px;
  background-color: tomato;
  position: relative;
}

.content {
  width: 100px;
  height: 100px;
  background-color: deepskyblue;
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  margin: auto;
}
<div class="wrapper">
  <div class="content"></div>
</div>

person Mo.    schedule 06.09.2018

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

Точки и тире

<div style="border: 5 dashed red;position:fixed;top:0;bottom:0;left:0;right:0;padding:5">
    <table style="position:fixed;" width="100%" height="100%">
        <tr>
            <td style="width:50%"></td>
            <td style="text-align:center">
                <div style="width:200;border: 5 dashed green;padding:10">
                    Perfectly Centered Content
                </div>
            </td>
            <td style="width:50%"></td>
        </tr>
    </table>
</div>

Очиститель

Ух ты, эти пять лет просто пролетели незаметно, не так ли?

<div style="position:fixed;top:0px;bottom:0px;left:0px;right:0px;padding:5px">
    <table style="position:fixed" width="100%" height="100%">
        <tr>
            <td style="width:50%"></td>
            <td style="text-align:center">
                <div style="padding:10px">
                    <img src="Happy.PM.png">
                    <h2>Stays in the Middle</h2>
                </div>
            </td>
            <td style="width:50%"></td>
        </tr>
    </table>
</div>
person Mr. B    schedule 24.09.2013

HTML:

<div class="wrapper">
    <div class="inner">
        content
    </div>
</div>

CSS:

.wrapper {
    position: relative;

    width: 200px;
    height: 200px;

    background: #ddd;
}

.inner {
    position: absolute;
    top: 0; bottom: 0;
    left: 0; right: 0;
    margin: auto;

    width: 100px;
    height: 100px;

    background: #ccc;
}

Этот и другие примеры можно найти здесь.

person Community    schedule 14.12.2013

Простой подход, который помог мне центрировать блок неизвестной ширины по горизонтали:

<div id="wrapper">
  <div id="block"></div>
</div>

#wrapper {
    position: absolute;
    width: 100%;
    text-align: center;
}

#block {
    display: inline-block;
}

Свойство text-align можно добавить в набор правил #block, чтобы выровнять его содержимое независимо от выравнивания блока.

Это работало в последних версиях Firefox, Chrome, Internet Explorer, Edge и Safari.

person Terence Bandoian    schedule 20.02.2018

Ни одно из решений у меня не сработало, так как я не хотел менять стиль элемента контейнера / оболочки. Этот код работал у меня:

position: absolute;
left: 50%;
margin-left: -50px;
top: 50%;
margin-top: -50px;
person Nick.K    schedule 23.01.2020

Вы также можете создать блок промежуточного программного обеспечения div#centered по центру со свойствами absolute, left и right и без свойства width, а затем установить основное содержимое div в качестве его дочернего элемента с полем display:inline-block и центрировать его с помощью text-align:center, установленного для его родительского поля промежуточного программного обеспечения.

#container {
  position: relative;
  width: 300px;
  height: 300px;
  border: solid 1px blue;
  color: #DDDDDD;
}

#centered {
  position: absolute;
  text-align: center;
  margin: auto;
  top: 20px;
  left: 0;
  right: 0;
  border: dotted 1px red;
  padding: 10px 0px;
}

#centered>div {
  border: solid 1px red;
  display: inline-block;
  color: black;
}
<div id="container">
  hello world hello world
  hello world hello world
  hello world hello world
  hello world hello world
  hello world hello world
  hello world hello world
  hello world hello world
  hello world hello world

  <div id="centered">
    <div>
      hello world <br/>
      I don't know my width<br/>
      but I'm still absolute!
    </div>
  </div>
</div>

person Paweł    schedule 03.05.2019

Вы можете поместить изображение в div и добавить идентификатор div и сделать так, чтобы CSS для этого div имел text-align:center:

HTML:

<div id="intro_img">

    <img src="???" alt="???">

</div>

CSS:

#intro_img {
    text-align: center;
}
person Dworvin Vonstrangle    schedule 28.11.2013

Старайтесь не использовать темную сторону CSS. Избегайте использования отрицательных значений полей. Я знаю, что иногда вы вынуждены делать ужасные вещи, например margin-left: -450px, но, вероятно, вы могли бы сделать что-то вроде right: 450px. Это просто мой способ работы.

person sebastian    schedule 28.11.2013
comment
отрицательные значения не являются темной стороной CSS. Они так же действительны, как и положительные значения. И ваше предложение поменять местами margin-left на right не имеет никакого смысла, если цель состоит в том, чтобы центрировать элемент. - person ProblemsOfSumit; 19.11.2014

Я использовал похожее решение:

#styleName {
    position: absolute;
    margin-left: -"X"px;
}

Где X - половина ширины div, который я хочу отобразить. У меня он отлично работает во всех браузерах.

person Bartosz    schedule 04.02.2013
comment
Вам также понадобится left: 50%, чтобы эта работа работала. - person Ivan Durst; 29.01.2014

person    schedule
comment
Потрясающие. Сработало у меня! У меня была одна проблема: изображение, которое я центрировал, было довольно большим, это заставляло внешний div выходить за правый край страницы и вызывать горизонтальную прокрутку. Я поменял левое свойство css на правое, и пока оно работает лучше, так как переход за левый край экрана не вызывает прокрутку - person BoomShaka; 26.10.2011
comment
что, если пользователь прокрутил страницу вниз, сверху появляется overylay, как вы думаете, будет хорошей идеей использовать jquery для устранения проблемы с прокруткой - person PUG; 01.09.2012
comment
одним из решений проблемы прокрутки может быть position: fixed, но что, если высота наложения неизвестна, необходимо реализовать полосы прокрутки для наложения - person PUG; 01.09.2012
comment
Решение для прокрутки может быть таким, хотя не тестировал его достаточно, что вы, ребята, думаете об этом решении? var scrolled =$(window).scrollTop(); if(scrolled>0) { var offset = $('#containerOverlay').offset(); $('#containerOverlay').css('top',($(window).height() * 0.05) + scrolled); } - person PUG; 01.09.2012
comment
Это своего рода духовный ответ, поскольку его душа все еще там. - person aderchox; 04.07.2021