Bezwzględne pozycjonowanie wewnątrz pozycji bezwzględnej

89

Mam 3 divelementy.

Pierwszy divjest większy (zawijany) i maposition:relative;

Druga divjest pozycjonowana bezwzględnie divwzględem pierwszej pozycji względnej (i jest zawarta w pierwszej pozycji div)

Trzeci divjest zawarty w drugim divi ma również pozycjonowanie bezwzględne.

<div id="1st">
   <div id="2nd">
     <div id="3rd"></div>
   </div>
</div>

Dlaczego trzecia divpozycja jest bezwzględna w stosunku do drugiej div(która jest również bezwzględną pozycją w stosunku do pierwszej div), a nie do pierwszej, divktóra ma pozycję względną?

Ponieważ trzecia divjest pozycją bezwzględną do bezwzględnej pozycji drugiej div.

pufos
źródło
To jest naprawdę coś, czego szukam, a te odpowiedzi na twoje pytania otworzyły mi oczy: \.
Benjamin
absolutny: element jest umieszczony względem jej najpierw umieszczana (nie statyczne) przodka elementu
Oswaldo Zapata

Odpowiedzi:

94

Ponieważ position: absoluteresetuje względną pozycję dla dzieci, tak samo jak to position: relativerobi.

Nie divda się tego obejść - jeśli chcesz, aby trzeci był ustawiony absolutnie względem pierwszego, będziesz musiał uczynić go dzieckiem pierwszego.

Pekka
źródło
Więc zasadniczo pozycja bezwzględna staje się pozycją względną dla jej absolutnie pozycjonowanego dziecka?
pufos
@pufos kind of. 0px / 0pxPozycja dla dzieci dostaje resetu przezposition: absolute
Pekka
24
@pufos Myślę, że trochę to mylisz. position:relativeoznacza, że ​​element zostanie umieszczony (za pomocą górnego, prawego, dolnego lewego) względem jego aktualnej pozycji. position: absoluteoznacza, że ​​zostanie umieszczony względem okna przeglądarki lub pierwszego elementu nadrzędnego z position: absolutelub position: relative.
seler
Czy możesz udostępnić odniesienie do tego w Internecie? Ponieważ nie mogłem znaleźć żadnego ... I ...
Wielkie
2
@pufos bardzo podstawowe odniesienie jest tutaj: w3.org/TR/CSS2/visuren.html#choose-position
Pekka
27

Zarówno position:relativeiposition:absolute ustal elementy zawierające jako przodków pozycjonujących.

Jeśli chcesz ustawić div 3 na podstawie div 1, ustaw go jako bezpośredni element potomny div 1.

Zauważ, że position: relativeoznacza to, że element jest umieszczony względem jego naturalnego położenia i position: absoluteoznacza, że ​​element jest umieszczony względem swojego pierwszego position:relativelub position:absoluteprzodka .

Mike Tunnicliffe
źródło
Chciałem, aby trzeci div był pozycjonowany absolutnie względem absolutnie pozycjonowanego div, ale nie wiedziałem, czy to jest standardowe (przeglądarka) .. i nie mogłem znaleźć specyfikacji online ...
Wielkie
Bezwzględne pozycjonowanie w tej sekcji: w3.org/TR/CSS21/visuren.html#comp-abspos
Mike Tunnicliffe
@MikeTunnicliffe bezwzględne oznacza, że ​​element jest umieszczony względem jego pierwszej pozycji: naprawiono również
Trần Kim Dự
15

Pozycja statyczna: pozycja statyczna jest domyślnym sposobem wyświetlania elementu w normalnym przepływie pliku HTML, jeśli w ogóle nie określono pozycji.

Ważne: top, right, bottomileft właściwości nie mają wpływu na statycznie elementu pozycjonowanego.

Pozycja względna: umieszczenie elementu z wartością względną utrzymuje element (i zajmowaną przez niego przestrzeń) w normalnym przepływie pliku HTML.

Następnie można przejść przez element pewnej ilości wykorzystaniem właściwości left, right, topi bottom. Może to jednak spowodować, że element będzie nakładał się na inne elementy na stronie - co może, ale nie musi, być pożądanym efektem.

Względnie umieszczony element może ruszyć się ze swojego miejsca, ale zajmowana przez niego przestrzeń pozostaje.

Pozycja bezwzględna: zastosowanie bezwzględnej wartości położenia do elementu usuwa go z normalnego przepływu. Kiedy przesuwasz element pozycjonowany bezwzględnie, jego punktem odniesienia jest góra / lewo najbliższego elementu zawierającego, który ma zadeklarowaną pozycję inną niż statyczna - nazywana również najbliższym kontekstem pozycjonowania. Tak więc, jeśli nie istnieje element zawierający pozycję inną niż statyczna, zostanie umieszczony od lewego górnego rogu elementu body.

W twoim przypadku najbliższy trzeci pojemnik to drugi.

Gaurav
źródło
4

Jeszcze jedna wyjaśniająca odpowiedź.

Twój obecny scenariusz jest następujący:

#my-parent {position: absolute}
#my-parent .my_child {position: absolute}

I trochę się z tym zmagasz.

Jeśli możesz zmienić kod HTML, po prostu zrób to:

#my-parent {position: absolute}
#my-parent .my-wrapper {position: relative}        /* Since you've added the wrapper in HTML */
#my-parent .my-wrapper .my-child {position: absolute}  /* Now you can play with it */
valk
źródło
2
my-wrapper prawdopodobnie powinien mieć
plik .my
To podejście jest niesamowite, nadal nie mam pojęcia, dlaczego rozwiązało mój problem. Mój problem polega na tym, że nie mogę mieć trzeciego elementu, aby był dzieckiem pierwszego elementu z jakiegoś innego powodu.
windmaomao
2

Powodem, 3rd divelement jest pozycjonowany bezwzględnie do 2. divelementu jest bo jak specyfikacja CSS wyjaśnia tutaj , to dlatego, że element „rodzic” (lepiej powiedzieć: blok zawierający) o absolutnie elementu pozycjonowanego nie koniecznie jego bezpośrednim elementem dominującym, ale raczej jego bezpośredni element pozycjonowany , tj. dowolny element, którego pozycja jest ustawiona na dowolną wartość, ale staticna przykładposition: relative/absolute/fixed/sticky;

Dlatego jeśli to możliwe w twoim kodzie, jeśli chcesz, aby trzeci divelement był absolutnie pozycjonowany względem pierwszego div, powinieneś ustawić drugi divelement jako position: static;jego wartość domyślną (lub po prostu usunąć dowolną position: ...deklarację z zestawu reguł drugiego divelementu) .

Powyższy będzie 1st blok zawierający od 3 całkowicie umieszczona , ignorując 2nd tym celu pozycjonowania.divdivdiv

Mam nadzieję, że to pomoże.

atzom
źródło
0

Na wypadek, gdyby ktoś nadal szukał odpowiedzi na to pytanie.

Udało mi się osiągnąć ten wynik, dodając clear: both;styl do pierwszego absolutnie pozycjonowanego elementu div, który zresetował dziecko i pozwolił mu użyć własnego absolutepozycjonowania.

Gość1234
źródło