IE 11 flex fix

IE11 solution for flex items with scrollable content and autosizing

by abhishekdev

HTML

<div class="ie11-wrapper">
  <section>
    <header>header</header>
    <article>
      <button onclick="toggleContentSize()">
        Toggle content size
      </button>
      <div>
        Long <br />
        Long <br />
      </div>
      <div id="more-content">
        <!-- 
      Remove this line to see sizing with less content -->



        ExtraWideExtraWideExtraWideExtraWideExtraWideExtraWideExtraWideExtraWideExtraWideExtraWide<br />
        Long <br />
        Long <br />
        Long <br />
        Long <br />
        Long <br />
        Long <br />
        Long <br />
        Long <br />
        Long <br />
        Long <br />
        Long <br />
        Long <br />
        Long <br />
        Long <br />
        Long <br />
        Long <br />
        Long <br />
        Long <br />
        Long <br />
        <!-- -->
      </div>
    </article>
    <footer>footer</footer>
  </section>
</div>

CSS

/* Source adapted from: https://jsfiddle.net/gktpsyv5/ */
.ie11-wrapper {
  display: flex;
  flex-direction: column;

  align-items: center;
  height: 100%;
  min-width: 100vw;
  position: fixed;
  top: 0;
  z-index: 1000;
  padding: 1rem 0;
  background: rgba(0,0,0,0.5);
}

section {
  display: flex;
  flex-direction: column;
  width: auto;
  border: 2px dashed red;

  background: white;
  max-width: min(50vw, 75rem);
  min-width: min(25vw, 75rem);
  margin: auto;
  position: relative;
  height: auto;
  max-height: calc(100vh - 2rem);

  align-self: stretch;
  flex: 0 1 auto;
}

article {
  min-height: 0px;
  flex-grow: 1;
  flex-shrink: 1;
  flex-basis: auto;
  overflow: auto;
}

header,
footer {
  flex-basis: auto;
  flex-grow: 0;
  flex-shrink: 0;
  background: lightgreen;
}

JavaScript

function toggleContentSize() {
  document.getElementById('more-content').style.display = toggleContentSize.large ? 'none' : 'block';
  toggleContentSize.large = !toggleContentSize.large;
}

toggleContentSize.large = true;