即使使用-ms前缀,CSS网格布局也无法在Edge和IE 11中工作

Fai*_*hid 50 html css internet-explorer-11 css-grid

我正在为我的网格使用以下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>
Run Code Online (Sandbox Code Playgroud)

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

现在,问题是此代码在Chrome,Firefox和Opera中运行良好,但是当我在Microsoft Edge或IE 11中打开此页面时,所有网格项在第一个单元格处相互重叠.根据这个站点,这些浏览器支持带有-ms前缀的CSS Grid布局.我为这个场景创建了一个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;
}
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)

Mic*_*l_B 101

Edge和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;
}
Run Code Online (Sandbox Code Playgroud)

使用:

.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;
}
Run Code Online (Sandbox Code Playgroud)

较旧的规范参考: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;
}
Run Code Online (Sandbox Code Playgroud)

使用:

.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;
}
Run Code Online (Sandbox Code Playgroud)

较旧的规范参考: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支持.你必须找到另一种方法来分开盒子.我没有读过整个旧规范,所以可能有一种方法.否则,尝试边距.

  • 除了上面提到的CSS语法调整(对于旧规范),每个网格项还需要使用`grid-column`和`grid为它们在定义的网格中的列和行中的位置显式赋值. -row`值.我更新了笔码:https://codepen.io/imfaisal/pen/gxeGmQ?editors = 1100 (10认同)
  • 事实证明,IE11实际上支持重复,但是sytax略有不同:-ms-grid-columns:(1fr)[5]; https://css-tricks.com/css-grid-in-ie-debunking-common-ie-grid-misconceptions/#article-header-id-2 (5认同)

kum*_*rsh 15

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

repeat支持该功能

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

支持网格间隙

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

例:

.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;
  }
}
Run Code Online (Sandbox Code Playgroud)

这有点冗长,但从正面来看,您不必为了支持IE而完全放弃网格。

使用自动前缀

我不能太强调-只需在构建步骤中使用autoprefixer即可解决网格的一半痛苦。以符合标准的方式编写CSS,然后让autoprefixer来完成自动转换所有旧规范属性的工作。当您决定不想支持IE时,只需在browserlist配置中更改一行,就可以从构建文件中删除所有IE专用代码。


leo*_*old 13

Faisal Khurshid和Michael_B已经给出了答案.
这只是试图使可能的解决方案更加明显.

对于IE11及以下版本,您需要在父div中启用网格的旧规范,例如正文或类似这里的"网格",如下所示:

.grid-parent{display:-ms-grid;}
Run Code Online (Sandbox Code Playgroud)

然后定义列和行的数量和宽度,例如:

.grid-parent{
  -ms-grid-columns: 1fr 3fr;
  -ms-grid-rows: 4fr;
}
Run Code Online (Sandbox Code Playgroud)

最后你需要明确地告诉浏览器你的元素应放在哪里,例如:

.grid-item-1{
  -ms-grid-column: 1;
  -ms-grid-row: 1;
}

.grid-item-2{
  -ms-grid-column: 2;
  -ms-grid-row: 1;
}
Run Code Online (Sandbox Code Playgroud)

  • 重要的是要注意,您必须为每个网格项定义“ -ms-grid-column”,因为IE无法识别自动放置位置(所有位置都将放置在第一列中)。 (3认同)