Примусити “position: absolute” бути відносно документа, а не батьківського контейнера


93

Я намагаюся вставити div у будь-яку частину тіла та зробити його position: absoluteвідносно всього документа, а не батьківського елемента, який має position: relative.


Якщо його позиція абсолютна щодо документа, то вона належить як дочірній <body>елемент тегу, ні?
Jim Garrison

Ви бачили моє рішення нижче?
tw16

Так. Я створюю шаблон, який використовується на багатьох сторінках, а іноді і всередині релятивно розташованого елемента (який я не можу контролювати. Тепер я бачу, що це неможливо. Дякую за допомогу. +1 від мене, і я позначу його як правильно, якщо ви скажете, що у вашій відповіді це неможливо.
Тімоті Руле

BrainJar має абсолютно класичний вступ до позиціонування в CSS, який дозволить прояснити будь-які затяжні питання тут.
Алан Х.

Відповіді:


35

Вам доведеться розмістити divзовнішню частину position:relativeелемента та body.


1
^^ Це. Якщо він абсолютно позиціонований, тоді насправді немає причин мати його всередині відносно розташованого елемента.
DOOManiac

7
@DOOManiac - ви можете захотіти його всередині відносно розташованого елемента, тому що ви хочете, щоб він запускав скрипт наведення курсора миші або не запускав сценарій миші, ініційований батьком. Моя відповідь дозволяє таку ситуацію.
Michael.Lumley

1
@DOOManiac причиною розміщення абсолютного елемента у відносному елементі є розташування абсолютного div щодо відносного елемента. Якщо ви хочете розташувати відносно тіла, тіло за замовчуванням є відносним, навіть якщо його не встановлено таким чином.
Jason Foglia

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

3
@walv: position:fixedі position:absoluteне мають однакової поведінки. Виправлено відносно області перегляду (а не документа) і призведе до того, що елемент буде завжди видимим навіть після прокрутки, що потенційно може спричинити накладання тощо. Я розумію, що можуть бути поважні причини для структури html, але оскільки питання стосується саме HTML css, моя відповідь правильна. Єдиний спосіб без JS зробити це відносно документа - перемістити його з position:relativeелемента.
tw16

95

Ви шукаєте position: fixed.

З MDN :

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


28
проблема з цією відповіддю полягає в тому, що користувач хотів використовувати абсолют, оскільки фіксовані елементи не рухаються при прокрутці, а абсолютні елементи роблять :)
друг

3
Ти абсолютна легенда.
Benisburgers

6
Питання полягало в тому, як розташуватись відносно документа, а не області перегляду
Пол Хамфріс,

Це потенційно може спричинити проблеми в ie11 через помилку в контексті складання
Джеймс Вестгейт,

32

Моє рішення було використовувати jQuery для переміщення div за межі батьківського рівня:

<script>
    jQuery(document).ready(function(){
        jQuery('#loadingouter').appendTo("body");
    });
</script>

<div id="loadingouter"></div>

1
Це вирішило мою проблему, тому що я не міг розмістити свій елемент безпосередньо всередині елемента body, оскільки я використовував основні сторінки. Дякую!
Osprey

9

Якщо ви не хочете приєднувати елемент body, наступне рішення буде працювати.

Я прийшов до цього питання, шукаючи рішення, яке могло б працювати, не прикріплюючи div до тіла, тому що у мене був сценарій наведення курсору, який я хотів запустити, коли миша знаходилася як над новим елементом, так і над елементом, який його породив. Поки ви готові використовувати jQuery і натхненний відповіддю @Liam William:

var leftOffset = <<VALUE>>;
var topOffset = <<VALUE>>;
$(element).css("left", leftOffset - element.offset().left);
$(element).css("top", topOffset - element.offset().top);

Це рішення працює шляхом віднімання поточного лівого та верхнього положення елемента (відносно тіла) таким чином, щоб перемістити елемент до 0, 0. Розміщення елемента куди завгодно щодо тіла стає таким самим простим, як додавання лівого та верхнього зміщення значення.


2
Також варто згадати функцію позиції jQueryUI .
Michael.Lumley

8

Це неможливо лише за допомогою CSS та HTML.

Використовуючи Javascript / jQuery, ви потенційно можете отримати елементи jQuery.offset()до DOM і порівняти їх з тим, jQuery.position()щоб розрахувати, де він повинен відображатися на сторінці.


ІМХО ця відповідь є найбільш корисною - без переміщення елемента безпосередньо під тілом (що не завжди можливо) і без використання фіксованого положення, яке змусить елемент завжди з'являтися, навіть при прокрутці вниз, ми можемо вдатися лише до JS. jQuery.offset({ left: 0 })за перемогу!
BornToCode
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.