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.


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.


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 .


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.


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 */

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.


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.