Posicionamento absoluto dentro da posição absoluta

89

Eu tenho 3 divelementos.

O primeiro divé maior (embrulhar) e temposition:relative;

divé posicionado de forma absoluta ao 1º divposicionamento relativo (e está incluído no 1º div)

O 3º divestá contido no 2º dive também possui posicionamento absoluto.

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

Por que a 3ª divposição é absoluta para a 2ª div(que também é posição absoluta para a 1ª div) e não a 1ª divque tem posição relativa?

Porque a 3ª divé o posicionamento absoluto para a 2ª posição absoluta div.

pufos
fonte
Isso é realmente o que estou procurando e essas respostas para suas perguntas me fizeram abrir os olhos: \.
Benjamin
absoluto: o elemento é posicionado em relação ao elemento ancestral primeiro posicionado (não estático)
Oswaldo Zapata

Respostas:

94

Porque position: absoluteredefine a posição relativa para crianças assim comoposition: relative faz.

Não há como contornar isso - se você quiser que o terceiro divseja absolutamente posicionado em relação ao primeiro, terá que torná-lo filho do primeiro.

Pekka
fonte
Então, basicamente, a posição absoluta torna-se posição relativa para seu filho posicionado de forma absoluta?
pufos de
@pufos meio que. A 0px / 0pxposição para crianças é redefinida peloposition: absolute
Pekka
24
@pufos Acho que você está confundindo um pouco isso. position:relativesignifica que o elemento será posicionado (usando superior, direito, inferior esquerdo) relativamente a sua posição atual. position: absolutesignifica que ele será posicionado em relação à janela do navegador ou primeiro pai com position: absoluteou position: relative.
seler
Você pode compartilhar uma referência sobre isso online? Porque eu não consegui encontrar nenhum ... E ... Muito obrigado
pufos
2
@pufos, a referência básica está aqui: w3.org/TR/CSS2/visuren.html#choose-position
Pekka
27

Ambos position:relativeeposition:absolute estabelecem elementos de conteúdo como ascestores de posicionamento.

Se você precisa que div 3 seja posicionado com base em div 1, torne-o um filho direto de div 1.

Observe que isso position: relativesignifica que o elemento está posicionado em relação à sua posição natural e position: absolutesignifica que o elemento está posicionado em relação à sua primeiro position:relativeou position:absoluteancestral .

Mike Tunnicliffe
fonte
Eu queria que o terceiro div fosse posicionado em absoluto em relação ao div posicionado em absoluto, mas não sabia se isso era padrão (crossbrowser) ... e não consegui encontrar as especificações online ... Muito obrigado
pufos
Posicionamento absoluto nessa seção: w3.org/TR/CSS21/visuren.html#comp-abspos
Mike Tunnicliffe
@MikeTunnicliffe absoluto significa que o elemento está posicionado em relação à sua primeira posição: também fixo
Trần Kim Dự
15

Posição estática: a posição estática é a forma padrão como um elemento aparecerá no fluxo normal do seu arquivo HTML se nenhuma posição for especificada.

Importante: top, right, bottome leftpropriedades não têm efeito sobre A estará estática elemento.

Posição relativa: posicionar um elemento com o valor relativo mantém o elemento (e o espaço que ocupa) no fluxo normal de seu arquivo HTML.

Você pode então mover o elemento por uma certa quantidade usando as propriedades left, right, tope bottom. No entanto, isso pode fazer com que o elemento se sobreponha a outros elementos que estão na página - o que pode ou não ser o efeito que você deseja.

Um elemento posicionado relativamente pode mover-se de seu lugar, mas o espaço que ocupou permanece.

Posição absoluta: aplicar o valor da posição absoluta a um elemento remove-o do fluxo normal. Quando você move o elemento posicionado de forma absoluta, seu ponto de referência é a parte superior / esquerda de seu elemento contendo mais próximo que tem uma posição declarada diferente de estática - também chamado de contexto de posicionamento mais próximo. Portanto, se nenhum elemento recipiente com uma posição diferente de estática existir, ele será posicionado no canto superior esquerdo do elemento do corpo.

No seu caso, o terceiro contêiner mais próximo é o segundo.

Gaurav
fonte
4

Mais uma resposta esclarecedora.

Seu cenário atual é este:

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

E você está lutando com isso.

Se você puder alterar o HTML, basta fazer o seguinte:

#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
fonte
2
my-wrapper provavelmente deve ser .my-wrapper
jdavid.net
Essa abordagem é incrível, ainda não tenho ideia de por que resolveu meu problema. Meu problema é que eu não posso ter meu terceiro elemento filho do primeiro elemento devido a algum outro motivo.
windmaomao
2

A razão pela qual o terceiro divelemento está absolutamente posicionado no segundo divelemento é porque, como a especificação CSS explica aqui , é porque o elemento "pai" (melhor dito: contendo o bloco) de um elemento absolutamente posicionado não é necessariamente seu elemento pai imediato, mas em vez disso, seu elemento imediatamente posicionado , ou seja, qualquer elemento cuja posição seja definida como qualquer coisa, exceto staticpor exemploposition: relative/absolute/fixed/sticky;

Portanto, sempre que possível em seu código, se você deseja que o terceiro divelemento seja absolutamente posicionado em relação ao primeiro, divvocê deve fazer o seu segundo divelemento como o position: static;seu valor padrão (ou simplesmente remover qualquer position: ...declaração no conjunto de regras do seu segundo divelemento) .

A descrição acima fará o primeiro diva bloco contendo do 3º posicionado de forma absoluta div, ignorando a segunda divpara este fim posicionamento.

Espero que ajude.

Atzom
fonte
0

Caso alguém ainda esteja procurando uma resposta para isso.

Consegui atingir esse resultado adicionando um clear: both;estilo ao primeiro div posicionado absolutamente que redefiniu a criança e permitiu que ela usasse seu próprio absoluteposicionamento.

Convidado 1234
fonte