Une véritable solution CSS pure avec une ligne d'en-tête fixe et une première colonne
J'ai dû créer un tableau avec à la fois un en-tête fixe et une première colonne fixe en utilisant du CSS pur et aucune des réponses ici n'était tout à fait ce que je voulais.
La position: sticky
propriété prend en charge à la fois le maintien en haut (comme je l'ai vu le plus utilisé) et sur le côté dans les versions modernes de Chrome, Firefox et Edge. Cela peut être combiné avec un div
qui a la overflow: scroll
propriété de vous donner un tableau avec des en-têtes fixes qui peuvent être placés n'importe où sur votre page:
Placez votre table dans un récipient:
<div class="container">
<table></table>
</div>
Utilisez overflow: scroll
sur votre conteneur pour activer le défilement:
div.container {
overflow: scroll;
}
Comme Dagmar l'a souligné dans les commentaires, le conteneur nécessite également un max-width
et un max-height
.
Utilisez position: sticky
pour avoir des cellules de table en tenir à bord et top
, right
ou left
de choisir le bord de coller à:
thead th {
position: -webkit-sticky; /* for Safari */
position: sticky;
top: 0;
}
tbody th {
position: -webkit-sticky; /* for Safari */
position: sticky;
left: 0;
}
Comme MarredCheese l'a mentionné dans les commentaires, si votre première colonne contient des <td>
éléments au lieu d' <th>
éléments, vous pouvez utiliser tbody td:first-child
dans votre CSS au lieu detbody th
Pour que l'en-tête de la première colonne reste à gauche, utilisez:
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/