Чтобы иметь перекрытие, вы должны либо использовать позиционированные элементы (что не является лучшим решением, если вы хотите сохранить элемент в потоке), либо использовать отрицательную маржу.
Давайте рассмотрим отрицательную маржу.Хитрость заключается в том, чтобы найти способ отрегулировать поля, чтобы создать перекрытие при уменьшении родительского контейнера.
Вот базовый пример:
section {
max-width: 300px;
border: 1px solid;
animation:change 2s linear infinite alternate;
}
@keyframes change {
from {max-width: 300px;}
to {max-width: 100px;}
}
.item{
height: 80px;
min-width: 80px;
background:blue;
display: inline-block;
vertical-align:top;
margin-right:calc((100% - 200px)/2);
}
.item:last-child {
margin-top: 2rem;
background: red;
}
<section>
<div class="item">
</div>
<div class="item">
</div>
</section>
Как видите, хитрость заключается в определении поля с учетом ширины контейнера (100%), и у нас будет два случая:
- Когда ширина больше, чем
Xpx
, у нас есть положительное поле и нормальное поведение с интервалом - Когда ширина меньше, чем
Xpx
, мы получим отрицательное поле и будет иметь эффект перекрытия без переноса.
Нам нужно просто найти хороший способ определить поле для получения необходимого поведения.Мы также можем рассмотреть медиазапрос, если нам нужно другое поведение, например отсутствие полей и наложение:
section {
border: 1px solid;
font-size:0;
}
.item{
height: 80px;
min-width: 80px;
background:blue;
display: inline-block;
vertical-align:top;
}
.item:nth-child(odd) {
margin-top: 2rem;
background: red;
}
@media all and (max-width:350px) {
.item{
margin-right:calc((100% - 320px)/4)
}
}
<section>
<div class="item">
</div>
<div class="item">
</div>
<div class="item">
</div>
<div class="item">
</div>
</section>
Другая идея, которая работает с вложенным элементом (например, с исходным кодом), заключается в том, чтобы переполнение было видимым и заставило внешний элемент сжатьсяиспользуя min-width:0
.
ul.current {
list-style: none;
display: flex;
width: 40%;
margin: 0 auto;
animation:change 2s infinite linear alternate;
}
@keyframes change {
from {width:100%}
to {width:40%}
}
li {
min-width:0;
}
li div {
border: 1px solid black;
background: green;
width: 10rem;
height: 10rem;
}
li:nth-child(odd) {
margin-top: 2rem;
}
li:nth-child(odd) div {
background: red;
}
/* GOAL */
section {
margin: 0 auto;
width: 40%;
}
.item {
position: absolute;
}
.item:last-child {
margin-top: 2rem;
margin-left: 5rem;
}
.content {
border: 1px solid black;
background: green;
width: 10rem;
height: 10rem;
}
.item:last-child .content {
background: red;
}
<ul class="current">
<li><div></div></li>
<li><div></div></li>
<li><div></div></li>
<li><div></div></li>
</ul>