I am using html table with Rowspan attribute to generate a table with different row size and column size. The issue I am having is the rendering in Outlook 2016 is showing an empty space whenever there is a an empty row. Anyone know the fix/workaround for this ? I tried using flexbox only to realize Outlook 2016 does not support this :(
Screenshot of the view in Outlook.
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><style>
table {
border: 1px solid #000000;
}
td {
border: 1px dotted #000000;
}
tr {
border: 1px dotted #000000;
}
.head {
font-size: 12px;
text-align: center;
vertical-align: middle;
font-weight: bold;
width: 200px;
height: 20px;
border-bottom: 1px solid #4c4c4c;
}
.tdHeading {
min-width: 64px;
background-color: #3f3a64;
color: #ffffff;
}
</style>
<table width="448" cellpadding="8" align="center" id="logtbl">
<thead>
<tr>
<td class="head" colspan="2" rowspan="2" width="64" align="center">
Testing
</td>
<td class="head" colspan="6" width="320">TBD</td>
</tr>
<tr>
<td class="head" width="64">1</td>
<td class="head" width="64">2</td>
<td class="head" width="64">3</td>
<td class="head" width="64">4</td>
<td class="head" width="64">5</td>
<td class="head" width="64">6</td>
</tr>
</thead>
<tbody id="bodyID">
<td rowspan="4">Cat1</td>
<tr>
<td>One</td>
<td></td>
<td></td>
<td></td>
<td bgcolor="red">
Item
</td>
<td></td>
<td></td>
</tr>
<tr>
<td>Two</td>
</tr>
<tr>
<td>Three</td>
</tr>
<td rowspan="3">Cat2</td>
<tr>
<td>Four</td>
</tr>
<tr>
<td>Five</td>
</tr>
</tbody>
</table>
Your problem stems from your HTML being invalid. A td
must always be enclosed within a tr
and cells within a thead
should be denoted with th
, rather than td
.
Also, at the top, you are not spanning 4 rows, you are spanning 3. And, at the bottom, you are not spanning 3 rows, you are spanning 2.
Specifically, this:
<tbody id="bodyID">
<td rowspan="4">Cat1</td> <!-- A cell must always be inside of a row -->
<tr>
Should have been this:
<tbody id="bodyID">
<tr>
<td rowspan="3">Cat1</td> <!-- This solves the issue. -->
<td>One</td>
<td></td>
<td></td>
<td></td>
<td class="bgRed">Item</td>
<td></td>
<td></td>
</tr>
You had the same issue with the second td rowspan
.
Beyond that, you are using several deprecated table, row, and cell attributes for styling that should all be implemented via CSS.
Putting it all together, we get this:
table {
border: 1px solid #000000;
width:448px; /* Instead of the deprecated width attribute. */
margin:auto; /* Instead of the deprecated align attribute. */
}
/* When multiple selectors need to be styled the same way
just create one selector with the combinator (,) operator. */
tr, td, th {
border: 1px dotted #000000;
}
/* Instead of the deprecated width attribute: */
.width64 { width:64px; }
.width320 { width:320px; }
/* Instead of the deprecated cellpadding attribute: */
td, th { padding:8px; }
.head {
font-size: 12px;
vertical-align: middle;
width: 200px;
height: 20px;
border-bottom: 1px solid #4c4c4c;
}
/* Instead of the deprecated bgcolor attribute: */
.bgRed { background-color:#f00;}
<table id="logtbl">
<thead>
<tr>
<!-- Within a <thead>, cells are denoted with <th>, rather than <td>
<th> elements automatically get centered and bolded, so no need to manually style. -->
<th class="head width64" colspan="2" rowspan="2">Testing</th>
<th class="head width320" colspan="6">TBD</th>
</tr>
<tr>
<th class="head">1</th>
<th class="head">2</th>
<th class="head">3</th>
<th class="head">4</th>
<th class="head">5</th>
<th class="head">6</th>
</tr>
</thead>
<tbody id="bodyID">
<tr>
<td rowspan="3">Cat1</td>
<td>One</td>
<td></td>
<td></td>
<td></td>
<td class="bgRed">Item</td>
<td></td>
<td></td>
</tr>
<tr>
<td>Two</td>
</tr>
<tr>
<td>Three</td>
</tr>
<tr>
<td rowspan="2">Cat2</td>
<td>Four</td>
</tr>
<tr>
<td>Five</td>
</tr>
</tbody>
</table>