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天,从周一开始.

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

网格项(=日单元格)非常简洁,因为页面上有数百个.一旦日期标签变得太大(可以使用左上角的按钮随意调整笔中的字体大小),网格的大小就会增加,超过页面的正文大小.

有没有办法防止这种行为?

我最初宣布我的年度网格的宽度和高度都是100%,所以这可能是我的出发点,但我找不到任何与网格相关的CSS属性能够满足这一需求.

Disclaimer:我知道有一些非常简单的方法可以不使用CSS网格布局来设置日历样式.然而,这个问题更多的是关于这个主题的常识,而不是解决具体的例子.

推荐答案

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

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

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

From the spec:

6.6. Automatic Minimum Size of Grid Items

为了为网格项提供更合理的默认最小大小,此 规范定义了值为min-width/min-heightauto还将指定轴上的自动最小大小应用于overflowvisible的栅格项.(其效果类似于对弹性项目施加的自动最小大小.)

下面是关于Flex项的更详细的解释,但它也适用于网格项:

这篇文章还讨论了nested containers和已知rendering differences among major browsers的潜在问题.


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

.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 demo


1fr vs minmax(0, 1fr)

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

Css相关问答推荐

Angular Material:如何同时使用2个徽章

使用 Flex 容器,如何在右对齐所有 Flex 子项的同时赋予子图像完整宽度?

为什么align-content:start应用于单行项目?

Vue3 组合 api 中的对象值样式

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

将框架放入 bootstrap 模式的正确方法是什么?

如何在 Tailwind 中使用 `margin: y x;` 速记?

使用 React-Router 和 Outlet 时如何确保内容保持在下方

基于类的 CSS Select 器

如何将 .btn-group 从 twitter-bootstrap 居中?

为什么不能将特定于供应商的伪元素/类组合成一个规则集?

你如何调试可打印的 CSS?

li 中的第二行在 CSS-reset 后的项目符号下开始

隐藏在AngularJs中的可见性?

Highcharts 图表选项 backgroundColor:'transparent' 在 IE 8 上显示黑色

thead 和 tbody 之间的间距

如何使用 CSS 绘制复选标记/勾号?

CSS图像最大宽度设置为原始图像大小?

CSS3可以转换字体大小吗?

输入上方带有标签的样式表