- Em tabelas com muitas linhas, quanto mais se rola a página, mais fácil é esquecer o significado das colunas, o que dificulta a leitura dos dados
- Basta adicionar
position: sticky; e top: 0; ao thead para implementar um cabeçalho fixo
sticky tem cerca de 96% de suporte nos navegadores no mundo todo, então está longe de ser um recurso experimental
- Mesmo ao visualizar linhas mais abaixo, como o item 300, os títulos das colunas continuam visíveis, melhorando a experiência de navegação pela tabela
- A implementação é pequena, mas o efeito é grande; por isso, em páginas com tabelas longas, vale aplicá-la como uma melhoria básica de usabilidade
O problema de o cabeçalho desaparecer em tabelas longas
- Em tabelas com grandes conjuntos de dados ou centenas de linhas, após rolar a página o cabeçalho da tabela sai da área visível
- Ao descer até o item 300, pode ficar difícil conferir novamente o que os dados de cada coluna significam
- Quanto mais desconhecida for a tabela, maior o esforço de navegação, já que é preciso lembrar o significado das colunas durante a leitura
Aplicando sticky ao thead
- A solução é adicionar duas propriedades CSS ao
thead
position: sticky;
top: 0;
- Ao usar
position: sticky junto com top: 0, é possível fixar o cabeçalho no topo da tela mesmo durante a rolagem
sticky conta com cerca de 96% de suporte global, então pode ser usado em muitos navegadores
- Você pode verificar o funcionamento real no exemplo no CodePen
1 comentários
Opiniões no Hacker News
Um cabeçalho fixo em um eixo eu até aceito, mas ainda estou esperando o dia em que o CSS dará suporte a isso nos dois eixos: https://github.com/w3c/csswg-drafts/issues/8286
overflow-x: auto, mas fazem você escolher só um dos doisConfesso que, mesmo sabendo pouquíssimo CSS, consigo fazer web apps que funcionam razoavelmente. Recentemente tentei fixar o cabeçalho em uma tabela monstruosa de cerca de 20 mil linhas: https://www.datasciencemeta.com/rpackages No começo, esperava que as classes de tabela do Bootstrap tivessem algo como
class="table table-header-sticky", mas não tinham; depois de uns 20 minutos mexendo em sugestões do Stack Overflow, GPT e CodePen, sempre surgiam efeitos colaterais estranhos Mas com o CodePen deste artigo funcionou em 2 minutos, e estou colocando isso em produção agoraFixar cabeçalhos de tabela parece fácil com um simples
position: sticky;, mas assim que você começa a acrescentar coisas ao conteúdo da tabela, fica complicado Em uma tabela com cabeçalho fixo, implementei um recurso que salvava o índice da primeira linha visível quando o usuário rolava o corpo e saía da página, para restaurá-lo ao voltar; mas ele sempre restaurava cerca de uma linha abaixo. No fim, a linha 5 estava de fato no topo da tabela, só que otheadficava sobreposto e fazia a linha 6 parecer a primeira Então ajustei a posição de rolagem levando em conta a altura dothead, mas às vezes ainda ficava alguns pixels desalinhado; como a tabela era grande, fazia lazy loading no evento de rolagem e usava o layout automático padrão de tabelas, as células do cabeçalho quebravam linha e a altura total do cabeçalho mudava. No fim, anexei um ResizeObserver aotheadpara ajustar dinamicamente a posição de rolagem quando a altura mudava [1] https://developer.mozilla.org/en-US/docs/Web/API/ResizeObser...Ao implementar isso, se você também quiser que a borda do cabeçalho fique fixa, dá para resolver colocando
position: absolute,width: 100%,top: 0/bottom: 0eborder-top/border-bottomemtable thead:beforeetable thead:afterSeria bom se cabeçalhos de tabela se comportassem assim automaticamente. Se o desenvolvedor já se deu ao trabalho de usar as tags relacionadas, normalmente é provável que esse seja o comportamento desejado
em vez dee, dentro de cada, 45 níveis deaninhados; nesses lugares, acho que não funcionariaNa linha de comando, basta mandar o cabeçalho para stderr e o corpo para stdout Se você não fizer isso, o resultado de
heights | sort -k2 -nrfica na ordemGeorge 186,Wally 173,NAME HEIGHT; mas, se o cabeçalho contornar stdout, a ordem ficaNAME HEIGHT,George 186,Wally 173heights | (sed -u 1q; sort -k2 -nr)funciona corretamente Fonte: https://stackoverflow.com/a/56151840heightsfor um arquivo, dá para fazer% head -1 heights ; sed 1,1d heights | sort -k2 -nr; seheightsfor um executável caro de rodar duas vezes, dá para fazer% heights > /tmp/heights ; head -1 /tmp/heights ; sed 1,1d /tmp/heights | sort -k2 -nr. Também dá para passar por um pipe paraawkAs outras opções são menos convenientes, mas menos surpreendentes, e funcionam mesmo que o autor do executável tenha pensado de outro jeitoIsso não funcionou por muito tempo. Antigamente, o Chrome desativava
position: stickynos elementostheadetr: https://issues.chromium.org/issues/41303743 Lembro que a tabela de suporte dos navegadores parecia quase toda verde, mas justamente nas tabelas do Chrome não funcionavaTambém há quem prefira dizer “por favor, não faça isso”: https://news.ycombinator.com/item?id=32998091
sticky?O CodePen fica melhor se você compensar o
toppela espessura da borda. Por exemplo, usar-1pxem vez de0evita que o corpo da tabela apareça por cima do cabeçalho Comparação: https://codepen.io/bradleytaunt/pen/bGZyJBj Versão corrigida: https://codepen.io/alokmenghrajani/pen/ExMBQowSugiro usar uma altura de viewport limitada em vez de um cabeçalho fixo, para que o cabeçalho esteja sempre visível Algo como o DataGridXL(https://datagridxl.com). Aliás, fui eu que criei