Позиція відносна проти абсолютної?


155

Яка різниця між position: relativeі position: absoluteв CSS? І коли слід використовувати який?


2
Я надав деякі докладне пояснення тут про те , як вони працюють
Mr. чужорідні

Підручник w3schools за положенням це добре пояснює.
gnsb

1
Відносно розташований елемент розташований відносно його нормального положення. Абсолютно розташований елемент відносно першого батьківського контейнера, який має абсолютне або відносне позиціонування. Тут є чудова стаття kolosek.com/css-position-relative-vs-position-absolute, що детально пояснює відносні та абсолютні позиції.
Неша Зорич

Відповіді:


160

Абсолютне CSS-позиціонування

position: absolute;

Абсолютне позиціонування - це найлегше зрозуміти. Ви починаєте з positionвластивості CSS :

position: absolute;

Це повідомляє веб-переглядачу, що все, що буде розміщено, слід вилучити із звичайного документообігу та розмістити в точному місці на сторінці. Це не вплине на те, як елементи перед ним або після нього в HTML розміщуються на веб-сторінці, однак це буде залежати від позиціонування батьків, якщо ви не перекриєте це.

Якщо ви хочете розташувати елемент на 10 пікселів у верхній частині вікна документа, ви використовуєте topзсув до positionнього там з absoluteпозиціонуванням:

position: absolute;
top: 10px;

Потім цей елемент завжди відображатиметься 10pxвгорі сторінки незалежно від того, який вміст проходить через, під або над елементом (візуально).

Чотири властивості позиціонування:

  1. top
  2. right
  3. bottom
  4. left

Щоб їх використовувати, потрібно розглядати їх як властивості зміщення. Іншими словами, розташований елемент right: 2pxне переміщується вправо 2px. Його правий бік зміщений з правої сторони вікна (або його головного батьківського положення) на 2px. Те саме стосується інших трьох.

Відносне позиціонування

position: relative;

Відносне позиціонування використовує ті самі чотири властивості absoluteпозиціонування, що і позиціонування. Але замість того, щоб базувати положення елемента на порту перегляду браузера, він починається з того місця, де був би елемент, якби він все ще знаходився в нормальному потоці .

Наприклад, якщо у вас на веб-сторінці є три абзаци, а третій має position: relativeстиль, розміщений на ній, його положення буде зміщене на основі поточного місця розташування - не з оригінальної сторони порту перегляду.

Пункт 1.

Пункт 2.

Пункт 3.

У наведеному вище прикладі третій абзац розміщуватиметься 3emз лівого боку елемента контейнера, але все ще буде нижче перших двох абзаців. Він залишатиметься в нормальному документообігу і просто трохи компенсується. Якщо ви змінили його position: absolute;, все, що слід за ним, відображатиметься поверх нього, оскільки воно більше не буде в нормальному потоці документа.

Примітки:

  • за замовчуванням widthелемента, який абсолютно розміщений, - це ширина вмісту всередині нього, на відміну від елемента, який розміщується відносно там, де за замовчуванням widthє 100%місця, яке він може заповнити.

  • У вас можуть бути елементи, які перетинаються з абсолютно розташованими елементами, тоді як ви не можете це робити з відносно розташованими елементами (як правило, без використання негативних поля / позиціонування)


багато витягнуто з: цього ресурсу


159
Заяви про абсолютне позиціонування вводять в оману. Елементи з абсолютним позиціонуванням розміщуються відносно першого батьківського з відносним або абсолютним позиціонуванням. Це може бути або не бути самим зовнішнім елементом (<html>). Все залежить від того, які елементи містять абсолютний позиціонований елемент. Ще одна велика відмінність полягає в тому, що абсолютні позиціоновані елементи вилучаються зі звичайного документообігу, а відносні позиціоновані елементи - ні. Отже, якщо у вас є три <div> s один на одного і ви встановите середнє на абсолютне позиціонування, верхній і нижній <div> s згортаються разом.
d512

11
@ user1334007 Ви дуже правильні, не соромтесь редагувати мою публікацію, оскільки я наразі занадто зависла, щоб зробити це самостійно.
Михайло Запорожець

@ user1334007 Так, я не можу приймати відгуки чи будь-що інше, але я внесу кілька змін до себе сьогодні ввечері заради пари балів, які ви намагалися підняти. Я пояснюю речі дуже випадково, тому що це не дозволяє занадто "підручником", однак зміст, погоджуючись, повинен бути максимально точним.
Михайло Запорожець

2
Ця відповідь не дозволяє сформулювати цю позицію: абсолютна; розташований відносно найближчого позиціонованого предка
Сави Джипт

@AndreyMarushkevych не соромтесь запропонувати редагувати відповідь.
Михайло Запорожець

52

І «відносне», і «абсолютне» позиціонування дійсно відносні, просто з різними рамками. "Абсолютне" позиціонування відносно положення іншого, що охоплює елемента. "Відносне" позиціонування є відносно положення, яке має сам елемент без позиціонування.

Це залежить від ваших потреб та цілей, якими ви користуєтесь. "Відносна" позиція підходить тоді, коли ви бажаєте змістити елемент з положення, яке воно інакше було б мати в потоці елементів, наприклад, щоб деякі символи відображалися в надшироковому положенні. "Абсолютне" позиціонування підходить для розміщення елемента в деякій системі координат, встановлених іншим елементом, наприклад, для "надрукування" зображення з деяким текстом.

Як спеціальне, використовуйте "відносне" позиціонування без переміщення (просто встановлення position: relative ), щоб зробити елемент орієнтиром, щоб ви могли використовувати "абсолютне" позиціонування для елементів, що знаходяться всередині нього (у розмітці).


Relative positioning is relative to the position that the element itself would have without positioning?? Елемент без позиціонування буде "статичним" за замовчуванням, але не відносним
kittu

21

Ще слід зазначити, що якщо ви хочете, щоб абсолютний елемент був обмежений батьківським елементом, вам потрібно встановити позицію батьківського елемента на відносну. Це збереже дочірній елемент, що міститься в батьківському елементі, і не буде "відносним" до всього вікна.

Я написав допис у блозі, де наводиться простий приклад, який створює наступний ефект:

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

У ньому є зелений div, який абсолютно розміщений внизу батьківського жовтого дива.

1 http://blog.troygrosfield.com/2013/02/11/working-with-css-positions-creating-a-simple-progress-bar/


4
Батько має бути "не статичним" - тому батько може бути відносним, абсолютним тощо ... Перевага використання родительського родича полягає в тому, що він не видаляє елемент з документа.
Фернандо

19

Позиція відносна:

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

Абсолютна позиція:

Коли ви вказуєте позицію: абсолютний, елемент вилучається з документа і розміщується саме там, де ви скажете йому це перейти.

Ось хороший підручник http://www.barelyfitz.com/screencast/html-training/css/positioning/ із використанням вибірки обох позицій відповідно до абсолютного та відносного позиціонування.


12

Відносно: Відносно поточного положення, але його можна перемістити. Або ЕЛЕКТРИЧНИЙ розміщений елемент розташований відносно ITSELF.

Абсолют: Елемент, розміщений АБСОЛЮТ, розташований відносно БЛОКУВАННЯ БЕЗПЕЧЕНОГО БИТАНЯ. якщо такий присутній, він працює як фіксований ..... відносно вікна.

<div style="position:relative"> <!--2nd parent div-->
    <div>   <!--1st parent div-->
        <div style="position:absolute;left:10px;....."> <!--Middle div-->
          Md. Arif
       </div>
    </div>
</div>

Тут divпозиція 2-го батьків є відносною, тому середина divзмінить своє положення стосовно другого з батьків div. Якщо divпозиція першого батька буде відносною, то середня divзмінює свою позицію відносно першого з батьків div. Деталі


2

Відповідаючи, оскільки моя репутація недостатньо коментує. Але не дивись на це як на відповідь, просто додаткова інформація, як я, мала деякі проблеми як з колонтитулом, так і з позиціонуванням.

Під час налаштування сторінки таким чином, щоб моє колонтитул завжди залишався внизу, з абсолютним положенням, а основний контейнер / обгортка з відносним положенням.

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

Повідомлення - це, як ви кажете, складна тема.

Моє рішення, щодо вмісту, який я хотів у «абсолютному» положенні на своїй веб-сторінці, і не відсунути його в сторону, коли, наприклад, відкриваючи спадне меню, було насправді дати йому відношення до посади, і поставити його на 35ем нижче мого спаду меню. (35em - це висота мого спадного меню, коли воно повністю розширене)

Потім, Top: -35em, для вмісту, який раніше був відсунутий убік. А потім додаємо маржу внизу: -35em. Таким чином, вміст знаходиться "внизу" мого випадаючого меню, але візуально він знаходиться поряд з моїм спадною меню! А пробіл внизу до нижнього колонтитулу має лише 10-кратний запас, як це було до того, як почати займатися цим. Тож моє рішення для цього було таким:

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

}
h1 {
    margin:0;
}
    #webpage {
    position:relative;
    min-height:100%;
    margin:0;
    overflow:auto;
}
     #header {
    height:5em;
    width:100%;
    padding:0;
    margin:0;
}
     #text {
    position:relative;
   margin-bottom:-32em;
    padding-top:2em;
    padding-right:2em;
    padding-bottom:10em;
    background-repeat:no-repeat;
    width:70%;
    padding-left:auto;
    margin-left:auto;
    margin-right:auto;
    right:10em;
    float:right;
    top:-32em;
      }
#dropdown {

position:absolute;
    left:0;
    width:20%;
    clear:both;
    display:block;
    position:relative;
    top:1em;
    height:35em;

}
    #footer {
    position:absolute;
    width:100%;
    right:0;
    bottom:0;
    height:5em;
    margin:0;
     margin-top:5em;
}

Я бачу, що на ваше запитання відповіли добре, але після багатьох проблем я знайшов це дуже гарним рішенням і способом краще зрозуміти, як працює позиціонування .. Коли я розміщую свій текстовий вміст, під меню, що випадає, це не відбувається " t відсуньте мій текст убік. Якщо я змінив текст на позицію абсолютної, колонтитул не залишився на місці. Як я можу повірити, що це питання для більшої кількості людей, ніж я, я додаю це тут. Що насправді трапляється, це я поклав текст, 35ем, нижче моєї краплі вниз.

Потім я візуально поставив його поруч з іншим, з відносним положенням і вгорі: -35em ;, і ввечері вийшов величезний простір внизу, з запасом: -35em;

негативні значення занижуються часом, дуже хороша функціональність, коли хтось краще розуміє ці позиції!

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

Цей параметр налаштував це дуже добре, і не забудьте використовувати "em", а не "px" для більш текучого / динамічного макета сторінки! :)

(можуть бути кращі рішення, але це працює для мене на крос-платформах, а також на пристроях).


2

Відносні проти абсолютного:

  • Різниця: відносно себе, щодо найближчого позиціонованого предка.
  • Різниця: Інші елементи оточують його шануванням свого старого існування, інші елементи навколо НЕ шанують його старе існування.
  • Схожість: Інші елементи оточують його НЕ шанують його нове існування, інші елементи навколо НЕ шанують його нове існування.

1

Давайте обговоримо сценарій, щоб пояснити різницю між абсолютним та відносним.

Всередині елемента корпусу кажуть, що у вас є елемент заголовка, висота якого 95% від висоти огляду, тобто 95vh. Всередині цього контейнера ви розмістили зображення і зменшили його непрозорість, щоб сказати 0,5. А тепер ви хочете розмістити зображення логотипу біля верхнього лівого кута. Сподіваюся, ви зрозуміли сценарій. Таким чином у вас буде світліше зображення в розділі заголовка з логотипом вгорі його у вказаному положенні.

Але перед тим, як почати це, я встановив маржу та прокладку на 0, як це

*{
   margin:0px;
   padding:0px;
   box-sizing: border-box; 
}

Це забезпечує відсутність за замовчуванням полів та накладки на елементи.

Таким чином, ви можете досягти своєї вимоги двома способами.

Перший шлях

  • ви даєте клас зображенню логотипу.
  • в css ви пишете

    .logo{ float:left; margin-top:40px; margin-left:40px; }

  • це розмістило логотип на 40 пікселів вгорі та зліва від батьків, що додається, що є заголовком. Зображення з’явиться так, ніби розміщене за бажанням.

Але мій друг, це поганий дизайн, щоб розмістити зображення, на яке ви зайво витратили стільки місця навколо, надавши йому трохи запасу, коли цього не потрібно. Все, що вам потрібно - це розмістити зображення в цьому місці. Ви впоралися, подушовуючи його з полями навколо. Поля зайняла простір і просунула його вміст глибше, створюючи враження, що він розташований саме там, де ви хотіли. Сподіваюся, ви зрозуміли проблему, вирішивши її навколо. Ви розміщуєте більше місця, ніж потрібно, щоб розмістити лише зображення в потрібному місці.

Тепер спробуємо інший підхід.

Другий шлях

  • зображення з класом логотипу знаходиться всередині елемента заголовка з класом "заголовок". Отже, батьківський клас є заголовком, а дочірній клас - логотипом, як і раніше.
  • ви встановите властивість позиції класу заголовків таким, як це

    .header{ position: relative; }

  • потім ви додали наступні властивості до класу логотипів

    .logo{ position:absolute; top:40px; left:40px }

Ось так. Ви розмістили зображення саме в тому самому місці. Не буде явної різниці в позиціонуванні неозброєним оком між першим підходом і другим підходом. Але якщо ви оглянете елемент зображення, то виявите, що він не зайняв зайвого місця. Він займає абсолютно таку ж площу, наскільки це власна ширина і висота.

То як це можливо? Я сказав класу логотипу зображення, що ви будете розміщені відносно класу заголовків, оскільки ви є дитиною цього класу, і що я конкретно згадав, що він є відносним . Так що будь-яка його дитина буде розміщена відносно її верхнього лівого кута. І що Ваше положення потрібно зафіксувати всередині цього батьківського елемента. значить, вам дано абсолют. І що вам потрібно трохи рухатися зверху і вліво до положення, яким я хочу, щоб ви були. Отже, вам надано верхнє та ліве властивість із значенням 40 пікселів. Таким чином ви будете розміщені відносно лише свого батька. Тож якщо завтра я переміщу вашого батька вгору або вниз або просто куди завгодно, ви завжди будете на 40 пікселів вгорі та зліва від верхнього лівого кута вашого батьківського заголовка. Таким чином, ваше становище фіксується всередині вашого батька, незалежно від того, чи є положення вашого батька виправленим чи ні в майбутньому (як це не є абсолютним, як ви).

Тому використовуйте відносні та абсолютні значення для батьків та дитини відповідно. По-друге, використовуйте його, коли ви хочете розмістити дочірній елемент у якомусь місці всередині його батьківського елемента. Не використовуйте наповнювачі, як поля, щоб насильно натискати на них. Надайте батьківському відносному значенню та дитині, яких ви хочете переїхати, абсолютне значення. Вкажіть верхній, лівий нижній або правий властивості дочірнього класу, щоб розмістити його всередині батьківського місця, де ви хочете.

Дякую.


0

Марко Пеллічотта: Положення елемента всередині іншого елемента може бути відносним або абсолютним щодо елемента, який знаходиться всередині.

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

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