flex property not working in IE
Asked Answered
A

5

26

I have been unable to determine why flexbox is not working in IE 11.

For testing, I sourced a very simple flexbox layout from CodePen and have pasted the information below.

Chrome works as intended; IE11 fails.

Image of layout-success running on Chrome:

enter image description here

Image of layout-failure on IE11

enter image description here

body {
  background: #333;
  font-family: helvetica;
  font-weight: bold;
  font-size: 1.7rem;
}

ul {
  list-style: none;
}

li {
  background: hotpink;
  height: 200px;
  text-align: center;
  border: 2px solid seashell;
  color: seashell;
  margin: 10px;
  flex: auto;
  min-width: 120px;
  max-width: 180px;
}

.flex {
  display: flex;
  justify-content: flex-start;
  flex-wrap: wrap;
}
<ul class="flex">
  <li>1</li>
  <li>2</li>
  <li>3</li>
  <li>4</li>
  <li>5</li>
  <li>6</li>
  <li>7</li>
  <li>8</li>
  <li>9</li>
  <li>10</li>
</ul>

http://codepen.io/hankthewhale/pen/IdKkB?editors=110

Alon answered 27/8, 2015 at 2:7 Comment(0)
D
59

IE has a problem parsing the flex property.

Here are a few workarounds that have worked for me:

  • Use the long-hand properties instead of the shorthand.

    Instead of something like this: flex: 0 0 35%.

    Try this:

    • flex-grow: 0
    • flex-shrink: 0
    • flex-basis: 35%


  • Careful with percentage and unitless values with flex-basis

    This may depend on your version of IE11. Behavior appears to vary.

    Try these variations:

    • flex: 1 1 0
    • flex: 1 1 0px
    • flex: 1 1 0%

Beware! Certain css minifiers will replace 0px with 0, which can be a really annoying thing to debug (however, they won't change 0% for some reason).

More details here:


  • Instead of flex: 1 use flex: auto (or add in flex-basis: auto)

    If you're using flex: 1 in flex-direction: row (such as on larger screens), and you switch to flex-direction: column in a media query (let's say for mobile devices), you may find that your flex items collapse.

    In your media query, add flex-basis: auto. This will override the flex-basis value in the flex: 1 rule (which is usually 0, 0px or 0%, depending on the browser).

    Using flex: auto should also work, which is short for:

    • flex-grow: 1
    • flex-shrink: 1
    • flex-basis: auto

  • Use old-fashion width / height properties instead of flex.

  • Use block layout instead of flex layout.

    You don't need to completely abandon flex layout. But for a particular container you may be able to get the job done with display: block instead of display: flex; flex-direction: column.

    For example, in needing to use the padding trick to responsively embed a video in a flex item, the obstacle I faced was that some browsers don't work well with percentage padding (or margin) in a flex container.

    To make it work I switched the display value on the flex item from this:

    /* a flex item, also a nested flex container */
    #footer-container > article {
        display: flex;
        flex-direction: column;
    }
    

    to this:

    #footer-container > article {
        display: block;
    }
    
Dimitry answered 3/9, 2016 at 19:26 Comment(2)
Hello! do you know of a polyfill that converts the flex from shorthand to longhand?Yusuk
Moving from shorthand to the multi-line definition was what worked for my situation.Bobcat
A
10

For me, using

  flex: 1 1 auto;

instead of

  flex: 1;

solved the flex issue on IE 11.

Abandoned answered 16/8, 2017 at 19:29 Comment(1)
Well, that is what Instead of flex: 1 use flex: auto means, as flex: auto translates to exactly that, flex: 1 1 autoAlternant
L
0

Just use flex:1 0 auto;. It will work.

Leveloff answered 16/11, 2017 at 5:30 Comment(0)
L
0

As in @Michael_B answer, limit the growth with Flexbox flex property: flex: 0 1 (1/n - b) taken in % value, where n is the number of flex items in a row and b is the gap that you want to see between flex items in IE.

On the flex items along with flex property above use the max-width property with percentage value of 1/n - b.

In your case the generalized CSS for the flex item would be:

li {
    // ... the remaining code from your snippet
    // Calculate the following manually and insert or use CSS preprocessor that does math for you.
    // See the formula explanation above.
    max-width: (your flex container max-width / 2) * 100% - b; 
    flex: 0 1 (your flex container max-width / 2) * 100% - b;
}

In actual case with 5 items / row there will be (1/5) * 100% - 1% = 19% => max-width: 19% and flex: 0 1 19%;.

Play with b parameter to make flex items short enough to allow flex: wrap; work.

Loos answered 7/8, 2018 at 7:37 Comment(0)
S
0

In my case, the CSS minifier rejects the px unit of the last argument in -ms-flex shorthand rule, I tried using % unit and it works fine.

Southerner answered 14/9, 2018 at 7:27 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.