Comme vous pouvez le voir dans le CSS ci-dessous, je veux me child2
positionner avant child1
. En effet, le site que je suis en train de développer devrait également fonctionner sur des appareils mobiles, sur lesquels il child2
devrait être en bas, car il contient la navigation que je souhaite en dessous du contenu sur les appareils mobiles. - Pourquoi pas 2 pages maîtres? Ce sont les 2 seuls divs
qui sont repositionnés dans tout le code HTML, donc 2 pages maîtres pour ce changement mineur sont une exagération.
HTML:
<div id="parent">
<div class="child1"></div>
<div class="child2"></div>
</div>
CSS:
parent { position: relative; width: 100%; }
child1 { width: auto; margin-left: 160px; }
child2 { width: 145px; position: absolute; top: 0px; bottom: 0px; }
child2
a une hauteur dynamique, car différents sous-sites peuvent avoir plus ou moins d'éléments de navigation.
Je sais que les éléments positionnés absolus sont supprimés du flux, donc ignorés par les autres éléments.
J'ai essayé de régler overflow:hidden;
le div parent, mais cela n'a pas aidé, ni le clearfix
.
Mon dernier recours sera JavaScript pour repositionner les deux en divs
conséquence, mais pour l'instant je vais essayer de voir s'il existe une façon non JavaScript de le faire.
la source
Réponses:
Vous avez répondu vous-même à la question: "Je sais que les éléments positionnés en absolu sont supprimés du flux, donc ignorés par les autres éléments". Vous ne pouvez donc pas définir la hauteur des parents en fonction d'un élément absolument positionné.
Vous utilisez des hauteurs fixes ou vous devez impliquer JS.
la source
Bien que l'étirement aux éléments
position: absolute
ne soit pas possible, il existe souvent des solutions où vous pouvez éviter le positionnement absolu tout en obtenant le même effet. Regardez ce violon qui résout le problème dans votre cas particulier http://jsfiddle.net/gS9q7/L'astuce consiste à inverser l'ordre des éléments en faisant flotter les deux éléments, le premier à droite, le second à gauche, de sorte que le second apparaît en premier.
Enfin, ajoutez un clearfix au parent et vous avez terminé (voir le violon pour la solution complète).
En règle générale, tant que l'élément avec la position absolue est positionné en haut de l'élément parent, il est probable que vous trouviez une solution de contournement en flottant l'élément.
la source
Feeela a raison, mais vous pouvez obtenir un parent qui se
div
contracte / se développe en un élément enfant si vous inversez votrediv
positionnement comme ceci:Cela devrait fonctionner pour vous.
la source
Il existe un moyen assez simple de résoudre ce problème.
Il vous suffit de dupliquer le contenu de child1 et child2 dans les divs relatifs avec display: aucun dans le parent div. Dites enfant1_1 et enfant2_2. Mettez child2_2 en haut et child1_1 en bas.
Lorsque votre requête (ou autre) appelle le div absolu, il suffit de définir le div relatif correspondant (child1_1 ou child2_2) avec display: block ET visibilité: caché. L'enfant relatif sera toujours invisible mais augmentera le div des parents.
la source
Avec du JavaScript pur, il vous suffit de récupérer la hauteur de votre
static position
élément enfant.child1
à l'aide de la méthode getComputedStyle () , puis de définir cette valeur de récupération commepadding-top
celle du même enfant à l'aide de la propriété HTMLElement.style .Vérifiez et exécutez l' extrait de code suivant pour un exemple pratique de ce que j'ai décrit ci-dessus:
la source
Cette question a été posée en 2012 avant flexbox. La bonne façon de résoudre ce problème en utilisant le CSS moderne est avec une requête multimédia et une inversion de colonne flexible pour les appareils mobiles. Aucun positionnement absolu n'est nécessaire.
https://jsfiddle.net/tnhsaesop/vjftq198/3/
HTML:
CSS:
la source
J'avais un problème similaire. Pour résoudre ce problème (au lieu de calculer la hauteur de l'iframe à l'aide du corps, du document ou de la fenêtre), j'ai créé un div qui enveloppe tout le contenu de la page (un div avec un id = "page" par exemple) puis j'ai utilisé sa hauteur.
la source
J'ai trouvé une autre solution, que je n'aime pas mais qui fait le travail.
Dupliquez essentiellement les éléments enfants de manière à ce que les doublons ne soient pas visibles.
CSS:
Si ces éléments enfants contiennent peu de balisage, l'impact sera faible.
la source
Voici l'exemple JS:
---------- Exemple jQuery JS --------------------
la source
Il y a un hack très simple qui résout ce problème
Voici un codeandbox qui illustre la solution: https://codesandbox.io/s/00w06z1n5l
HTML
CSS
vous pouvez jouer avec le positionnement du div hack pour affecter la position de l'enfant.
Voici un extrait:
la source
Il existe maintenant une meilleure façon de procéder. Vous pouvez utiliser la propriété bottom.
la source
C'est très similaire à ce que @ChrisC a suggéré. Il n'utilise pas un élément positionné absolu, mais un élément relatif. Peut-être pourrait travailler pour vous
Et votre css comme ça:
https://jsfiddle.net/royriojas/dndjwa6t/
la source
Pensez également à la prochaine approche:
CSS:
Aussi, puisque vous essayez de repositionner les divs, considérez la grille CSS
la source
Les vues absolues se positionnent par rapport à l'ancêtre le plus proche qui n'est pas positionné statiquement (
position: static
), donc si vous voulez une vue absolue positionnée par rapport à un parent donné, définissez le parentposition
surrelative
et l'enfantposition
surabsolute
la source
Essayez ça, ça a fonctionné pour moi
Il définira la hauteur de l'enfant sur la hauteur du parent
la source