即使有前缀,CSS 网格布局也不能在 IE11 中工作

新手上路,请多包涵

我正在为我的网格使用以下 HTML 标记。

 <section class="grid">
    <article class="grid-item width-2x height-2x">....</article>
    <article class="grid-item">....</article>
    <article class="grid-item">....</article>
    <article class="grid-item width-2x">....</article>
    <article class="grid-item height-2x">....</article>
    <article class="grid-item">....</article>
    <article class="grid-item">....</article>
    <article class="grid-item width-2x height-2x">....</article>
</section>

SCSS 代码如下所示:

 .grid {
    display: grid;
    grid-template-columns: repeat( 4, 1fr );
    grid-gap: 30px;
    align-items: start;

    .grid-item {
        &.height-2x {
            grid-row: span 2;
        }
        &.width-2x {
            grid-column: span 2;
        }
    }
}

由于我在我的工作流程中使用了自动前缀,它会自动添加带有 -ms 前缀的所有相关属性。我可以通过检查元素确认它。

现在,问题是这段代码在 Chrome、Firefox 和 Opera 中运行良好,但是当我在 Microsoft Edge 或 IE 11 中打开此页面时,所有网格项在第一个单元格中都相互重叠。根据 这个站点,这些浏览器支持带有 -ms 前缀的 CSS 网格布局。我为这个场景创建了一个 CodePen。

CodePen 链接

为什么它不起作用?

 .grid {
  display: -ms-grid;
  display: grid;
  -ms-grid-columns: (1fr)[4];
  grid-template-columns: repeat(4, 1fr);
  -ms-grid-rows: (270px)[4];
  grid-template-rows: repeat(4, 270px);
  grid-gap: 30px;
}

.grid .grid-item {
  background-color: #000;
  color: #fff;
  text-align: center;
  line-height: 270px;
}

.grid .grid-item.height-2x {
  -ms-grid-row: span 2;
  grid-row: span 2;
}

.grid .grid-item.width-2x {
  -ms-grid-column: span 2;
  grid-column: span 2;
}
 <section class="grid">
  <article class="grid-item width-2x height-2x">....</article>
  <article class="grid-item">....</article>
  <article class="grid-item">....</article>
  <article class="grid-item width-2x">....</article>
  <article class="grid-item height-2x">....</article>
  <article class="grid-item">....</article>
  <article class="grid-item">....</article>
  <article class="grid-item width-2x height-2x">....</article>
</section>

原文由 Faisal Khurshid 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 682
2 个回答

IE11 使用 旧版本的 Grid 规范

您使用的属性在旧的网格规范中不存在。使用前缀没有区别。

这是我立即看到的三个问题。


repeat()

旧版规范中不存在 repeat() 功能,因此 IE11 不支持。

您需要使用正确的语法,这在 这篇文章的另一个答案中 有所介绍,或者声明所有行和列的长度。

代替:

 .grid {
  display: -ms-grid;
  display: grid;
  -ms-grid-columns: repeat( 4, 1fr );
      grid-template-columns: repeat( 4, 1fr );
  -ms-grid-rows: repeat( 4, 270px );
      grid-template-rows: repeat( 4, 270px );
  grid-gap: 30px;
}

利用:

 .grid {
  display: -ms-grid;
  display: grid;
  -ms-grid-columns: 1fr 1fr 1fr 1fr;             /* adjusted */
      grid-template-columns:  repeat( 4, 1fr );
  -ms-grid-rows: 270px 270px 270px 270px;        /* adjusted */
      grid-template-rows: repeat( 4, 270px );
  grid-gap: 30px;
}

旧规范参考: https ://www.w3.org/TR/2011/WD-css3-grid-layout-20110407/#grid-repeating-columns-and-rows


span

span 关键字在旧规范中不存在,因此 IE11 不支持。您必须使用这些浏览器的等效属性。

代替:

 .grid .grid-item.height-2x {
  -ms-grid-row: span 2;
      grid-row: span 2;
}
.grid .grid-item.width-2x {
  -ms-grid-column: span 2;
      grid-column: span 2;
}

利用:

 .grid .grid-item.height-2x {
  -ms-grid-row-span: 2;          /* adjusted */
      grid-row: span 2;
}
.grid .grid-item.width-2x {
  -ms-grid-column-span: 2;       /* adjusted */
      grid-column: span 2;
}

旧规范参考: https ://www.w3.org/TR/2011/WD-css3-grid-layout-20110407/#grid-row-span-and-grid-column-span


grid-gap

grid-gap 属性,以及它的长手形式 grid-column-gapgrid-row-gap ,在旧规范中不存在,因此它们不受支持IE11。你必须找到另一种方法来分隔盒子。我还没有阅读整个旧规范,所以可能有一种方法。否则,请尝试边距。


网格项目自动放置

旧规范中有一些关于网格项自动放置的讨论,但该功能从未在 IE11 中实现。 (网格项目的自动放置现在是当前浏览器的标准)。

因此,除非您专门定义网格项的位置,否则它们将堆叠在单元格 1,1 中。

使用 -ms-grid-row-ms-grid-column 属性。

原文由 Michael Benjamin 发布,翻译遵循 CC BY-SA 4.0 许可协议

迈克尔给出了一个非常全面的答案,但我想指出一些您仍然可以做的事情,以便能够以几乎无痛的方式在 IE 中使用网格。

支持 repeat 功能

您仍然可以使用重复功能,它只是隐藏在不同的语法后面。而不是写 repeat(4, 1fr) ,你必须写 (1fr)[4] 。而已。有关当前情况,请参阅本系列文章: https ://css-tricks.com/css-grid-in-ie-debunking-common-ie-grid-misconceptions/

支持网格间隙

除 IE 外,所有浏览器都支持网格间隙。因此,您可以使用 @supports at 规则为所有新浏览器有条件地设置网格间隙:

例子:

 .grid {
  display: grid;
}
.item {
  margin-right: 1rem;
  margin-bottom: 1rem;
}
@supports (grid-gap: 1rem) {
  .grid {
    grid-gap: 1rem;
  }
  .item {
    margin-right: 0;
    margin-bottom: 0;
  }
}

它有点冗长,但从好的方面来说,您不必为了支持 IE 而完全放弃网格。

使用自动前缀

我怎么强调都不为过 - 只需在构建步骤中使用 autoprefixer 即可解决网格问题的一半。以符合标准的方式编写您的 CSS,让 autoprefixer 自动转换所有旧规范属性。当您决定不想支持 IE 时,只需更改浏览器列表配置中的一行,您就会从构建的文件中删除所有特定于 IE 的代码。

原文由 kumarharsh 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题