Внутренний контейнер сдвигает положение внешнего контейнера из-за поля внутреннего контейнера

Раздел row имеет верхнее/нижнее поле 10px (margin: 10px 2px). Однако 10px сдвигает позицию основного контейнера. Я пытаюсь добиться того, чтобы строка имела верхнее/нижнее поле внутри main-container. Маржа как-то убегает и толкает main-container.

Вот мой код:

body {
    padding: 0;
    margin: 0;
}
.main-container {
    position: relative;
    display: block;
    width: 183px;
    height: 101px;
    background-color: red;
}

.row {
    position: relative;
    display: block;
    margin: 10px 2px;
    width: 175px;
    height: 15px;
    background-color: green;
}
<div class = "main-container">
    <div class = "row">
    </div>
    <div class = "row">
    </div>
</div>

Но если вы запустите этот код (ниже) без div row. Вы можете видеть, что положение main-container отличается. Это положение, в котором должен быть main-container.

body {
    padding: 0;
    margin: 0;
}
.main-container {
    position: relative;
    display: block;
    width: 183px;
    height: 101px;
    background-color: red;
}
<div class = "main-container">
</div>

Как я могу это исправить?

Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
3
0
626
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы должны изменить свой position в классе .main-container на position: absolute вместо position: relative.

Относительное позиционирование будет перемещать элемент в потоке страницы, тогда как абсолютное позиционирование, по сути, заблокирует его в любом положении, в котором вы его установили. Относительное позиционирование больше подходит для таких ситуаций, как ваш класс .row, где вы хотите, чтобы он зависел от позиционирования. класса .main-container. Абсолютное позиционирование следует использовать, когда вы не хотите, чтобы другие элементы (в частности, родительский элемент) определяли его позицию.

body {
    padding: 0;
    margin: 0;
}
.main-container {
    position: absolute;
    display: block;
    width: 183px;
    height: 101px;
    background-color: red;
}

.row {
    position: relative;
    display: block;
    margin: 10px 2px;
    width: 175px;
    height: 15px;
    background-color: green;
}
<div class = "main-container">
    <div class = "row">
    </div>
    <div class = "row">
    </div>
</div>

эта статья отлично объясняет, почему у вас возникают проблемы, когда и у родителя, и у ребенка есть position: relative. Если вы полностью уберете position родителя, вы даже не заметите разницы. Почему? Потому что не к чему его позиционировать родственник. Если вы удалите его из класса .row, вы получите те же результаты. Относительное позиционирование ищет элемент с позиционированием Кроме какstatic. В этом случае его нет, поэтому он ничего не делает, поскольку все родители (тело, html и т. д.) по умолчанию имеют position: static.

body {
    padding: 0;
    margin: 0;
}
.main-container {
    display: block;
    width: 183px;
    height: 101px;
    background-color: red;
}

.row {
    position: relative;
    display: block;
    margin: 10px 2px;
    width: 175px;
    height: 15px;
    background-color: green;
}
<div class = "main-container">
    <div class = "row">
    </div>
    <div class = "row">
    </div>
</div>

Но почему row меняет положение main-container? Маржа для row равна внутриmain-container? Как это избежать main-container? Поле row должно смещать позицию строки внутри за пределы main-container

Ross 09.04.2019 03:28

Я добавил объяснение для вас. position: relative в вашем .main-container классе ничего не делает. Если вы удалите его полностью, вы заметите, что ничего не изменилось. Дело не в том, что margin «убегает» от main-container. Это просто неправильное использование position: relative, не приводящее к изменению позиционирования.

Nick 09.04.2019 03:46

@Ross проверьте дубликат, все дело в схлопывании полей, нет необходимости менять положение. Изменение позиции в данном случае является взломать, потому что маржа не схлопывается с position:absolute.

Temani Afif 09.04.2019 08:38

Не обязательно «хак», а скорее одно из многих возможных решений проблемы. Все возможные решения для устранения проблемы можно найти здесь.

Nick 09.04.2019 18:10
<div class = "main-container">
    <div class = "row">
    </div>
    <div class = "row">
    </div>
</div>

body {
  padding: 10px;
  margin: 0;
}
.main-container {
  position: relative;
    width: 183px;
    height: 101px;
    background-color: red;
}

.row {
  position: relative;
  left: 50%;
  top: 35%;
  transform: translate(-50%, -50%);
  margin: 10px 0;
    width: 175px;
    height: 15px;
    background-color: green;
}

Проверьте это в https://codepen.io/3rdsty4bl00d/pen/OGbENg?editors=1100#0

Знаете, почему мой код не сработал? Я обычно использую этот метод все время для позиционирования своих внутренних элементов div, но по какой-то причине сегодня он сломался?

Ross 09.04.2019 03:25

Использование position: absolute; и position: relative; проблематично. Вот почему я избегаю использования позиций в css. Использование flexbox с сеткой намного проще и избавляет от головной боли.

3rdsty4bl00d 09.04.2019 03:28

Есть ли способ заставить это работать, используя position: relative;? Потому что в моем реальном коде он портится, когда я использую сетку. Я использовал относительное позиционирование. Так что все мое как бы настроено в относительном положении

Ross 09.04.2019 03:40

Проверьте этот новый код codepen для вашего ответа. Я надеюсь, что это работает. codepen.io/3rdsty4bl00d/pen/OGbENg?editors=1100#0

3rdsty4bl00d 09.04.2019 03:54

Я не высмеиваю position: absolute; и position: relative;. Это действительно отличный и очень полезный инструмент при разработке веб-страницы. Раньше я использовал эти позиции до того, как открыл для себя flex-box и grid layout. После того, как я привык к этим макетам, я нахожу позиционирование элемента слишком сложным. Flex-box и Grid layout действительно упростили позиционирование элемента. Пожалуйста, не поймите меня неправильно. Я не говорю, что это плохо для кода. @Ник

3rdsty4bl00d 09.04.2019 04:05

Другие вопросы по теме