防止内容扩展网格项

Prevent content from expanding grid items

提问人:Loilo 提问时间:4/10/2017 最后编辑:Loilo 更新时间:7/26/2023 访问量:279657

问:

TL;DR:有没有类似CSS网格的东西?table-layout: fixed


我试图创建一个年视图日历,其中有一个大的 4x3 网格用于月份,其中嵌套了 7x6 网格用于日期。

日历应填满页面,因此年份网格容器的宽度和高度各为 100%。

.year-grid {
  width: 100%;
  height: 100%;

  display: grid;
  grid-template: repeat(3, 1fr) / repeat(4, 1fr);
}

.month-grid {
  display: grid;
  grid-template: repeat(6, 1fr) / repeat(7, 1fr);
}

下面是一个工作示例:https://codepen.io/loilo/full/ryXLpO/

为简单起见,该笔中每个月都有 31 天,从星期一开始。

我还选择了一个小得离谱的字体来演示这个问题:

网格项目(= 日单元格)非常紧凑,因为页面上有几百个网格项目。一旦日期数字标签变得太大(随意使用左上角的按钮在笔中调整字体大小),网格的大小就会变大并超过页面的正文大小。

有什么方法可以防止这种行为吗?

我最初声明我的年份网格的宽度和高度为 100%,所以这可能是开始的重点,但我找不到任何与网格相关的 CSS 属性来满足这种需求。

免責聲明:我知道有一些非常简单的方法可以在不使用 CSS 网格布局的情况下设置该日历的样式。然而,这个问题更多的是关于该主题的一般知识,而不是解决具体的例子。

css 网格布局 css-grid

评论

0赞 Michael Coker 4/10/2017
你想发生什么?每个单元格中的字体可以是任何大小,并且永远不会导致网格单元格大小增加?
1赞 Loilo 4/10/2017
完全。基本上,如果我将网格项的大小设置为百分比值而不是分数,会发生什么,这是一种更方便的方法。
0赞 Loilo 4/10/2017
我基本上是在寻找表格布局的网格布局版本:固定(请参阅:codepen.io/loilo/pen/dvxpvq?editors=1100)
34赞 Lonnie Best 9/6/2018
这是整个CSS Grid规范中最大的痛点。它们需要是一个设置,其中网格区域无法转义其任何父网格容器的尺寸!事实上,对于深度嵌套的网格结构来说,这是一场噩梦。

答:

570赞 Michael Benjamin 4/10/2017 #1

默认情况下,网格项不能小于其内容的大小。

网格项的初始大小为 和 。min-width: automin-height: auto

您可以通过将网格项设置为 或设置为 以外的任何值来覆盖此行为。min-width: 0min-height: 0overflowvisible

从规格:

6.6. 网格的自动最小大小 项目

为了给网格项提供更合理的默认最小大小,本规范定义了 / 的值,同时将指定轴中的自动最小大小应用于 .(效果类似于对柔性项目施加的自动最小尺寸。automin-widthmin-heightoverflowvisible

以下是涵盖 flex 项的更详细说明,但它也适用于网格项:

这篇文章还介绍了嵌套容器的潜在问题以及主要浏览器之间已知的渲染差异


若要修复布局,请对代码进行以下调整:

.month-grid {
  display: grid;
  grid-template: repeat(6, 1fr) / repeat(7, 1fr);
  background: #fff;
  grid-gap: 2px;
  min-height: 0;  /* NEW */
  min-width: 0;   /* NEW; needed for Firefox */
}

.day-item {
  padding: 10px;
  background: #DFE7E7;
  overflow: hidden;  /* NEW */
  min-width: 0;      /* NEW; needed for Firefox */
}

jsFiddle 演示


1frminmax(0, 1fr)

上述解决方案在网格项级别运行。有关容器级解决方案,请参阅以下帖子:

评论

9赞 Loilo 4/10/2017
哇。这既迷人又有趣,我绝对不会通过尝试来想出这一点。您是否只是浏览了该信息的规格?因为在不知道该谷歌搜索什么之后,这就是我之前尝试过的,但我最终阅读了错误的部分(在得出错误的问题原因之后)。
3赞 user 4/16/2017
它固定了高度,但它继续在水平方向上增长,无济于事。我错过了什么吗?min-width: 0;
8赞 Knack 3/6/2018
对于嵌套网格,我们需要将其应用于所有级别。但我真的来这里是为了点赞,谢谢你。
8赞 Hugo Mallet 1/17/2020
CSS 规范贡献者应停止服药。为什么不是一个新关键字?为什么要对已经存在的属性进行甚至没有意义的特殊行为?...css 会变得简单直观吗?
4赞 vovchisko 2/8/2021
minmax里克简直完美!
170赞 FremyCompany 9/18/2018 #2

前面的答案很好,但我也想提一下,网格有一个固定的布局等效物,你只需要写而不是作为你的轨道大小。minmax(0, 1fr)1fr

评论

18赞 Thierry Prost 11/25/2018
我推荐这种方法,而不是以前接受的答案。
2赞 BAERUS 1/22/2019
虽然这有效,但我有点不明白......你能解释一下为什么这有效吗?minmax(0, 1fr) 在做什么?这不应该总是 0 吗?我很困惑:(
14赞 Mikko Rantalainen 2/7/2019
minmax(0, 1fr)有效,因为实际上是 的简写,它不是原始问题的正确值。1frminmax(auto,1fr)
2赞 Mikko Rantalainen 2/7/2019
有关其他详细信息,请参阅 github.com/w3c/csswg-drafts/issues/1777
6赞 shinzou 7/30/2020
所有其他答案都是黑客,这应该是公认的答案
13赞 bjnsn 11/15/2019 #3

现有的答案可以解决大多数情况。但是,我遇到了一个情况,我需要网格单元格的内容是 。我通过绝对定位在包装器中解决了它(不理想,但我知道的最好的),如下所示:overflow: visible


.month-grid {
  display: grid;
  grid-template: repeat(6, 1fr) / repeat(7, 1fr);
  background: #fff;
  grid-gap: 2px;  
}

.day-item-wrapper {
  position: relative;
}

.day-item {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  padding: 10px;

  background: rgba(0,0,0,0.1);
}

https://codepen.io/bjnsn/pen/vYYVPZv

评论

2赞 HamsterWithPitchfork 2/12/2022
当有人问什么是CSS黑客时,他们应该被指出这个答案。
0赞 mdomino 9/13/2022
谢谢,这是在我的特定情况下唯一有效的解决方案。
0赞 Akash Kava 6/22/2023
这是正确答案,不需要创建,而是可以添加规则.day-item-wrapper.month-grid > * { position: relative; }