Если вы посмотрите на спецификацию блочной модели CSS , вы увидите следующее:
Процент [маржа] рассчитывается относительно ширины содержащего блока сгенерированного бокса. Обратите внимание, что это верно и для полей «верхний край» и «нижний край». Если ширина содержащего блока зависит от этого элемента, то результирующий макет не определен в CSS 2.1. (курсив мой)
Это действительно правда. Но почему ? Что, черт возьми, могло заставить кого-нибудь так спроектировать его? Легко придумать сценарии, в которых вы хотите, например, определенная вещь всегда должна быть на 25% ниже верхней части страницы, но трудно придумать какую-либо причину, по которой вы хотите, чтобы вертикальное заполнение было относительно горизонтального размера родитель.
Вот пример явления, о котором я говорю:
<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%
вы тоже не получите квадратный элемент.
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).
Так что все идет в обе стороны»
margin: 25%
самом деле означает. Это не было бы равным запасом, даже если код предполагает, что это так. У меня нет доказательств, подтверждающих это, но это кажется разумным.