css - 如何防止网格区域的内部内容向下突出?
问题描述
我一直致力于构建一个包含一些“面板”和“行”的网格布局区域。每个面板由标题和主要元素组成,其中一些主要元素内部有一些项目。
这是我的演示。https://codepen.io/bunatree/pen/Vwjqmod
#canvas {
padding: 10px;
display: grid;
gap: 10px;
grid-template:
"bar1 bar1 "
"panel1 panel2"
"bar2 bar2 "
"panel3 panel4"
/1fr 1fr
}
#sidebar {
grid-area: side;
background-color: #c99;
}
#panel1 {
grid-area: panel1;
}
#panel2 {
grid-area: panel2;
}
#panel3 {
grid-area: panel3;
}
#panel4 {
grid-area: panel4;
}
#bar1 {
grid-area: bar1;
}
#bar2 {
grid-area: bar2;
}
.panel {
padding: 10px;
background-color: #ccc;
}
.bar {
background-color: rgba(0,128,255,0.5);
padding: 20px;
}
header {
background-color: #9c9;
padding: 10px;
}
main {
min-height: 30px;
padding: 10px;
background-color: #c9c;
/* I set this 100% height here so that
the bottom of the main area reaches
the bottom of the panel div. */
height: 100%;
}
.item {
background-color: #cc9;
padding: 10px;
margin: 10px 0;
}
<div id="canvas">
<div class="bar" id="bar1">Bar 1</div>
<div class="panel" id="panel1">
<header>Panel 1</header>
<main>
<div class="item">Item 1</div>
<div class="item">Item 2</div>
</main>
</div>
<div class="panel" id="panel2">
<header>Panel 2</header>
<main>
<div class="item">Item 1</div>
</main>
</div>
<div class="bar" id="bar2">Bar 2</div>
<div class="panel" id="panel3">
<header>Panel 3</header>
<main>
</main>
</div>
<div class="panel" id="panel4">
<header>Panel 4</header>
<main>
<div class="item">Item 1</div>
</main>
</div>
</div>
但是,它使主要区域向下突出。
没有 100% 高度设置,溢出问题得到解决,但主要元素的高度适合内部项目的总高度。
没有设置 100% 高度,当没有内项时,主元素的高度会变短。
所以,我的问题是如何扩展主元素的高度而不把它伸出来,而不管内部项目的数量是多少。
如果有人帮助我,我会很高兴。谢谢你。
解决方案
自己解决了这个问题。
我不得不;
- 停止对主要元素使用 100% 高度。(这使它从网格区域溢出。)
- 将 display: flex 和 flex-direction: column 设置为 .panel 元素。
- 将 flex-grow: 1 设置为主要元素以垂直扩展它。
运行下面的代码,您将看到主元素(背景:紫色)的高度垂直适合面板元素的内部(背景:灰色)。
#canvas {
padding: 10px;
display: grid;
gap: 10px;
grid-template:
"bar1 bar1 "
"panel1 panel2"
"bar2 bar2 "
"panel3 panel4"
/1fr 1fr
}
#panel1 {
grid-area: panel1;
}
#panel2 {
grid-area: panel2;
}
#panel3 {
grid-area: panel3;
}
#panel4 {
grid-area: panel4;
}
#bar1 {
grid-area: bar1;
}
#bar2 {
grid-area: bar2;
}
.panel {
padding: 10px;
background-color: #ccc;
/* Set flex here,
and set flex-grow: 1 for the main element. */
display: flex;
flex-direction: column;
}
.bar {
background-color: rgba(0,128,255,0.5);
padding: 20px;
}
header {
background-color: #9c9;
padding: 10px;
}
main {
min-height: 30px;
padding: 10px;
background-color: #c9c;
/* Use not height here but flex in the .panel element,
and set flex-grow:1 here. */
/* height: 100%; */
flex-grow: 1;
}
.item {
background-color: #cc9;
padding: 10px;
margin: 10px 0;
}
<div id="canvas">
<div class="bar" id="bar1">Bar 1</div>
<div class="panel" id="panel1">
<header>Panel 1</header>
<main>
<div class="item">Item 1</div>
<div class="item">Item 2</div>
</main>
</div>
<div class="panel" id="panel2">
<header>Panel 2</header>
<main>
<div class="item">Item 1</div>
</main>
</div>
<div class="bar" id="bar2">Bar 2</div>
<div class="panel" id="panel3">
<header>Panel 3</header>
<main>
</main>
</div>
<div class="panel" id="panel4">
<header>Panel 4</header>
<main>
<div class="item">Item 1</div>
</main>
</div>
</div>
推荐阅读
- css - 减少复选框/单选按钮组的重复 CSS 代码
- r - 根据两个单独的匹配要求删除一行
- java - com.jayway.jsonpath.InvalidPathException:无效路径 $myVar.id
- c# - 使用“GetConversationItems”时抛出的调用者或应用程序无法使用请求的 Web 方法
- javascript - 确定是千位还是百位还是十位
- c# - 如果在指定时间内未单击按钮,则关闭表单并打开第二个表单
- php - 在 cakephp 中集成 fullcalendar,哪些文件要包含在哪里?
- java - 检查一个arraylist中的相同值并将数量添加到android中第二个arraylist中的相应值
- arrays - 如何在 MIP 汇编代码中获得有效的冒泡排序?
- java - java - 如何从java中的一个输入提示将多个值放入一个数组中?