So if you can use some JQ this is what I found works I use this in a couple different tables I have. Some are created by Knockout.js, some are dynamically created using some PHP and autoscroll, and some are static. The concept that makes them work is all the same.
The CSS:
table thead {
width: 100%;
display: block;
position: relative;
}
table tbody {
display: block;
overflow-y: hidden; /* Or what ever you choose */
overflow-x: hidden;
height: 350px; /* Percents don't really work in a dynamic setting so keep that in mind */
}
The JS:
$(table + ' tbody tr:last-of-type td').each(function(a, b, c) {
var w = $(this).css('width'),
i = parseInt(a);
$(table + ' thead tr th').eq(i).css('width', w);
});
Pretty much it's the JS that makes it work, the key is we have to set the header cells to the same width as the body. So what happens when we have a table body that will scroll, the browser sneaks the width of the scroll bar off the last cell. this gives us our mismatch with the header cells and the body cells. Good practice in this case if you need to make your table fluid is use percents on all the columns except the last one this way results are predictable.
This post pointed me in the right direction.
EDIT:
I forgot to mention all instances I have this implemented are bootstrap-3 tables.