示例HTML和CSS:

.root {
  background-color: green;
}

.outer {
    display: grid;
    grid-template-rows: 100vh;
    grid-template-columns: 100px;
    padding: 5rem;
    overflow-y: auto;
}

.nav {
  background-color: red;
  height: 150vh;
}
 
* {
  box-sizing: border-box;
}
<div class="root">
  <div class="outer">
    <div class="nav"></div>
  </div>
</div>

小提琴示例:https://jsfiddle.net/dr18cbet/

在这个精心设计的示例中,滚动到网格容器的底部不包括网格容器的底部填充.

当然还有更好的方法来组织这些代码,例如,将填充和溢出设置移动到网格项(在本例中为nav).我还注意到,如果我将grid-template-rows设置为默认值auto,填充也会按预期显示.但是,在网格容器上的这种溢出+填充设置的组合以及获得外部高度(在示例中为100vh)的网格项会导致不应用容器的底部填充.为什么会这样?我翻遍了css的说明书,但找不到解释.

推荐答案

诀窍在于,您必须考虑网格区域,它是网格容器和网格项之间的一种"额外包装".

溢出应用于网格容器,网格区域没有溢出,但网格项溢出了网格区域(而不是网格容器).

这里有另一个代码可以更好地理解.第一个div没有溢出(网格区域),但嵌套的div(网格项)溢出,在这种配置中,底部填充不可见,但仍然存在,嵌套的div与其重叠.

.box {
  border: 2px solid;
  height: 200px;
  aspect-ratio: 1;
  padding: 20px;
  box-sizing: border-box;
  overflow: auto;
}

.box > div {
  height: 100%;
}

.box > div > div {
  height: 220px;
  background: blue;
}
<div class="box">
  <div>
    <div></div>
  </div>
</div>

这有点棘手,但它与css网格无关.这就是溢出的行为方式.

in the specification个地方,你可以读到:

注意:在可滚动的溢出矩形中,此填充表示框自身的填充,以便当其内容滚动到末尾时,在其流入(或浮动)内容的末端边缘和框的边界边缘之间有填充.它通常最终与框自己的填充大小完全相同,except in a few cases—such与流外定位元素or the visible overflow of a descendant, has already increased the size of the scrollable overflow rectangle outside the conceptual “content edge” of the scroll container’s content.的大小相同

"可见的子孙溢出"是这里的关键.

Css相关问答推荐

在Powershell中使用正则表达式编辑css文件

如何将CSS Paint API与Reaction一起使用

Mat-Form-字段占用更多区域,导致其他控件远离它

如何使重复线性渐变适合字体大小?

如何使用TailwindCSS溢出?

当滚动量较小时,在滚动问题上动画粘性导航

为什么我的 CSS 转换在 React 18 中不起作用

通过 CSS 中的媒体查询更改站点的页面大小

Material UI Modal 因背景而变暗

使用 css 网格和 nth-child 交替行

基于类的 CSS Select 器

在同一旋转中以度数变换旋转

  • 元素上的子弹来自哪里?
  • 如何从 表格单元格中创建链接

    BEM 块、命名和嵌套

    我应该使用 CSS :disabled 伪类还是 [disabled] 属性 Select 器,还是见仁见智?

    使用 Twitter Bootstrap 使页脚粘在页面底部

    CSS 表格 td 宽度 - 固定,不灵活

    将 Fixed div 设置为父容器的 100% 宽度

    CSS关键帧动画CPU占用率高,应该这样吗?