<table class="table table-header-rotated">
      <!-- First column header is not rotated -->
      <!-- Following headers are rotated -->
      <th class="rotate"><div><span>Column header 1</span></div></th>
        <th class="rotate"><div><span>Column header 2</span></div></th>
        <th class="rotate"><div><span>Column header 3</span></div></th>
        <th class="rotate"><div><span>Column header 4</span></div></th>
        <th class="rotate"><div><span>Column header 5</span></div></th>
        <th class="rotate"><div><span>Column header 6</span></div></th>
      <th class="row-header">Row header 1</th>
      <td><input checked="checked" name="column1[]" type="radio" value="row1-column1"></td>
      <td><input checked="checked" name="column2[]" type="radio" value="row1-column2"></td>
      <td><input name="column3[]" type="radio" value="row1-column3"></td>
      <td><input name="column4[]" type="radio" value="row1-column4"></td>
      <td><input name="column5[]" type="radio" value="row1-column5"></td>
      <td><input name="column6[]" type="radio" value="row1-column6"></td>
      <th class="row-header">Row header 2</th>
      <td><input name="column1[]" type="radio" value="row2-column1"></td>
      <td><input name="column2[]" type="radio" value="row2-column2"></td>
      <td><input checked="checked" name="column3[]" type="radio" value="row2-column3"></td>
      <td><input checked="checked" name="column4[]" type="radio" value="row2-column4"></td>
      <td><input name="column5[]" type="radio" value="row2-column5"></td>
      <td><input name="column6[]" type="radio" value="row2-column6"></td>
      <th class="row-header">Row header 3</th>
      <td><input name="column1[]" type="radio" value="row3-column1"></td>
      <td><input name="column2[]" type="radio" value="row3-column2"></td>
      <td><input name="column3[]" type="radio" value="row3-column3"></td>
      <td><input name="column4[]" type="radio" value="row3-column4"></td>
      <td><input checked="checked" name="column5[]" type="radio" value="row3-column5"></td>
      <td><input checked="checked" name="column6[]" type="radio" value="row3-column6"></td>
.table-header-rotated {
  border-collapse: collapse;
  .csstransforms & td {
    width: 30px;
  .no-csstransforms & th {
    padding: 5px 10px;
  td {
    text-align: center;
    padding: 10px 5px;
    border: 1px solid #ccc;
  .csstransforms & th.rotate {
    height: 140px;
    white-space: nowrap;
    // Firefox needs the extra DIV for some reason, otherwise the text disappears if you rotate 
    > div {
        // Magic Numbers
        translate(25px, 51px)
        // 45 is really 360-45
      width: 30px;
    > div > span {
      border-bottom: 1px solid #ccc;
      padding: 5px 10px;
  th.row-header {
    padding: 0 10px;
    border-bottom: 1px solid #ccc;
View Compiled

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

  1. https://s3-us-west-2.amazonaws.com/s.cdpn.io/3/modernizr-2.7.1.js