margin
влияет на макет, в то время как верхний / левый только перемещают элемент из его нормального положения потока, не затрагивая макет.
Вот базовый пример c, чтобы понять разницу:
.box {
height:50px;
background:red;
border:2px solid;
}
<div class="box"></div>
<div class="box" style="margin-top:-50px;"></div>
<div class="box"></div>
Обратите внимание, как мы сдвигаем второй элемент, а третий следует за ним.
Теперь давайте используем top
.box {
height:50px;
background:red;
border:2px solid;
}
<div class="box"></div>
<div class="box" style="top:-50px;position:relative"></div>
<div class="box"></div>
Третий не будет двигаться. top
просто повлияет на соответствующий элемент
Из спецификации:
относительно
Положение блока рассчитывается в соответствии с нормальным потоком (это называется положение в нормальном потоке). Затем поле смещается относительно его нормального положения. Когда блок B относительно позиционирован, позиция следующего блока рассчитывается так, как если бы блок B не был смещен.
Для поля, как мне кажется, это более тривиально, так как поле является часть модели коробки, как определено здесь . Вы не найдете явного предложения о том, как ведет себя отрицательное поле, но, следуя его логике c, мы можем понять, что отрицательное поле повлияет на блок соответствующего элемента и повлияет на соседние элементы.
Таким образом, отрицательное поле не действительно перемещает элемент так же, как верх / влево.