Existe uma técnica CSS / JavaScript entre navegadores para exibir uma tabela HTML longa, de modo que os cabeçalhos das colunas permaneçam fixos na tela e não rolem com o corpo da tabela. Pense no efeito "congelar painéis" no Microsoft Excel.
Desejo poder percorrer o conteúdo da tabela, mas poder sempre ver os cabeçalhos das colunas na parte superior.
javascript
css
html-table
Cheekysoft
fonte
fonte
thead th { position: sticky; top: 0; }
. O Safari precisa de um prefixo de fornecedor:-webkit-sticky
Respostas:
Eu estava procurando uma solução para isso por um tempo e achei que a maioria das respostas não está funcionando ou não é adequada para a minha situação, então escrevi uma solução simples com o jQuery.
Este é o esboço da solução:
Abaixo está o código em uma demonstração executável.
Esta solução funciona no Chrome e no IE. Como é baseado no jQuery, isso também deve funcionar em outros navegadores suportados pelo jQuery.
fonte
Isso pode ser resolvido de maneira limpa em quatro linhas de código.
Se você se importa apenas com navegadores modernos, é possível obter um cabeçalho fixo com muito mais facilidade usando transformações CSS. Soa estranho, mas funciona muito bem:
O suporte para transformações CSS está amplamente disponível, exceto no Internet Explorer 8-.
Aqui está o exemplo completo para referência:
Mostrar snippet de código
fonte
$(this).addClass('border')
altera o restante da tabela apresenta fontes, tamanho e cor que eu passo na classe de borda. Mas, não adiciona linhas ao cabeçalho fixo. Apreciar, qualquer entrada sobre como corrigir issoAcabei de concluir a montagem de um plug-in jQuery que utilizará uma única tabela válida usando HTML válido (tem que ter um cabeçalho e um corpo) e produzirá uma tabela com cabeçalhos fixos, rodapé fixo opcional que pode ser um cabeçalho clonado ou qualquer outro conteúdo que você escolheu (paginação etc.). Se você quiser aproveitar os monitores maiores, ele também redimensionará a tabela quando o navegador for redimensionado. Outro recurso adicionado é poder rolar lateralmente se as colunas da tabela não puderem ser exibidas.
http://fixedheadertable.com/
no github: http://markmalek.github.com/Fixed-Header-Table/
É extremamente fácil de configurar e você pode criar seus próprios estilos personalizados. Ele também usa cantos arredondados em todos os navegadores. Lembre-se de que acabei de lançá-lo, por isso ainda é tecnicamente beta e há muito poucos problemas menores que estou resolvendo.
Funciona no Internet Explorer 7, Internet Explorer 8, Safari, Firefox e Chrome.
fonte
Eu também criei um plugin que aborda esse problema. Meu projeto - jQuery.floatThead existe há mais de 4 anos e é muito maduro.
Ele não requer estilos externos e não espera que sua tabela seja estilizada de nenhuma maneira específica. Ele suporta o Internet Explorer9 + e Firefox / Chrome.
Atualmente (2018-05), possui:
Muitas (não todas) das respostas aqui são hacks rápidos que podem ter resolvido o problema que uma pessoa estava tendo, mas não funcionarão para todas as tabelas.
Alguns dos outros plugins são antigos e provavelmente funcionam muito bem com o Internet Explorer, mas serão interrompidos no Firefox e Chrome.
fonte
TL; DR
Se você tem como alvo navegadores modernos e não possui necessidades de estilo extravagantes: http://jsfiddle.net/dPixie/byB9d/3/ ... Embora a versão com quatro grandes seja bastante agradável, esta versão lida com a largura do fluido muito melhor.
Boas notícias, pessoal!
Com os avanços do HTML5 e CSS3, isso agora é possível, pelo menos para navegadores modernos. A implementação levemente hackeada que criei pode ser encontrada aqui: http://jsfiddle.net/dPixie/byB9d/3/ . Eu testei no FX 25, Chrome 31 e IE 10 ...
HTML relevante (no entanto, insira um doctype HTML5 na parte superior do documento):
Mas como?!
Basta colocar um cabeçalho de tabela, que você oculta visualmente, tornando-o 0px alto, que também contém divs usadas como cabeçalho fixo. O contêiner da mesa deixa espaço suficiente na parte superior para permitir o cabeçalho absolutamente posicionado, e a tabela com barras de rolagem aparece como seria de esperar.
O código acima usa a classe posicionada para posicionar a tabela absolutamente (estou usando-a em uma caixa de diálogo no estilo pop-up), mas você também pode usá-la no fluxo do documento removendo a
positioned
classe do contêiner.Mas ...
Não é perfeito. O Firefox se recusa a fazer com que o cabeçalho fique na linha 0px (pelo menos não encontrei nenhuma maneira), mas teimosamente o mantém no mínimo 4px ... Não é um grande problema, mas dependendo do seu estilo, ele mexerá com as bordas etc.
A tabela também está usando uma abordagem de coluna falsa, na qual a cor de plano de fundo do contêiner é usada como plano de fundo para as divs do cabeçalho, que são transparentes.
Resumo
Em suma, pode haver problemas de estilo, dependendo de seus requisitos, especialmente bordas ou planos de fundo complicados. Também pode haver problemas com a computabilidade, ainda não o verifiquei em uma ampla variedade de navegadores (por favor, comente suas experiências se você tentar), mas não encontrei nada parecido, então achei que valeria a pena postar de qualquer forma ...
fonte
<section>
elemento, precisa ser restrito em altura apenas para forçá-lo a transbordar e mostrar a rolagem. Qualquer layout que faça o estouro do contêiner funcionaria. Se você encontrar um caso em que isso não ocorra, envie um link para um violino.padding-top
valor codificado também significa que, se o texto do cabeçalho da tabela estiver em mais de uma linha, ele aparecerá no topo das células da tabela. Pena, porque isso funciona como um encanto na maioria das vezes. Muito bom truque com odiv
noth
para contornar o problema de dimensionamento de coluna maioria das outras soluções têm.Todas as tentativas de resolver isso de fora da especificação CSS são sombras pálidas do que realmente queremos: Cumprimento da promessa implícita do THEAD.
Esse problema de cabeçalhos congelados para uma tabela é um ferimento aberto em HTML / CSS há muito tempo.
Em um mundo perfeito, haveria uma solução de CSS puro para esse problema. Infelizmente, não parece haver um bom lugar.
Os padrões-discussões relevantes sobre este tópico incluem:
ATUALIZAÇÃO : Firefox enviado
position:sticky
na versão 32. Todo mundo ganha!fonte
thead th { position: sticky; top: 0; }
. Podemos atualizar esta resposta para declarar isso claramente?Aqui está um plugin jQuery para cabeçalhos de tabela fixos. Permite rolar a página inteira, congelando o cabeçalho quando chegar ao topo. Funciona bem com as tabelas do Twitter Bootstrap .
Repositório do GitHub: https://github.com/oma/table-fixed-header
Ele não rola apenas o conteúdo da tabela. Procure outras ferramentas para isso, como uma dessas outras respostas. Você decide o que melhor se adequa ao seu caso.
fonte
A maioria das soluções postadas aqui requer jQuery. Se você estiver procurando por uma solução independente de estrutura, tente o Grid: http://www.matts411.com/post/grid/
Está hospedado no Github aqui: https://github.com/mmurph211/Grid
Além de suportar cabeçalhos fixos, também suporta colunas e rodapés esquerdos fixos, entre outras coisas.
fonte
A propriedade CSS
position: sticky
possui grande suporte na maioria dos navegadores modernos (tive problemas com o Edge, veja abaixo).Isso nos permite resolver o problema de cabeçalhos fixos com bastante facilidade:
Safari precisa de um prefixo de fornecedor:
-webkit-sticky
.Para o Firefox, tive que adicionar
min-height: 0
a um dos elementos pai. Eu esqueço exatamente por que isso era necessário.Infelizmente, a implementação do Microsoft Edge parece estar apenas semi-funcionando. Pelo menos, eu tinha algumas células de tabela trêmulas e desalinhadas em meus testes. A mesa ainda era utilizável, mas tinha problemas estéticos significativos.
fonte
position: sticky;
com a tabela dentro de uma div que temoverflow: scroll;
,overflow-x: scroll;
ouoverflow-y: scroll;
. parece ser a melhor e mais simples solução para cabeçalhos e colunas fixos de tabelas em navegadores modernos. Esta resposta precisa ser votada para o topo.Uma tabela de rolagem CSS pura mais refinada
Todas as soluções CSS puras que eu vi até agora - por mais inteligentes que sejam - carecem de um certo nível de polimento ou simplesmente não funcionam corretamente em algumas situações. Então, eu decidi criar o meu próprio ...
Recursos:
Aqui estão algumas violações que mostram as opções de largura automática e fluida:
Largura e altura do fluido (se adapta ao tamanho da tela): jsFiddle (observe que a barra de rolagem é exibida apenas quando necessário nesta configuração, portanto, você pode precisar encolher o quadro para vê-lo)
Largura automática, altura fixa (mais fácil de integrar com outro conteúdo): jsFiddle
A configuração Largura automática, Altura fixa provavelmente tem mais casos de uso, então postarei o código abaixo.
O método que eu usei para congelar a linha do cabeçalho é semelhante ao d-Pixie, portanto, consulte o post dele para obter uma explicação. Havia uma série de bugs e limitações com essa técnica que só podiam ser corrigidos com montes de CSS adicionais e um contêiner div extra ou dois.
fonte
Um simples plugin jQuery
Essa é uma variação da solução de Mahes. Você pode chamá-lo como
$('table#foo').scrollableTable();
A ideia é:
thead
etbody
emtable
elementos separadostable
em umadiv.scrollable
div.scrollable
realmente rolarO CSS pode ser:
Ressalvas
Dito isto, ele funciona para os meus propósitos e você pode pegá-lo e modificá-lo.
Aqui está o plugin:
fonte
:)
Solução HTML / CSS não tão limpa, mas pura.
Atualizado para o exemplo IE8 + JSFiddle
fonte
Suporte para rodapé fixo
Estendi a função de Nathan para também suportar um rodapé fixo e uma altura máxima. Além disso, a função definirá o próprio CSS e você só precisará suportar uma largura.
Uso:
Altura fixa:
Altura máxima (se o navegador suportar a opção 'max-height' do CSS):
Roteiro:
fonte
De alguma forma, acabei
Position:Sticky
trabalhando bem no meu caso:fonte
Duas divs, uma para cabeçalho, uma para dados. Torne a div de dados rolável e use JavaScript para definir a largura das colunas no cabeçalho como igual à largura dos dados. Eu acho que as larguras das colunas de dados precisam ser corrigidas e não dinâmicas.
fonte
Sei que a pergunta permite JavaScript, mas aqui está uma solução CSS pura que eu desenvolvi que também permite que a tabela se expanda horizontalmente. Foi testado com o Internet Explorer 10 e os mais recentes navegadores Chrome e Firefox. Um link para jsFiddle está na parte inferior.
O HTML:
E o CSS:
http://jsfiddle.net/HNHRv/3/
fonte
Para aqueles que tentaram a boa solução fornecida por Maximilian Hils e não conseguiram fazê-la funcionar com o Internet Explorer, eu tive o mesmo problema (Internet Explorer 11) e descobri qual era o problema.
No Internet Explorer 11, a transformação de estilo (pelo menos com a conversão) não funciona
<THEAD>
. Eu resolvi isso aplicando o estilo a todos os<TH>
itens em um loop. Isso funcionou. Meu código JavaScript fica assim:No meu caso, a tabela era um GridView no ASP.NET. Primeiro, pensei que era porque não tinha
<THEAD>
, mas mesmo quando eu o forcei a ter um, não funcionou. Então eu descobri o que escrevi acima.É uma solução muito agradável e simples. No Chrome, é perfeito, no Firefox, um pouco irregular, e no Internet Explorer, ainda mais irregular. Mas apesar de tudo, uma boa solução.
fonte
Eu gostaria de ter encontrado a solução do @ Mark anteriormente, mas escrevi a minha antes de ver essa pergunta do SO ...
O Mine é um plugin jQuery muito leve que suporta cabeçalho, rodapé, extensão de coluna (colspan), redimensionamento, rolagem horizontal e um número opcional de linhas a serem exibidas antes do início da rolagem.
jQuery.scrollTableBody (GitHub)
Enquanto você tem uma tabela com adequada
<thead>
,<tbody>
e (opcional)<tfoot>
, tudo o que você precisa fazer é esta:fonte
Eu encontrei esta solução alternativa - mova a linha do cabeçalho em uma tabela acima da tabela com dados:
fonte
Ao aplicar o plug-in StickyTableHeaders jQuery à tabela, os cabeçalhos das colunas ficarão na parte superior da viewport à medida que você rola para baixo.
Exemplo:
fonte
Gosto da resposta de Maximillian Hils, mas tive alguns problemas:
Para me livrar da oscilação, uso um tempo limite para esperar até que o usuário termine a rolagem e aplico a transformação - para que o cabeçalho não fique visível durante a rolagem.
Também escrevi isso usando jQuery, uma vantagem disso é que o jQuery deve manipular prefixos de fornecedores para você
A tabela é envolto em um div com a classe
table-container-fixed
.Defino o colapso da borda como separado porque, de outra forma, perdemos as bordas durante a tradução e removo a borda da tabela para impedir que o conteúdo apareça logo acima da célula onde a borda estava durante a rolagem.
Eu deixo o
th
fundo branco para cobrir as células abaixo e adiciono uma borda que corresponde à borda da tabela - que é estilizada usando o Bootstrap e rolada para fora da vista.fonte
Use a versão mais recente do jQuery e inclua o seguinte código JavaScript.
fonte
Esta não é uma solução exata para a linha de cabeçalho fixa, mas eu criei um método bastante engenhoso de repetir a linha de cabeçalho em toda a tabela longa, mantendo a capacidade de classificar.
Esta pequena opção requer o plugin jQuery
tablesorter
. Veja como funciona:HTML
Obviamente, minha tabela tem muito mais linhas que isso. 193 para ser exato, mas você pode ver onde a linha do cabeçalho se repete. A linha de cabeçalho de repetição é configurada por esta função:
jQuery
fonte
Muitas pessoas parecem estar procurando por essa resposta. Eu o encontrei enterrado em uma resposta a outra pergunta aqui: Sincronizando a largura da coluna entre as tabelas em dois quadros diferentes, etc.
Das dezenas de métodos que tentei, esse é o único método que achei confiável para permitir que você tenha uma tabela inferior de rolagem com a tabela de cabeçalho com as mesmas larguras.
Aqui está como eu fiz isso, primeiro aprimorei o jsfiddle acima para criar essa função, que funciona em ambos
td
eth
(no caso de encontrar outros que usamth
para estilizar suas linhas de cabeçalho).Em seguida, é necessário criar duas tabelas. NOTA: a tabela de cabeçalho deve ter um extra
TD
para deixar espaço na tabela superior da barra de rolagem, assim:Então faça algo como:
Esta é a única solução que encontrei no Stack Overflow que funciona com muitas perguntas semelhantes postadas, que funciona em todos os meus casos.
Por exemplo, tentei o plug-in do jQuery stickytables, que não funciona com durandal, e o projeto do Google Code aqui https://code.google.com/p/js-scroll-table-header/issues/detail?id=2
Outras soluções que envolvem a clonagem de tabelas, apresentam desempenho ruim ou são ruins e não funcionam em todos os casos.
Não há necessidade dessas soluções excessivamente complexas. Basta criar duas tabelas como os exemplos abaixo e chamar a função setHeaderTableWidth, como descrito aqui e boom, está pronto .
Se isso não funcionar, você provavelmente estava jogando com sua propriedade de dimensionamento de caixa CSS e precisará configurá-la corretamente. É fácil estragar seu conteúdo CSS por acidente. Há muitas coisas que podem dar errado, então fique atento / cuidado com isso. Essa abordagem funciona para mim .
fonte
Aqui está uma solução com a qual acabamos trabalhando (para lidar com alguns casos extremos e versões mais antigas do Internet Explorer, acabamos também desbotando a barra de título na rolagem e depois a desbotando quando a rolagem termina, mas nos navegadores Firefox e WebKit esta solução simplesmente funciona, e assume o colapso da borda: colapso.
A chave para esta solução é que, depois de aplicar o colapso de borda , o CSS transforma trabalho no cabeçalho, por isso é apenas uma questão de interceptar eventos de rolagem e definir a transformação corretamente. Você não precisa duplicar nada. Além desse comportamento ser implementado corretamente no navegador, é difícil imaginar uma solução mais leve.
JSFiddle: http://jsfiddle.net/podperson/tH9VU/2/
É implementado como um simples plugin jQuery. Você simplesmente deixa seu cabeçote grudento com uma chamada como $ ('thead'). Sticky (), e eles ficam por aqui. Ele funciona para várias tabelas em uma página e seções principais na metade das tabelas grandes.
fonte
border: 2px solid red;
ath
, role e você verá o problema. Eu vim com essa solução mais básica mim mesmo: jsfiddle.net/x6pLcor9/19Aqui está uma resposta aprimorada para a postada por Maximilian Hils .
Este funciona no Internet Explorer 11, sem nenhuma oscilação:
fonte
Desenvolvi um plug-in jQuery simples e leve para converter uma tabela HTML bem formatada em uma tabela rolável com cabeçalho e colunas fixos.
O plug-in funciona bem para combinar o posicionamento pixel a pixel da seção fixa com a seção rolável. Além disso, você também pode congelar o número de colunas que sempre estarão à vista ao rolar horizontalmente.
Demonstração e documentação: http://meetselva.github.io/fixed-table-rows-cols/
Repositório do GitHub: https://github.com/meetselva/fixed-table-rows-cols
Abaixo está o uso de uma tabela simples com um cabeçalho fixo,
fonte
fonte
Adicional à resposta de @Daniel Waltrip. A tabela precisa incluir div
position: relative
para poder trabalharposition:sticky
. Então, eu gostaria de postar meu código de exemplo aqui.CSS
HTML
Demo
fonte