Почему два div не выровневаются при точных значений координат?

Рейтинг: 0Ответов: 3Опубликовано: 23.01.2023

Элемент div с идентификатором "#block2" слегка ниже чем элемент div с идентификатором "#block1"...

#block1 {
  width: 100px;
  height: 100px;
  border: 1px solid black;
  background-color: red;
}

#block2 {
  width: 100px;
  height: 100px;
  border: 1px solid black;
  background-color: red;
  margin-left: 104px;
  margin-top: -100px;
}
<div id="block1"></div>
<div id="block2"></div>

Почему так происходит ?

Ответы

▲ 1Принят

Странно, что столько людей сказали про 102px, но никто не сказал откуда берутся эти 2px..

Всё дело в border: 1px, из-за того, что есть свойство box-sizing, которое по дефолту имеет значение content-box, border будет добавлять ещё и своё значение размера к основному.

Именно так получается, что фактически ваш блок равен следующим размерам:

width  = border-left-width + width + border-right-width  = 1px + 100px + 1px = 102px
height = border-top-width + height + border-bottom-width = 1px + 100px + 1px = 102px

По этому чтобы расположить блок #block2 на том же уровне, что и block1, вам потребуется указать margin-top: -102px.

#block1 {
  width: 100px;
  height: 100px;
  border: 1px solid black;
  background-color: red;
}

#block2 {
  width: 100px;
  height: 100px;
  border: 1px solid black;
  background-color: red;
  margin-left: 104px;
  margin-top: -102px;
}
<div id="block1"></div>
<div id="block2"></div>

Или указать значение для блоков box-sizing: border-box, тогда размеры border будут "съедаться вовнутрь", тем самым блок всегда будет того размера, которого вы указали.

#block1 {
  width: 100px;
  height: 100px;
  border: 1px solid black;
  background-color: red;
}

#block2 {
  width: 100px;
  height: 100px;
  border: 1px solid black;
  background-color: red;
  margin-left: 104px;
  margin-top: -102px;
}
<div id="block1"></div>
<div id="block2"></div>


А вообще не понятно зачем такое извращение, чтобы расположить элементы горизонтально, давно используют Flexbox

#block1 {
  width: 100px;
  height: 100px;
  border: 1px solid black;
  background-color: red;
  box-sizing: border-box;
}

#block2 {
  width: 100px;
  height: 100px;
  border: 1px solid black;
  background-color: red;
  box-sizing: border-box;
  margin-left: 104px;
  margin-top: -100px;
  animation: BorderWidth 1s linear infinite alternate;
}

@keyframes BorderWidth {
  to {border-width: 15px;}
}
<div id="block1"></div>
<div id="block2"></div>

▲ 0

Из-за строчки margin-top, удалите этот параметр, либо поставь 102,104px

▲ 0

Потому что у тебя высота блоков не 100, а 102. Наверное, ты хотел вот так:

* {
  box-sizing: border-box;
}

#block1 {
  width: 100px;
  height: 100px;
  border: 1px solid black;
  background-color: red;
}

#block2 {
  width: 100px;
  height: 100px;
  border: 1px solid black;
  background-color: red;
  margin-left: 104px;
  margin-top: -100px;
}
<div id="block1"></div>
<div id="block2"></div>

PS: А вообще, ты что-то странное делаешь.