Como definir <table>
100% de largura e colocar apenas dentro da <tbody>
rolagem vertical para alguma altura?
table {
width: 100%;
display:block;
}
thead {
display: inline-block;
width: 100%;
height: 20px;
}
tbody {
height: 200px;
display: inline-block;
width: 100%;
overflow: auto;
}
<table>
<thead>
<tr>
<th>Head 1</th>
<th>Head 2</th>
<th>Head 3</th>
<th>Head 4</th>
<th>Head 5</th>
</tr>
</thead>
<tbody>
<tr>
<td>Content 1</td>
<td>Content 2</td>
<td>Content 3</td>
<td>Content 4</td>
<td>Content 5</td>
</tr>
</tbody>
</table>
Quero evitar adicionar algumas div adicionais, tudo o que quero é uma tabela simples como essa e quando estou tentando alterar a exibição table-layout
, position
e muito mais na tabela CSS não funcionam bem com largura de 100% apenas com largura fixa em px.
html
css
vertical-scrolling
Marko S
fonte
fonte
Respostas:
Para tornar o
<tbody>
elemento rolável, precisamos alterar a maneira como ele é exibido na página, ou seja, usá-lodisplay: block;
para exibi-lo como um elemento no nível do bloco.Como alteramos a
display
propriedade detbody
, também devemos alterar essa propriedade para othead
elemento para impedir a quebra do layout da tabela.Então nós temos:
Navegadores da Web exibem os elementos
thead
etbody
como grupo de linhas (table-header-group
etable-row-group
) por padrão.Depois que mudamos isso, os
tr
elementos internos não preenchem todo o espaço do contêiner.Para consertar isso, precisamos calcular a largura das
tbody
colunas e aplicar o valor correspondente aothead
colunas via JavaScript.Colunas de largura automática
Aqui está a versão jQuery da lógica acima:
E aqui está a saída (no Windows 7 Chrome 32) :
DEMO DE TRABALHO .
Tabela de largura total, colunas de largura relativa
Conforme o Pôster original fosse necessário, poderíamos expandir
table
para 100% dewidth
seu contêiner e, em seguida, usar um relativo ( Porcentagem )width
para cada coluna da tabela.Como a tabela possui um layout de (tipo de) fluido , devemos ajustar a largura das
thead
colunas quando o contêiner é redimensionado.Portanto, devemos definir as larguras das colunas assim que a janela for redimensionada:
A saída seria:
DEMO DE TRABALHO .
Suporte ao navegador e alternativas
Testei os dois métodos acima no Windows 7 por meio das novas versões dos principais navegadores da Web (incluindo o IE10 +) e funcionou.
No entanto, ele não funciona corretamente no IE9 e abaixo.
Isso ocorre porque, em um layout de tabela , todos os elementos devem seguir as mesmas propriedades estruturais.
Usando
display: block;
os elementos<thead>
e<tbody>
, quebramos a estrutura da tabela.Redesenhar o layout via JavaScript
Uma abordagem é redesenhar o layout da tabela (inteira). Use o JavaScript para criar um novo layout rapidamente e manipule e / ou ajuste as larguras / alturas das células dinamicamente.
Por exemplo, dê uma olhada nos seguintes exemplos:
Mesas de aninhamento
Essa abordagem usa duas tabelas aninhadas com uma div contendo. A primeira
table
possui apenas uma célula que possui adiv
e a segunda tabela é colocada dentro dessediv
elemento.Verifique as tabelas de rolagem vertical no CSS Play .
Isso funciona na maioria dos navegadores da web. Também podemos fazer a lógica acima dinamicamente via JavaScript.
Tabela com cabeçalho fixo na rolagem
Como o objetivo de adicionar uma barra de rolagem vertical ao
<tbody>
é exibir o cabeçalho da tabela na parte superior de cada linha, poderíamos posicionar othead
elemento para permanecerfixed
na parte superior da tela.Aqui está uma demonstração de trabalho dessa abordagem, realizada por Julien .
Possui um suporte promissor ao navegador da web.
E aqui uma implementação CSS pura por Willem Van Bockstal .
A solução CSS pura
Aqui está a resposta antiga. É claro que adicionei um novo método e refinei as declarações CSS.
Mesa com Largura Fixa
Nesse caso,
table
deve ter um valor fixowidth
(incluindo a soma das larguras das colunas e a largura da barra de rolagem vertical) .Cada coluna deve ter uma largura específica e a última coluna do
thead
elemento precisa de uma largura maior, igual à largura das outras + à largura da barra de rolagem vertical.Portanto, o CSS seria:
Aqui está a saída:
DEMO DE TRABALHO .
Mesa com 100% de largura
Nesta abordagem, o
table
tem uma largura de100%
e para cada um ,th
etd
o valor dawidth
propriedade deve ser menor que100% / number of cols
.Além disso, precisamos reduzir a largura de
thead
como valor da largura da barra de rolagem vertical.Para fazer isso, precisamos usar a
calc()
função CSS3 , da seguinte maneira:Aqui está a demonstração online .
Nota: Essa abordagem falhará se o conteúdo de cada coluna quebrar a linha, ou seja, o conteúdo de cada célula deve ser curto o suficiente .
A seguir, há dois exemplos simples de solução CSS pura que eu criei no momento em que respondi a essa pergunta.
Aqui está a demonstração do jsFiddle v2 .
Versão antiga: jsFiddle Demo v1
fonte
display: block
você perde propriedades de tabela como largura da coluna compartilhada entre thead e tbody. Sei que você corrigiu isso definindo,width: 19.2%
mas, caso não conheçamos a largura de cada coluna com antecedência, isso não funcionará.height: 100%
(quando você deseja que a tabela se expanda para a parte inferior da página).ng-repeat
tabelas AngularJS . Não sei por que existem todas as bibliotecas com cabeçalhos de tabela fixos e o que não acontece quando há essa solução.box-sizing
propriedade, para que bordas de duas espessuras diferentes não atinjam o alinhamento da coluna.Na solução a seguir, a tabela ocupa 100% do contêiner pai, sem necessidade de tamanhos absolutos. É CSS puro, o layout flexível é usado.
Aqui está como fica:
Possíveis desvantagens:
HTML (reduzido):
CSS, com algumas decorações omitidas para maior clareza:
código completo no jsfiddle
O mesmo código em LESS para que você possa misturá-lo:
fonte
td
deve ajudarNos navegadores modernos, você pode simplesmente usar o css:
fonte
<table>
com o<div>
qual possuioverflow-y: auto;
e algunsmax-height
. Por exemplo:<div style="overflow-y: auto; max-height: 400px;"><table>...</table></div>
Estou usando
display:block
parathead
etbody
. Por esse motivo, a largura dasthead
colunas é diferente da largura dastbody
colunas.Para corrigir isso, uso
jQuery
código pequeno , mas isso pode ser feitoJavaScript
apenas.Aqui está minha demonstração de trabalho: http://jsfiddle.net/gavroche/N7LEF/
Não funciona no IE 8
Mostrar snippet de código
fonte
colNumber
variável pode ser substituída por código que itera pelas células reais encontradas e observe que ela não funciona corretamente se houver algumcolspan
s (também pode ser aprimorado no código, se necessário, mas improvável no tipo de tabela que provavelmente deseja esse recurso de rolagem).Somente CSS
para Chrome, Firefox, Edge (e outros navegadores sempre verdes )
Simplesmente
position: sticky; top: 0;
seusth
elementos:PS: se você precisar de bordas para elementos TH,
th {box-shadow: 1px 1px 0 #000; border-top: 0;}
isso ajudará (já que as bordas padrão não são pintadas corretamente na rolagem).Para uma variante do anterior que usa apenas um pouco de JS para acomodar o IE11, consulte esta resposta https://stackoverflow.com/a/47923622/383904
fonte
separate
você está adicionando óleo ao fogo. jsfiddle.net/RokoCB/o0zL4xyw e veja uma solução AQUI: adicione bordas ao TH fixo - eu sou bem-vindo para sugestões OFC se eu perdi alguma coisa.Crie duas tabelas uma após a outra, coloque a segunda tabela em uma div de altura fixa e defina a propriedade overflow como auto. Mantenha também todos os td dentro da segunda mesa vazios.
fonte
Eu finalmente entendi direito com CSS puro, seguindo estas instruções:
http://tjvantoll.com/2012/11/10/creating-cross-browser-scrollable-tbody/
O primeiro passo é definir o
<tbody>
bloco display: para que um excesso e uma altura possam ser aplicados. A partir daí, as linhas<thead>
precisam ser definidas para a posição: relativa e exibição: bloco, para que elas fiquem no topo da rolagem agora<tbody>
.tbody, thead { display: block; overflow-y: auto; }
Como o
<thead>
está relativamente posicionado, cada célula da tabela precisa de uma largura explícitaMas infelizmente isso não é suficiente. Quando uma barra de rolagem está presente, os navegadores alocam espaço para ela, portanto,
<tbody>
acaba tendo menos espaço disponível que o<thead>
. Observe o leve desalinhamento que isso cria ...A única solução alternativa que eu pude encontrar foi definir uma largura mínima em todas as colunas, exceto a última.
Exemplo de código inteiro abaixo:
CSS:
Html:
EDIT: Solução alternativa para largura da tabela 100% (acima, na verdade, é para largura fixa e não respondeu à pergunta):
HTML:
CSS:
Demonstração: http://codepen.io/anon/pen/bNJeLO
fonte
Solução alternativa de Css para forçar colunas a serem exibidas corretamente com um tbody 'block'
Essa solução ainda exige que as
th
larguras sejam calculadas e definidas pelo jQueryE o Jquery / Javascript
fonte
tente abaixo abordagem, muito simples e fácil de implementar
Abaixo está o link jsfiddle
http://jsfiddle.net/v2t2k8ke/2/
HTML:
CSS:
Jquery:
fonte
Adicionando uma largura fixa a td, depois de fazer o bloco de exibição tbody & thead funcionar perfeitamente, também podemos usar o plugin slimscroll para deixar a barra de rolagem bonita.
fonte
Este é o código que funciona para mim para criar um cabeçalho em uma tabela com um corpo rolável:
fonte
Para usar "overflow: scroll", você deve definir "display: block" no cabeçote e no corpo. E isso atrapalha as larguras das colunas entre eles. Mas você pode clonar a linha do cabeçalho com Javascript e colá-la no corpo como uma linha oculta para manter as larguras exatas das colunas.
http://jsfiddle.net/Julesezaar/mup0c5hk/
O css:
fonte
Experimente este jsfiddle . Isso está usando jQuery e é feito com a resposta de Hashem Qolami. Primeiro, faça uma tabela regular e depois role-a.
fonte