防止内容扩展网格项

Loi*_*ilo 113 css css3 grid-layout css-grid

TL; DR:table-layout: fixed CSS网格有什么相似之处吗?


我尝试创建一个带有大型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);
}
Run Code Online (Sandbox Code Playgroud)

这是一个有效的例子:https://codepen.io/loilo/full/ryXLpO/

为简单起见,该笔每个月都有31天,周一开始.

我还选择了一个可笑的小字体来演示这个问题:

网格项(=日单元格)非常精简,因为页面上有数百个.一旦日期数字标签变得太大(可以使用左上方的按钮随意使用笔中的字体大小),网格的大小将会增大并超过页面的主体大小.

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

我最初声明我的年度网格在宽度和高度上都是100%,所以这可能是重要的一点,但我找不到任何符合网格的CSS属性.

免责声明:我知道有很简单的方法可以在不使用CSS Grid Layout的情况下设置日历的样式.然而,这个问题更多的是关于该主题的一般知识而不是解决具体的例子.

Mic*_*l_B 197

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

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

您可以通过将网格项设置为min-width: 0,min-height: 0overflow使用除以外的任何值来覆盖此行为visible.

从规格:

6.6.网格项的自动最小尺寸

为了为网格项提供更合理的默认最小大小,此规范定义/ 的auto值还将指定轴中的自动最小大小应用于其为的网格项.(效果类似于弹性项目的自动最小尺寸.)min-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 */
}
Run Code Online (Sandbox Code Playgroud)

修改后的codepen


1fr VS minmax(0, 1fr)

上述解决方案在网格项级别运行.对于容器级解决方案,请参阅此帖子:

  • 这个修复是金色的.病了.这病了.不生病意味着坏,但生病意味着好.Unbeweebabble. (8认同)
  • `minmax` 做得非常完美! (4认同)
  • CSS 规范贡献者应该停止吸毒。为什么不换一个新的关键词呢?为什么要对已经存在的财产做出甚至没有意义的特殊行为?...CSS 会变得简单直观吗? (3认同)
  • 哇.那是同时令人着迷和有趣的事情,我绝对不会想到这只是试着四处走动.您是否只是浏览一下这些信息的规格?因为在不知道谷歌的内容之后,这就是我之前尝试过的,但我最后读错了部分(在得出问题的错误原因之后). (2认同)
  • 我之前曾遇到过这个问题 [**flex items**](http://stackoverflow.com/q/36247140/3597276)。由于 Flex 和网格项之间有很多相似之处,我认为行为可能是相同的,并专注于规范的该部分。 (2认同)
  • 它固定了高度,但它继续在水平方向增长,`min-width: 0;` 没有帮助。我错过了什么吗? (2认同)
  • @user,Chrome 和 Firefox 之间的网格布局实现明显不同。我的答案中的原始代码适用于 Chrome。但要在FF中工作还需要进一步调整。将“min-width: 0”添加到“.month-grid”和“.day-item”。答案已修改。 (2认同)
  • 对于嵌套网格,我们需要将其应用于所有级别.但我真的来到这里赞成并感谢你.. (2认同)
  • 我一直想知道为什么当父级的高度在 %/vh/vw 中定义时,将高度指定为 x% 不起作用。内容最终总是会扩展 div 并破坏父级。这个最小高度的东西太神奇了!这确实也有一定道理。为什么教程网站不讨论这些原因!?有人可以在任何地方找到更多此类解释(例如预先策划的列表)吗? (2认同)
  • @PragyAgarwal .. /sf/users/251809351/?tab=answers :-) (2认同)
  • 你才是真正的 MVP!感谢您的“最小宽度:0;” 解决方案。我能够修复我的光滑滑块溢出单元格(kenwheeler)。 (2认同)

Fre*_*any 36

以前的答案是相当不错的,但我也想提一提,有一个固定的布局相当于为网格,你只需要编写minmax(0, 1fr),而不是1fr为你的轨道的大小.

  • `minmax(0, 1fr)` 有效是因为 `1fr` 实际上是 `minmax(auto,1fr)` 的简写,它不是原始问题的正确值。 (7认同)
  • 所有其他答案都是黑客,这应该是公认的答案 (4认同)
  • 我推荐这种方法超过以前接受的答案. (3认同)
  • 虽然这有效,但我有点不明白......你能解释一下为什么这有效吗?minmax(0, 1fr) 在做什么?那不应该总是0吗?我很困惑 :( (2认同)
  • 有关更多详细信息,请参阅 https://github.com/w3c/csswg-drafts/issues/1777 (2认同)

bjn*_*nsn 13

现有的答案可以解决大多数情况。但是,我遇到了一种情况,我需要网格单元的内容为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);
}
Run Code Online (Sandbox Code Playgroud)

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

  • 当有人问什么是 CSS hack 时,应该向他们指出这个答案。 (2认同)