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
For me, using
flex: 1 1 auto;
instead of
flex: 1;
solved the flex issue on IE 11.
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.
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.
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%
Make sure flex-shrink
is enabled.
So instead of this: flex: 0 0 35%
Try this: flex: 0 1 35%
(In other cases flex-shrink
needs to be disabled: Flex item overlaps another item in IE11)
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
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;
}
Just use flex:1 0 auto;
. It will work.