我有一个flexbox
(flex-direction: row
),内容包含2列和固定高度。我希望左右列分别具有红色和蓝色背景。如果任一列溢出,则会出现flexbox
的滚动条(溢出的部分仍为红色/蓝色)。如果列的内容高度小于flexbox
的高度,则下方空格仍应为红色/蓝色。
不使用渐变颜色或javascript,我该如何实现这种效果?
演示(我希望灰色部分为蓝色):
#c1 {
background-color: gray;
display: flex;
height: 200px;
overflow-y: auto;
align-items: baseline;
}
#left {
flex: 1;
background-color: red;
}
#right {
flex: 1;
background-color: blue;
}

<div id="c1">
<div id="left">
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
</div>
<div id="right">
<div>line</div>
</div>
</div>
&#13;
不起作用的方法:
align-items: stretch
:溢出的部分将为灰色position: absolute
的{{1}} div
,仅用于背景:如果滚动条可见,此flexbox
的宽度将会错误。答案 0 :(得分:1)
当您修复父级的高度并使用display flex时,子级的高度将自动适合高度父级。所以在这种情况下,你需要使用js来改变孩子的身高。如果您不想使用js,那么您只需执行以下操作:
#c1 {
background-color: gray;
height: 200px;
overflow-y: auto;
}
#left {
background-color: red;
}
#right {
background-color: blue;
}
#left, #right{
display:table-cell;
width:200px;
}
<div id="c1">
<div id="left">
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
</div>
<div id="right">
<div>line</div>
</div>
</div>
答案 1 :(得分:1)
我认为对容器使用display: table;
会更容易,对列使用display: table-cell;
会更容易。像表一样的元素,你可以获得你想要的渲染。
我不得不添加另一个容器,因为你不能轻易地限制table
的高度。
#c1 {
background-color: gray;
height: 200px;
overflow-y: auto;
}
.table {
display: table;
width: 100%;
}
#left {
background-color: red;
}
#right {
background-color: blue;
}
#left, #right {
display: table-cell;
width: 50%;
}
<div id="c1">
<div class="table">
<div id="left">
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
</div>
<div id="right">
<div>line</div>
</div>
</div>
</div>
答案 2 :(得分:1)
用另一个div包裹左右div,设置display flex和min-height:该div的min-content。也为左右div设置了100%的高度。
#c1 {
background-color: gray;
display: flex;
height: 200px;
overflow-y: auto;
}
#wrap{
display:flex;
width:100%;
min-height:min-content;
}
#left {
flex: 1;
background-color: red;
height:100%;
}
#right {
flex: 1;
background-color: blue;
height:100%;
}
<div id="c1">
<div id='wrap'>
<div id="left">
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
</div>
<div id="right">
<div>line</div>
</div>
</div>
</div>
答案 3 :(得分:0)
根据Nithin Charly的回答,我得到了这个:
(由于错误,在IE中无法正常工作)
#c1 {
background-color: gray;
height: 200px;
overflow-y: auto;
}
#wrap {
display: flex;
min-height: 100%;
align-items: stretch;
}
#left {
flex: 1;
background-color: red;
}
#right {
flex: 1;
background-color: blue;
}
<div id="c1">
<div id="wrap">
<div id="left">
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
</div>
<div id="right">
<div>line</div>
</div>
</div>
</div>
答案 4 :(得分:-1)
问题在于align-items: baseline
。你可以把它留下来或用拉伸代替它,你会得到你想要的东西。
#c1 {
background-color: gray;
display: flex;
height: 200px;
overflow-y: auto;
/* align-items: baseline; */
}
#left {
flex: 1;
background-color: red;
}
#right {
flex: 1;
background-color: blue;
}
<div id="c1">
<div id="left">
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
<div>line</div>
</div>
<div id="right">
<div>line</div>
</div>
</div>