我一直在使用 CSS Grid Layouts第一次,他们很棒。但是,现在我无法控制其中一个网格单元。
我想要的是有一个元素占用现有的可用空间并且不再,当内容变得太大时滚动。我的理解是,在计算完所有其他内容后,1fr
的网格大小会占用统一数量的可用空间。我尝试了各种尺寸,例如 minmax(auto, 1fr)
但无济于事 - 1fr
似乎会扩展以适应我不想要的内容。设置像 100px
这样的最大尺寸也不好,因为我希望尺寸由网格中的其他元素决定。
例子如下:
.container {
display: grid;
grid-template-rows: auto 1fr auto;
grid-template-columns: 1fr 1fr;
}
.container>div {
border: 1px solid blue;
border-radius: 5px;
}
.left {
grid-column: 1;
grid-row: 1/4;
}
.header {
grid-column: 2;
grid-row: 1;
}
.problem-child {
grid-column: 2;
grid-row: 2;
overflow-y: scroll;
}
.footer {
grid-column: 2;
grid-row: 3;
}
<div class="container">
<div class="left">left<br>I don't want this one to scroll<br>this should<br>determine<br>the height of the whole grid container</div>
<div class="header">column header</div>
<div class="problem-child">problem child:<br>I<br>want<br>this<br>to<br>scroll<br>rather<br>than<br>making<br>everything<br>tall</div>
<div class="footer">column footer</div>
</div>
我可以使用什么网格声明(如果有的话)让“有问题的 child ”在溢出时滚动而不是展开?
最佳答案
您可以使用 max-height:100%;
和 min-height
来保留足够的高度以显示正确的滚动条。(firefox会做,chrome 目前不会)
.container {
display: grid;
grid-template-rows: auto minmax(1fr, 25vh) auto;
grid-template-columns: 1fr 1fr;
}
.container>div {
border: 1px solid blue;
border-radius: 5px;
}
.left {
grid-column: 1;
grid-row: 1/4;
}
.header {
grid-column: 2;
grid-row: 1;
}
.problem-child {
grid-column: 2;
grid-row: 2;
min-height:4em;
max-height:100%;
overflow-y: auto;
}
.footer {
grid-column: 2;
grid-row: 3;
}
<div class="container">
<div class="left">left<br>I don't want this one to scroll<br>this should<br>determine<br>the height of the whole grid container</div>
<div class="header">column header</div>
<div class="problem-child">problem child:<br>I<br>want<br>this<br>to<br>scroll<br>rather<br>than<br>making<br>everything<br>tall</div>
<div class="footer">column footer</div>
</div>
作为解决方法,您还可以在 absolute
位置使用额外的包装器将其从流中移除并将其调整为行的高度:(这两种情况都需要一个最小高度在需要时正确显示滚动条)
.container {
display: grid;
grid-template-rows: auto 1fr auto;
grid-template-columns: 1fr 1fr;
}
.container>div {
border: 1px solid blue;
border-radius: 5px;
}
.left {
grid-column: 1;
grid-row: 1/4;
}
.header {
grid-column: 2;
grid-row: 1;
}
.problem-child {
grid-column: 2;
grid-row: 2;
position:relative;
min-height:4em;
}
.problem-child >div {
position:absolute;
top:0;
left:0;
right:0;
max-height:100%;
overflow:auto ;
}
.footer {
grid-column: 2;
grid-row: 3;
}
<div class="container">
<div class="left">left<br>I don't want this one to scroll<br>this should<br>determine<br>the height of the whole grid container</div>
<div class="header">column header</div>
<div class="problem-child">
<div>problem child:<br>I<br>want<br>this<br>to<br>scroll<br>rather<br>than<br>making<br>everything<br>tall</div>
</div>
<div class="footer">column footer</div>
</div>
关于CSS 网格 : content to use free space but scroll when bigger,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43352501/