Mam 3 div
elementy.
Pierwszy div
jest większy (zawijany) i maposition:relative;
Druga div
jest pozycjonowana bezwzględnie div
względem pierwszej pozycji względnej (i jest zawarta w pierwszej pozycji div
)
Trzeci div
jest zawarty w drugim div
i ma również pozycjonowanie bezwzględne.
<div id="1st">
<div id="2nd">
<div id="3rd"></div>
</div>
</div>
Dlaczego trzecia div
pozycja 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, div
która ma pozycję względną?
Ponieważ trzecia div
jest pozycją bezwzględną do bezwzględnej pozycji drugiej div
.
html
css
css-position
pufos
źródło
źródło
Odpowiedzi:
Ponieważ
position: absolute
resetuje względną pozycję dla dzieci, tak samo jak toposition: relative
robi.Nie
div
da się tego obejść - jeśli chcesz, aby trzeci był ustawiony absolutnie względem pierwszego, będziesz musiał uczynić go dzieckiem pierwszego.źródło
0px / 0px
Pozycja dla dzieci dostaje resetu przezposition: absolute
position:relative
oznacza, że element zostanie umieszczony (za pomocą górnego, prawego, dolnego lewego) względem jego aktualnej pozycji.position: absolute
oznacza, że zostanie umieszczony względem okna przeglądarki lub pierwszego elementu nadrzędnego zposition: absolute
lubposition: relative
.Zarówno
position:relative
iposition: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: relative
oznacza to, że element jest umieszczony względem jego naturalnego położenia iposition: absolute
oznacza, że element jest umieszczony względem swojego pierwszegoposition:relative
lubposition:absolute
przodka .źródło
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
,bottom
ileft
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
,top
ibottom
. 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.
źródło
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 */
źródło
Powodem, 3rd
div
element jest pozycjonowany bezwzględnie do 2.div
elementu 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ść, alestatic
na przykładposition: relative/absolute/fixed/sticky;
Dlatego jeśli to możliwe w twoim kodzie, jeśli chcesz, aby trzeci
div
element był absolutnie pozycjonowany względem pierwszegodiv
, powinieneś ustawić drugidiv
element jakoposition: static;
jego wartość domyślną (lub po prostu usunąć dowolnąposition: ...
deklarację z zestawu reguł drugiegodiv
elementu) .Powyższy będzie 1st blok zawierający od 3 całkowicie umieszczona , ignorując 2nd tym celu pozycjonowania.
div
div
div
Mam nadzieję, że to pomoże.
źródło
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łasnegoabsolute
pozycjonowania.źródło