233 votes

Positionnement absolu ignorant le rembourrage du parent

Comment faire en sorte qu'un élément positionné de manière absolue respecte le padding de son parent ? Je veux qu'un div interne s'étende sur la largeur de son parent et qu'il soit positionné au bas de ce parent, en fait un pied de page. Mais l'enfant doit respecter le remplissage du parent et ce n'est pas le cas. L'enfant est plaqué contre le bord du parent.

Donc je veux ça :

enter image description here

mais je reçois ça :

enter image description here

<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 le faire avec une marge autour de la division intérieure, mais je préférerais ne pas avoir à l'ajouter.

268voto

D'abord, voyons por qué c'est en train de se produire.

La raison en est que, étonnamment, lorsqu'une boîte a position: absolute sa boîte de contenu est la boîte de remplissage du parent (c'est-à-dire la boîte autour de son remplissage). C'est surprenant, car habituellement (c'est-à-dire lors de l'utilisation du positionnement statique ou relatif), la boîte de contenu est la boîte de remplissage du parent. contenu boîte.

Voici le partie pertinente de la spécification CSS :

Dans le cas où l'ancêtre est un élément en ligne, le bloc contenant est la boîte de délimitation autour des boîtes de remplissage de la première et de la dernière boîte en ligne générées pour cet élément..... Sinon, le bloc contenant est formé par le bord de remplissage de l'ancêtre.

L'approche la plus simple - comme suggéré dans la réponse de Winter - est d'utiliser padding: inherit sur la position absolue div . Cela ne fonctionne, cependant, que si vous ne voulez pas que la position absolue div d'avoir un rembourrage supplémentaire qui lui est propre. Je pense que les solutions les plus polyvalentes (dans la mesure où les deux éléments peuvent avoir leur propre rembourrage indépendant) sont les suivantes :

  1. Ajoutez une position relative supplémentaire div (sans remplissage) autour de l'objet positionné de façon absolue div . Ce nouveau div respectera le rembourrage de son parent, et le positionnement absolu de la fonction div le remplit alors.

    L'inconvénient, bien sûr, c'est que vous manipulez le HTML simplement à des fins de présentation.

  2. Répétez le rembourrage (ou ajoutez-le) sur l'élément positionné de façon absolue.

    L'inconvénient est que vous devez répéter les valeurs dans votre CSS, ce qui est fragile si vous écrivez le CSS directement. Cependant, si vous utilisez un outil de prétraitement tel que SASS o LESS vous pouvez éviter ce problème en utilisant une variable. C'est la méthode que j'utilise personnellement.

78voto

Winter Points 1305

Vous pouvez essayer d'utiliser le fichier css suivant :

.child-element {
    padding-left: inherit;
    padding-right: inherit;
    position: absolute;
    left: 0;
    right: 0;
}

Il permet à l'élément enfant d'hériter du remplissage du parent, puis l'enfant peut être positionné pour correspondre à la largeur et au remplissage des parents.

De plus, j'utilise box-sizing: border-box; pour les éléments concernés.

Je ne l'ai pas testé dans tous les navigateurs, mais il semble que cela fonctionne dans Chrome, Firefox et IE10.

34voto

NewSpender Points 399

Ce n'est peut-être pas la solution la plus élégante (sur le plan sémantique), mais dans certains cas, elle fonctionnera sans inconvénient : Au lieu du padding, 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).

8voto

Touch Points 1255

Voici mon meilleur essai. J'ai ajouté un autre Div, je l'ai mis en rouge et j'ai changé la hauteur du parent à 200px, juste pour le tester. L'idée est que l'enfant devient le petit-enfant et que le parent devient le grand-parent. Le parent respecte donc son parent. J'espère que vous avez compris mon idée.

<html>
  <body>
    <div style="background-color: blue; padding: 10px; position: relative; height: 200px;">
     <div style="background-color: red;  position: relative; height: 100%;">    
        <div style="background-color: gray; position: absolute; left: 0px; right: 0px;bottom: 0px;">css sux</div>
     </div>
    </div>
  </body>
</html>

Editar:

Je pense que ce que vous essayez de faire ne peut pas être fait. La position absolue signifie que vous allez lui donner des coordonnées qu'il doit respecter. Et si le parent a un padding de 5px. Et que vous positionnez absolument l'enfant à top : -5px ; left : -5px . Comment est-ce que c'est supposé honorer le parent et vous en même temps ? ?

Ma solution

Si vous voulez qu'il honore le parent, ne le positionnez pas absolument à ce moment-là.

8voto

Niloct Points 2290

Utilisez margin au lieu de padding dans la div parent : http://blog.vjeux.com/2012/css/css-absolute-position-taking-into-account-padding.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X