【问题标题】:Nested CSS grid layout different behavior in Chrome and Firefox嵌套 CSS 网格布局在 Chrome 和 Firefox 中的不同行为
【发布时间】:2018-07-04 16:30:16
【问题描述】:

我正在尝试使用 CSS 网格布局来模拟一些响应行为,特别是:

grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));

我的示例https://codepen.io/elgs/pen/goNxeL 在 Chrome 中运行良好,但在 Firefox 中似乎无法运行。当你水平调整浏览器大小时你会发现它。

另一个例子https://codepen.io/elgs/pen/YYoxOq 在 Chrome 和 Firefox 中都运行良好。

html,body {
  height: 100%;
  width: 100%;
  margin: 0 auto;
  padding: 0;
}
body {
  display: grid;
  grid-template-columns: 1fr;
  grid-template-rows: 100px 1fr 50px;
}
.header {
  grid-column: 1/2;
  grid-row: 1/2;
  display: grid;
  grid-template-columns: 1fr;
  grid-template-rows: 1fr;
  background-color: #57324f;
}
.header .title {
  grid-column: 1/2;
  grid-row: 1/2;
  align-self: center;
  justify-self: center;
  width: 100%;
  max-width: 1000px;
  color: aliceblue;
}
.footer {
  grid-column: 1/2;
  grid-row: 3/4;
  display: grid;
  grid-template-columns: 1fr;
  grid-template-rows: 1fr;
  background-color: #57324f;
}
.footer .copyright {
  grid-column: 1/2;
  grid-row: 1/2;
  align-self: center;
  font-size: 12px;
  justify-self: center;
  width: 100%;
  max-width: 1000px;
  color: aliceblue;
}
.content {
  grid-column: 1/2;
  grid-row: 2/3;
  display: grid;
  grid-template-columns: 1fr;
  grid-template-rows: 0;
  background-color: aliceblue;
}
.content .main {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
  grid-gap: 10px;
  grid-auto-flow: dense;
  justify-self: center;
  width: 100%;
  margin-top: 10px;
  max-width: 1000px;
}
.placeholder {
    height: 100px;
  position: relative;
  border: 1px solid red;
}
<div class="header">
    <div class="title">
        <h2>Header</h2>
    </div>
</div>
<div class="content">
    <div class="main">
        <div class="placeholder"></div>
        <div class="placeholder"></div>
        <div class="placeholder"></div>
        <div class="placeholder"></div>
        <div class="placeholder"></div>
        <div class="placeholder"></div>
    </div>
</div>
<div class="footer">
    <div class="copyright">
        <span>Footer</span>
    </div>
</div>

我想知道是我做错了什么还是浏览器的错误。

  • Firefox 版本:58.0(64 位)
  • Chrome 版本:版本 64.0.3282.119(官方构建)(64 位)

【问题讨论】:

    标签: html css google-chrome firefox css-grid


    【解决方案1】:

    似乎是 Firefox 中的一个错误。但我不确定。

    以下是清楚的:

    1. 嵌套网格容器这一事实很重要。

      您的second demo 可在 Chrome 和 Firefox 中使用,它只有一个网格容器。

      first demo 仅适用于 Chrome,具有嵌套的网格容器。如果您消除了这种嵌套,并且只使用一个网格容器,那么该布局在两种浏览器中都可以使用。

      因此,作为一种可能的跨浏览器解决方案,尽量减少网格容器的嵌套。

      在这个修改后的演示中,我在 body.content 元素上注释掉了 display: grid。剩下的唯一网格容器在.main,红色框的父级:

      revised demo

    html,
    body {
      height: 100%;
      width: 100%;
      margin: 0 auto;
      padding: 0;
    }
    
    body {
      /* display: grid; */
      grid-template-columns: 1fr;
      grid-template-rows: 100px 1fr 50px;
    }
    
    .header {
      grid-column: 1/2;
      grid-row: 1/2;
      display: grid;
      grid-template-columns: 1fr;
      grid-template-rows: 1fr;
      background-color: #57324f;
    }
    
    .header .title {
      grid-column: 1/2;
      grid-row: 1/2;
      align-self: center;
      justify-self: center;
      width: 100%;
      max-width: 1000px;
      color: aliceblue;
    }
    
    .footer {
      grid-column: 1/2;
      grid-row: 3/4;
      display: grid;
      grid-template-columns: 1fr;
      grid-template-rows: 1fr;
      background-color: #57324f;
    }
    
    .footer .copyright {
      grid-column: 1/2;
      grid-row: 1/2;
      align-self: center;
      font-size: 12px;
      justify-self: center;
      width: 100%;
      max-width: 1000px;
      color: aliceblue;
    }
    
    .content {
      grid-column: 1/2;
      grid-row: 2/3;
      /* display: grid; */
      grid-template-columns: 1fr;
      grid-template-rows: 0;
      background-color: aliceblue;
    }
    
    .content .main {
      display: grid;
      grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
      grid-gap: 10px;
      grid-auto-flow: dense;
      justify-self: center;
      width: 100%;
      margin-top: 10px;
      max-width: 1000px;
    }
    
    .placeholder {
        height: 100px;
      position: relative;
      border: 1px solid red;
    }
    <div class="header">
      <div class="title">
        <h2>Header</h2>
      </div>
    </div>
    <div class="content">
      <div class="main">
        <div class="placeholder"></div>
        <div class="placeholder"></div>
        <div class="placeholder"></div>
        <div class="placeholder"></div>
        <div class="placeholder"></div>
        <div class="placeholder"></div>
      </div>
    </div>
    <div class="footer">
      <div class="copyright">
        <span>Footer</span>
      </div>
    </div>

    1. 在 Firefox 中,max-width 的固定值可防止框缩小以适应更小的屏幕尺寸。

      Firefox 在使用max-width 上的像素值缩小.main 容器时遇到问题。 Chrome 没有。

      想到的一个典型解决方案是覆盖网格项目上的min-width: auto 默认设置。这可以防止项目缩小到超过其内容的大小或定义的宽度。

      但是,此处描述的该解决方案:Prevent content from expanding grid items ... 在这种情况下不起作用。

      (可能是因为网格项中没有内容,也没有定义宽度。定义的唯一宽度是在网格列上,在网格容器上设置。因此,仅适用于网格项的解决方案可能不甚至不适用。)

      作为一种可能的解决方法,如果您必须保留嵌套容器,则不要使用带有max-width 的固定值,而是使用百分比值。这可能对你有用。

      revised codepen

    body {
      display: grid;
      grid-template-columns: 1fr;
      grid-template-rows: 100px 1fr 50px;
      height: 100vh;
      margin: 0;
    }
    
    .header {
      display: grid;
      grid-template-columns: 1fr;
      grid-template-rows: 1fr;
      background-color: #57324f;
    }
    
    .content {
      display: grid;
      grid-template-columns: 1fr;
      /* grid-template-rows: 0; */
      align-content: start;  /* new */
      background-color: aliceblue;
    }
    
    .content .main {
      display: grid;
      grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
      grid-auto-rows: 100px;  /* new */
      grid-gap: 10px;
      grid-auto-flow: dense;
      justify-self: center;
      width: 100%;
      margin-top: 10px;
      /* max-width: 1000px; */
      max-width: 75%;  /* new */
    }
    
    .placeholder {
      border: 1px solid red;
    }
    
    .footer {
      display: grid;
      grid-template-columns: 1fr;
      grid-template-rows: 1fr;
      background-color: #57324f;
    }
    
    .header .title,
    .footer .copyright {
      align-self: center;
      justify-self: center;
      width: 100%;
      max-width: 1000px;
      color: aliceblue;
    }
    
    .footer .copyright {
      font-size: 12px;
    }
    <div class="header">
      <div class="title">
        <h2>Header</h2>
      </div>
    </div>
    <div class="content">
      <div class="main">
        <div class="placeholder"></div>
        <div class="placeholder"></div>
        <div class="placeholder"></div>
        <div class="placeholder"></div>
        <div class="placeholder"></div>
        <div class="placeholder"></div>
      </div>
    </div>
    <div class="footer">
      <div class="copyright">
        <span>Footer</span>
      </div>
    </div>

    【讨论】:

    • 通过将max-width 从固定值更改为百分比,Chrome 和 Firefox 的行为都符合预期。太感谢了。想知道这是 Firefox 的预期行为,或者他们是否会在未来的版本中修复它。
    • 不客气。就像我在一开始提到的那样,我并不完全确定这个错误的状态。它确实看起来像 Firefox 中的一个。但是 Grid 是全新的,所以可能还有很多事情需要整理。
    • RE:Firefox 错误行为 - 可能是 this bug,这更多是关于子网格的延迟实现(也就是缺少一个功能而不是包含错误)
    • @TylerH,该错误报告是关于子网格功能 (which I've explored before)。这个问题没有调用任何子网格。它只是嵌套网格容器,所以我不确定它们是否相关。不过还是谢谢。
    • @TylerH,听起来确实如此,但不是。嵌套网格容器和子网格不同。子网格是一个完全独立的功能,尚未被任何浏览器实现。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-10
    • 2020-02-10
    • 2017-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多