Old School Float Layout
 
float places an element to the left or right side of its container, allowing inline elements to wrap around it.
clear can cancel float.
<style>
  * {
    margin: 0;
    padding: 0;    
  }
  #wrapper{
    margin: auto;
    width: 90vw; /* Viewport Width = browser window width */
  }
  #top{
    height: 10vh;  /* if Viewport Height is 50cm, 1vh = 0.5cm (or 1%) */
    background-color: aqua;
  }
  #middle {
    overflow: hidden; /* enable the -10000px bottom margin height hack below... */
  }
  #left_col{
    width: 150px;
    background-color: greenyellow;
    float: left;   
    margin-bottom: -10000px; /* this doesnt make column heights the same size... */
    padding-bottom: 10000px;
    
  }
  #mid_col{
    /* 100% of #wrapper - #leftcol - #right: */
    width: calc(100% - 150px - 100px);
    background-color: violet; 
    float: left;
    margin-bottom: -10000px; /* it just gives column heights illusion of same size... */
    padding-bottom: 10000px;
  }
  #right{
    width: 100px;
    background-color: sandybrown; 
    float: left;
    margin-bottom: -10000px; /* which usually suffices. there are better ways. */
    padding-bottom: 10000px;
  }
  #footer{
    clear: both; 
    height: 5vh;
    background-color: lightgray;
  }
</style>
<div id="wrapper">
  <div id="top">top division</div>
  <div id="middle">
    <div id="left_col">left column fixed width 150px, height will vary</div>
    <div id="mid_col">
      middle column will grow and shrink in width based on the width of the viewport.<br>
      these three columns will grow and shrink in height based on whichever has the most content. try it out!
    </div>
    <div id="right">right column fixed width 100px, height will vary</div>
  </div>
  <div id="footer">footer</div>
</div>
read up on calc() then try this:
- put some content into left, middle and right columns. what happened to their:
    - widths
- heights