【问题标题】:Why does Chrome 80 cause this grid-template-rows: auto problem为什么 Chrome 80 会导致这个 grid-template-rows: auto 问题
【发布时间】:2020-05-21 19:47:42
【问题描述】:

有人知道最新的 Chrome 80 更新有什么问题吗?

好像

grid-template-rows: auto

即使标记中不存在给定行,也从现在开始占用一些空间。仅在 Chrome 80+ 上发生。

.l-page {
  display: grid;
  grid-template-columns: auto 1fr;
  grid-template-rows: auto auto minmax(1px, 1fr);
  /*  // 1px is needed because of https://stackoverflow.com/questions/49558290/container-scrolls-to-top-when-children-element-height-changes */
  grid-template-areas:
    'sidebar primary_bar'
    'sidebar notification'
    'sidebar content';
  width: 100vw;
  height: 100vh;
}

.l-sidebar {
  grid-area: sidebar;
  padding-right: 10px;
}

.l-notification {
  grid-area: notification;
}

.l-primary-bar {
  grid-area: primary_bar;
}

.l-content {
  grid-area: content;
}
<div class="l-page">
  <div class="l-sidebar">sidebar</div>
  <!--<div class="l-notification"></div>
      <div class="l-primary-bar"></div>-->
  <div class="l-content">content</div>
</div>

另请参阅:https://jsfiddle.net/ju4xvegf/

Chrome 80

火狐 72

【问题讨论】:

  • grid-template-rows: minmax(0px, auto) minmax(0px, auto) minmax(1px, 1fr); 是否将其修复为预期结果?
  • 不,它没有
  • 是否有原因:grid-template-rows: auto auto 1fr;不是一个选项? 因为效果很好;)
  • @TemaniAfif 如果您想更新,80 已经过测试版,如果您访问 Chrome 的“关于”页面,应该会推送给您。
  • @G-Cyr True,相关的错误是 2019 年 2 月 2 日的 fixed...

标签: html css google-chrome css-grid


【解决方案1】:

我不确定这是错误还是 CSS 网格算法发生了变化(需要修改规范),但您可以简化逻辑,如下所示:

.l-page {
  display: grid;
  grid-template-columns: 1fr;
  grid-template-rows: auto auto minmax(0, 1fr);
  height: 300px;
  margin:5px;
  border: 1px solid red;
}

.l-sidebar {
  grid-row: span 3;
  grid-column:-3;
  padding-right: 10px;
}

.l-primary-bar {
  order: 1;
}
.l-notification {
  order: 2;
}

.l-content {
  order: 3;
}
<div class="l-page">
  <div class="l-sidebar">sidebar</div>
  <div class="l-content">content</div>
</div>

<div class="l-page">
  <div class="l-sidebar">sidebar</div>
  <div class="l-notification">notif</div>
  <div class="l-primary-bar">bar</div>
  <div class="l-content">content</div>
</div>

<div class="l-page">
  <div class="l-sidebar">sidebar</div>
  <div class="l-notification">notif</div>
  <div class="l-content">content</div>
</div>

<div class="l-page">
  <div class="l-primary-bar">bar</div>
  <div class="l-notification">notif</div>
  <div class="l-sidebar">sidebar</div>
  <div class="l-content">content</div>
</div>

<div class="l-page">
  <div class="l-primary-bar">bar</div>
  <div class="l-notification">notif</div>
  <div class="l-content">content</div>
</div>

更新

使用您的初始代码,如果您只用1fr 更改minmax(1px,1fr),它应该可以正常工作。

.l-page {
  display: grid;
  grid-template-columns: auto 1fr;
  grid-template-rows: auto auto 1fr;
  grid-template-areas:
    'sidebar primary_bar'
    'sidebar notification'
    'sidebar content';
    height: 300px;
  margin:5px;
  border: 1px solid red;
}

.l-sidebar {
  grid-area: sidebar;
  padding-right: 10px;
}

.l-notification {
  grid-area: notification;
}

.l-primary-bar {
  grid-area: primary_bar;
}

.l-content {
  grid-area: content;
}
<div class="l-page">
  <div class="l-sidebar">sidebar</div>
  <div class="l-content">content</div>
</div>

<div class="l-page">
  <div class="l-sidebar">sidebar</div>
  <div class="l-notification">notif</div>
  <div class="l-primary-bar">bar</div>
  <div class="l-content">content</div>
</div>

<div class="l-page">
  <div class="l-sidebar">sidebar</div>
  <div class="l-notification">notif</div>
  <div class="l-content">content</div>
</div>

<div class="l-page">
  <div class="l-primary-bar">bar</div>
  <div class="l-notification">notif</div>
  <div class="l-sidebar">sidebar</div>
  <div class="l-content">content</div>
</div>

<div class="l-page">
  <div class="l-primary-bar">bar</div>
  <div class="l-notification">notif</div>
  <div class="l-content">content</div>
</div>

似乎新版本的 chrome 正在以不同的方式解析 minmax(1px,1fr)。您可以尝试慢慢增加1px 的值,并注意minmax() 如何使行变大。

注意1fr 等价于minmax(auto,1fr) https://github.com/w3c/csswg-drafts/issues/1777

有类似问题的相关问题:grid-template-columns in Chrome 80 inconsistently computed

【讨论】:

  • 谢谢!我真的很喜欢这种简化,但是你将如何制作一个没有侧边栏和没有额外修改类的版本?
  • 有趣; ] 为了安全起见,我会做 grid-row: -1/1;所以 grid-column 必须等于行数
  • @LukaGronko 是的,在这种情况下它会产生相同的结果;)
  • @LukaGronko 没有网格列必须设置为 -3,因为我们有一个明确的列,所以要将我们的元素放在它之前,我们需要计算 3 行(-1 是边缘,-2 是开始显式列和 -3 是之前的新行)
  • 太棒了!如果我想在右侧放置一个侧边栏? d.pr/i/Ql8uB2d.pr/i/l0PEZG
【解决方案2】:

注意:我在写这个答案时分心了,而且我有一段时间没有深入研究 CSS Grid,所以这只是我对正在发生的事情的最佳猜测。

我认为这也与您命名的 grid-template-areas 有关,而不仅仅是您的 grid-template-rows 设置。您的 CSS 中有以下命名区域:

grid-template-areas:
    'sidebar primary_bar'
    'sidebar notification'
    'sidebar content';

但在您的标记中,您有两个右列 div 被注释掉了:

<!--<div class="l-notification"></div>
    <div class="l-primary-bar"></div>-->

Firefox 和 v80 之前的 Chrome 似乎忽略了标记中为空或不存在的 grid-template-areas,因此您在顶部看到 contentsidebar 位于同一行。但是,Chrome v80 似乎已经决定,由于您已经通过 grid-template-areas 属性声明了多行,它应该至少保留一行空间,可能使用以下逻辑:

"将所有空行合并为一行,然后在网格中的下一个可用行上开始行"

而不是 Chrome 79(和 Firefox 72)所做的:

"完全折叠所有空行,以便只显示有内容的行。"

简而言之,您需要删除 grid-template-areas 属性中没有标记的命名区域之一。我会继续寻找。

【讨论】:

  • 感谢您很好地分享您的发现,这是该解决方案最酷的部分,因为这两个部分可能出现在标记中也可能不出现
  • 看起来 Chrome v80 已经决定,由于您已经通过 grid-template-areas 属性声明了多行,它应该至少保留一行空间,可能使用以下逻辑: --> 即使在 Chrome 79 中,该区域也不是空的。您可以添加 grid-gap 来注意这一点:jsfiddle.net/z6af1me9。这对我来说似乎是一个错误
  • 是的,他们在那里,但没有占用任何空间,直到现在......
  • 现在我看到了这种行为,它确实很有趣。如果你玩 grid-gap 并观察网格,它的行为会更令人惊讶。
  • @TemaniAfif 是的,我通过对每个网格区域应用不同的背景颜色来做到这一点,但网格间隙可能会更简单。
猜你喜欢
  • 2018-08-15
  • 2020-11-18
  • 1970-01-01
  • 2021-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-21
相关资源
最近更新 更多