If your header and footer are fixed height and you want the footer always pinned at the bottom then I think you can get away with an absolute layout like this.
Just pin the footer down and have the content top/bottom set. Don't set height on the content to allow it to fill space between the header/footer.
body { margin: 0; height: 100vh; width: 100vw }
.header { height: 50px; background: blue }
.content { position: absolute; top: 50px; bottom: 50px; width: 100%; background: red }
.footer { position: absolute; bottom: 0; height: 50px; width: 100%; background: green }
<div class="header">Header</div>
<div class="content">Content</div>
<div class="footer">Footer</div>
You could also do it without the absolute positioning and just use calc() to adjust the height. For either solution you need the container (body in this case) set to fill the screen with vh/vw.
body { margin: 0; height: 100vh; width: 100vw }
.header { height: 50px; background: blue }
.content { height: calc(100% - 100px); background: red }
.footer { height: 50px; background: green }
<div class="header">Header</div>
<div class="content">Content</div>
<div class="footer">Footer</div>
There is another way with flexbox where you wouldn't need fixed heights on the header/footer - I may follow-up with that one...
EDIT: this would be my preferred way, flexbox so you don't have to worry about the heights of the header/footer, the content always stretches.
body { margin: 0; height: 100vh; width: 100vw; display: flex; flex-direction: column }
.header { background: blue }
.content {
display: flex;
flex: 1 1 auto;
background: red;
}
.footer { background: green }
<div class="header">Header</div>
<div class="content">Content</div>
<div class="footer">Footer<br>With Line Break</div>