Si vous regardez la spécification du modèle de boîte CSS , vous observerez ce qui suit:
Le pourcentage de [marge] est calculé par rapport à la largeur du bloc contenant de la boîte générée. Notez que cela est également vrai pour «margin-top» et «margin-bottom». Si la largeur du bloc conteneur dépend de cet élément, la mise en page résultante n'est pas définie dans CSS 2.1. (c'est moi qui souligne)
C'est en effet vrai. Mais pourquoi ? Qu'est-ce qui obligerait quelqu'un à le concevoir de cette façon? Il est facile de penser à des scénarios où vous voulez, par exemple, une certaine chose doit toujours être 25% en dessous du haut de la page, mais il est difficile de trouver une raison pour laquelle vous voudriez que le remplissage vertical soit relatif à la taille horizontale de le 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>
height: 10%; width: 10%
vous n'obtiendrez pas d'élément carré non plus.
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).
donc ça va dans les deux sens
margin: 25%
signifie réellement. Ce ne serait pas une marge égale, même si le code le suggère. Je n'ai aucune preuve à l'appui, mais cela semble raisonnable.