Empilhar DIVs um em cima do outro?


115

É possível empilhar vários DIVs como:

<div>
<div></div>
<div></div>
<div></div>
<div></div>
</div>

Para que todos os DIVs internos tenham a mesma posição X e Y? Por padrão, todos eles vão abaixo uns dos outros, aumentando a posição Y pela altura do último DIV anterior.

Tenho a sensação de que algum tipo de flutuação ou exibição ou outro truque pode morder?

EDIT: O DIV pai tem posição relativa, portanto, usar a posição absoluta não parece funcionar.


Para esclarecer minha resposta, você deseja posicionar absolutamente os divs internos.
— Matt

Respostas:


166

Posicione o div externo como quiser e, em seguida, posicione os divs internos usando absoluto. Eles vão se empilhar.

.inner {
  position: absolute;
}
<div class="outer">
   <div class="inner">1</div>
   <div class="inner">2</div>
   <div class="inner">3</div>
   <div class="inner">4</div>
</div>


1
Não parece funcionar. Talvez eu devesse ter mencionado que tenho este cenário: <div style = "position: absolute ..."> <div style = "position: relative ..."> <div> empilhar </div> <div> empilhar isto </div> <div> empilhar isto </div> <div> empilhar isto </div> </div> </div>
— Torre

2
Você deseja posicionar absolutamente os divs que possuem "stack this" neles. Funciona - experimentei antes de publicar o meu original. Se você não colocar seletores de classe em seus divs, adapte o método de seleção de div na resposta de Eric para selecionar os divs da pilha.
— Matt

1
Não funcionou para mim também. Muitos desconhecidos deixados para os telespectadores.
— yan bellavance

Eu tenho os divs para empilhar usando position: relative e especificando a altura
— yan bellavance

pode ter algo a ver com o suporte de exibição?
— yan bellavance

50

Para adicionar à resposta de Dave:

div { position: relative; }
div div { position: absolute; top: 0; left: 0; }

Não parece funcionar. Talvez eu devesse ter mencionado que tenho este cenário: <div style = "position: absolute ..."> <div style = "position: relative ..."> <div> empilhar </div> <div> empilhar isto </div> <div> empilhar isto </div> <div> empilhar isto </div> </div> </div>
— Torre

Acho que , nesse caso, você deseja definir "top: 0; left: 0;" no seu div que tem "position: relative". Definitivamente teste o IE6 nisso, embora não possa dizer com certeza se funcionará.
— Eric Wendelin

10

Se você quer dizer literalmente colocar um em cima do outro, um no topo (mesmas posições X, Y, mas posições Z diferentes), tente usar o z-indexatributo CSS. Isso deve funcionar (não testado)

<div>
    <div style='z-index: 1'>1</div>
    <div style='z-index: 2'>2</div>
    <div style='z-index: 3'>3</div>
    <div style='z-index: 4'>4</div>
</div>

Isso deve mostrar 4 no topo de 3, 3 no topo de 2 e assim por diante. Quanto mais alto for o índice z, mais alto será o elemento posicionado no eixo z. Espero que isso tenha ajudado você :)



5

Posicionei os divs ligeiramente deslocados, para que você possa ver em funcionamento.
HTML

<div class="outer">
  <div class="bot">BOT</div>
  <div class="top">TOP</div>
</div>

CSS

.outer {
  position: relative;
  margin-top: 20px;
}

.top {
  position: absolute;
  margin-top: -10px;
  background-color: green;
}

.bot {
  position: absolute;
  background-color: yellow;
}

https://codepen.io/anon/pen/EXxKzP


4

Agora você pode usar o CSS Grid para corrigir isso.

<div class="outer">
  <div class="top"> </div>
  <div class="below"> </div>
</div>

E o css para isso:

.outer {
  display: grid;
  grid-template: 1fr / 1fr;
  place-items: center;
}
.outer > * {
  grid-column: 1 / 1;
  grid-row: 1 / 1;
}
.outer .below {
  z-index: 2;
}
.outer .top {
  z-index: 1;
}

0

Sei que este post é um pouco antigo mas tive o mesmo problema e tentei consertar várias horas. Finalmente encontrei a solução:

se tivermos 2 caixas posicionadas absolue

<div style='left: 100px; top: 100px; position: absolute; width: 200px; height: 200px;'></div>
<div style='left: 100px; top: 100px; position: absolute; width: 200px; height: 200px;'></div>

esperamos que haja uma caixa na tela. Para fazer isso, devemos definir margin-bottom igual a -height, desta forma:

<div style='left: 100px; top: 100px; position: absolute; width: 200px; height: 200px; margin-bottom: -200px;'></div>
<div style='left: 100px; top: 100px; position: absolute; width: 200px; height: 200px; margin-bottom: -200px;'></div>

funciona bem para mim.


0

Eu tinha o mesmo requisito que tentei no violino abaixo.

#container1 {
background-color:red;
position:absolute;
left:0;
top:0;
height:230px;
width:300px;
z-index:2;
}
#container2 {
background-color:blue;
position:absolute;
left:0;
top:0;
height:300px;
width:300px;
z-index:1;
}

#container {
position : relative;
height:350px;
width:350px;
background-color:yellow;
}

https://plnkr.co/edit/XnlneRFlvo1pB92UXCC6?p=preview

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.