Si observa las especificaciones del modelo de cuadro CSS , observará lo siguiente:
El porcentaje [margen] se calcula con respecto al ancho del bloque que contiene el cuadro generado. Tenga en cuenta que esto también es cierto para 'margin-top' y 'margin-bottom'. Si el ancho del bloque contenedor depende de este elemento, el diseño resultante no está definido en CSS 2.1. (énfasis mío)
Esto es de hecho cierto. Pero por que ? ¿Qué demonios obligaría a cualquiera a diseñarlo de esta manera? Es fácil pensar en los escenarios en los que desea, por ejemplo, que una cosa siempre esté un 25% por debajo de la parte superior de la página, pero es difícil encontrar alguna razón por la que desee que el relleno vertical sea relativo al tamaño horizontal de el padre.
Aquí hay un ejemplo del fenómeno al que me refiero:
<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%
que tampoco obtendrás un elemento cuadrado.
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).
así lo dice en ambos sentidos
margin: 25%
realmente significa. No sería un margen uniforme, aunque el código lo sugiera. No tengo pruebas para respaldar esto, pero parece razonable.