После небольшого усилия я придумал это
Давайте немного углубимся в это
html довольно просто
<div id="app">
<div class="flex">
<div class="row" id="item1"></div>
<div class="row" id="item2"></div>
<div class="row" id="item3"></div>
</div>
<div id="top"></div>
</div>
у нас есть контейнер верхнего уровня #app
, контейнер для наших слоев div.flex
и div.top
, элемент, который мы будем располагать поверх.
Запускается css немного по шаблону, просто для начала
html,body{
margin:0;
padding: 0;
height: 100%;
}
.flex{
display: flex;
flex-direction: column;
}
#item1{
background: teal;
}
#item2{
background: pink;
}
#item3{
background:orange;
}
бит html, body
просто для того, чтобы демо выглядело хорошо в jsfiddle. В противном случае это будет компенсировано. Брутто.
Затем мы определяем .flex
так, чтобы каждый из его элементов заполнял контейнер, т.е. изгибался по всем columns
слева направо
, наконец, мы даем каждому элементу .row
цвет
При этом мы получим 3 полосы цвета одинакового размера, равномерно распределенные внутри div
Интересная часть
#app{
position: relative;
}
#top{
position: absolute;
top: 0;
background: white;
margin: 20px;
width: calc(100% - 40px);
height: calc(100% - 40px);
}
Теперь я должен признать, что мой понимание немного шатко, если я ошибаюсь, поправьте меня.
Теперь нам нужно, чтобы #top
нарушил нормальный поток макета. Мы не хотим, чтобы его просто поместили ниже предыдущего div. Для этого мы можем сказать position: absolute
, но этого недостаточно.
position: absolute
ищет ближайшего предка с position: relative
и выравнивается с этим предком. Поэтому, если мы хотим позиционировать #top
относительно его контейнера #app
#app{
position: relative;
}
#top{
position: absolute;
top: 0;
}
top:0
, выровняйте #top
к вершине #app
. Поиграйте с ним в скрипке, чтобы получить solid гр asp.
Наконец
#top{
position: absolute;
top: 0;
background: white;
margin: 20px;
}
нам нужно небольшое поле по краю #top
, чтобы мы могли видеть цвета позади, и мы покрыли это margin: 20px
. Теперь нам нужно вычесть 2 * margin
из width
и height
, чтобы все правильно выстроить
#top{
position: absolute;
top: 0;
background: white;
margin: 20px;
width: calc(100% - 40px);
height: calc(100% - 40px);
}
Надеюсь, это поможет!
Fin
PS Поиграйте с числами в скрипке. Это должно очень помочь
html,body{
margin:0;
padding: 0;
height: 100%;
}
div{
width: 100%;
height: 100%;
}
.flex{
display: flex;
flex-direction: column;
}
#item1{
background: teal;
}
#item2{
background: pink;
}
#item3{
background:orange;
}
#app{
position: relative;
}
#top{
position: absolute;
top: 0;
background: white;
margin: 20px;
width: calc(100% - 40px);
height: calc(100% - 40px);
}
<div id="app">
<div class="flex">
<div class="row" id="item1"></div>
<div class="row" id="item2"></div>
<div class="row" id="item3"></div>
</div>
<div id="top"></div>
</div>