Preciso de ajuda para sobrepor um indivíduo div
a outro div
.
Meu código fica assim:
<div class="navi"></div>
<div id="infoi">
<img src="info_icon2.png" height="20" width="32"/>
</div>
Infelizmente não consigo aninhar o div#infoi
ou o img
, dentro do primeiro div.navi
.
Tem que haver dois div
s separados, como mostrado, mas preciso saber como colocar o lado div#infoi
superior div.navi
e o direito mais central e centralizado em cima do div.navi
.
overflow: hidden
, use emoverflow: visible
vez disso.Respostas:
Sugiro aprender sobre
position: relative
e elementos filho composition: absolute
.fonte
absolute
os elementos posicionados são posicionados em relação aoposition:absolute|relative|fixed
elemento pai explicitamente posicionado ( ) mais próximo . apenas esclarecimentos adicionais ... jsfiddle.net/p5jkc8gzA solução aceita funciona muito bem, mas a IMO não tem uma explicação sobre o motivo. O exemplo abaixo é resumido ao básico e separa o CSS importante do CSS de estilo não relevante. Como bônus, também incluí uma explicação detalhada de como o posicionamento CSS funciona.
TLDR; se você deseja apenas o código, role para baixo até O resultado .
O problema
Existem dois elementos separados, irmãos, e o objetivo é posicionar o segundo elemento (com um
id
deinfoi
), para que ele apareça no elemento anterior (aquele com umclass
denavi
). A estrutura HTML não pode ser alterada.Solução proposta
Para alcançar o resultado desejado, vamos mover ou posicionar o segundo elemento, que chamaremos
#infoi
para que apareça no primeiro elemento, que chamaremos.navi
. Especificamente, queremos#infoi
ser posicionados no canto superior direito de.navi
.Posição CSS Conhecimento necessário
CSS possui várias propriedades para elementos de posicionamento. Por padrão, todos os elementos são
position: static
. Isso significa que o elemento será posicionado de acordo com sua ordem na estrutura HTML, com poucas exceções.Os outros
position
valores sãorelative
,absolute
,sticky
, efixed
. Ao definir um elementoposition
para um desses outros valores, agora é possível usar uma combinação das quatro propriedades a seguir para posicionar o elemento:top
right
bottom
left
Em outras palavras, ao definir
position: absolute
, podemos adicionartop: 100px
para posicionar o elemento 100 pixels da parte superior da página. Por outro lado, se definirmosbottom: 100px
o elemento, ele será posicionado a 100 pixels da parte inferior da página.Aqui é onde muitos novatos em CSS se perdem -
position: absolute
tem um quadro de referência. No exemplo acima, o quadro de referência é obody
elementoposition: absolute
comtop: 100px
significa que o elemento está posicionado a 100 pixels da parte superior dobody
elemento.O quadro de referência da posição, ou o contexto da posição, pode ser alterado definindo o
position
elemento pai de qualquer valor diferente deposition: static
. Ou seja, podemos criar um novo contexto de posição fornecendo um elemento pai:position: relative;
position: absolute;
position: sticky;
position: fixed;
Por exemplo, se um
<div class="parent">
elemento é fornecidoposition: relative
, qualquer elemento filho usa o<div class="parent">
como contexto de posição. Se um elemento filho fosse fornecidoposition: absolute
etop: 100px
, o elemento seria posicionado a 100 pixels da parte superior do<div class="parent">
elemento, porque<div class="parent">
agora é o contexto da posição.O outro fator a ser observado é a ordem da pilha - ou como os elementos são empilhados na direção z. O que você deve saber aqui é que a ordem dos elementos da pilha é, por padrão, definida pelo inverso de sua ordem na estrutura HTML. Considere o seguinte exemplo:
Neste exemplo, se os dois
<div>
elementos fossem posicionados no mesmo lugar na página, o<div>Top</div>
elemento cobriria o<div>Bottom</div>
elemento. Como<div>Top</div>
vem depois<div>Bottom</div>
na estrutura HTML, ele tem uma ordem de empilhamento mais alta.Mostrar snippet de código
A ordem de empilhamento pode ser alterada com CSS usando as propriedades
z-index
ouorder
.Podemos ignorar a ordem de empilhamento nesta edição, pois a estrutura HTML natural dos elementos significa que o elemento em que queremos que apareça
top
vem após o outro elemento.Então, voltando ao problema em questão - usaremos o contexto da posição para resolver esse problema.
A solução
Como mencionado acima, nosso objetivo é posicionar o
#infoi
elemento para que ele apareça dentro do.navi
elemento. Para fazer isso, agruparemos os elementos.navi
e#infoi
em um novo elemento<div class="wrapper">
para que possamos criar um novo contexto de posição.Em seguida, crie um novo contexto de posição dando
.wrapper
aposition: relative
.Com este novo contexto de posição, podemos posicionar
#infoi
dentro.wrapper
. Primeiro, dê#infoi
aposition: absolute
, permitindo-nos posicionar#infoi
absolutamente.wrapper
.Em seguida, adicione
top: 0
eright: 0
para posicionar o#infoi
elemento no canto superior direito. Lembre-se, como o#infoi
elemento está usando.wrapper
como contexto de posição, ele estará no canto superior direito do.wrapper
elemento.Como
.wrapper
é apenas um contêiner para.navi
, o posicionamento#infoi
no canto superior direito da.wrapper
dá o efeito de ser posicionado no canto superior direito da.navi
.E aí está,
#infoi
agora parece estar no canto superior direito de.navi
.O resultado
O exemplo abaixo é resumido ao básico e contém alguns estilos mínimos.
Mostrar snippet de código
Uma solução alternativa (grade)
Aqui está uma solução alternativa usando CSS Grid para posicionar o
.navi
elemento com o#infoi
elemento na extrema direita. Eu usei asgrid
propriedades detalhadas para deixar o mais claro possível.Mostrar snippet de código
Uma solução alternativa (sem invólucro)
Caso não possamos editar nenhum HTML, o que significa que não podemos adicionar um elemento wrapper, ainda podemos obter o efeito desejado.
Em vez de usar
position: absolute
o#infoi
elemento, usaremosposition: relative
. Isso nos permite reposicionar o#infoi
elemento de sua posição padrão abaixo do.navi
elemento. Composition: relative
podemos usar umtop
valor negativo para movê-lo para cima de sua posição padrão, e umleft
valor de100%
menos alguns pixels, usandoleft: calc(100% - 52px)
, para posicioná-lo próximo ao lado direito.Mostrar snippet de código
fonte
Usando um
div
com estiloz-index:1;
eposition: absolute;
você pode sobrepor seudiv
em qualquer outrodiv
.z-index
determina a ordem em que as divs 'empilham'. Um div com um valor mais altoz-index
aparecerá na frente de um div com um valor mais baixoz-index
. Observe que essa propriedade funciona apenas com elementos posicionados .fonte
A nova especificação Grid CSS fornece uma solução muito mais elegante. O uso
position: absolute
pode levar a sobreposições ou problemas de dimensionamento, enquanto o Grid o salvará de hacks CSS sujos.Exemplo mínimo de sobreposição de grade:
HTML
CSS
É isso aí. Se você não criar para o Internet Explorer, seu código provavelmente funcionará.
fonte
A seguir, uma solução simples 100% baseada em CSS. O "segredo" é usar o
display: inline-block
elemento no invólucro. Avertical-align: bottom
imagem é um truque para superar o preenchimento de 4px que alguns navegadores adicionam após o elemento.Conselho : se o elemento antes do wrapper estiver embutido, eles poderão acabar aninhados. Nesse caso, você pode "embrulhar o invólucro" dentro de um recipiente com
display: block
- geralmente um bom e velhodiv
.fonte
Isto é o que você precisa:
fonte
Não sou muito codificador nem especialista em CSS, mas ainda estou usando a sua ideia nos meus designs da web. Também tentei resoluções diferentes:
Claro que haverá um invólucro em torno de ambos. Você pode controlar a localização do menu div que será exibido dentro do cabeçalho div com margens esquerdas e posições superiores. Você também pode definir o menu div para flutuar corretamente, se quiser.
fonte
Aqui está um exemplo simples para trazer um efeito de sobreposição com um ícone de carregamento sobre outra div.
Experimente aqui: http://jsbin.com/fotozolucu/edit?html,css,output
fonte