Let’s say you have created an HTML table with following markup:
<table id="xMyTable" style="width:100%;"> <tr > <td style="vertical-align:top"> <div style="border: 2px solid black; background-color:red; height: 100px;"> </div> </td> <td style="vertical-align:top" rowspan="3"> <div style="border: 2px solid black; background-color:orange; height: 600px"> </div> </td> </tr> <tr> <td style="vertical-align:top"> <div style="border: 2px solid black; background-color:green; height: 100px"> </div> </td> </tr> <tr> <td style="vertical-align:top"> <div style="border: 2px solid black; background-color:blue; height: 100px"> </div> </td> </tr> </table>
It’s very basic, one rowspanned cell that holds a content with large height on the right and 3 corresponding cells with content of smaller height on the left. You’d expect it to look like this:
Unfortunately as is it works only in Google Chrome. In the rest of the browsers, including Interned Explorer and famed FireFox it looks like this:
What happens is browsers automatically spread spanned cells height to evenly fit height of the cell with rowspan. To rectify this situation we need a little help from JavaScript.
First let’s create a function that would adjust height of a cell in relation to total height of the table:
function growCell(td) { var table, target, high, low, mid; table = td.offsetParent; target = table.offsetHeight; low = td.offsetHeight; // find initial high high = low; while (table.offsetHeight <= target) { high *= 2 td.style.height = (high) + 'px'; } // binary search! while (low + 1 < high) { mid = low + Math.floor((high - low) / 2); td.style.height = mid + 'px'; if (table.offsetHeight > target) { high = mid; } else { low = mid; } } td.style.height = low + 'px'; }
Now we need to call this function for every cell in the table starting in reverse from the bottom row:
function growTable(i_sTableID) { var xTable = document.getElementById(i_sTableID); for (Y = xTable.rows.length - 1; Y >= 0; Y--) { for (X = 0; X < xTable.rows[Y].cells.length; X++) { growCell(xTable.rows[Y].cells[X]) } } }
That’s it. Now all we have to do to adjust table layout is call this growTable
function and pass ID of the table in question:
growTable('xMyTable');
And the table takes desired layout.
CREDITS: This solution is not mine, I simple translated it from jQuery to plain-vanilla JavaScript. Original method was provided by Jeffery To @stackoverflow.com