【发布时间】:2020-04-30 18:38:28
【问题描述】:
关于如何防止 flex child 成长的信息太多,但很难找到如何防止 flex PARENT 成长(因为孩子)。
考虑下面的布局:
- 外部元素的高度和宽度是固定的(可能适用于本机应用程序)
- 页眉和页脚不增长也不缩小。此外,页脚始终位于底部。
- 主要内容(页眉和页脚之间)占用所有可用空间。
- 主要内容没有滚动。
- 但内部元素可以滚动。例如。部分标题下方的滚动视图:
初步解决方案:
.layout {
display: flex;
flex-direction: column;
width: 640px;
height: 300px;
background: rgba(220, 20, 60, 0.2);
}
.header {
flex: 0 0 auto;
padding: 4px 8px;
background: rgba(220, 20, 60, 0.2);
}
.content {
display: flex;
flex-direction: column;
flex: 1 1 auto;
padding: 4px 8px;
background: rgba(255, 69, 0, 0.2);
overflow-y: hidden;
}
.title {
flex: 0 0 auto;
background: rgba(255, 255, 0, 0.2);
}
.splitView {
display: flex;
flex: 1 1 auto;
background: rgba(0, 128, 128, 0.2);
overflow-y: hidden;
}
.splitView-section {
display: flex;
flex-direction: column;
flex: 1 1 50%;
}
.splitView-section:first-child {
background: rgba(0, 191, 255, 0.2);
}
.splitView-section:last-child {
background: rgba(0, 0, 255, 0.2);
}
.scrollView {
flex: 1 1 auto;
background: rgba(165, 42, 42, 0.2);
overflow-y: auto;
}
.veryBigElement {
background: #CD5C5C;
width: 50px;
height: 500px;
box-shadow: rgba(0, 0, 0, 0.25) 0 0 6px
}
.footer {
flex: 0 0 auto;
padding: 4px 8px;
background: rgba(173, 255, 47, 0.2);
}
<div class="layout">
<div class="header">I am header</div>
<div class="content">
<div class="title">Title</div>
<div class="splitView">
<div class="splitView-section">
<div class="sectionTitle">Section title</div>
<div class="scrollView">
<div class="veryBigElement"></div>
</div>
</div>
<div class="splitView-section"></div>
</div>
</div>
<div class="footer">I am footer</div>
</div>
-
外部元素的高度和宽度是固定的:比如
width: 640px和height: 300px;。 -
页眉和页脚不会增长也不会缩小。
flex: 0 0 auto用于页眉和页脚。 -
主要内容(页眉和页脚之间)占用所有可用空间。
flex: 1 1 auto。 -
页脚也总是在底部。页脚不需要
margin-top: auto,因为它被主要内容压到了底部。 - 主要内容没有滚动。默认情况下不会滚动。
-
但内部元素可以滚动。
overflow-y: auto用于滚动视图。
它有效。但是有一个问题:如果我们添加一些带有阴影的元素(例如,滚动视图的卡片),因为overflow-y: hidden 对应于.splitView 和.content,我们将看不到它的一部分。例如。如果要为.veryBigElement 添加box-shadow: rgba(black, 0.25) 0 0 6px,我们只看到:
因此,根据设计,可能无法使用上述解决方案。如果我们从.splitView 和.content 中删除overflow-y: hidden,则splitView-section 将增长而不管overflow-y: auto 的.scrollView。
请不要这样:
- 我们不知道页眉的高度和页脚的高度(假设它的内容是动态的)。
- 我们无法计算
.scrollView的高度,甚至无法计算splitView的高度:在实际应用中它可能是很多内容而不是'.title'。
JSFiddle:https://jsfiddle.net/teyqkrh8/
【问题讨论】:
-
box-shadow 到底有什么问题?这似乎很正常。是因为在其他元素上看不到吗?预期的结果是什么?
-
@Salix,问题是:我们看到红色矩形的阴影正好,但想看到所有四边阴影。
-
你想让阴影覆盖其他部分吗?
-
“章节标题”是否增长?还是总是一样高?
-
通过将 'scrollView' 放在另一个容器中,您可以使用该容器来定位并给出 veryBigElement 上的 ':after' 元素的高度。在我的回答中查看更新的 codepen。