Як центрувати абсолютно розміщений елемент у діві?


1078

Мені потрібно розмістити div(з position:absolute;) елемент в центрі мого вікна. Але у мене виникають проблеми з цим, бо ширина невідома .

Я спробував це. Але його потрібно відрегулювати, оскільки ширина чутлива.

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

Будь-які ідеї?


4
У вас є приклад в прикладах абсолютного центру, які можна узагальнити в різних ситуаціях.
— Mihai8

2
Є краща відповідь на це запитання на сайті stackoverflow.com/questions/17976995/…
— Andrew Swift

Відповіді:


1333

<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
Дивовижно. Працювали для мене! У мене була одна проблема: зображення, яке я центрирував, було досить великим, через що зовнішній div вийшов за межі правого краю сторінки та спричинив горизонтальне прокручування. Я поміняв властивість "left" css на "right", і поки це працює краще, оскільки перехід лівого краю екрану не спричиняє прокрутки
— BoomShaka

Що робити, якщо користувач прокрутив сторінку вниз, вверху з’явиться overylay, чи вважаєте ви, що буде хорошою ідеєю використовувати jquery для усунення проблеми прокрутки
— PUG

1
одне рішення для проблеми прокрутки може бути, position: fixedале що робити, якщо висота накладення невідома, потрібно буде впровадити смуги прокрутки для накладання
— PUG

3
Є незначна проблема, з якою я зіткнувся з використанням цієї методики. Оскільки зовнішній div займає 50% екрана, деяке зміщення відбувається, коли текст ширший за 50% екрана. Я вирішив це, встановивши зовнішній div на "width: 100%" та видаливши ліву властивість. Для внутрішнього поділу я просто встановив вирівнювання тексту в центр. Це вирішує питання.
— Нікі Л.

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
потрібно встановити ширину діва, який повинен бути центрований - він не працюватиме автоматично з, скажімо, кнопкою з текстом на ньому.
— Стефан

2
@Joshua Це буде орієнтуватися лише горизонтально, не вертикально, як інша відповідь.
— ygoe

3
Я вважаю за краще це рішення, оскільки воно не збільшує розмір вікна перегляду.
— iceydee

13
Для підтримки крос-браузера: widthслід встановити певне значення, щоб це працювало. autoі 100%не буде центрувати елемент. display: block;є обов'язковим. position: absolute;НЕ обов'язково. Всі значення спрацюють. Батьківський елемент positionповинен бути встановлений на щось інше, ніж static. Налаштування leftі rightдо 0не потрібні. margin-left: auto; margin-right: auto;зробить роботу.
— Onur Yıldırım

767

Чуйне рішення

Ось хороше рішення для чуйного дизайну або невідомих розмірів взагалі, якщо вам не потрібно підтримувати 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 більше не потрібна, це повинно бути фактичним рішенням. Це рішення краще, ніж ліве: 0 / право: 0 техніка, оскільки це робить елементи повної ширини, в той час як це зберігає ширину і працює на елементи невідомої ширини.
— aleemb

51
Це, безумовно, найкраща відповідь, якщо це поле, у якому міститься div, менше, ніж у дочірнього.
— Справа

2
@ChadJohnson, звичайно, так і є. Спробуйте його з webkit-префіксом, як я запропонував.
— ПроблемиOfSumit

2
Ах, я пропустив вашу замітку про -webkit. Дивовижно.
— Чад Джонсон

3
transform: translateздається, що робить position: fixedнепридатним для дітей. Прийнята відповідь в цьому випадку працює краще.
— dmvianna

49

Дійсно приємний пост .. Просто хотів додати, якщо хтось хоче це зробити з одним тегом діви, то тут вихід:

Приймаючи widthяк 900px.

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

У цьому випадку слід знати widthзаздалегідь.


26
"because the width is unknown"... це не відповідає на питання
— Мішель Ейрес

15
привіт @Michel насправді, коли ви шукаєте в Google щось, що стосується центрування абсолютного диві, це посилання є першим посиланням. Ось чому я додав це рішення, якщо хтось, як я, шукає вищезазначене рішення .. :)
— pratikabu

1
Не дуже корисний для чуйного дизайну, але він працював на мене, поки я не почав робити гнучкі конструкції. Це дійсна відповідь на центрування абсолютно розташованих відомих елементів ширини .
— Шон Кендл

35

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

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
Я думаю, що вам потрібно додати висоту для вертикальної роботи.
— Рауль

Схоже, це положення в центрі сторінки, а не центр іншого елемента.
— Günter Zöchbauer

1
@ GünterZöchbauer так, якщо ви хочете зробити елемент елемента батьківського, встановіть позицію батьківського родича.
— Мохсен Абдоллахі

20

Шукаючи рішення, я отримав відповіді вище, і міг зробити контент у центрі відповіді Маттіаса Вайлера, але використовуючи вирівнювання тексту.

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

Працював з хромом та Firefox.


5
Я думаю, що тобі не потрібне "вирівнювання тексту: центр"
— Тобіас

Це вирішило тут мою проблему . Дякую!
— Воломіке

Мені знадобилося "вирівнювання тексту: центр", і це працювало там, де рішення, запропоноване @ProblemsOfSumit, не працювало, оскільки воно перетворило текст.
— Нат

19

Якщо вам потрібно також централізувати горизонтально та вертикально:

left: 50%;
top: 50%;
transform: translate(-50%, -50%);

дуже
— класне

15

** РЕЗОНСИВНЕ РІШЕННЯ **

Якщо припустити елемент у діві, це ще один дів ...

це рішення прекрасно працює

<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 точок діва, який завжди є коробкою (має 4 сторони).

Це буде:

  1. Працюйте, не знаючи висоти / ширини батьків.
  2. Робота над чуйною.
  3. Робота на осі X або Y. Або обидва, як у моєму прикладі.
  4. Я не можу придумати ситуацію, коли це не працює.

Будь ласка, дайте мені знати, якщо ви виявите ситуацію, коли це не працює, щоб я міг редагувати питання з вашим вкладом.
— Даніель Мосс

Перетворення / переклад призведе до того, що сафарі вимкне текст у певному масштабі
— Джеймс Тан

@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 можна використовувати для центрування абсолютного розміщеного поділу.

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


на моєму екрані -Firefox 68.x, він просто не вирівнюється, абсолютний блок з’являється внизу відносного блоку
— Веб-жінка

Ви можете спробувати це display: -webkit-flex;?
— Дхаваль Ярдош

7

Наскільки я знаю, цього неможливо досягти за невідомої ширини.

Ви можете - якщо це працює у вашому сценарії - абсолютно розташувати невидимий елемент зі 100% шириною та висотою, а також розмістити в ньому елемент із використанням поля: auto та можливо вертикального вирівнювання. Інакше для цього вам потрібен Javascript.


+1 для речі "margin: auto". Я раніше це пробував, щоб горизонтально центрувати діл, використовуючи рядок "margin: 0 auto" - "0", що застосовується до вертикальних полів, і "auto" по горизонталі. Я думаю, що саме це використовує StackOverflow для діва верхнього рівня, щоб отримати 2 товсті білі рамки вниз по сторонах сторінки. Однак на сторінці W3Schools на полі CSS зазначено автоматичне значення, що "Результат цього залежить від браузера" - я особисто не пробував це в багатьох різних браузерах, тому я не можу коментувати цей момент (але це очевидно робить трюк в деяких з них)
— Steg

1
можливо невідома ширина (і висота), якщо IE8 не є проблемою. Детальну інформацію див. У моїй відповіді.
— ProblemsOfSumit

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>

Удосконалено: /// це робить горизонтальну смугу прокрутки не відображатися з великими елементами в центрі поділки.

<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 в будь-якому випадку використовувався
— Whisperer Code

8
це НЕ кращий спосіб. Завжди краще використовувати CSS, коли це можливо. Центрування DIV можливе за допомогою CSS в кожній осі, а також для чуйних сторінок. Немає необхідності в JavaScript!
— ПроблемиOfSumit

1
@yckart, і в цьому випадку інструментом є CSS.
— ProblemsOfSumit

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 за допомогою веб-браузерів. keithclark.co.uk/articles/gpu-text-rendering-in-webkit
— Yasha

Просто використовуйте той тип антиалізингу, який вам подобається. -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;
}



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 ID та мати 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; }

Властивість вирівнювання тексту може бути додана до набору правил #block, щоб вирівняти його вміст незалежно від вирівнювання блоку.

Це працювало на останніх версіях Firefox, Chrome, IE, Edge та Safari.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.