如何在 CSS 网格中滚动?
How to get scrolling in a CSS grid?
我在 css 网格中嵌入了一个组件。
在堆栈闪电战中,我有一个 3 行的外部网格。其中一行有一个最小宽度。如果视口小于最小宽度,如何让它水平滚动?
在中间一行中,我有一个本身使用 2 列网格的组件。列中的 div 具有最小高度。
我正在寻找的是,如果视口的大小调整到整个内部组件(红色框)不可见,则红色框是可滚动的。
这里是堆栈闪电战:
https://stackblitz.com/edit/angular-q4geyk
这是另一个例子:
html {
box-sizing: border-box;
}
*,
*:before,
*:after {
box-sizing: inherit;
}
.content {
display: grid;
grid-template-rows: 2em 1fr 1px;
grid-gap: 0.5rem;
height: 20em;
}
.my-panel {
border: 1 green solid;
background-color: red;
padding: 0.25rem;
}
.my-component {
display: grid;
grid-template-columns: 1fr 1fr;
grid-gap: 0.5rem;
padding: 0.25rem;
height: 100%;
}
header {
border: green solid 1px;
padding: 4px;
}
main {
border: blue solid 1px;
padding: 1rem;
}
main div {
border: red solid 1px;
height: 100%;
}
footer {
border-bottom: black solid 1px;
}
<div class="content">
<header>
<div>Component Showcase</div>
</header>
<main>
<div>
<section class="my-component">
<div class="my-panel"> </div>
<div class="my-panel"> </div>
</section>
</div>
</main>
<footer></footer>
</div>
您在布局方面遇到两个主要问题:
首先,默认情况下,网格项不能小于其内容。默认值为 min-width: auto
和 min-height: auto
。因此,main
元素(app-root
中的网格项)需要覆盖。
将 min-width: 0
添加到 main
。
这里有更完整的解释:
第二个,您将两列的红框设置为:
grid-template-columns: 1fr 1fr
这意味着每个列将在容器中平等分配空闲 space。如果这些列中没有任何内容,两列都可以简单地缩小到 0 宽度,而不会触发溢出。因此,没有滚动条。
如果你这样做也会存在同样的问题:
grid-template-columns: 50% 50%
因此,除非这些列中始终有内容强制设置最小宽度,否则我会推荐这样的内容:
grid-template-columns: minmax(250px, 1fr) minmax(250px, 1fr)
https://stackblitz.com/edit/angular-ortstl?file=src/styles.css
.the_div_you_want_to_scroll{
display: grid ;
align-items: center ;
grid-auto-flow: row ;
grid-auto-rows: 25% ; // play with this to change height of the children, 50% will fill half
grid-template-columns: unset; // do not set template columns and rows
grid-template-rows: unset;
overflow: scroll;
}
这样你可以根据需要添加多少children,在网格系统中,使用模板时总是很难维护动态内容,
当您无法预测您将获得多少物品时,请使用grid-auto-flow
✌
我在 css 网格中嵌入了一个组件。
在堆栈闪电战中,我有一个 3 行的外部网格。其中一行有一个最小宽度。如果视口小于最小宽度,如何让它水平滚动?
在中间一行中,我有一个本身使用 2 列网格的组件。列中的 div 具有最小高度。
我正在寻找的是,如果视口的大小调整到整个内部组件(红色框)不可见,则红色框是可滚动的。
这里是堆栈闪电战:
https://stackblitz.com/edit/angular-q4geyk
这是另一个例子:
html {
box-sizing: border-box;
}
*,
*:before,
*:after {
box-sizing: inherit;
}
.content {
display: grid;
grid-template-rows: 2em 1fr 1px;
grid-gap: 0.5rem;
height: 20em;
}
.my-panel {
border: 1 green solid;
background-color: red;
padding: 0.25rem;
}
.my-component {
display: grid;
grid-template-columns: 1fr 1fr;
grid-gap: 0.5rem;
padding: 0.25rem;
height: 100%;
}
header {
border: green solid 1px;
padding: 4px;
}
main {
border: blue solid 1px;
padding: 1rem;
}
main div {
border: red solid 1px;
height: 100%;
}
footer {
border-bottom: black solid 1px;
}
<div class="content">
<header>
<div>Component Showcase</div>
</header>
<main>
<div>
<section class="my-component">
<div class="my-panel"> </div>
<div class="my-panel"> </div>
</section>
</div>
</main>
<footer></footer>
</div>
您在布局方面遇到两个主要问题:
首先,默认情况下,网格项不能小于其内容。默认值为 min-width: auto
和 min-height: auto
。因此,main
元素(app-root
中的网格项)需要覆盖。
将 min-width: 0
添加到 main
。
这里有更完整的解释:
第二个,您将两列的红框设置为:
grid-template-columns: 1fr 1fr
这意味着每个列将在容器中平等分配空闲 space。如果这些列中没有任何内容,两列都可以简单地缩小到 0 宽度,而不会触发溢出。因此,没有滚动条。
如果你这样做也会存在同样的问题:
grid-template-columns: 50% 50%
因此,除非这些列中始终有内容强制设置最小宽度,否则我会推荐这样的内容:
grid-template-columns: minmax(250px, 1fr) minmax(250px, 1fr)
https://stackblitz.com/edit/angular-ortstl?file=src/styles.css
.the_div_you_want_to_scroll{
display: grid ;
align-items: center ;
grid-auto-flow: row ;
grid-auto-rows: 25% ; // play with this to change height of the children, 50% will fill half
grid-template-columns: unset; // do not set template columns and rows
grid-template-rows: unset;
overflow: scroll;
}
这样你可以根据需要添加多少children,在网格系统中,使用模板时总是很难维护动态内容,
当您无法预测您将获得多少物品时,请使用grid-auto-flow
✌