css абсолютна позиція не працюватиме з margin-left: auto margin-right: auto


82

Скажімо, у вас є такий css, застосований до тегу div

.divtagABS {
    position: absolute;
    margin-left: auto;  
    margin-right:auto;
 }

поля зліва та поля зліва не набувають чинності

але якщо у вас є родич, це чудово працює, тобто

,divtagREL {
position: relative;
margin-left: auto;  
 margin-right:auto;
}

чому так? я просто хочу відцентрувати елемент

хтось може пояснити, чому встановлення полів на авто в абсолютному положенні не працює?


просто використовуйте margin: auto;. при абсолютній позиції всі інші елементи стилю (щодо позиції / тощо) ігноруються.
hjpotter92

Оберніть його тегом <center> і встановіть ширину .divtagABS на 100%.
Хлоя

Я можу підтвердити: хоча деякі кажуть, що це твердження застаріле, я помітив нецентрувальну помилку для position: absolute;IE Edge.
WoodrowShigeru

Відповіді:


157

EDIT: ця відповідь стверджувала, що неможливо відцентрувати абсолютно позиціонований елемент за допомогою margin: auto;, але це просто не відповідає дійсності. Оскільки це найбільш прийнята і прийнята відповідь, я здогадався, що просто зміню її на правильну.

Коли ви застосовуєте наступний CSS до елемента

position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
margin: auto;

А потім надайте елементу фіксовану ширину та висоту, наприклад 200px або 40%, елемент буде центрувати себе.

Ось скрипка, яка демонструє ефект.


3
url: vision.to/articles/margins-and-absolute-positioning.php не працює, будь ласка, замініть
chrmod

2
"Елемент з абсолютним положенням не можна відцентрувати ..." Насправді це не відповідає дійсності: Ключ полягає у встановленні всіх top/bottom/left/rightвластивостей 0та оголошенні, widthа heightпотім margin: autoавтоматично відцентрує абсолютно позиціонований елемент. Див .: Техніка абсолютного центрування ; це також на Smashing Magazine .
DynamicDispatch

2
А для того, щоб зробити ширину псевдодинамічною, використовуйте width: 100%;та (тобто) max-width: 500px;.
WoodrowShigeru

1
Так, вам потрібно додати, width: 100%щоб він працював з фронтом та IE9-11.
Huelfe,

1
Я думаю, вам потрібно встановити лише ліворуч, праворуч та (макс.) Ширину для того, щоб він знаходився в центрі, немає необхідності внизу або вгорі для горизонтального вирівнювання. Хоча для кращої практики слід встановити принаймні один із них, щоб браузери не
могли

67

Я використав цей фокус, щоб відцентрувати абсолютно позиціонований елемент . Хоча, ви повинні знати ширину елемента.

.divtagABS {
    width: 100px;
    position: absolute;
    left: 50%;
    margin-left: -50px;
  }

В основному, ви використовуєте лівий: 50%, а потім поверніть його на половину ширини з негативним полем.


Так, це те, що вам слід використовувати, якщо елемент має фіксовану ширину.
Бантрос,

Блискуче. Дякую за це
treeface

Ви можете використовувати поле зліва: -25%; щоб відцентрувати його замість жорсткого кодування числа.
Аарон Харун,

4
@AaronHarun - на жаль, ні, це не буде працювати так, як ви очікуєте. Я думаю, що 25% будуть засновані на ширині батьків. Я встановив ручку коду, щоб перевірити це: codepen.io/chippper/pen/xwKIl - ви можете перемикати останній рядок CSS, щоб зрозуміти, що я маю на увазі.
chipcullen

Це спонукало мене до подібного фокусу, але з використанням margin-left: -50%;. Як не дивно, але це виправило дуже дивну проблему вирівнювання для мене!
cregox

38

якщо абсолютний елемент має ширину, ви можете використовувати код нижче

.divtagABS{
    width:300px;
    positon:absolute;
    left:0;
    right:0;
    margin:0 auto;
}

Блискуче! Але чому це не працює, якщо не встановлено лівий та правий?
geoffroy

1
Дуже приємне рішення. Працює також із шириною: 100% під Bootstrap;)
Андрій Гардау

Якщо ви хочете зробити його центром по вертикалі та горизонталі, просто розгорніть його до початку: 0; знизу: 0; поєднайте це з переходом CSS 3 для ширини та висоти, і ви отримаєте досить приємний ефект
Даніель Уортінгтон-Бодарт

Я думаю, що це горизонтальний випадок техніки Абсолютного Центрування (також: Smashing Magazine ), яка використовує margin: auto; position: absolute; top: 0; left: 0; bottom: 0; right: 0;(із оголошеними widthта height) як для горизонтального, так і для вертикального центрування. Пов’язані статті пояснюють, як працює цей метод, і порівнюють його з іншими методами центрування.
DynamicDispatch

@geoffroy бо left, right, topі bottomє виставитися по autoзамовчуванням і це, разом з абсолютним макеті, на самому ділі запобігти , margin: autoщоб бути помітним
asdru

17

Працює JSFiddle нижче. При використанні абсолютної позиції margin: 0 autoце не спрацює, але ви можете зробити наступне (також масштабуватиметься):

left: 50%;
transform: translateX(-50%);

Оновлення: Працює JSFiddle


3
Це дуже приємний хакер для css
Dinesh Patra

Найкраща робота з абсолютними div-позиціями, але мають певні проблеми в IE10, коли позиціонування div має ширину більше батьківської ширини ... :(
iTux

1

У мене вже була така сама проблема, і у мене є рішення написати контейнер (.divtagABS-контейнер, у вашому випадку) абсолютно позиціонований, а потім відносно позиціонувати вміст усередині нього (.divtagABS, у вашому випадку).

Готово! Тепер AUTO для поля .divtagABS зліва та зліва буде працювати.


1

Усі відповіді були лише запропонованими рішеннями чи обхідними шляхами. Але все одно не отримаєте відповіді на питання: чому margin: auto працює з position: relative, а ні з position: absolute.

Наступне пояснення було для мене корисним:

"Поля мають мало сенсу для абсолютно розташованих елементів, оскільки такі елементи вилучаються із звичайного потоку, тому вони не можуть відтіснити будь-які інші елементи на сторінці . Використання таких полів може вплинути лише на розміщення елемента, до якого застосовується поле, не будь-який інший елемент ". http://www.justskins.com/forums/css-margins-and-absolute-82168.html


-1

Якщо елемент абсолютно позиційний, то він не відносний або не стосується будь-якого об’єкта - включаючи саму сторінку. Тож margin: auto;не можу вирішити, де середина.

Це чекає, коли йому явно скажуть, використовуючи leftі topде розташувати себе.

Ви все ще можете відцентрувати його програмно, використовуючи javascript або щось інше.


-4

Коли ви визначаєте стилі для поділу, який позиціонується absolute ly, вони вказують поля марні. Оскільки їх більше немає всередині звичайного дерева DOM.

Ви можете використовувати float, щоб зробити трюк.

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