Hallo zusammen,
seit einiger Zeit bin ich auf der Suche nach einer "guten Lösung" um Tabellen responsive zu gestalten. (Ja ich weiß, Tabellen sollten am Besten komplett vermieden werden, aber manchmal geht dies leider nicht.)
Hier gibt es die unterschiedlichsten Lösungsansätze (Spaltengrößen mit Breakpoints anpassen, mit/ohne Scrollbar, etc...), diese sind alle nicht sehr befriedigend. Ich bin jetzt auf den folgenden Ansatz (siehe CSS und HTML unten) gestoßen und finde diesen recht gut.
Wenn hier das Fenster zu klein wird, dann werden die <thead> ausgeblendet und durch ein Pseudoelement per "::before" ersetzt. Die Tabelle wird dann umstrukturiert.
Hier habe ich leider nur ein Problem, ich kann die Höhe des Pseudo-Elements "td::before" nicht automatisch an die jeweilige Feldhöhe anpassen. In diesem Beispiel wirkt sich das so aus, dass die graue Hinterlegung von "td::before" nicht bis zum unteren Ende der Spalte geht, sobald hier eine Zelle über mehrere Zeilen groß ist. (Objekt 2, Attribut 2 und Attribut 3).
Kann mir hier jemand von euch helfen, oder hat Denkanstöße/ Schlagworte zum selbst googeln für mich?
Vielen Dank schon mal im Voraus!
Willy
<style>
table {
width:100%;
}
table, td, tr, th {
border:2px solid black;
border-collapse: collapse;
text-align: left;
}
td, tr, th {
padding:1em;
}
th {
background:#eee;
font-weight: bold;
}
@media screen and (max-width:700px) {
table, tr, td {
padding:0;
border:1px solid black;
}
table {
border:none;
}
thead {
display:none;
}
tr {
float: left;
width: 100%;
margin-bottom: 2em;
}
td {
float: left;
width: 100%;
padding:1em;
}
td::before {
content:attr(data-label);
word-wrap: break-word;
background: #eee;
border-right:2px solid black;
width: 20%;
float:left;
padding:1em;
font-weight: bold;
margin:-1em 1em -1em -1em;
}
.spalte{
float: left;
width: 60%;
}
}
</style>
Alles anzeigen
<table>
<thead>
<tr>
<th>Attribut 1</th>
<th>Attribut 2</th>
<th>Attribut 3</th>
</tr>
</thead>
<tbody>
<tr>
<td data-label="Attribut 1"><div class="spalte">Objekt 1</div></td>
<td data-label="Attribut 2"><div class="spalte">Objekt 1</div></td>
<td data-label="Attribut 3"><div class="spalte">Objekt 1</div></td>
</tr>
<tr>
<td data-label="Attribut 1"><div class="spalte">Objekt 2</div></td>
<td data-label="Attribut 2"><div class="spalte"><ul><li>Listeneintrag 2</li><li>Listeneintrag 2</li><li>Listeneintrag 2</li></ul></div></td>
<td data-label="Attribut 3"><div class="spalte">Objekt 2<br> Objekt 2<br>Objekt 2</div></td>
</tr>
</tbody>
</table>
Alles anzeigen