Eu preciso criar uma tabela html (ou algo parecido) com um cabeçalho fixo e uma primeira coluna fixa.
Todas as soluções que vi até agora usam Javascript ou jQuery
para definir scrollTop / scrollLeft, mas não funciona bem em navegadores móveis, então estou procurando uma solução CSS pura.
Encontrei uma solução para uma coluna fixa aqui: jsfiddle.net/C8Dtf/20/ mas não sei como posso aprimorá-la para tornar o cabeçalho fixo também.
Quero que funcione em navegadores webkit ou use alguns css3
recursos, mas, repito, não quero usar Javascript
para rolar.
EDIT: Este é um exemplo do comportamento que desejo alcançar: https://web.archive.org/web/20130829032141/http://datatables.net/release-datatables/extras/FixedColumns/css_size.html
html
css
html-table
markup
fixed-header-tables
panfil
fonte
fonte
position
comportamento complexo a linhas e células, mas não entendo muito bem onde é aplicável ou não.Respostas:
Uma solução CSS pura real com uma linha de cabeçalho fixa e primeira coluna
Tive que criar uma tabela com um cabeçalho fixo e uma primeira coluna fixa usando CSS puro e nenhuma das respostas aqui foi exatamente o que eu queria.
A
position: sticky
propriedade oferece suporte tanto para a fixação no topo (como já vi que é mais usada) quanto para as laterais nas versões modernas do Chrome, Firefox e Edge. Isso pode ser combinado com umdiv
que tem aoverflow: scroll
propriedade de fornecer uma tabela com cabeçalhos fixos que podem ser colocados em qualquer lugar da página:Coloque sua mesa em um recipiente:
Use
overflow: scroll
em seu contêiner para permitir a rolagem:Como Dagmar apontou nos comentários, o contêiner também requer um
max-width
e ummax-height
.Use
position: sticky
ter células tabela vara até a borda etop
,right
ouleft
de escolher qual borda a vara para:Como MarredCheese mencionou nos comentários, se sua primeira coluna contém
<td>
elementos em vez de<th>
elementos, você pode usartbody td:first-child
em seu CSS em vez detbody th
Para que o cabeçalho da primeira coluna fique à esquerda, use:
Exibir trecho de código
https://jsfiddle.net/qwubvg9m/1/
fonte
width
da sua primeira coluna, poderá usarposition: sticky
nas células da segunda coluna com umleft
valor igual ao da primeira colunawidth
: jsfiddle.net/wvypo83c/794<td>
elementos em vez de<th>
elementos, você pode usartbody td:first-child
em seu CSS em vez detbody th
.Hoje em dia, isso só é possível com CSS com
position: sticky
propriedade.Aqui vai um snippet:
(jsFiddle: https://jsfiddle.net/hbqzdzdt/5/ )
Em relação à compatibilidade. Funciona em todos os principais navegadores, mas não no IE. Existe um polyfill para,
position: sticky
mas eu nunca tentei.fonte
Isso não é tarefa fácil.
O link a seguir é para uma demonstração de trabalho:
Link atualizado de acordo com o comentário de lanoxx
http://jsfiddle.net/C8Dtf/366/
Apenas lembre-se de adicionar estes:
não vejo outra maneira de conseguir isso. Especialmente não usando apenas css.
Isso é muito para passar. Espero que isto ajude :)
fonte
"bFilter": false
"bInfo" : false
à.dataTable()
chamadathead
está em sua própria tabela, que não está limitado a mudanças detd
elementos, portanto, se o texto de uma célula for longo, ath
largura não se ajustará de acordo.Todas essas sugestões são ótimas e tudo, mas elas estão apenas corrigindo o cabeçalho ou uma coluna, não ambos, ou estão usando javascript. O motivo - não acredito que possa ser feito em CSS puro. O motivo:
Se fosse possível fazer isso, você precisaria aninhar vários divs roláveis um dentro do outro, cada um com uma rolagem em uma direção diferente. Em seguida, você precisaria dividir sua tabela em três partes - o cabeçalho fixo, a coluna fixa e o resto dos dados.
Bem. Mas agora o problema - você pode fazer um deles ficar parado quando você rola, mas o outro está aninhado dentro da área de rolagem do primeiro e, portanto, está sujeito a ser rolado para fora da vista, então não pode ser fixado no a tela. 'Ah-ha' você diz 'mas eu posso de alguma forma usar a posição absoluta ou fixa para fazer isso' - não, você não pode. Assim que você fizer isso, você perderá a capacidade de rolar aquele contêiner. É uma situação do ovo e da galinha - você não pode ter os dois, eles se anulam.
Acredito que a única solução seja através do javascript. Você precisa separar completamente os três elementos e manter suas posições sincronizadas por meio de javascript. Existem bons exemplos em outras postagens desta página. Este também vale a pena dar uma olhada:
http://tympanus.net/codrops/2014/01/09/sticky-table-headers-columns/
fonte
Fiz algumas mudanças no jsfiddle. Isso pode ser o que você está tentando fazer.
Codifiquei os títulos da seguinte forma:
E adicionei alguns estilos também.
Espero que seja isso que você quer :)
fonte
Um exemplo usando apenas CSS:
fonte
div
. É odiv
que permite a rolagem de linha enquanto o cabeçalho permanece no mesmo lugar. Essa abordagem funcionou para minhas necessidades.Para corrigir cabeçalhos e colunas, você pode usar o seguinte plug-in:
Atualizado em julho de 2019
Recentemente, surgiu também uma solução CSS pura que é baseada na propriedade CSS
position: sticky;
( aqui para mais detalhes sobre isso) aplicada a cadaTH
item (em vez de seu contêiner pai)fonte
Encontrei uma excelente solução de Paul O'Brien para o problema e gostaria de compartilhar o link: https://codepen.io/paulobrien/pen/LBrMxa
Removi o estilo do rodapé:
fonte
Recentemente, tive que criar uma solução com um grupo de cabeçalho fixo e uma primeira coluna fixa. Eu dividi minha tabela em div e usei jquery para capturar a rolagem da janela.
http://jsfiddle.net/TinT/EzXub/2346/
fonte
Um colega de trabalho e eu acabamos de lançar um novo projeto GitHub que fornece uma diretiva Angular que você pode usar para decorar sua tabela com cabeçalhos fixos: https://github.com/objectcomputing/FixedHeader
Ele depende apenas do css e do angular, com uma diretiva que adiciona alguns divs. Não é necessário jQuery.
Esta implementação não é tão completa quanto algumas outras implementações, mas se sua necessidade for simplesmente adicionar tabelas fixas, achamos que esta pode ser uma boa opção.
fonte
Depois de dois dias lutando com Internet Explorer 9 + Chrome + Firefox (Windows) e Safari (Mac), encontrei um sistema que é
Resultado:
HTML:
CSS:
fonte
div.cost_center table{border-collapse: collapse;}
e a terceira legenda deve ser algo que se encaixe nos 60px (neste exemplo)As respostas existentes são adequadas para a maioria das pessoas, mas para aqueles que desejam adicionar sombras sob o cabeçalho fixo e à direita da primeira coluna (fixa), aqui está um exemplo prático (css puro):
http://jsbin.com/nayifepaxo/1/edit?html,output
O principal truque para fazer isso funcionar é
::after
adicionar sombras à direita de cada uma das primeirastd
de cadatr
:Levei um tempo (muito tempo ...) para fazer tudo funcionar, então decidi compartilhar para aqueles que estão em uma situação semelhante.
fonte
Exibir trecho de código
precisa corrigir o rodapé do cabeçalho
fonte
Algo assim pode funcionar para você ... Provavelmente exigirá que você defina as larguras das colunas para a linha do cabeçalho.
http://jsfiddle.net/vkhNC/
Atualizar:
Não estou convencido de que o exemplo que você deu seja possível apenas com CSS. Eu adoraria que alguém provasse que estou errado. Aqui está o que tenho até agora . Não é o produto acabado, mas pode ser um começo para você. Espero que isso lhe indique uma direção útil, onde quer que seja.
fonte
Outra solução é usar o AngularJS. O módulo AngularUI tem uma diretiva chamada
ng-grid
que suporta um recurso chamado fixação de coluna. Não é 100% CSS puro, mas as outras soluções também não.http://angular-ui.github.io/ng-grid/#columnPinning
fonte
Exemplo de CSS puro:
http://jsfiddle.net/cCarlson/L98m854d/
Desvantagem: a estrutura / lógica do cabeçalho fixo depende bastante de dimensões específicas, portanto, a abstração provavelmente não é uma opção viável .
fonte
Posição: sticky não funciona para alguns elementos como (thead) no Chrome e outros navegadores de webkit como safari.
Mas funciona bem com (th)
Ou visite meu exemplo de código :
fonte
Acho que isso vai te ajudar: https://datatables.net/release-datatables/extensions/FixedHeader/examples/header_footer.html
Em suma, se você sabe como criar uma dataTable, você só precisa adicionar esta linha jQuery ao seu fundo:
bottom: true // serve para tornar o cabeçalho Bottom fixo também.
fonte
Se você quiser usar apenas HTML e CSS puros, eu tenho uma solução para seu problema:
Neste jsFiddle você pode ver uma solução sem script que fornece uma tabela com um cabeçalho fixo. Não deve ser um problema adaptar a marcação para uma primeira coluna fixa também. Você só precisa criar uma tabela com posição absoluta para a primeira coluna dentro do
hWrapper
-div e reposicionar ovWrapper
-div.Fornecer conteúdo dinâmico não deve ser um problema usando motores tentadores do lado do servidor ou do navegador, minha solução funciona bem em todos os navegadores modernos e navegadores mais antigos a partir do IE8.
fonte
Só preciso mudar o estilo
Demo: https://plnkr.co/edit/Qxy5RMJBXmkaJAOjBtQn?p=preview
fonte