CSS-Only Sticky Head Headers в Chrome
У меня есть следующий фрагмент Sass, в котором я хочу, чтобы <thead>
плавал, когда прокручивается таблица. Это работает правильно в Safari, но не в Chrome Version 58.0.3029.110 (64-bit)
.
Я знаю, что Chrome была на опять-таки, опять-таки поддержка sticky
, и в настоящее время поддерживает его, но это финал? Является ли это ошибкой Chrome или мне нужно другое решение? (Я предпочитаю подход CSS, а не Javascript, потому что он более совершенен.)
.table {
thead {
background: white;
position: sticky;
top: 0;
z-index: 10;
}
}
Ответы
Ответ 1
position: sticky не работает с некоторыми элементами таблицы (thead/tr) в Chrome. Вы можете двигаться липкой к tds/ths tr, вам нужно быть липким. Как это:
.table {
thead tr:nth-child(1) th{
background: white;
position: sticky;
top: 0;
z-index: 10;
}
}
Также это сработает.
.table {
position: sticky;
top: 0;
z-index: 10;
}
Вы можете перемещать заголовок в отдельный макет. Например:
<table class="table">
<thead>
<tr>
<th>1</th>
<th>2</th>
<th>3</th>
<th>4</th>
</tr>
</thead>
</table>
<table>
<tbody>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
<td>4</td>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
<td>4</td>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
<td>4</td>
</tr>
</table>
Ответ 2
Для кого-то, кто все еще ищет решение и не удовлетворен принятым.
1) Используйте класс sticky-top для th-го элемента.
2) С собственным классом
th.sticky-header {
position: sticky;
top: 0;
z-index: 10;
/*To not have transparent background.
background-color: white;*/
}
<table class="table">
<thead>
<tr>
<th class="sticky-header">1</th>
<th class="sticky-header">2</th>
<th class="sticky-header">3</th>
<th class="sticky-header">4</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
<td>4</td>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
<td>4</td>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
<td>4</td>
</tr>
</tbody>
</table>
Ответ 3
https://jsfiddle.net/y9cwnb81/4/
div.table {
width: 100%;
display: grid;
grid-template-columns: 1fr 1fr 1fr;
grid-template-rows: 1fr auto;
grid-template-areas:
"header header header"
"content content content";
}
.header {
grid: 1fr/1fr;
}
.content {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
grid-template-rows: auto;
grid-area: content;
height: 200px;
overflow-y: scroll;
}
.content div {
grid: auto-flow 1fr / repeat(auto-fill);
}
<!-- Here is the table code -->
<div class="table">
<div class="header">Name</div>
<div class="header">Color</div>
<div class="header">Description</div>
<div class="content">
<div>Apple</div>
<div>Red</div>
<div>These are red asd,mas, da,msnd asndm,asndm,asndbansbdansmbdmnasbd.</div>
<div>Apple</div>
<div>Red</div>
<div>These are red asd.</div>
<div>Apple</div>
<div>Red</div>
<div>These are red asd.</div>
<div>Apple</div>
<div>Red</div>
<div>These are red asd.</div>
<div>Apple</div>
<div>Red</div>
<div>These are red asd.</div>
<div>Apple</div>
<div>Red</div>
<div>These are red asd.</div>
<div>Apple</div>
<div>Red</div>
<div>These are red asd.</div>
<div>Apple</div>
<div>Red</div>
<div>These are red asd.</div>
<div>Apple</div>
<div>Red</div>
<div>These are red asd.</div>
<div>Apple</div>
<div>Red</div>
<div>These are red asd.</div>
<div>Apple</div>
<div>Red</div>
<div>These are red asd.</div>
</div>
</div>
Вот пример использования CSS GRID, чтобы иметь липкие заголовки только с CSS, без необходимости использования javascript.
Ответ 4
Вы устанавливаете липкую позицию в ячейке таблицы заголовка вместо строки таблицы.
.td.header {
position: sticky;
top:0px;
}
Проверьте этот jsfiddle для простого примера.