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


1078

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

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

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

Любые идеи?


4
У вас есть пример в Абсолютном центре примеров, которые можно обобщать в разных ситуациях.
Mihai8

2
Есть лучший ответ на этот вопрос на stackoverflow.com/questions/17976995/…
Эндрю Свифт

Ответы:


1334

<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>


76
Потрясающие. Работал на меня! У меня была одна проблема: изображение, которое я центрировал, было довольно большим, из-за чего внешний тег перешел за правый край страницы и вызвал горизонтальную прокрутку. Я поменял свойство css "left" на "right", и пока оно работает лучше, так как переход через левый край экрана не вызывает прокрутку
BoomShaka

Что делать, если пользователь прокрутил страницу вниз, наверху появляется оверлей, как вы думаете, будет ли хорошей идеей использовать jquery для исправления проблемы с прокруткой
PUG

1
Одним из решений проблемы прокрутки может быть, position: fixedно что, если высота не известна для наложения, должны быть реализованы полосы прокрутки для наложения
PUG

3
С этой техникой я столкнулся с небольшой проблемой. Поскольку внешний блок занимает 50% экрана, происходит некоторое смещение, когда текст шире, чем 50% экрана. Я решил это, установив внешний div в «width: 100%» и удалив свойство left. Для внутреннего div я просто устанавливаю выравнивание текста по центру. Это решает проблему.
Ники Л.

3
В этом случае высота в процентах относительно содержащего блока <html>. Но <html>элемент не имеет heightуказанного, поэтому он принимает высоту всего содержимого в документе, что является ничем, потому что единственный контент абсолютно позиционирован (вынут из потока контента). Добавление height: 100%к <html>элементу имеет значение для этого.
bobince

1801

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

#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>


36
Я просто хочу донести, что отрицательные поля являются абсолютно допустимым CSS и не должны рассматриваться как «грязный хак». Отрицательные поля указаны в спецификации блочной модели W3C. Кажется, что некоторые люди произвольно решают, что это хак, потому что они а) не знают их или б) используют их для исправления своего плохого CSS.
Джозеф Равенвольф

58
необходимо установить ширину div, который будет центрирован - не будет работать автоматически, скажем, с кнопкой с текстом на нем.
Стефан

2
@ Joshua Это будет только по центру, а не по вертикали, как другой ответ.
ygoe

3
Я предпочитаю это решение, так как оно не увеличивает размер области просмотра.
Iceydee

13
Для кросс-браузерной поддержки: widthдолжно быть установлено определенное значение, чтобы это работало. autoи 100%не будет центрировать элемент. display: block;является обязательным. position: absolute;НЕ обязательно. Все ценности будут работать. Родительский элемент positionдолжен быть установлен в нечто иное, чем static. Установка leftи rightдо 0не нужна. margin-left: auto; margin-right: auto;сделаю работу.
Онур Йылдырым

768

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

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

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

Вот JS Fiddle

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

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

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

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

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


26
С поддержкой IE7 больше нет необходимости, это должно быть де-факто решением. Это решение лучше, чем метод left: 0 / right: 0, так как это делает элементы полной ширины, в то время как это сохраняет ширину и работает с элементами неизвестной ширины.
aleemb

51
Безусловно лучший ответ, это работает, если поле, в котором находится div, меньше, чем child.
Дело

2
@ChadJohnson, конечно, это так. Попробуйте с webkit-префиксом, как я и предлагал.
Задачи из

2
Ах, я пропустил ваше замечание о -webkit. Потрясающие.
Чед Джонсон

3
transform: translateкажется position: fixedнепригодным для детей. Принятый ответ работает лучше в этом случае.
Дмвианна

49

Действительно хороший пост ... Просто хотел добавить, если кто-то хочет сделать это с одним тегом div, тогда вот выход:

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

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

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


26
"because the width is unknown"... это не отвечает на вопрос
Мишель Айрес

15
Привет @Michel На самом деле, когда вы ищете в Google что-то, связанное с центрированием абсолютного div, эта ссылка становится первой ссылкой. Вот почему я добавил это решение, если кто-то вроде меня ищет вышеуказанное решение .. :)
pratikabu

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

36

Абсолют Центр

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 и IE8

Надеюсь это поможет :)


Это не работает, пожалуйста, проверьте следующий codepen codepen.io/anon/pen/YqWxjJ
Марк

1
Извините, я думаю, что это будет работать, но вам нужно включить фиксированную высоту и ширину codepen.io/anon/pen/WwxEYQ
Марк

31

эта работа для вертикальной и горизонтальной

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

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

 #parentElement{
      position:relative
  }

редактировать:

  • для вертикального центра выровняйте заданную высоту по вашему элементу. благодаря @Raul

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


2
Я думаю, что вам нужно добавить высоту для вертикальной работы.
Рауль

Похоже, что это позиции в центре страницы, а не в центре другого элемента.
Гюнтер Цохбауэр

1
@ GünterZöchbauer да, если вы хотите сделать элемент центром родителя, установите положение родителя относительно.
Мохсен Абдоллахи

20

В поисках решения я получил ответы выше и мог сосредоточить контент на ответе Матиаса Вейлера, но с помощью выравнивания текста.

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

Работал с Chrome и Firefox.


5
Я думаю, что вам не нужно "text-align: center"
Тобиас

Это решило мою проблему здесь . Спасибо!
Volomike

Мне нужен был «text-align: center», и это сработало, когда решение, предложенное @ProblemsOfSumit, не сработало, поскольку сделало перенос текста.
Nat


15

** ОТВЕТСТВЕННОЕ РЕШЕНИЕ **

Предполагая, что элемент в 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>

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


1
гений. почему другой не придумал это.
mesqueeb

Спасибо, счастливого кодирования
RealMJDev

13

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

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

Хорошее исправление, спасибо, мужик!
Стэнли Бейтсвар

12

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

.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>

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

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

Это будет:

  1. Работайте без необходимости знать высоту / ширину родителя.
  2. Работайте на отзывчивом.
  3. Работайте на оси X или Y. Или оба, как в моем примере.
  4. Я не могу придумать ситуацию, когда это не работает.

Пожалуйста, дайте мне знать, если вы обнаружите ситуацию, когда это не работает, чтобы я мог отредактировать вопрос с вашим вкладом.
Дэниел Мосс,

transform / translate приведет к тому, что сафари сделает текст размытым в определенном масштабе
Джеймс Тан

@DanielMoss какие-либо причины не использовать translate(-50%,-50%);?
Марк Байенс

12

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

демонстрация

<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;
}

9

Flex можно использовать для центрирования абсолютного позиционирования div.

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


на моем экране - Firefox 68.x, он просто не выравнивается, в нижней части относительного блока появляется абсолютный блок
Webwoman

Ты можешь попробовать это display: -webkit-flex;?
Давал Джардош

7

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

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


+1 за «маржу: авто» вещь. Я пробовал это раньше, чтобы горизонтально центрировать div, используя строку «margin: 0 auto» - «0» применяется к вертикальным полям и «auto» к горизонтали. Я думаю, это то, что StackOverflow использует для самого верхнего уровня div, чтобы получить 2 толстых белых границы по краям страницы. Однако на странице W3Schools на полях CSS для автоматического значения указано, что «результат зависит от браузера» - я лично не пробовал его во многих различных браузерах, поэтому я не могу прокомментировать этот момент (но в некоторых из них это явно
срабатывает

1
это возможно для неизвестной ширины (и высоты), если IE8 не проблема. Смотрите мой ответ для деталей.
Задачи из

7

Я хотел бы добавить к ответу @ bobince:

<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>

6

Вот полезный плагин 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)
    });
};

это лучший способ, особенно с учетом дизайна.
m4tm4t

Было бы тривиально, если бы jQuery использовался в любом случае
Code Whisperer

8
это НЕ лучший способ. Всегда лучше использовать CSS, когда это возможно. Центрирование DIV возможно с помощью CSS на каждой оси, а также для адаптивных страниц. Нет необходимости в JavaScript!
Задачи

1
@yckart и в этом случае инструмент CSS.
Задачи из

5

sass / compass версия Responsive Solution выше:

#content {
  position: absolute;
  left: 50%;
  top: 50%;
  @include vendor(transform, translate(-50%, -50%));
}

4
transform: translate(-50%, -50%)делает текст и весь другой контент размытым на OS X, используя браузеры webkit. keithclark.co.uk/articles/gpu-text-rendering-in-webkit
Яша

Просто используйте тот тип сглаживания, который вам нравится, -webkit-font-smoothing: antialiased;что я почерпнул из статьи, которую вы опубликовали.
Адам Спенс

4

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

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

JSFiddle здесь



3

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

HTML:

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

CSS:

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

3
#container
{
  position: relative;
  width: 100%;
  float:left
}
#container .item
{
  width: 50%;
  position: absolute;
  margin: auto;
  left: 0;
  right: 0;
}


2

Это решение работает, если элемент имеет 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>


2

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

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>


1

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;
}

Это и другие примеры здесь


1

Это трюк, который я понял для того, чтобы заставить 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>


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

.center:before {
    content: '';
    display: inline-block;
    margin-left: -50%;
}

0

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

HTML:

<div id="intro_img">

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

</div>

CSS:

#intro_img {
    text-align:center;
}


0

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

<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, IE, Edge и Safari.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.