Почему margin считает от html, а не от родителя?

В HTML, свойство margin в действительности зависит от контекста и в большинстве случаев вычисляется относительно родительского элемента, хотя это и не всегда так.

Во-первых, необходимо понять основную концепцию CSS модели разметки (CSS box model). Каждый элемент веб-страницы представляется в виде прямоугольного блока, который состоит из следующих частей: контент (content), отступы (margin), рамка (border) и заполнение (padding). Отступы (margin) определяют расстояние между элементами, а также между элементом и его родительским элементом или границей страницы.

По умолчанию, значение свойства margin задано для всех сторон (верхней, нижней, левой и правой), и в этом случае эти отступы применяются равномерно ко всем сторонам элемента.

Если у элемента установлено свойство margin, оно может быть вычислено относительно следующих контекстных факторов:

1. Если элемент находится внутри контейнера, то margin будет вычислен относительно этого контейнера или его родительского элемента.

2. Однако, если у родительского элемента задано свойство margin, то это может изменить вычисление отступа для дочернего элемента. Если у родительского элемента задано значение margin, то отступ дочернего элемента будет вычислен относительно этого значения.

3. В некоторых случаях, установка margin элемента может быть вычислена относительно контента страницы, и не зависеть от родительского элемента или контейнера.

В качестве примера, если у родительского элемента заданы отступы (margin), то дочерний элемент будет вычислять свои собственные отступы относительно родительского элемента. Но если у дочернего элемента также установлено значение отступа (margin), то эти значения могут сложиться и образовать новое значение отступа для дочернего элемента.

Например, пусть есть следующий HTML код:

<style>
    .parent-element {
        margin: 20px;
    }
    .child-element {
        margin: 10px;
    }
</style>
<div class="parent-element">
    <div class="child-element">
        Some Content
    </div>
</div>

В данном случае, отступы (margin) дочернего элемента "child-element" будут вычислены относительно отступов (margin) родительского элемента "parent-element". В результате, верхний и нижний отступы (margin) дочернего элемента будут равны 30px (сумма отступов родителя и дочернего элемента), а левый и правый отступы останутся равными 10px, как задано у дочернего элемента.

Таким образом, при использовании свойства margin в HTML, важно понимать контекст, относительно которого производится вычисление отступов. Оно может зависеть от родительского элемента, контейнера или, в некоторых случаях, от контента страницы.