Eine echte reine CSS-Lösung mit einer festen Kopfzeile und einer ersten Spalte
Ich musste eine Tabelle mit einem festen Header und einer festen ersten Spalte mit reinem CSS erstellen, und keine der Antworten hier war genau das, was ich wollte.
Die position: sticky
Eigenschaft unterstützt sowohl das Festhalten an der Oberseite (wie ich am häufigsten gesehen habe) als auch an der Seite in modernen Versionen von Chrome, Firefox und Edge. Dies kann mit einem kombiniert werden div
, das die overflow: scroll
Eigenschaft hat, Ihnen eine Tabelle mit festen Überschriften zu geben, die an einer beliebigen Stelle auf Ihrer Seite platziert werden kann:
Stellen Sie Ihren Tisch in einen Behälter:
<div class="container">
<table></table>
</div>
Verwenden Sie overflow: scroll
auf Ihrem Container, um das Scrollen zu aktivieren:
div.container {
overflow: scroll;
}
Wie Dagmar in den Kommentaren betonte, benötigt der Container auch a max-width
und a max-height
.
Verwenden position: sticky
Tabelle Zellen kleben an der Kante und top
, right
oder left
zu wählen , die Kante zu Stick:
thead th {
position: -webkit-sticky; /* for Safari */
position: sticky;
top: 0;
}
tbody th {
position: -webkit-sticky; /* for Safari */
position: sticky;
left: 0;
}
Wie MarredCheese in den Kommentaren erwähnt hat, können Sie, wenn Ihre erste Spalte <td>
Elemente anstelle von <th>
Elementen enthält, diese tbody td:first-child
in Ihrem CSS anstelle von verwendentbody th
Verwenden Sie Folgendes, damit die Überschrift in der ersten Spalte links bleibt:
thead th:first-child {
left: 0;
z-index: 1;
}
/* Use overflow:scroll on your container to enable scrolling: */
div {
max-width: 400px;
max-height: 150px;
overflow: scroll;
}
/* Use position: sticky to have it stick to the edge
* and top, right, or left to choose which edge to stick to: */
thead th {
position: -webkit-sticky; /* for Safari */
position: sticky;
top: 0;
}
tbody th {
position: -webkit-sticky; /* for Safari */
position: sticky;
left: 0;
}
/* To have the header in the first column stick to the left: */
thead th:first-child {
left: 0;
z-index: 2;
}
/* Just to display it nicely: */
thead th {
background: #000;
color: #FFF;
/* Ensure this stays above the emulated border right in tbody th {}: */
z-index: 1;
}
tbody th {
background: #FFF;
border-right: 1px solid #CCC;
/* Browsers tend to drop borders on sticky elements, so we emulate the border-right using a box-shadow to ensure it stays: */
box-shadow: 1px 0 0 0 #ccc;
}
table {
border-collapse: collapse;
}
td,
th {
padding: 0.5em;
}
<div>
<table>
<thead>
<tr>
<th></th>
<th>headheadhead</th>
<th>headheadhead</th>
<th>headheadhead</th>
<th>headheadhead</th>
<th>headheadhead</th>
<th>headheadhead</th>
<th>headheadhead</th>
</tr>
</thead>
<tbody>
<tr>
<th>head</th>
<td>body</td>
<td>body</td>
<td>body</td>
<td>body</td>
<td>body</td>
<td>body</td>
<td>body</td>
</tr>
<tr>
<th>head</th>
<td>body</td>
<td>body</td>
<td>body</td>
<td>body</td>
<td>body</td>
<td>body</td>
<td>body</td>
</tr>
<tr>
<th>head</th>
<td>body</td>
<td>body</td>
<td>body</td>
<td>body</td>
<td>body</td>
<td>body</td>
<td>body</td>
</tr>
<tr>
<th>head</th>
<td>body</td>
<td>body</td>
<td>body</td>
<td>body</td>
<td>body</td>
<td>body</td>
<td>body</td>
</tr>
<tr>
<th>head</th>
<td>body</td>
<td>body</td>
<td>body</td>
<td>body</td>
<td>body</td>
<td>body</td>
<td>body</td>
</tr>
<tr>
<th>head</th>
<td>body</td>
<td>body</td>
<td>body</td>
<td>body</td>
<td>body</td>
<td>body</td>
<td>body</td>
</tr>
</tbody>
</table>
</div>
https://jsfiddle.net/qwubvg9m/1/