Flexbox alternative for IE9

96,152

Solution 1

Use modernizr to detect whether flex capabilities are present, and provide fallback styles where necessary. Modernizr will add classes like flexbox, no-flexbox, and flexbox-legacy to the html element, so in your styles you can use:

    .container {
        display: flex;
    }
    .no-flexbox .container {
        display: table-cell;
    }

I highly recommend reading through Zoe Gillenwater's (@zomigi) presentations on the subject, particularly Leveling Up With Flexbox (Smart Web Conference - September 2014)

  • slide 21: horizontal navigation spacing > display: inline-block;
  • slide 62: pinning elements without flexbox > display: table-cell;
  • slide 70,71: aligning forms fallbacks
  • slide 88,91: example with and without flex order

Also, in her presentation CSS3 Layout, there are a few good sideby side previews of layouts with and without flexbox:

  • slide 73: Using inline-block with flexbox: horizontal form
  • slide 79: Using inline-block with flexbox: horizontal navigation

Some of takeaways for me:

  • browser support ie10+ is pretty good caniuse
  • use auto-prefixr to handle browser prefixes
  • use modernizr to provide fallbacks
  • "flexbox is not all or nothing" @zomigi

Solution 2

I like the above answer but you don't have to use modernizr. You could simply use table layout for ie9 and flexbox for others.

.container {
    display: table-cell; // ie9
    display: flex;       // others
}

Solution 3

One year later, this solution, using JavaScript to adjust the layout in older browsers, seems interesting => https://github.com/10up/flexibility

Almost 2000 stars on Github but the last commit was 3 months ago, I don't know if it still actively maintained.

Share:
96,152
GoldBishop
Author by

GoldBishop

Due to the abusive nature of the SO system, I am working on an alternative that allows Newbie users to ask their "Pointless" questions and get direction/answers, instead of the demeaning Downvote/Closing when their general question does not meet the viewers interpretation of a "Good Question" Favorite Online Tools: Developer Fusion Online Code Converter .Net Fiddle Profiles: LinkedIn About.Me

Updated on November 05, 2020

Comments

  • GoldBishop
    GoldBishop over 3 years

    I have developed a website with Chrome initially (easiest to design for) but now am getting to IE support model.

    That being said, I started with IE11 and made the necessary changes for the quirky differences between IE & Chrome. But now I am stepping down the IE versions. I was able to get 90% of the webpages to display correctly with CSS for IE10. But now most of the CSS elements that I have for these two browsers, are for the most part irrelevant for IE9.

    I would like to keep from needing to have multiple browser specific style sheets, if possible.

    First problems is converting IE10+ implementation of the flexbox model of CSS.

    Current Implementation for the flexbox container:

    div#navContainer{
        display: flex; //Current browsers (IE11, Chrome, etc)
        display: -ms-flexbox; //IE10 implementation
    }
    
    div#TeamsSection {
        text-align: center;
    }
    
    div.NavSection {
        margin: 0px 7px;
        padding: 4px 0px 0px 0px;
    }
    
    div#teams {
        margin: 0px;
    
        select {
            margin: 0px;
        }
    }
    

    HTML:

    <div id="navContainer" class="float-left">
        <div id="LogoSection" class="NavSection">
            <div id="Logo">
                <img src="Images/Logo.png" />
            </div>
        </div>
        <div id="TeamsSection" class="NavSection">
            <label>Select a Team:</label><br />
            <div id="teams"></div>
        </div>
        <div id="UserSection" class="NavSection hidden">
            <label>Select a User:</label><br />
            <div id="requestor"></div>
        </div>
    </div>
    

    I know IE9 does not implement Flexbox, so please don't insult the research I have already done. I need an equivalent implementation that will allow me to change the HTML as little as possible.

  • Scott Romack
    Scott Romack about 9 years
    .container { display: flex; display: table-cell; }
  • bernk
    bernk over 8 years
    I think it should be .container {display: table-cell; display: flex;}
  • ptim
    ptim over 8 years
    nice! I guess there may be some edge cases where flexbox-legacy browsers render slightly differently.. autoprefixer is still handy!
  • maxedison
    maxedison over 8 years
    This doesn't work. It's the child elements of .container that need to be positioned inline, not .container itself.
  • GoldBishop
    GoldBishop about 8 years
    quality utility does not need alot of active changes. Google's BootStrap seems to also provide the functionality we have all struggled with.
  • Alex Morales
    Alex Morales about 8 years
    Actually it's Twitter Bootstrap. Just sayin'. ;)
  • Scott Romack
    Scott Romack about 7 years
    Add the above code to the child elements if that is what you need.
  • GoldBishop
    GoldBishop about 7 years
    Technicalities, they all come from the same branch of the tree ;)
  • Patrick
    Patrick about 7 years
    I like to create a mixin so that another dev, but most likely myself, do not forget to add in the fallback: @mixin display-flex() {display: table-cell; display: flex;}