Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

CSS Grid Layout not working in IE11 even with prefixes

I'm using following HTML markup for my grid.

<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> 

The SCSS code is something like below:

.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;         }     } } 

Since I'm using auto-prefixer in my workflow it automatically adds all relevant properties with -ms prefix. I can confirm it via inspect element.

Now, the issue is this code works just fine in Chrome, Firefox and Opera, but when I open this page in Microsoft Edge or in IE 11 all grid items are overlapping each other at first cell. According to this site these browsers support CSS Grid layout with -ms prefix. I've created a CodePen for this scenario.

CodePen Link

Why is it not working?

.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>
like image 571
Faisal Khurshid Avatar asked Aug 20 '17 21:08

Faisal Khurshid


People also ask

Is CSS grid supported in IE11?

The grid-gap property, as well as its long-hand forms grid-column-gap and grid-row-gap , don't exist in the older spec, so they aren't supported by IE11.

Why is grid-template-columns not working CSS?

The problem is that you are applying the grid-template-columns property to grid items. This is a grid container property. It will be ignored on grid items (unless they are also grid containers). Instead use the grid-column and grid-row properties, which apply to grid items.

Is CSS grid supported by all browsers?

Other than in Internet Explorer, CSS Grid Layout is unprefixed in Safari, Chrome, Opera, Firefox and Edge. Support for all the properties and values detailed in these guides is interoperable across browsers.


2 Answers

IE11 uses an older version of the Grid specification.

The properties you are using don't exist in the older grid spec. Using prefixes makes no difference.

Here are three problems I see right off the bat.


repeat()

The repeat() function doesn't exist in the older spec, so it isn't supported by IE11.

You need to use the correct syntax, which is covered in another answer to this post, or declare all row and column lengths.

Instead of:

.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; } 

Use:

.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; } 

Older spec reference: https://www.w3.org/TR/2011/WD-css3-grid-layout-20110407/#grid-repeating-columns-and-rows


span

The span keyword doesn't exist in the older spec, so it isn't supported by IE11. You'll have to use the equivalent properties for these browsers.

Instead of:

.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; } 

Use:

.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; } 

Older spec reference: https://www.w3.org/TR/2011/WD-css3-grid-layout-20110407/#grid-row-span-and-grid-column-span


grid-gap

The grid-gap property, as well as its long-hand forms grid-column-gap and grid-row-gap, don't exist in the older spec, so they aren't supported by IE11. You'll have to find another way to separate the boxes. I haven't read the entire older spec, so there may be a method. Otherwise, try margins.


grid item auto placement

There was some discussion in the old spec about grid item auto placement, but the feature was never implemented in IE11. (Auto placement of grid items is now standard in current browsers).

So unless you specifically define the placement of grid items, they will stack in cell 1,1.

Use the -ms-grid-row and -ms-grid-column properties.

  • CSS Grid auto placement in IE/EDGE
  • CSS Grid not working in ie11 despite prefixes
  • https://www.w3.org/TR/2011/WD-css3-grid-layout-20110407/#automatic-placement-of-grid-items
like image 182
Michael Benjamin Avatar answered Nov 15 '22 23:11

Michael Benjamin


Michael has given a very comprehensive answer, but I'd like to point out a few things which you can still do to be able to use grids in IE in a nearly painless way.

The repeat functionality is supported

You can still use the repeat functionality, it's just hiding behind a different syntax. Instead of writing repeat(4, 1fr), you have to write (1fr)[4]. That's it. See this series of articles for the current state of affairs: https://css-tricks.com/css-grid-in-ie-debunking-common-ie-grid-misconceptions/

Supporting grid-gap

Grid gaps are supported in all browsers except IE. So you can use the @supports at-rule to set the grid-gaps conditionally for all new browsers:

Example:

.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;   } } 

It's a little verbose, but on the plus side, you don't have to give up grids altogether just to support IE.

Use Autoprefixer

I can't stress this enough - half the pain of grids is solved just be using autoprefixer in your build step. Write your CSS in a standards-complaint way, and just let autoprefixer do it's job transforming all older spec properties automatically. When you decide you don't want to support IE, just change one line in the browserlist config and you'll have removed all IE-specific code from your built files.

like image 45
kumarharsh Avatar answered Nov 16 '22 00:11

kumarharsh