【问题标题】:Why is CSS Grid row height different in Safari?为什么 Safari 中的 CSS Grid 行高不同?
【发布时间】:2019-08-16 06:12:19
【问题描述】:

我使用 CSS Grid 来布置一个困难的网格布局,其中网格项目具有不同的高度和宽度。网格行的高度设置为1fr,使其与网格的高度成正比。某些网格项具有grid-row: span 2grid-row: span 3

为了保持纵横比,网格元素绝对位于包装器内部并带有填充。

在 -ms- 前缀的帮助下,这一切在 Chrome 和 Firefox 甚至 IE 中都能完美运行。

在 Safari 中,情况就不同了:

然而,在 Safari 中,网格行的计算方式似乎并不相同——在 Safari 中,行的高度比任何其他浏览器都要短得多,这会破坏布局。这是为什么呢?

从网格元素中删除绝对位置不会改变行高。但似乎将height: 0 放在网格包装器上会使行高在 Safari 中的行为与在 Chrome 和 Firefox 中的行为相同。这背后的原因是什么?

代码:

Codepen:https://codepen.io/katrina-isabelle/pen/rRqvXq

.grid-wrapper {
  position: relative;
  padding-bottom: 60%;
}

.grid {
  display: grid;
  grid-gap: 2px;
  grid-template-columns: 29% 21% 21% 29%;
  grid-auto-rows: 1fr;
  position: absolute;
  width: 100%;
  height: 100%;
}

.grid-item {
  width: 100%;
  color: #ccc;
  background: #ccc;
}
.grid-item--1 {
  grid-row: span 2;
}
.grid-item--2 {
  grid-row: span 3;
}
.grid-item--3 {
  grid-row: span 2;
}
.grid-item--4 {
  grid-row: span 3;
}
.grid-item--5 {
  grid-row: span 2;
}
.grid-item--6 {
  grid-row: span 3;
}
.grid-item--7 {
  grid-row: span 2;
}
.grid-item--8 {
  grid-row: span 2;
}
.grid-item--9 {
  grid-row: span 1;
}
<div class="grid-wrapper">
  <div class="grid">
    <div class="grid-item grid-item--1">
      Grid item
    </div>
    <div class="grid-item grid-item--2">
      Grid item
    </div>
    <div class="grid-item grid-item--3">
      Grid item
    </div>
    <div class="grid-item grid-item--4">
      Grid item
    </div>
    <div class="grid-item grid-item--5">
      Grid item
    </div>
    <div class="grid-item grid-item--6">
      Grid item
    </div>
    <div class="grid-item grid-item--7">
      Grid item
    </div>
    <div class="grid-item grid-item--8">
      Grid item
    </div>
    <div class="grid-item grid-item--9">
      Grid item
    </div>
  </div>
</div>

【问题讨论】:

  • 如果我没记错的话,Safari 不喜欢你用于.grid 的单位%。一般来说,我会在 safari display: flex 中使用网格布局。但这只是我个人的喜好。
  • @Demian 只是想注意,如果您检查元素,您会看到 .grid 元素确实扩展以填充其父元素的高度,它是网格内的行没有扩展.您将如何在 flex 中重新创建此布局?
  • 有父 flex 和子 inline-flex。
  • @Demian 很想看一个例子。我刚刚在.grid 上尝试了display: flex.grid-items 上的display: inline-flex,它破坏了布局

标签: css safari css-grid


【解决方案1】:

我在 Safari 12+ 中遇到过类似的问题,因为我还在基于网格的布局中使用填充来强制纵横比。我不确定这是否与您遇到的完全相同的问题,但以下修复适用于我在 Safari 中的笔上。

TLDR:将display:grid 放在网格容器周围的 div 上。它正在运行:https://codepen.io/harrison-rood/pen/rNxXWPb

在为此扯了几个小时的头发后,我决定尝试将display:grid 放在我的主网格周围的包装上,并且效果很好!我不知道为什么这会解决它,但我的猜测是它在父容器上为 Safari 提供了更多上下文,并允许 height:100% 引用网格上下文而不是父容器,类似于 Chrome 和 Firefox 的处理方式默认情况下。这让我非常沮丧,以至于我觉得有义务创建一个 SO 帐户,这样我才能发布这个!希望对您有所帮助!

【讨论】:

  • 感谢分享这个解决方案!正如我在我的 OP 中提到的,您还可以添加 height: 0 来修复它。很神秘。我认为display: grid 感觉是一种更好的方法,但无论哪种方式,拥有多种选择都不会受到伤害
  • 超级奇怪吧?我很想知道为什么会这样,但到目前为止我还不能确定。
  • 哇,这对我也有用!确实很奇怪,但感谢您找到解决方案!
【解决方案2】:

使用height: 100vh,而不是网格容器上的height: 100% (.grid)。

或者,如果您真的想使用百分比,请确保父级具有定义的高度。一些浏览器仍然遵守关于百分比高度的旧规则,即:

具有百分比高度的元素必须有一个具有定义高度的父元素作为参考点,否则百分比高度将被忽略

更多细节在这里:

【讨论】:

  • 我在第二段中提到我试图保持网格的纵横比,所以100vh 不适合我的用例。以像素为单位定义高度意味着我必须创建许多媒体查询来保持纵横比,这就是我使用百分比填充技巧的原因。我宁愿使用height: 0 技巧也不愿编写所有这些媒体查询
  • height: 100vh 是一个百分比,但它是相对于视口而言的。我提出的另一个选项也是百分比,但按照规范规则实施。
  • 所以父级 (.grid-wrapper) 没有定义高度,因为高度是由填充设置的——这就是保持纵横比的方式。如果我定义父级或.grid 的高度,关于如何保持纵横比的任何想法?
  • 另外,澄清一下,网格以 100% 的宽度显示,因此如果高度与视口高度相关,则不会保持纵横比。
【解决方案3】:

(作为答案发布以包含图片。) 在使用设置height: 0 遵循您建议的修复后,我使用 Safari 和 Chrome (Vivaldi) 获得了这些结果。正如你所说,这从 Safari 中几乎折叠的状态扩展了 div 的高度。

我想知道:您的目标是左侧的解决方案,还是应该像右侧的那样? 如果左侧的替代方案是您的目标,您可以通过在.grid 上设置grid-auto-rows: auto 来获得相同的结果。 我猜在这两种情况下(height: 0grid-auto-rows: auto)你都在某种程度上有效地将高度计算转义为 .grid-wrappers 高度的分数。

我不能说为什么 Safari 会以如此不同的方式这样做,但是 - 务实 - 我个人会考虑使用网格区域而不是跨度来放置元素 - 至少在布局合理的情况下。

【讨论】:

  • 右边是想要的布局。在左侧,您似乎复制了我的 SCSS 但没有启用 SCSS 预处理器
  • 您能否提供一个使用网格区域而不是跨度的示例?我是网格新手,不熟悉这个概念
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-28
  • 1970-01-01
  • 1970-01-01
  • 2012-03-04
  • 2019-06-05
  • 2022-01-01
相关资源
最近更新 更多