Si vous regardez le Spécifications du modèle de boîte CSS vous observerez ce qui suit :
Le pourcentage de la [marge] est calculé par rapport à la largeur du bloc contenant la boîte générée. Notez que cela s'applique également à "margin-top" et "margin-bottom". Si la largeur du bloc contenant dépend de cet élément, la mise en page résultante est indéfinie en CSS 2.1. (c'est moi qui souligne)
C'est en effet vrai. Mais por qué ? Qu'est-ce qui pourrait bien pousser quelqu'un à le concevoir de cette façon ? Il est facile de penser à des scénarios où l'on veut, par exemple, qu'une certaine chose soit toujours 25% plus bas que le haut de la page, mais il est difficile de trouver une raison pour laquelle on voudrait que le remplissage vertical soit relatif à la taille horizontale du parent.
Voici un exemple du phénomène auquel je fais référence :
<div style="border: 1px solid red; margin: 0; padding: 0; width: 200px; height: 800px;">
This div is 200x800.
<div style="border: 1px solid blue; margin: 10% 0 0 10%;">
This div has top-margin of 10% and left-margin of 10% with respect to its parent.
</div>
</div>
0 votes
La taille verticale de la page ou le fenêtre ? Ils ne sont presque jamais de la même taille. J'imagine que cette ambiguïté explique en grande partie pourquoi.
0 votes
La taille verticale de l'élément contenant (potentiellement le corps, bien sûr.) J'ai ajouté un exemple dans JSFiddle pour aider à illustrer.
0 votes
Je ne sais pas. Mais cette question mérite une étoile "Favorite" de ma part, un +1, et du temps passé à faire des recherches (et peut-être, si je ne trouve rien de convenable, à envoyer un courriel à quelqu'un comme Eric Meyer).
3 votes
Ma première idée est que cela créerait une ambiguïté quant à ce qui
margin: 25%
signifie en fait. Il ne s'agirait pas d'une marge égale, même si le code le suggère. Je n'ai aucune preuve de ce que je avance, mais cela me semble raisonnable.0 votes
Par rapport à quoi préférez-vous que le rembourrage soit relatif ?
4 votes
jsFiddle de mes pensées . La hauteur étant beaucoup plus variable que la largeur, les marges se déplaceraient de manière difficile à prévoir lorsque le contenu changerait.
0 votes
@gmeben : Je préférerais que le haut et le bas soient relatifs à la hauteur (peut-être ).
1 votes
@Ryan : C'est vrai, ce ne serait pas une marge égale, mais encore une fois, si vous dites
height: 10%; width: 10%
vous n'obtiendrez pas non plus un élément carré.0 votes
@mquander Vrai, mais c'est aussi moins ambigu.
4 votes
Selon dev.w3.org/csswg/css3-box/#the-margin-properties on y lit
Note that in a horizontal flow, percentages on ‘margin-top’ and ‘margin-bottom’ are relative to the width of the containing block, not the height (and in vertical flow, ‘margin-left’ and ‘margin-right’ are relative to the height, not the width).
Cela va donc dans les deux sens0 votes
@Richard : Bon point, c'est vrai ; il tire parti du fait que même les éléments de bloc "sous-utilisés" comme les paragraphes sans texte prennent toujours 100% de la largeur de leur conteneur par défaut.
1 votes
@Ryan Je pense que nous avons un gagnant. Regardez ici pour une démo - jsFiddle
0 votes
@Ryan bien que je suppose que la même chose est vraie de la largeur pour les éléments en ligne - jsFiddle
0 votes
Remarque : dans la plupart des cas, vous pourriez probablement utiliser
position: relative
ytop: 10%
en valeurs de pourcentage pourtop
ybottom
sont calculés en fonction de la hauteur du parent.0 votes
@RichardTowers Pas vraiment. Vous ne pouvez pas définir un pourcentage de largeur sur les éléments en ligne, donc la largeur de l'élément en ligne ne dépend pas de la largeur de son parent.
0 votes
Cette dépendance décrite il y a une équation algébrique avec une inconnue (la hauteur du parent) et une équation (hauteur du parent = somme des hauteurs des enfants + remplissage). Elle n'est pas du tout mal définie et sa solution peut être trouvée très simplement. Si vous écrivez cela sur papier, et que vous ne codez pas d'abord, cela deviendra évident. Voir mon commentaire sur la réponse de @Ryan.
0 votes
Cette fonction est très utile pour réaliser des images carrées : stackoverflow.com/questions/23400232/
0 votes
@Lode c'est aussi très utile lorsque vous avez besoin de contrôler le ratio d'aspect.