Search code examples
cssflexboxinternet-explorer-11

ie 11: flex grow parent issue


I have such code:

https://plnkr.co/edit/ZAEzfAOCO0ZcSq2OR4Lp?p=preview

but this isn't working in ie, until I add height:0 (it's a very bad idea on parent element)

  <body>
    <div class="container">
      <div class="container-item container-item-1"></div>
      <div class="container-item container-item-2"></div>
      <div class="container-item container-item-3"></div>
    </div>
  </body>

body, html {
  min-height: 100%;
  height: 100%;
}

.container {
  width: 100%;
  min-height: calc(100% - 80px);
  margin: 30px;
  padding: 20px;
  border: 1px solid gray;
  border-radius: 16px;
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
      -ms-flex-direction: column;
          flex-direction: column;
  -webkit-box-flex: 1;
      -ms-flex: 1;
          flex: 1;
}

.container-item {
  -webkit-box-flex: 1;
      -ms-flex: 1;
          flex: 1;
  content: "someText";
  border-bottom: 1px solid #cecece;
}

.container-item-1 {
  background-color: red;
}

.container-item-2 {
  background-color: orange;
}

.container-item-3 {
  background-color: green;
}

everything works fine in chrome and ff (my parents should expand to fit parent)

Important!

I need a flexible solution, my code can have a lot of nested div's (not a constant value) between body and content divs.

for example:

<body>
  <div>
    <div>
      <div class="container">
        <div class="container-item container-item-1"></div>
        <div class="container-item container-item-2"></div>
        <div class="container-item container-item-3"></div>
      </div>
    </div>
  </div>
</body>

or

<body>
  <div>
    <h3>text</h3>
      <div class="container">
        <div class="container-item container-item-1"></div>
        <div class="container-item container-item-2"></div>
        <div class="container-item container-item-3"></div>
      </div>
  </div>
</body>

Solution

  • If you have an unknown or nested markup before the container, you could add an extra wrapper within it (here inner), to overcome IE's min-height bug.

    Fiddle sample 1 -- Fiddle sample 2

    Stack snippet sample 1

    html, body {
      margin: 0;
    }
    
    .container {
      display: flex;
    }
    
    .container .inner {
      width: 100%;
      min-height: calc(100vh - 100px);
      margin: 30px;
      padding: 20px;
      border: 1px solid gray;
      border-radius: 16px;
      display: flex;
      flex-direction: column;
    }
    
    .container-item {
      flex-grow: 1;
      border: 1px solid #cecece;
    }
    
    .container-item-1 {
      background-color: red;
    }
    
    .container-item-2 {
      background-color: orange;
    }
    
    .container-item-3 {
      background-color: green;
    }
    <div>
      <h3>text</h3>
      <div class="container">
        <div class="inner">
          <div class="container-item container-item-1">
          </div>
          <div class="container-item container-item-2">
          </div>
          <div class="container-item container-item-3">
          </div>
        </div>
      </div>
    </div>

    Stack snippet sample 2

    html, body {
      margin: 0;
    }
    
    .container {
      display: flex;
    }
    
    .container .inner {
      width: 100%;
      min-height: calc(100vh - 100px);
      margin: 30px;
      padding: 20px;
      border: 1px solid gray;
      border-radius: 16px;
      display: flex;
      flex-direction: column;
    }
    
    .container-item {
      flex-grow: 1;
      border: 1px solid #cecece;
    }
    
    .container-item-1 {
      background-color: red;
    }
    
    .container-item-2 {
      background-color: orange;
    }
    
    .container-item-3 {
      background-color: green;
    }
    <div>
      <div>
        <div class="container">
          <div class="inner">
            <div class="container-item container-item-1">
            </div>
            <div class="container-item container-item-2">
            </div>
            <div class="container-item container-item-3">
            </div>
          </div>
        </div>
      </div>
    </div>