J'ai besoin d'aide pour superposer un individu div
sur un autre div
.
Mon code ressemble à ceci:
<div class="navi"></div>
<div id="infoi">
<img src="info_icon2.png" height="20" width="32"/>
</div>
Malheureusement, je ne peux pas imbriquer le div#infoi
ou le img
, à l'intérieur du premier div.navi
.
Il doit s'agir de deux div
s distincts comme indiqué, mais j'ai besoin de savoir comment placer le div#infoi
dessus div.navi
et le côté le plus à droite et centré sur le dessus du div.navi
.
overflow: hidden
, utilisezoverflow: visible
plutôt.Réponses:
Je suggère au sujet de l' apprentissage
position: relative
et des éléments enfants avecposition: absolute
.la source
absolute
Les éléments positionnés sont positionnés par rapport à leurposition:absolute|relative|fixed
élément parent explicitement positionné ( ) le plus proche . juste une clarification supplémentaire ... jsfiddle.net/p5jkc8gzLa solution acceptée fonctionne très bien, mais l'OMI n'a pas d'explication sur la raison pour laquelle elle fonctionne. L'exemple ci-dessous se résume aux principes de base et sépare le CSS important du CSS de style non pertinent. En bonus, j'ai également inclus une explication détaillée du fonctionnement du positionnement CSS.
TLDR; si vous ne voulez que le code, faites défiler vers le bas jusqu'au résultat .
Le problème
Il y a deux éléments séparés, frères et sœurs et le but est de positionner le deuxième élément (avec un
id
deinfoi
), afin qu'il apparaisse dans l'élément précédent (celui avec unclass
denavi
). La structure HTML ne peut pas être modifiée.Solution proposée
Pour obtenir le résultat souhaité, nous allons déplacer ou positionner le deuxième élément, que nous appellerons de
#infoi
sorte qu'il apparaisse dans le premier élément, que nous appellerons.navi
. Plus précisément, nous voulons#infoi
être positionnés dans le coin supérieur droit de.navi
.Position CSS Connaissances requises
CSS a plusieurs propriétés pour positionner les éléments. Par défaut, tous les éléments le sont
position: static
. Cela signifie que l'élément sera positionné selon son ordre dans la structure HTML, à quelques exceptions près.Les autres
position
valeurs sontrelative
,absolute
,sticky
etfixed
. En définissant un élémentposition
sur l'une de ces autres valeurs, il est désormais possible d'utiliser une combinaison des quatre propriétés suivantes pour positionner l'élément:top
right
bottom
left
En d'autres termes, en définissant
position: absolute
, nous pouvons ajoutertop: 100px
pour positionner l'élément à 100 pixels du haut de la page. Inversement, si nous définissonsbottom: 100px
l'élément, il serait positionné à 100 pixels du bas de la page.C'est là que de nombreux nouveaux arrivants CSS se perdent -
position: absolute
a un cadre de référence. Dans l'exemple ci-dessus, le cadre de référence est l'body
élément.position: absolute
avectop: 100px
signifie que l'élément est positionné à 100 pixels du haut de l'body
élément.Le cadre de référence de la position ou le contexte de la position peut être modifié en définissant l'
position
élément parent sur une valeur autre queposition: static
. Autrement dit, nous pouvons créer un nouveau contexte de position en donnant un élément parent:position: relative;
position: absolute;
position: sticky;
position: fixed;
Par exemple, si un
<div class="parent">
élément est donnéposition: relative
, tous les éléments enfants utilisent le<div class="parent">
comme contexte de position. Si un élément enfant était donnéposition: absolute
ettop: 100px
, l'élément serait positionné à 100 pixels du haut de l'<div class="parent">
élément, car<div class="parent">
c'est maintenant le contexte de position.L'autre facteur à prendre en compte est l' ordre d'empilement - ou la façon dont les éléments sont empilés dans la direction z. Il faut savoir ici que l'ordre des éléments de la pile est, par défaut, défini par l'inverse de leur ordre dans la structure HTML. Prenons l'exemple suivant:
Dans cet exemple, si les deux
<div>
éléments étaient positionnés au même endroit sur la page, l'<div>Top</div>
élément couvrirait l'<div>Bottom</div>
élément. Comme<div>Top</div>
vient après<div>Bottom</div>
dans la structure HTML, il a un ordre d'empilement plus élevé.Afficher l'extrait de code
L'ordre d'empilement peut être modifié avec CSS à l'aide des propriétés
z-index
ouorder
.Nous pouvons ignorer l'ordre d'empilement dans ce problème car la structure HTML naturelle des éléments signifie que l'élément sur lequel nous voulons apparaître
top
vient après l'autre élément.Donc, revenons au problème en cours - nous utiliserons le contexte de position pour résoudre ce problème.
La solution
Comme indiqué ci-dessus, notre objectif est de positionner l'
#infoi
élément de sorte qu'il apparaisse à l'intérieur de l'.navi
élément. Pour ce faire, nous encapsulerons les éléments.navi
et#infoi
dans un nouvel élément<div class="wrapper">
afin de pouvoir créer un nouveau contexte de position.Créez ensuite un nouveau contexte de position en donnant
.wrapper
unposition: relative
.Avec ce nouveau contexte de position, nous pouvons nous positionner à l'
#infoi
intérieur.wrapper
. Tout d'abord, donnez#infoi
unposition: absolute
, nous permettant de nous positionner#infoi
absolument.wrapper
.Ajoutez ensuite
top: 0
etright: 0
pour positionner l'#infoi
élément dans le coin supérieur droit. N'oubliez pas que l'#infoi
élément étant utilisé.wrapper
comme contexte de position, il se trouvera en haut à droite de l'.wrapper
élément.Parce qu'il
.wrapper
s'agit simplement d'un conteneur pour.navi
, le positionnement#infoi
dans le coin supérieur droit de.wrapper
donne l'effet d'être positionné dans le coin supérieur droit de.navi
.Et
#infoi
voilà , il semble maintenant être dans le coin supérieur droit de.navi
.Le résultat
L'exemple ci-dessous se résume aux bases et contient un style minimal.
Afficher l'extrait de code
Une solution alternative (grille)
Voici une solution alternative utilisant CSS Grid pour positionner l'
.navi
élément avec l'#infoi
élément à l'extrême droite. J'ai utilisé lesgrid
propriétés verbeuses pour le rendre aussi clair que possible.Afficher l'extrait de code
Une solution alternative (sans emballage)
Dans le cas où nous ne pouvons pas modifier de code HTML, ce qui signifie que nous ne pouvons pas ajouter d'élément wrapper, nous pouvons toujours obtenir l'effet souhaité.
Au lieu d'utiliser
position: absolute
l'#infoi
élément, nous utiliseronsposition: relative
. Cela nous permet de repositionner l'#infoi
élément à partir de sa position par défaut sous l'.navi
élément. Avecposition: relative
nous pouvons utiliser unetop
valeur négative pour la déplacer vers le haut par rapport à sa position par défaut, et uneleft
valeur de100%
moins quelques pixels, en utilisantleft: calc(100% - 52px)
, pour la positionner près du côté droit.Afficher l'extrait de code
la source
En utilisant un
div
style avecz-index:1;
etposition: absolute;
vous pouvez superposer votrediv
sur n'importe quel autrediv
.z-index
détermine l'ordre dans lequel les divs «empilent». Un div avec un plus hautz-index
apparaîtra devant un div avec un plus basz-index
. Notez que cette propriété ne fonctionne qu'avec des éléments positionnés .la source
La nouvelle spécification CSS Grid fournit une solution beaucoup plus élégante. L'utilisation
position: absolute
peut entraîner des chevauchements ou des problèmes de mise à l'échelle tandis que Grid vous évitera des hacks CSS sales.Exemple de superposition de grille la plus minimale:
HTML
CSS
C'est ça. Si vous ne construisez pas pour Internet Explorer, votre code fonctionnera très probablement.
la source
Voici une solution simple 100% basée sur CSS. Le "secret" consiste à utiliser l'
display: inline-block
élément dans le wrapper. Levertical-align: bottom
dans l'image est un hack pour surmonter le remplissage 4px que certains navigateurs ajoutent après l'élément.Conseil : si l'élément avant le wrapper est en ligne, il peut se retrouver imbriqué. Dans ce cas, vous pouvez "envelopper l'emballage" à l'intérieur d'un récipient avec
display: block
- généralement un bon et vieuxdiv
.la source
Voici ce dont vous avez besoin:
la source
Je ne suis pas vraiment un codeur ni un expert en CSS, mais j'utilise toujours votre idée dans mes conceptions Web. J'ai aussi essayé différentes résolutions:
Bien sûr, il y aura un emballage autour d'eux deux. Vous pouvez contrôler l'emplacement du div de menu qui sera affiché dans le div d'en-tête avec les marges gauche et les positions supérieures. Vous pouvez également définir le menu div pour qu'il flotte à droite si vous le souhaitez.
la source
Voici un exemple simple pour apporter un effet de superposition avec une icône de chargement sur une autre div.
Essayez-le ici: http://jsbin.com/fotozolucu/edit?html,css,output
la source