Gostaria de poder "ajustar" a apresentação de uma tabela HTML para adicionar um único recurso: ao rolar a página para baixo para que a tabela fique na tela, mas as linhas do cabeçalho estejam fora da tela, gostaria que os cabeçalhos permanecessem visível na parte superior da área de visualização.
Isso seria conceitualmente semelhante ao recurso "congelar painéis" no Excel. No entanto, uma página HTML pode conter várias tabelas e eu gostaria que isso acontecesse para a tabela que está atualmente em exibição, apenas enquanto estiver em exibição.
Nota: Vi uma solução em que a área de dados da tabela é rolada enquanto os cabeçalhos não rolam. Essa não é a solução que estou procurando.
html
html-table
Craig McQueen
fonte
fonte
Respostas:
Confira jQuery.floatThead ( demos disponíveis ), que é muito legal, também pode trabalhar com DataTables e até trabalhar dentro de um
overflow: auto
contêiner.fonte
Eu criei uma solução de prova de conceito usando jQuery .
Veja a amostra aqui.
Agora eu tenho esse código em um repositório de bitbucket Mercurial . O arquivo principal é
tables.html
.Estou ciente de um problema com isso: se a tabela contiver âncoras e se você abrir o URL com a âncora especificada em um navegador, quando a página carregar, a linha com a âncora provavelmente será obscurecida pelo cabeçalho flutuante.
Atualização 11-12-2017: Vejo que isso não funciona com o Firefox atual (57) e o Chrome (63). Não sabe quando e por que isso parou de funcionar ou como corrigi-lo. Mas agora, acho que a resposta aceita por Hendy Irawan é superior.
fonte
floatingHeaderRow.css("top", Math.min(scrollTop - offset.top, $(this).height() - floatingHeaderRow.height()) + "px");
parafloatingHeaderRow.css("top", scrollTop + "px");
o código que você tinha, o cabeçalho da tabela estava pulando mais abaixo na página para eventualmente desaparecer da página.// Copy cell widths from original header
parte do código). @ Craig McQueen, edite sua resposta para que ninguém mais cometa esse erro.Craig, refinei um pouco o seu código (entre algumas outras coisas que ele agora está usando position: fixed) e o envolvi como um plugin do jQuery.
Experimente aqui: http://jsfiddle.net/jmosbech/stFcx/
E obtenha a fonte aqui: https://github.com/jmosbech/StickyTableHeaders
fonte
Se você estiver segmentando navegadores modernos compatíveis com css3 ( suporte ao navegador: https://caniuse.com/#feat=css-sticky ), poderá usar
position:sticky
, o que não requer JS e não prejudica o layout da tabela. e td da mesma coluna. Também não requer largura fixa da coluna para funcionar corretamente.Exemplo para uma única linha de cabeçalho:
Para segmentos com 1 ou 2 linhas, você pode usar algo como isto:
Pode ser necessário jogar um pouco com o topo propriedade do último filho, alterando o número de pixels para corresponder à altura da primeira linha (+ a margem + a borda + o preenchimento, se houver), para que a segunda linha fique abaixo abaixo o primeiro.
Além disso, ambas as soluções funcionam mesmo se você tiver mais de uma tabela na mesma página: o
th
elemento de cada uma começa a ficar pegajoso quando sua posição superior é a indicada na definição de css e desaparece quando toda a tabela rola para baixo. Portanto, se houver mais tabelas, todas funcionam lindamente da mesma maneira.Por que usar o último filho antes e o primeiro filho depois no css?
Como as regras css são renderizadas pelo navegador na mesma ordem em que você as escreve no arquivo css, por isso, se você tiver apenas 1 linha no elemento thead, a primeira linha também será a última linha e a regra do primeiro filho também precisará para substituir o último filho. Caso contrário, você terá um deslocamento da linha 30 px da margem superior, que suponho que não queira.
Um problema conhecido de posição: pegajoso é que ele não funciona nos elementos do cabeçalho ou nas linhas da tabela: você deve direcionar os elementos. Pular esse problema será resolvido em versões futuras do navegador.
fonte
thead tr+tr th
para segmentar a segunda linha.Alternativas possíveis
js-floating-table-headers
js-floating-table-headers (Código do Google)
No Drupal
Eu tenho um site do Drupal 6. Eu estava na página "módulos" do administrador e percebi que as tabelas tinham esse recurso exato!
Olhando para o código, parece ser implementado por um arquivo chamado
tableheader.js
. Aplica o recurso em todas as tabelas da classesticky-enabled
.Para um site Drupal, eu gostaria de poder usar esse
tableheader.js
módulo como está no conteúdo do usuário.tableheader.js
parece não estar presente nas páginas de conteúdo do usuário no Drupal. Publiquei uma mensagem no fórum para perguntar como modificar o tema do Drupal para que fique disponível. De acordo com uma resposta,tableheader.js
pode ser adicionado a um tema Drupal usandodrupal_add_js()
no tema datemplate.php
seguinte maneira:fonte
Encontrei esse problema muito recentemente. Infelizmente, eu tive que fazer 2 mesas, uma para o cabeçalho e outra para o corpo. Provavelmente não é a melhor abordagem de todos os tempos, mas aqui vai:
Isso funcionou para mim, provavelmente não é a maneira elegante, mas funciona. Vou investigar para ver se posso fazer algo melhor, mas isso permite várias tabelas.
Leia a propriedade do estouro para ver se ela se adapta às suas necessidades
fonte
É realmente uma coisa complicada ter um cabeçalho pegajoso na sua mesa. Eu tinha o mesmo requisito, mas com asp: GridView e, em seguida, achei que ele realmente tinha cabeçalho pegajoso no gridview. Existem muitas soluções disponíveis e demorei 3 dias a tentar toda a solução, mas nenhuma delas conseguiu satisfazer.
O principal problema que enfrentei com a maioria dessas soluções foi o problema de alinhamento. Quando você tenta fazer o cabeçalho flutuar, de alguma forma o alinhamento das células do cabeçalho e do corpo fica fora do controle.
Com algumas soluções, também tive o problema de sobrepor o cabeçalho às primeiras linhas do corpo, o que faz com que as linhas do corpo fiquem ocultas atrás do cabeçalho flutuante.
Então agora eu tive que implementar minha própria lógica para conseguir isso, embora eu também não considere isso uma solução perfeita, mas isso também possa ser útil para alguém,
Abaixo está a tabela de amostra.
Nota : A tabela é agrupada em um DIV com o atributo de classe igual a 'table-holder'.
Abaixo está o script JQuery que eu adicionei no cabeçalho da página html.
e finalmente abaixo está a classe CSS para fins de coloração.
Portanto, toda a idéia dessa lógica é colocar a tabela em uma div do suporte da tabela e criar clone desse suporte no lado do cliente quando a página for carregada. Agora, oculte o corpo da tabela dentro do suporte do clone e posicione a parte restante do cabeçalho sobre o cabeçalho original.
A mesma solução também funciona para asp: gridview, você precisa adicionar mais duas etapas para conseguir isso no gridview,
No evento OnPrerender do objeto gridview em sua página da web, defina a seção da tabela da linha do cabeçalho igual a TableHeader.
E envolva sua grade
<div class="table-holder"></div>
.Nota : se o cabeçalho tiver controles clicáveis, talvez seja necessário adicionar mais um script jQuery para passar os eventos gerados no cabeçalho clonado para o cabeçalho original. Esse código já está disponível no plugin jQuery sticky-header criado por jmosbech
fonte
O uso
display: fixed
dathead
seção deve funcionar, mas, para funcionar apenas na tabela atual em exibição, você precisará da ajuda do JavaScript. E será complicado, pois será necessário descobrir os locais de rolagem e a localização dos elementos em relação à janela de visualização, que é uma das principais áreas de incompatibilidade do navegador.Dê uma olhada nas estruturas JavaScript populares (jQuery, MooTools, YUI, etc etc.) para ver se elas podem fazer o que você deseja ou torná-lo mais fácil.
fonte
position: fixed
. Lamentamos, mas não funcionou no Chrome.Se você usa uma tabela em tela cheia, talvez esteja interessado em definir a opção para exibir: fixo; e superior: 0; ou tente uma abordagem muito semelhante via css.
Atualizar
Crie rapidamente uma solução funcional com iframes (html4.0). Este exemplo NÃO está em conformidade com o padrão, mas você poderá corrigi-lo facilmente:
outer.html
test.html
fonte
A resposta mais simples usando apenas CSS: D !!!
fonte
Essa prova de conceito que você criou foi ótima! No entanto, eu também encontrei este plugin jQuery, que parece estar funcionando muito bem. Espero que ajude!
fonte
É frustrante que o que funciona bem em um navegador não funcione em outros. O seguinte funciona no Firefox, mas não no Chrome ou IE:
fonte
px
? É essa unidade herdada usada pelas pessoas no dia 90 quando um dispositivo de exibição era usado para ter 72 dpi?