Comment faire en sorte qu'un élément positionné absolu honore le remplissage de son parent? Je veux qu'un div interne s'étende sur la largeur de son parent et soit positionné au bas de ce parent, essentiellement un pied de page. Mais l'enfant doit honorer le rembourrage du parent et il ne le fait pas. L'enfant est pressé contre le bord du parent.
Alors je veux ceci:
mais je comprends ceci:
<html>
<body>
<div style="background-color: blue; padding: 10px; position: relative; height: 100px;">
<div style="background-color: gray; position: absolute; left: 0px; right: 0px; bottom: 0px;">css sux</div>
</div>
</body>
</html>
Je peux y arriver avec une marge autour de la div interne, mais je préférerais ne pas avoir à ajouter cela.
css
padding
css-position
d512
la source
la source
style="background-color: gray; position: absolute; left: 10px; right: 10px; bottom: 10px;"
?left:
etright:
sur l'enfant (positionné en absolu), votre problème est résolu. J'ajoute ce b / c c'est la réponse que d'autres avec le même problème sont susceptibles de rechercher.Réponses:
Voyons d'abord pourquoi cela se produit.
La raison en est que, étonnamment, lorsqu'une boîte a
position: absolute
sa boîte contenant, c'est la boîte de remplissage du parent (c'est-à-dire la boîte autour de son remplissage). Cela est surprenant car généralement (c'est-à-dire lors de l'utilisation d'un positionnement statique ou relatif), la boîte contenant est la boîte de contenu du parent .Voici la partie pertinente de la spécification CSS :
L'approche la plus simple - comme suggéré dans la réponse de Winter - consiste à utiliser
padding: inherit
sur le positionné absolumentdiv
. Cela ne fonctionne, cependant, que si vous ne voulez pas que le positionné de manière absoluediv
ait son propre rembourrage supplémentaire. Je pense que les solutions les plus générales (en ce que les deux éléments peuvent avoir leur propre rembourrage indépendant) sont:Ajoutez un supplément relativement positionné
div
(sans rembourrage) autour du positionné absolumentdiv
. Ce nouveaudiv
respectera le remplissage de son parent, et le positionné absolument lediv
remplira alors.L'inconvénient, bien sûr, est que vous manipulez le HTML simplement à des fins de présentation.
Répétez le remplissage (ou ajoutez-y) sur l'élément absolument positionné.
L'inconvénient ici est que vous devez répéter les valeurs de votre CSS, ce qui est fragile si vous écrivez directement le CSS. Cependant, si vous utilisez un outil de prétraitement comme
SASS
ou,LESS
vous pouvez éviter ce problème en utilisant une variable. C'est la méthode que j'utilise personnellement.la source
position: absolute
? Il est surprenant que la boîte contenant soit la boîte de remplissage, mais il doit y avoir une raison à cela, tout comme je suis sûr qu'il y a une raison pour laquelle (sansbox-sizing
) lewidth
&height
n'inclut pas le rembourrage ou la bordure.box-sizing
propriété, sur le parent ou l'enfant. C'est parce que cela affecte le dimensionnement , comme en largeur / hauteur, mais pas la boîte contenant, bien que j'admets que cela aurait plus de sens si cela affectait les deux.padding: inherit
fonctionne bien si le positionnement absoludiv
n'a pas besoin de rembourrage propre, et j'ai ajouté une mention de cette technique. C'est moins flexible, cependant, car vous ne pouvez pas ajouter de rembourrage supplémentaire à la position absoluediv
(c'est-à-dire que vous ne pouvez pas direpadding: inherit + 5px
). C'est pourquoi je préfère les techniques que je mentionne ici.position:absolute
élément enfant fonctionne en effet si vous recherchez simplement que l'enfant respecte le remplissage du parent. Cependant, si vous cherchez à ajouter un rembourrage supplémentaire à l'enfant, vous devrez garder le rapport de rembourrage en contrôle dans votre code. Pas de moyen propre de le faire avec juste CSS.Une chose que vous pouvez essayer est d'utiliser le css suivant:
Il permet à l'élément enfant d'hériter du remplissage du parent, puis l'enfant peut être positionné pour correspondre au widht et au remplissage des parents.
Aussi, j'utilise
box-sizing: border-box;
pour les éléments impliqués.Je n'ai pas testé cela dans tous les navigateurs, mais cela semble fonctionner dans Chrome, Firefox et IE10.
la source
Eh bien, ce n'est peut-être pas la solution la plus élégante (sémantiquement), mais dans certains cas, cela fonctionnera sans aucun inconvénient: au lieu d'un remplissage, utilisez une bordure transparente sur l'élément parent. Les éléments enfants positionnés en absolu respecteront la bordure et le rendu sera exactement le même (sauf que vous utilisez la bordure de l'élément parent pour le style).
la source
Utilisez la marge au lieu du remplissage dans la div parent: http://blog.vjeux.com/2012/css/css-absolute-position-taking-into-account-padding.html
la source
Voici ma meilleure chance. J'ai ajouté une autre Div et l'ai rendue rouge et j'ai changé la taille de votre parent à 200px juste pour la tester. L'idée est que l'enfant devient maintenant le petit-enfant et le parent devient le grand-parent. Le parent respecte donc son parent. J'espère que vous avez mon idée.
Éditer:
Je pense que ce que vous essayez de faire ne peut pas être fait. La position absolue signifie que vous allez lui donner les coordonnées qu'elle doit honorer. Que faire si le parent a un remplissage de 5 px. Et vous positionnez absolument l'enfant en haut: -5px; à gauche: -5px . Comment est-il censé honorer le parent et vous en même temps ??
Ma solution
Si vous voulez qu'il honore le parent, ne le positionnez pas absolument.
la source
1.) vous ne pouvez pas utiliser de grande bordure sur le parent - au cas où vous voudriez avoir une bordure spécifique
2.) vous ne pouvez pas ajouter de marge - au cas où votre parent fait partie d'un autre conteneur et que vous voulez que votre parent prenne le plein largeur de ce grand parent.
La seule solution qui devrait être applicable est d'emballer vos enfants dans un autre conteneur afin que votre parent devienne le grand-parent, puis d'appliquer un rembourrage au wrapper / parent des nouveaux enfants. Ou vous pouvez directement appliquer un rembourrage aux enfants.
Dans ton cas:
la source
Aurait pu facilement le faire en utilisant un niveau supplémentaire de Div.
Démo: https://jsfiddle.net/soxv3vr0/
la source
ajouter un remplissage: héritez de votre position absolue
la source