Вы можете добавить flex: 1
к cell
, чтобы строки имели одинаковые пробелы.Также добавьте overflow: auto
, чтобы при необходимости прокручивать любой дополнительный контент.Если вы хотите, чтобы три столбца разделяли горизонтальное пространство одинаково, просто добавьте flex: 1
к col
- см. Демонстрацию ниже:
.double-row {
display: flex;
border: 2px solid blue;
}
.col {
border-right: 1px solid grey;
flex: 1; /* if columns must share equal space */
}
.first-col {
display: flex;
align-items: center;
padding: 10px;
}
.other-col {
display: flex;
flex-direction: column;
}
.cell {
padding: 10px;
border-bottom: 1px solid grey;
flex: 1; /* equal rows */
overflow: auto; /* overflow if content is more */
}
.cell.upper {
background: #00FF002F;
}
.cell.down {
background: #FF00002F;
}
input {
width: 100%; /* added */
}
<div class="double-row">
<div class="col first-col">
<h1>
Double Row
</h1>
</div>
<div class="col other-col">
<div class="cell upper">
<p>
Upper Text
</p>
</div>
<div class="cell down">
<input type="text">
<p>
Bottom Text
</p>
<p>
Bottom Text
</p>
<p>
Bottom Text
</p>
</div>
</div>
<div class="col other-col">
<div class="cell upper">
</div>
<div class="cell down">
<input type="text">
<p>
Bottom Text
</p>
</div>
</div>
</div>
Без переполнения и выравнивания высоты по наибольшей ячейке с flexbox работать некорректно - см. Демонстрацию ниже с min-height: 50%
для other-cell cell
,Контейнер в целом не растет:
.double-row {
display: flex;
border: 2px solid blue;
}
.col {
border-right: 1px solid grey;
flex: 1; /* if columns must share equal space */
}
.first-col {
display: flex;
align-items: center;
padding: 10px;
}
.other-col {
display: flex;
flex-direction: column;
}
.other-col .cell {
min-height: 50%; /* added */
}
.cell {
padding: 10px;
border-bottom: 1px solid grey;
flex: 1; /* equal rows */
}
.cell.upper {
background: #00FF002F;
}
.cell.down {
background: #FF00002F;
}
input {
width: 100%; /* added */
}
<div class="double-row">
<div class="col first-col">
<h1>
Double Row
</h1>
</div>
<div class="col other-col">
<div class="cell upper">
<p>
Upper Text
</p>
</div>
<div class="cell down">
<input type="text">
<p>
Bottom Text
</p>
<p>
Bottom Text
</p>
<p>
Bottom Text
</p>
</div>
</div>
<div class="col other-col">
<div class="cell upper">
</div>
<div class="cell down">
<input type="text">
<p>
Bottom Text
</p>
</div>
</div>
</div>
Мы можем переключиться на CSS-сетки, поскольку макет здесь имеет 2D-поведение - чтобы получить желаемый макет, мы можем использовать сетку 3x2, где каждая ячейка занимает1fr пробел (что означает, что строки будут расти равными) - см. Демонстрацию ниже:
.double-row {
display: grid;
grid-template-columns: 1fr 1fr 1fr; /* 3 equal columns */
grid-template-rows: 1fr 1fr; /* 2 equal rows */
border: 2px solid blue;
}
.col {
border-right: 1px solid grey;
}
.first-col {
display: flex;
align-items: center;
padding: 10px;
grid-row: 1 / span 2; /* occupy the first two rows */
}
.other-col {
display: contents; /* promote the 'cell' to grid item */
}
.first-col + .other-col .cell {
border-right: 1px solid grey; /* border fix */
}
.cell {
padding: 10px;
border-bottom: 1px solid grey;
}
.cell.upper {
background: #00FF002F;
grid-row: 1; /* place in first row */
}
.cell.down {
background: #FF00002F;
}
input {
width: 100%; /* added */
}
<div class="double-row">
<div class="col first-col">
<h1>
Double Row
</h1>
</div>
<div class="col other-col">
<div class="cell upper">
<p>
Upper Text
</p>
</div>
<div class="cell down">
<input type="text">
<p>
Bottom Text
</p>
<p>
Bottom Text
</p>
<p>
Bottom Text
</p>
</div>
</div>
<div class="col other-col">
<div class="cell upper">
</div>
<div class="cell down">
<input type="text">
<p>
Bottom Text
</p>
</div>
</div>
</div>