I did this with a combination of:
Here's a jsfiddle example to demonstrate.
Haven't tested on all browsers but I imagine it's not great on older IE versions.
$("#clscroll-content").scroll(function() {_x000D_
$("#clscroll-row-headers").scrollTop($("#clscroll-content").scrollTop());_x000D_
$("#clscroll-column-headers").scrollLeft($("#clscroll-content").scrollLeft());_x000D_
});_x000D_
_x000D_
$("#clscroll-column-headers").scroll(function() {_x000D_
$("#clscroll-content").scrollLeft($("#clscroll-column-headers").scrollLeft());_x000D_
});_x000D_
_x000D_
$("#clscroll-row-headers").scroll(function() {_x000D_
$("#clscroll-content").scrollTop($("#clscroll-row-headers").scrollTop());_x000D_
});
_x000D_
.clscroll table {_x000D_
table-layout: fixed;_x000D_
}_x000D_
_x000D_
.clscroll td, .clscroll th { _x000D_
overflow: hidden;_x000D_
}_x000D_
_x000D_
.corner-header {_x000D_
float: left;_x000D_
}_x000D_
_x000D_
.column-headers {_x000D_
float: left;_x000D_
overflow: scroll;_x000D_
}_x000D_
_x000D_
.row-headers {_x000D_
clear: both;_x000D_
float: left; _x000D_
overflow: scroll;_x000D_
}_x000D_
_x000D_
.table-content {_x000D_
table-layout: fixed;_x000D_
float: left;_x000D_
overflow: scroll;_x000D_
}_x000D_
_x000D_
.clscroll td, .clscroll th { _x000D_
width: 200px;_x000D_
border: 1px solid black;_x000D_
}_x000D_
_x000D_
.row-headers, .table-content {_x000D_
height: 100px;_x000D_
}_x000D_
_x000D_
.column-headers, .table-content, .table-content table, .column-headers table {_x000D_
width: 400px;_x000D_
}
_x000D_
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>_x000D_
<div class="clscroll corner-header">_x000D_
<table>_x000D_
<tr>_x000D_
<th> </th>_x000D_
</tr>_x000D_
</table>_x000D_
</div>_x000D_
<div class="clscroll column-headers" id="clscroll-column-headers">_x000D_
<table>_x000D_
<tr>_x000D_
<th>Bus</th>_x000D_
<th>Plane</th>_x000D_
<th>Boat</th>_x000D_
<th>Bicycle</th>_x000D_
</tr>_x000D_
</table>_x000D_
</div>_x000D_
<div class="clscroll row-headers" id="clscroll-row-headers">_x000D_
<table>_x000D_
<tr>_x000D_
<th>Red</th>_x000D_
</tr>_x000D_
<tr>_x000D_
<th>Green</th>_x000D_
</tr>_x000D_
<tr>_x000D_
<th>Blue</th>_x000D_
</tr>_x000D_
<tr>_x000D_
<th>Orange</th>_x000D_
</tr>_x000D_
<tr>_x000D_
<th>Purple</th>_x000D_
</tr>_x000D_
<tr>_x000D_
<th>Yellow</th>_x000D_
</tr>_x000D_
<tr>_x000D_
<th>Pink</th>_x000D_
</tr>_x000D_
<tr>_x000D_
<th>Brown</th>_x000D_
</tr>_x000D_
</table>_x000D_
</div>_x000D_
<div class="clscroll table-content" id="clscroll-content">_x000D_
<table>_x000D_
<tr>_x000D_
<td>Red Bus</td>_x000D_
<td>Red Plane</td>_x000D_
<td>Red Boat</td>_x000D_
<td>Red Bicycle</td>_x000D_
</tr>_x000D_
<tr>_x000D_
<td>Green Bus</td>_x000D_
<td>Green Plane</td>_x000D_
<td>Green Boat</td>_x000D_
<td>Green Bicycle</td>_x000D_
</tr>_x000D_
<tr>_x000D_
<td>Blue Bus</td>_x000D_
<td>Blue Plane</td>_x000D_
<td>Blue Boat</td>_x000D_
<td>Blue Bicycle</td>_x000D_
</tr>_x000D_
<tr>_x000D_
<td>Orange Bus</td>_x000D_
<td>Orange Plane</td>_x000D_
<td>Orange Boat</td>_x000D_
<td>Orange Bicycle</td>_x000D_
</tr>_x000D_
<tr>_x000D_
<td>Purple Bus</td>_x000D_
<td>Purple Plane</td>_x000D_
<td>Purple Boat</td>_x000D_
<td>Purple Bicycle</td>_x000D_
</tr>_x000D_
<tr>_x000D_
<td>Yellow Bus</td>_x000D_
<td>Yellow Plane</td>_x000D_
<td>Yellow Boat</td>_x000D_
<td>Yellow Bicycle</td>_x000D_
</tr>_x000D_
<tr>_x000D_
<td>Pink Bus</td>_x000D_
<td>Pink Plane</td>_x000D_
<td>Pink Boat</td>_x000D_
<td>Pink Bicycle</td>_x000D_
</tr>_x000D_
<tr>_x000D_
<td>Brown Bus</td>_x000D_
<td>Brown Plane</td>_x000D_
<td>Brown Boat</td>_x000D_
<td>Brown Bicycle</td>_x000D_
</tr>_x000D_
</table>_x000D_
</div>
_x000D_