IE10's 2012 Flexbox: Supporting the Syntax That Time Forgot
IE10 supports Flexbox — but only the abandoned 2012 draft syntax behind -ms- prefixes. Here's what that syntax looks like, why you shouldn't hand-write it, and why a float-based fallback is usually the smarter call.
26 Jul 2026, 09:26 UTC

If your analytics still show a sliver of IE10 traffic, you've probably hit the strangest corner of legacy CSS: IE10 supports Flexbox, but not the Flexbox you know. It implements the March 2012 working draft — an abandoned intermediate syntax that only exists behind -ms- prefixes. Writing display: flex does nothing in IE10. Writing display: -ms-flexbox works, sort of. This post is about what that syntax actually looks like, why hand-writing it is a trap, and the engineering decision most teams should make instead.
Three Flexboxes walk into a stylesheet
Flexbox went through three major syntax eras: the 2009 draft (display: box, seen in old Firefox and Safari), the 2012 draft (display: -ms-flexbox, IE10 only), and the final spec (display: flex, everything modern). The 2012 draft isn't just the modern syntax with a prefix glued on. The property names and value semantics genuinely differ:
justify-contentbecomes-ms-flex-pack, with values likestartandjustifyinstead offlex-startandspace-between.align-itemsbecomes-ms-flex-align.- The
flexshorthand maps to-ms-flex, but the value interpretation differs from the final spec — a single number doesn't mean quite the same thing. - There's no
flex-wrapequivalent worth relying on; multi-line flex layouts in IE10 are effectively off the table.
On top of the syntax drift, IE10's implementation has real bugs: flex items containing only inline content can collapse, and min-height on flex containers behaves incorrectly. So even a "correct" 2012-syntax stylesheet can render wrong.
A worked example: a simple media row
Say you need a row with an avatar, a flexible text block, and a right-aligned action button. Modern CSS:
.media-row {
display: flex;
align-items: center;
}
.media-row .body {
flex: 1 1 auto;
}The IE10-compatible version, as a prefixing tool would emit it:
.media-row {
display: -ms-flexbox;
display: flex;
-ms-flex-align: center;
align-items: center;
}
.media-row .body {
-ms-flex: 1 1 auto;
flex: 1 1 auto;
}Note the ordering: the -ms- declarations come first so modern browsers ignore them and use the standard properties. IE10 ignores what it doesn't understand and picks up its own dialect. This is exactly the kind of output Autoprefixer (or any equivalent build-time prefixer) generates when its browser target list includes ie 10 — and that's the key practical point.
Don't hand-write the 2012 syntax
Because the value mappings differ subtly from the final spec, hand-written -ms-flex code is easy to get wrong in ways you won't notice until you open a real IE10 window. The safer path is mechanical: write modern CSS, configure your build tool's prefixer for ie 10, and diff the output to confirm the 2012 properties appear. That turns an obscure historical dialect into a solved build problem.
One more quirk works in your favor: IE10 was the last version of Internet Explorer to support conditional comments. That means you can still do HTML-level targeting without JavaScript:
<!--[if IE 10]>
<link rel="stylesheet" href="ie10-overrides.css">
<![endif]-->This is the final version of IE where that trick exists — IE11 dropped conditional comments entirely.
The better decision: degrade, don't replicate
Here's the honest trade-off. Even with perfect tooling, IE10 Flexbox gives you a buggy, wrap-less subset of a layout system. For most real layouts, the engineering effort is better spent treating IE10 as a graceful-degradation tier: serve it a simple float- or inline-block-based layout, and let modern browsers get the full Flexbox or Grid experience.
A float fallback often costs almost nothing because the cascade handles it naturally:
.media-row .avatar,
.media-row .body {
float: left; /* picked up by IE10 */
}
.media-row {
display: -ms-flexbox;
display: flex;
}When display: flex applies, the floats on the children are ignored (flex items don't float). When it doesn't — or when you decide IE10 gets the fallback outright via a conditional-comment stylesheet — the floats carry the layout. The result in IE10 won't be pixel-identical, but it will be readable and navigable, which is the actual requirement.
Verify before you invest, and after you ship
Two checks matter. First, before doing any of this: confirm from your own analytics that IE10 traffic justifies the work. IE10 is end-of-life and receives no security updates; supporting it is a business decision, not a default. Second, test in a real IE10 environment — a Windows 8 virtual machine image — rather than a browser's emulation or document mode, which doesn't reproduce all the rendering bugs. For the fallback path, disable your flex rules and confirm the content still reads in order and nothing overlaps.
The takeaway: IE10's Flexbox is a historical dialect, not a feature. Generate it with tooling if you must, but the decision that ages best is a deliberate, simplified fallback — scoped with the last conditional comments IE ever shipped.
0 replies
A thoughtful contribution can make all the difference. Be the first to share one.