Почему при добавлении отступа сверху к красному блоку зеленый блок также смещается от синего? С чем это может быть связано и как сделать так, чтобы отступался только красный блок, при этом оставляя расстояние в 20px между синим и зеленым блоками? <br/> <br/> <pre><code class="html"><div class="wrapper">
<div class="a1"></div>
<div class="a2"></div>
<div class="a3"></div>
<div class="a4"></div>
</div></code></pre> <br/> <br/> <pre><code class="css">.wrapper{
width: 400px;
display: flex;
justify-content: space-between;
flex-wrap: wrap;
gap: 20px;
background-color: antiquewhite;
}
.a1{
width: 150px;
height: 150px;
background-color:blue;
}
.a2{
margin-top: 50px;
width: 150px;
height: 150px;
background-color:red;
}
.a3{
width: 150px;
height: 150px;
background-color:green;
}
.a4{
width: 150px;
height: 150px;
background-color:black;
}</code></pre>
Ваша проблема связана с тем, как работает модель блочной верстки и свойство `margin` в CSS. Когда вы добавляете верхний отступ (`margin-top`) к блоку `.a2` (красный), этот отступ также влияет на другие блоки, потому что блочные элементы "подвигаются" вниз. Это явление называется "схлопывание отступов" (margin collapse).
Чтобы отождить красный блок от синего, при этом сохранив расстояние в 20 пикселей между синим и зеленым блоками, вы можете использовать несколько подходов:
### Способ 1: Использование `padding`
Вы можете использовать внутренний отступ (`padding`) вместо внешнего (`margin`). Например, добавьте `padding-top` к родительскому блоку (`.wrapper`):
```css
.wrapper {
width: 400px;
display: flex;
justify-content: space-between;
flex-wrap: wrap;
gap: 20px;
background-color: antiquewhite;
padding-top: 50px; /* Добавляем внутренний отступ */
}
.a2 {
/* Убираем margin-top */
width: 150px;
height: 150px;
background-color: red;
}
```
### Способ 2: Использование `overflow`
Вы можете добавить свойство `overflow: hidden;` к родительскому элементу `.wrapper`. Это также предотвратит схлопывание отступов:
```css
.wrapper {
width: 400px;
display: flex;
justify-content: space-between;
flex-wrap: wrap;
gap: 20px;
background-color: antiquewhite;
overflow: hidden; /* Это предотвратит схлопывание отступов */
}
.a2 {
margin-top: 50px; /* Здесь оставляем отступ */
width: 150px;
height: 150px;
background-color: red;
}
```
### Способ 3: Использование `position`
Еще один вариант — использование `position: relative;` для красного блока. Это также будет предотвращать схлопывание отступов:
```css
.a2 {
margin-top: 50px;
position: relative; /* Это предотвратит схлопывание отступов */
width: 150px;
height: 150px;
background-color: red;
}
```
Каждый из этих подходов позволит вам отодвинуть красный блок, не смещая зеленый блок, сохраняя при этом 20 пикселей отступа между синим и зеленым блоками. Вы можете выбрать тот, который лучше всего соответствует вашим требованиям по дизайну.
<blockquote>Подскажите почему когда задаю отступ сверху красному блоку зеленый тоже отступает от синего?</blockquote> <br/> У вас не зеленый отступает, а весь ряд нижних блоков опускается на величину указанную в margin-top для a2. 50px в margin-top + 20px в gap. Вот у вас уже 70 px между верхним и нижним рядом. <br/> <blockquote>С чем это связано?</blockquote> <br/> Так работает flexbox. <br/> <blockquote>Как сделать чтоб отступал от верха только красный блок, а между синим и зеленым расстояние оставалось 20px?</blockquote> <br/> Использовать transform для элемента где нужен отступ. <br/> <br/> <pre><code class="css">.a2{
transform: translateY(50px);
width: 150px;
height: 150px;
background-color:red;
}</code></pre>