Estou escrevendo uma página na qual preciso de uma tabela HTML para manter um tamanho definido. Eu preciso que os cabeçalhos na parte superior da tabela permaneçam lá o tempo todo, mas também preciso que o corpo da tabela role, independentemente de quantas linhas sejam adicionadas à tabela. Pense em uma mini versão do excel. Parece uma tarefa simples, mas quase todas as soluções que encontrei na web têm algumas desvantagens. Como posso resolver isso?
javascript
html
css
html-table
mentiroso
fonte
fonte
Respostas:
Eu tive que encontrar a mesma resposta. O melhor exemplo que encontrei é http://www.cssplay.co.uk/menu/tablescroll.html - achei que o exemplo nº 2 funcionou bem para mim. Você terá que definir a altura da tabela interna com Java Script, o resto é CSS.
fonte
Eu achei o DataTables bastante flexível. Embora sua versão padrão seja baseada no jquery, também há um plugin do AngularJs .
fonte
Vi a excelente solução de Sean Haddy para uma pergunta semelhante e tomei a liberdade de fazer algumas edições :
aria-hidden="false"
Sean fez o trabalho pesado, no entanto. Agradecemos também a Matt Burland, por apontar a necessidade de apoiar o tfoot.
Veja por si mesmo em http://jsfiddle.net/jhfrench/eNP2N/
fonte
Você já tentou usar thead e tbody e definir uma altura fixa em tbody com estouro: scroll?
Quais são os seus navegadores de destino?
EDIT: Funcionou bem (quase) no firefox - a adição da barra de rolagem vertical causou a necessidade de uma barra de rolagem horizontal também - eca. O IE acabou de definir a altura de cada td para o que eu havia especificado como a altura de tbody. Aqui está o melhor que eu poderia encontrar:
fonte
overflow-x: hidden;
eoverflow-y: auto
também ajuda.O que você precisa é:
1) ter um corpo de tabela de altura limitada, pois a rolagem ocorre apenas quando o conteúdo é maior que a janela de rolagem. No entanto,
tbody
não pode ser dimensionado, e você deve exibi-lo comoblock
:2) Ressincronize as larguras das colunas do cabeçalho da tabela e do corpo da tabela , tornando esta última um
block
elemento não relacionado. A única maneira de fazer isso é simular a sincronização, aplicando a mesma largura de colunas a ambas .No entanto, como
tbody
ele é umblock
agora, ele não pode mais se comportar como umtable
. Como você ainda precisa de umtable
comportamento para exibir suas colunas corretamente, a solução é solicitar que cada uma de suas linhas seja exibida comotable
s individuais :(Observe que, usando esta técnica, você não poderá mais se estender por linhas).
Feito isso, você pode impor larguras de coluna para ter a mesma largura em ambos
thead
etbody
. Você não poderia:th, td { width: 20%; }
se você tiver cinco colunas), o que é mais prático (não é necessário definir a largura para cada instância da tabela), mas não pode funcionar para nenhuma contagem de colunasEu prefiro a última opção, que requer adicionar:
Veja uma demonstração aqui , bifurcada da resposta a esta pergunta .
fonte
Edit: Esta é uma resposta muito antiga e está aqui para a prosperidade, apenas para mostrar que foi suportada uma vez nos anos 2000, mas caiu porque a estratégia dos navegadores nos 2010 era respeitar as especificações do W3C, mesmo que alguns recursos fossem removidos: Tabela rolável com cabeçalho fixo / rodapé foi desajeitadamente especificado antes do HTML5.
Más notícias
Infelizmente, não há uma maneira elegante de lidar com a tabela rolável com especificações fixas
thead
/tfoot
porque HTML / CSS não são muito claras sobre esse recurso .Explicações
Embora a especificação HTML 4.01 diga
thead
/tfoot
/tbody
seja usada (introduzida?) Para rolar o corpo da tabela:Mas o recurso de tabela de rolagem de trabalho no FF 3.6 foi removido no FF 3.7 porque considerado um bug por não ser compatível com as especificações HTML / CSS. Veja isto e aquilo comentários sobre erros de FF.
Dica da Mozilla Developer Network
Abaixo está uma versão simplificada das dicas úteis do MDN para tabela rolável.
Consulte esta página arquivada ou a versão atual em francês
No entanto, a MDN também diz que isso não funciona mais no FF :-(
Também testei no IE8 => a tabela também não pode ser rolada: - ((
fonte
Não tenho certeza se alguém ainda está olhando para isso, mas do jeito que eu fiz isso anteriormente é usar duas tabelas para exibir a única tabela original - a primeira apenas a linha de título da tabela original e nenhuma linha de corpo da tabela (ou uma linha de corpo vazia para criar) validar).
O segundo está em uma div separada e não tem título e apenas as linhas do corpo da tabela original. A div separada é então tornada rolável.
A segunda tabela em sua div é colocada logo abaixo da primeira tabela no HTML e parece uma única tabela com um cabeçalho fixo e uma seção inferior rolável. Eu só testei isso no Safari, Firefox e IE (versões mais recentes de cada uma na primavera de 2010), mas funcionou em todas elas.
O único problema era que a primeira tabela não seria validada sem um corpo (validador W3.org - XHTML 1.0 estrito) e, quando adicionei uma sem conteúdo, ela causava uma linha em branco. Você pode usar CSS para tornar isso não visível, mas ele ainda ocupa espaço na página.
fonte
display: none;
, a menos que você queira dizer espaço na fonte ..?Esta solução funciona no Chrome 35, Firefox 30 e IE 11 (não testou outras versões)
Seu CSS puro: http://jsfiddle.net/ffabreti/d4sope1u/
Tudo está definido para exibir: bloco, tabela precisa de uma altura:
fonte
Isso me causou enormes dores de cabeça ao tentar implementar essa grade para uma aplicação nossa. Eu tentei todas as várias técnicas disponíveis, mas cada uma delas teve problemas. O mais próximo que cheguei foi o uso de um plugin jQuery como o Flexigrid (procure alternativas em http://www.ajaxrain.com ), mas isso não parece suportar tabelas 100% amplas, é o que eu precisava.
O que acabei fazendo foi rolar sozinho; O Firefox suporta
tbody
elementos de rolagem , de modo que o navegador cheirou e utilizou o CSS apropriado (altura da configuração, estouro, etc ... pergunto se você deseja mais detalhes) para fazer essa rolagem; depois, para outros navegadores, usei duas tabelas separadas,table-layout: fixed
que usam um tamanho. algoritmo garantido para não exceder o tamanho indicado (as tabelas normais serão expandidas quando o conteúdo for muito amplo para caber). Ao dar a ambas as tabelas larguras idênticas, consegui alinhar suas colunas. Enrolei o segundo em um conjunto de div para rolar e, com um pouco de brincadeira com margens, etc., consegui a aparência que eu queria.Desculpe se esta resposta parece um pouco vaga em alguns lugares; Estou escrevendo rapidamente, pois não tenho muito tempo. Deixe um comentário se você quiser que eu expanda ainda mais!
fonte
Aqui está um código que realmente funciona para IE e FF (pelo menos):
Alterei o código original para torná-lo mais claro e também para colocá-lo funcionando bem no IE e também no FF.
Código original AQUI
fonte
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
Aqui está a minha alternativa. Ele também usa DIVs diferentes para o cabeçalho, corpo e rodapé, mas sincronizados para redimensionar janelas e com pesquisa, rolagem, classificação, filtragem e posicionamento:
Minhas listas de CDs
Clique nos botões Jazz, Clássica ... para ver as tabelas. Ele é configurado para ser adequado mesmo se o JavaScript estiver desativado.
Parece OK no IE, FF e WebKit (Chrome, Safari).
fonte
Desculpe, eu não tenho lido todas as respostas à sua pergunta.
Sim, aqui a coisa que você quer (eu já fiz)
Você pode usar duas tabelas, com o mesmo nome de classe para estilos semelhantes, uma apenas com cabeçalho da tabela e outra com suas linhas. Agora coloque esta tabela dentro de uma div com altura fixa com overflow-y: auto OR scroll.
fonte
O principal problema que tive com as sugestões acima foi ser capaz de conectar o tablesorter.js E poder flutuar os cabeçalhos de uma tabela restrita a um tamanho máximo específico. Acabei encontrando o plugin jQuery.floatThead, que fornecia os cabeçalhos flutuantes e permitia que a classificação continuasse funcionando.
Ele também possui uma boa página de comparação mostrando plugins semelhantes a outros .
fonte
Live JsFiddle
É possível apenas com HTML e CSS
fonte
Se está tudo bem em usar JavaScript, aqui está minha solução. Crie uma tabela com largura fixa em todas as colunas (pixels!) Adicione a classe Scrollify à tabela e adicione esta altura do conjunto javascript + jquery 1.4.x em css ou estilo!
Testado em: Opera, Chrome, Safari, FF, IE5.5 ( falha de script épica ), IE6, IE7, IE8, IE9
Editar: altura fixa.
fonte
Faço isso com javascript (sem biblioteca) e CSS - o corpo da tabela rola com a página e a tabela não precisa ter largura ou altura fixa, embora cada coluna deva ter uma largura. Você também pode manter a funcionalidade de classificação.
Basicamente:
Em HTML, crie divs de contêiner para posicionar a linha do cabeçalho da tabela e o corpo da tabela, também crie uma div "mask" para ocultar o corpo da tabela à medida que ela passa pelo cabeçalho
Em CSS, converta as partes da tabela em blocos
Em Javascript, obtenha a largura da tabela e corresponda à largura da máscara ... obtenha a altura do conteúdo da página ... meça a posição de rolagem ... manipule CSS para definir a posição da linha do cabeçalho da tabela e a altura da máscara
Aqui está o javascript e uma DEMO jsFiddle.
fonte
Para mim, nada relacionado à rolagem realmente funcionou até remover a largura da tabela CSS. Originalmente, a tabela CSS era assim:
Assim que eu removi a largura: 100%; todos os recursos de rolagem começaram a funcionar.
fonte
Se você tiver padrões suficientemente baixos;), poderá colocar uma tabela que contenha apenas um cabeçalho diretamente acima de uma tabela que possua apenas um corpo. Não rolará horizontalmente, mas se você não precisar disso ...
fonte