Search code examples
csswidthcss-positionflexboxfixed

Fixed position element inheriting width of flex item


I'm building out a UI that requires a fixed position/sticky element at the bottom of the viewport with a width constrained by a main content area. The main content area is optionally flanked by (sibling) left and/or right sidebars with fixed widths, so I'm using Flexbox to build the three column structure with flex-grow: 1 on the main content.

I've learned from @Marc Audet's accepted answer at How can I make a fixed positioned div inherit width of parent? that setting width: inherit on the fixed element is typically how to solve this problem, but it only seems to work when there's a specified width on its parent, which doesn't help me considering I need the main content area to fill the remaining width of the page.

Does anyone have any ideas for getting around this? Check out my Fiddle for the code/example. Any help would be appreciated!


Solution

  • CSS

    html {
      box-sizing: border-box;
      font: 400 16px/1.45 'Source Code Pro';
    }
    
    *,
    *:before,
    *:after {
      box-sizing: inherit;
      margin: 0;
      padding: 0;
      border: 0;
      outline: none;
      overflow-x: hidden;
    }
    
    body {
      background: #121;
      color: #FEF;
      -webkit-font-smoothing: antialiased;
      -moz-osx-font-smoothing: grayscale;
      width: 100vw;
      height: 100vh;
    }
    
    .container {
      display: flex;
      color: #fff;
      height: -moz-fit-content;
      height: -webkit-fit-content;
      height: fit-content;
      background: blue;
    }
    
    .left {
      background: blue;
      min-height: 100vh;
      min-width: 150px;
      flex-shrink: 0;
    }
    
    .middle {
      background: green;
      min-height: 100vh;
      overflow: hidden;
      width: calc(100vw - 400px);
      padding-bottom: 60px;
      flex-grow: 1;
      flex-shrink: 0;
    }
    
    .middle .fixed-footer {
      background: orange;
      position: fixed;
      bottom: 0;
      width: 100vw;
      width: inherit;
      padding: 16px 0;
      overflow-x: hidden;
    }
    
    .right {
      background: blue;
      min-height: 100vh;
      min-width: 250px;
      flex-shrink: 0;
    }
    
    @media screen and (min-width: 640px) {
      html {
        margin-left: calc(100vw - 100%);
        margin-right: 0;
        overflow-y: auto;
      }
    }
    

    Added Star Wars ipsum content to demonstrate .middle's vertical flexibility and how .fixed-footer is stationary and is .middle's width.

    DEMO