position: 'sticky'
A atterri dans Chrome 56 , mais cela rend la bordure invisible dans certaines circonstances.
Prenons l'exemple suivant:
table {
border-collapse: collapse;
}
thead {
position: sticky;
top: 0;
}
th {
background-color: #fff;
border-right: 5px solid red;
}
<table>
<thead>
<tr>
<th>First</th>
<th>Second</th>
<th>Third</th>
</tr>
</thead>
</table>
Dans Chrome 56.0.2924.76, seule la dernière bordure de <th>
Est visible, et ce uniquement lorsque <th>
A un background-color
Spécifié .
Est-ce un bug dans Chrome?
semble forcer une refusion aidera partiellement:
table {
border-collapse: collapse;
}
thead {
position: sticky;
top: 0;
}
th {
border-right: 5px solid red;
transform:scale(0.999);
}
<table>
<thead>
<tr>
<th>First</th>
<th>Second</th>
<th>Third</th>
</tr>
</thead>
</table>
background-clip
semble également efficace et inoffensif:
table {
margin-top: 1em;
border-collapse: collapse;
margin-bottom: 200vh
}
thead {
position: sticky;
top: 0;
}
th {
border-right: 5px solid red;
background:white;
background-clip: padding-box;
}
<table>
<thead>
<tr>
<th>First</th>
<th>Second</th>
<th>Third</th>
</tr>
</thead>
</table>
J'ai fait face au même problème. Ma solution de contournement consistait à utiliser le :after
pseudo-élément pour émuler une bordure inférieure.
th:after{
content:'';
position:absolute;
left: 0;
bottom: 0;
width:100%;
border-bottom: 1px solid rgba(0,0,0,0.12);
}
si le tableau contient une bordure autour des colonnes et que nous ajoutons une position collante, lorsque nous faisons défiler le tableau, nous montrons l'effet de chevauchement pour supprimer cet effet et conserve la bordure, nous devons supprimer la bordure et ajouter un contour au lieu de la bordure
table tr th{
outline: 1px solid #e9ecef;
border:none;
outline-offset: -1px;
}
J'ai résolu avec l'ombre
table tr th {
position: -webkit-sticky;
position: sticky;
top: -1px;
z-index: 2;
background-color: white;
-moz-box-shadow: 0 0 1px -1px #ccc;
-webkit-box-shadow: 0 0 1px -1px #ccc;
box-shadow: 0 0 1px -1px #ccc;
}
L'exemple suivant fonctionne actuellement bien sous Chrome (65) et Firefox (59).
Le code SCSS illustre mieux la relation entre les valeurs. Vous pouvez définir les valeurs souhaitées en modifiant les variables.
SCSS:
table {
&.sticky-table-head {
// Variables
$border-width: 2px;
$head-background-color: #ded;
$head-border-color: #8a8;
$background-color: #f8fff8;
$border-color: #cdc;
$color: #686;
// Declarations
margin-bottom: 1em;
border-collapse: collapse;
background-color: $background-color;
color: $color;
&:last-child {
margin-bottom: 100vh;
}
th,
td {
border: $border-width solid $border-color;
}
thead {
th {
position: sticky;
top: ($border-width / 2);
background-color: $head-background-color;
outline: $border-width solid $head-border-color;
outline-offset: (- $border-width / 2);
}
}
}
}
HTML et CSS compilé:
table.sticky-table-head {
margin-bottom: 1em;
border-collapse: collapse;
background-color: #f8fff8;
color: #686;
}
table.sticky-table-head:last-child {
margin-bottom: 100vh;
}
table.sticky-table-head th,
table.sticky-table-head td {
border: 2px solid #cdc;
}
table.sticky-table-head thead th {
position: -webkit-sticky;
position: sticky;
top: 1px;
background-color: #ded;
outline: 2px solid #8a8;
outline-offset: -1px;
}
<div>
<!-- First table -->
<table class="sticky-table-head">
<thead>
<tr>
<th>Lorem</th>
<th>Ipsum</th>
<th>Dolor sit amet</th>
</tr>
</thead>
<tbody>
<tr>
<td>ipsum</td>
<td>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</td>
<td>sit</td>
</tr>
<tr>
<td>ipsum</td>
<td>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</td>
<td>sit</td>
</tr>
<tr>
<td>ipsum</td>
<td>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</td>
<td>sit</td>
</tr>
<tr>
<td>ipsum</td>
<td>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</td>
<td>sit</td>
</tr>
<tr>
<td>ipsum</td>
<td>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</td>
<td>sit</td>
</tr>
<tr>
<td>ipsum</td>
<td>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</td>
<td>sit</td>
</tr>
<tr>
<td>ipsum</td>
<td>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</td>
<td>sit</td>
</tr>
<tr>
<td>ipsum</td>
<td>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</td>
<td>sit</td>
</tr>
</tbody>
</table>
<!-- Second table -->
<table class="sticky-table-head">
<thead>
<tr>
<th>Lorem</th>
<th>Ipsum</th>
<th>Dolor sit amet</th>
</tr>
</thead>
<tbody>
<tr>
<td>ipsum</td>
<td>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</td>
<td>sit</td>
</tr>
<tr>
<td>ipsum</td>
<td>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</td>
<td>sit</td>
</tr>
<tr>
<td>ipsum</td>
<td>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</td>
<td>sit</td>
</tr>
<tr>
<td>ipsum</td>
<td>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</td>
<td>sit</td>
</tr>
<tr>
<td>ipsum</td>
<td>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</td>
<td>sit</td>
</tr>
<tr>
<td>ipsum</td>
<td>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</td>
<td>sit</td>
</tr>
<tr>
<td>ipsum</td>
<td>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</td>
<td>sit</td>
</tr>
<tr>
<td>ipsum</td>
<td>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</td>
<td>sit</td>
</tr>
</tbody>
</table>
</div>
Une autre option consiste à encapsuler votre contenu dans un élément et à mettre la frontière dessus:
<th><div class="th-inner">your content</div><th>
.th-inner {
padding: 10px;
border-bottom: 1px solid #ccc;
}
Cependant J'ai trouvé que mettre la bordure sur le th
fonctionnait sans border-collapse: collapse
sur la table, donc je suis allé pour ça.
thead::after {
content: '';
display: block;
position: absolute;
right: 0;
bottom: 0;
left: 0;
height: 1px;
background-color: #333333;
}
J'ai corrigé ce même problème avec un pseudo-élément au lieu d'une bordure. Je ne sais pas pourquoi cela se produit en premier lieu, cependant.
J'utilise uniquement des bordures horizontales dans ma page, cela peut donc devoir être adapté à votre cas particulier. En utilisant une couleur d'arrière-plan semi-transparente pour les cellules du tableau, j'ai découvert que c'est l'extrémité inférieure de l'arrière-plan qui recouvre la bordure horizontale. Je suppose que ce sera la même chose avec l'extrémité droite pour la bordure verticale. Pour éviter le chevauchement des bordures, j'ai défini un dégradé linéaire qui remplit tout mais épargne le dernier pixel. Malheureusement, cela ne fonctionne que dans Firefox et Chrome mais pas dans Edge.
td:first-child
{
position: sticky;
left: 0px;
z-index: 2;
background: linear-gradient(to bottom, white, white calc(100% - 1px), transparent calc(100% - 1px), transparent);
}
Le bord peint un dégradé linéaire mais du blanc en haut au transparent en bas, ignorant le changement dur à l'arrêt à 100% - 1px.