Was sind responsive Tabellen?

Responsives Verhalten ist heute Pflicht für die meisten Web-Anwendungen. Tabellen werden dabei meist als Problem wahrgenommen. Auch Bootstraps Antwort auf responsive Tabellen ist nicht immer befriedrigend. Letztlich leistet es das HTML-Element <table> einfach nicht. Komplexe Tabellen mit vielen Spalten lassen sich nicht beliebig verdichten:

Responsive Tabelle mit voller Breite
Responsive Tabelle mit voller Breite

Dieselbe Tabelle könnte sich aber auch in eine Liste verwandeln, die vollständig responsiv ist.

Responsive Tabelle (Ansicht Smartphone)
Responsive Tabelle auf dem Smartphone

Die Tabelle als Basis

Nun erzeugen aber viele Grids ihre Darstellung mit Tabellen. Darauf zu verzichten ist oft nicht möglich und mit erheblichem Aufwand verbunden. Glücklicherweise kann die Darstellung von Tabellen mit CSS 3 weitgehend angepasst werden. Was damit nicht geht, erledigt HTML 5. Auf JavaScript kann dabei verzichtet werden. Hier der Code der Tabelle aus den letzten beiden Abbildungen:

Code Firma Preis Änderung In % Eröffnung Höchster Niedrigster Volumen
MSF Microsoft $51.38 -0.01 -0.36% $51.39 $51.39 $51.38 9,395
APC Apple $95.46 -0.03 -0.45% $91.88 $99.15 $91.38 7,741

Verhalten mit CSS steuern

Das passende CSS dazu sieht folgendermaßen aus. Es wird durch das @media-Element nur wirksam, wenn die Bildschirmbreite unter 768px fällt.

@media only screen and (max-width: 768px) {

  /* Verhindert das Standardverhalten einer Tabelle */
  #notable table,
  #notable thead,
  #notable tbody,
  #notable th,
  #notable td,
  #notable tr {
    display: block;
  }

    /* Kopfbereich verstecken */
    #notable thead tr {
      position: absolute;
      top: -9999px;
      left: -9999px;
    }

  #notable tr {
    border: 1px solid #ccc;
  }

  #notable td {
    /* Verhalten einer Reihe */
    border: none;
    border-bottom: 1px solid #eee;
    position: relative;
    padding-left: 50%;
    white-space: normal;
    text-align: left;
  }

    #notable td:before {
      /* Neuer Kopfbereich */
      position: absolute;
      /* Simulation der Abstände */
      top: 6px;
      left: 6px;
      width: 145%;
      padding-right: 10px;
      white-space: nowrap;
      text-align: left;
      font-weight: bold;
      /* Überschriften aus data-title="" holen */
      content: attr(data-title);
    }

}

Elegante Automation mit JavaScript

Der einzige Mehraufwand besteht darin, wiederholt die Label mit data-title="" zu bestimmen. Hier kann etwas JavaScript (mit jQuery) helfen, indem die Kopffelder automatisiert kopiert werden:

$(function () {
  var t = [];
  $('thead th').each(function () {
    t.push($(this).text());        
  });
  $('tbody tr').each(function() {
    $(this).find('td').each(function(i, e) {
      $(e).attr('data-title', t[i]);
    });
  });
});

Das Skript sucht nach den Kopffeldern und erstellt daraus ein Array (Zeile 4). Dann wird nach den Reihen gesucht (Zeile 6) und in jeder Reihe das data-Attribut jedes Elements aus dem Array befüllt (Zeile 8). Die wiederholte Angabe von data-title="Code" usw. ist nicht mehr notwendig und kann vollständig entfernt werden.

Dieser Text ist aus meinem Buch zu Bootstrap 3.

Echt responsive Tabellen