Estou trabalhando em um aplicativo da web em que desejo que o conteúdo preencha a altura da tela inteira.
A página tem um cabeçalho, que contém um logotipo e informações da conta. Essa pode ser uma altura arbitrária. Quero que a div de conteúdo preencha o restante da página até o final.
Eu tenho um cabeçalho div
e um conteúdo div
. No momento, estou usando uma tabela para o layout da seguinte forma:
CSS e HTML
#page {
height: 100%; width: 100%
}
#tdcontent {
height: 100%;
}
#content {
overflow: auto; /* or overflow: hidden; */
}
<table id="page">
<tr>
<td id="tdheader">
<div id="header">...</div>
</td>
</tr>
<tr>
<td id="tdcontent">
<div id="content">...</div>
</td>
</tr>
</table>
Toda a altura da página é preenchida e nenhuma rolagem é necessária.
Para qualquer coisa dentro da div de conteúdo, a configuração top: 0;
a colocará logo abaixo do cabeçalho. Às vezes, o conteúdo será uma tabela real, com sua altura definida para 100%. Colocar header
dentro content
não permitirá que isso funcione.
Existe uma maneira de obter o mesmo efeito sem usar o table
?
Atualizar:
Os elementos dentro do conteúdo div
também terão alturas definidas para porcentagens. Então, algo a 100% dentro do div
preenchê-lo-á até o fundo. Assim como dois elementos a 50%.
Atualização 2:
Por exemplo, se o cabeçalho #content
ocupar 20% da altura da tela, uma tabela especificada a 50% dentro ocuparia 40% do espaço da tela. Até agora, envolver a coisa toda em uma tabela é a única coisa que funciona.
fonte
display:table
propriedades e relacionadas, consulte esta resposta para uma pergunta muito semelhante.Respostas:
Atualização de 2015: a abordagem flexbox
Há duas outras respostas mencionando brevemente o flexbox ; no entanto, isso foi há mais de dois anos e eles não fornecem nenhum exemplo. A especificação para o flexbox definitivamente se estabeleceu agora.
Todos os principais navegadores e IE11 + suportam Flexbox. Para o IE 10 ou mais antigo, você pode usar o calço FlexieJS.
Para verificar o suporte atual, você também pode ver aqui: http://caniuse.com/#feat=flexbox
Exemplo de trabalho
Com o flexbox, você pode alternar facilmente entre qualquer uma de suas linhas ou colunas com dimensões fixas, dimensões de tamanho de conteúdo ou dimensões de espaço restante. No meu exemplo, configurei o cabeçalho para ajustar ao conteúdo (conforme a pergunta dos OPs), adicionei um rodapé para mostrar como adicionar uma região de altura fixa e, em seguida, defina a área de conteúdo para preencher o espaço restante.
No CSS acima, a propriedade flex abrevia as propriedades flex-grow , flex-shrink e flex-base para estabelecer a flexibilidade dos itens flex. O Mozilla tem uma boa introdução ao modelo de caixas flexíveis .
fonte
flex: 0 1 30px;
atributobox .row
é substituído em todas as div?overflow-y: auto
a.row.content
conseguir o que você precisa no entanto.Realmente não existe uma maneira sólida e de vários navegadores para fazer isso em CSS. Supondo que seu layout tenha complexidades, você precisa usar JavaScript para definir a altura do elemento. A essência do que você precisa fazer é:
Depois de obter esse valor e definir a altura do elemento, você precisa anexar manipuladores de eventos à janela onload e onresize, para poder disparar sua função de redimensionamento.
Além disso, supondo que seu conteúdo possa ser maior que a janela de visualização, você precisará definir overflow-y para rolar.
fonte
A postagem original é mais de 3 anos atrás. Acho que muitas pessoas que chegam a este post como eu estão procurando uma solução de layout semelhante a um aplicativo, digamos um cabeçalho, rodapé e conteúdo de altura total que ocupam a tela restante. Nesse caso, este post pode ajudar, funciona no IE7 +, etc.
http://blog.stevensanderson.com/2011/10/05/full-height-app-layouts-a-css-trick-to-make-it-easier/
E aqui estão alguns trechos desse post:
fonte
display: table
no corpo, ele parece transbordar. Fazer issoheight: 100%
não produz a altura correta..col
não é usado, é?Em vez de usar tabelas na marcação, você pode usar tabelas CSS.
Marcação
CSS (relevante)
FIDDLE1 e FIDDLE2
Algumas vantagens deste método são:
1) Menos marcação
2) A marcação é mais semântica que as tabelas, porque não se trata de dados tabulares.
3) O suporte ao navegador é muito bom : IE8 +, todos os navegadores e dispositivos móveis modernos ( caniuse )
Apenas para completar, eis os elementos Html equivalentes às propriedades css do modelo de tabela CSS
fonte
html, body { height: 100%, width: 100% }
parecia crítico nos meus testes.relative
posicionamento notable-row
elemento, portanto, leva a altura do ascendente da primeira posição que não é um elemento da tabela.Abordagem apenas CSS (se a altura for conhecida / fixa)
Quando você deseja que o elemento do meio se estenda verticalmente por toda a página, é possível usar
calc()
que é introduzido no CSS3.Supondo que tenhamos uma altura
header
efooter
elementos fixos e desejemos que asection
tag use toda a altura vertical disponível ...Demo
A marcação assumida e seu CSS devem ser
Então, aqui, o que estou fazendo é somar a altura dos elementos e deduzir do
100%
usocalc()
função.Apenas certifique-se de usar
height: 100%;
os elementos pai.fonte
Usava:
height: calc(100vh - 110px);
código:
fonte
Uma solução simples, usando o flexbox:
Amostra Codepen
Uma solução alternativa, com uma div centralizada na div de conteúdo
fonte
Que tal você simplesmente usar
vh
que significaview height
em CSS ...Veja abaixo o snippet de código que criei para você e execute-o:
Além disso, veja a imagem abaixo que criei para você:
fonte
CSS3 Simple Way
atualmente, todos os principais navegadores são compatíveis; portanto, vá em frente se você não tiver necessidade de oferecer suporte a navegadores antigos.
fonte
Isso pode ser feito exclusivamente
CSS
usandovh
:e a
HTML
Eu verifiquei, Ele funciona em todos os principais navegadores:
Chrome
,IE
eFireFox
fonte
vh
evw
unidades antes. Mais informações: snook.ca/archives/html_and_css/vm-vh-unitsheight: 100%
on#content
fez com que sua altura correspondesse à de#page
ignorar#tdcontent
completamente a altura. Com muito conteúdo, a barra de rolagem se estende além da parte inferior da página.Nenhuma das soluções postadas funciona quando você precisa da div inferior para rolar quando o conteúdo é muito alto. Aqui está uma solução que funciona nesse caso:
Fonte original: Preenchendo a altura restante de um contêiner durante o processamento de estouro em CSS
Visualização ao vivo do JSFiddle
fonte
body-content-wrapper
, e as coisas parecem funcionar muito bem sem o invólucro duplo (semtable-cell
s). Existe algum problema em fazê-lo dessa maneira?.body
altura acaba sendo a mesma que a definida.container
. A barra de rolagem vertical ainda está no lugar certo, mas.container
acaba ficando mais esticada do que queremos. Quando está em tela cheia, a parte inferior.body
está fora da parte inferior da tela.Estive procurando uma resposta para isso também. Se você tiver a sorte de poder segmentar o IE8 e superior, poderá usar
display:table
valores relacionados para obter as regras de renderização de tabelas com elementos em nível de bloco, incluindo div.Se você tiver ainda mais sorte e seus usuários estiverem usando navegadores de primeira linha (por exemplo, se este for um aplicativo de intranet nos computadores que você controla, como o meu projeto mais recente), você poderá usar o novo Layout de caixa flexível no CSS3!
fonte
O que funcionou para mim (com uma div dentro de outra div e suponho em todas as outras circunstâncias) é definir o preenchimento inferior para 100%. Ou seja, adicione isso à sua css / stylesheet:
fonte
HTML 5
CSS
A solução acima usa unidades de viewport e flexbox e , portanto, é o IE10 +, desde que você use a sintaxe antiga do IE10.
Codepen para jogar: link to codepen
Ou este, para aqueles que precisam que o contêiner principal seja rolável em caso de conteúdo excedente: link para codepen
fonte
Agora há muitas respostas, mas achei
height: 100vh;
que o trabalho para trabalhar no elemento div que precisa preencher todo o espaço vertical disponível.Dessa forma, não preciso brincar com exibição ou posicionamento. Isso foi útil ao usar o Bootstrap para criar um painel em que eu tinha uma barra lateral e uma principal. Eu queria que o principal esticasse e preencha todo o espaço vertical para que eu pudesse aplicar uma cor de fundo.
Suporta IE9 e superior: clique para ver o link
fonte
Em todos os navegadores sãos, você pode colocar a div "header" antes do conteúdo, como um irmão, e o mesmo CSS funcionará. No entanto, o IE7- não interpreta a altura corretamente se o flutuador for 100% nesse caso; portanto, o cabeçalho precisa estar IN no conteúdo, como acima. O estouro: auto causará barras de rolagem duplas no IE (que sempre tem a barra de rolagem da janela de exibição visível, mas desativada), mas sem ela, o conteúdo será cortado se estourar.
fonte
div
... ou sejatop: 0;
, colocará algo logo abaixo do cabeçalho. Vou modificar minha pergunta novamente, porque você respondeu perfeitamente, e ainda não é o que eu quero! Vou apenas ocultar o excesso, pois o conteúdo deve caber.Eu lutei com isso por um tempo e acabei com o seguinte:
Como é fácil tornar o DIV do conteúdo a mesma altura do pai, mas aparentemente difícil torná-lo a altura do pai menos a altura do cabeçalho, eu decidi fazer o conteúdo div altura completa, mas posicione-o absolutamente no canto superior esquerdo e depois defina um preenchimento para o topo que tem a altura do cabeçalho. Dessa forma, o conteúdo é exibido ordenadamente sob o cabeçalho e preenche todo o espaço restante:
fonte
Se você puder lidar com o não suporte a navegadores antigos (ou seja, MSIE 9 ou mais antigo), poderá fazê-lo com o Módulo de layout de caixa flexível que já é W3C CR. Esse módulo também permite outros truques interessantes, como reordenar o conteúdo.
Infelizmente, o MSIE 9 ou inferior não suporta isso e você deve usar o prefixo do fornecedor para a propriedade CSS para todos os navegadores que não sejam o Firefox. Esperamos que outros fornecedores abandonem o prefixo em breve também.
Outra opção seria o CSS Grid Layout, mas que tem ainda menos suporte de versões estáveis de navegadores. Na prática, apenas o MSIE 10 suporta isso.
Atualizar ano 2020 : todos os navegadores modernos suportam ambos
display: flex
edisplay: grid
. O único que falta é o suporte para osubgrid
qual apenas é suportado pelo Firefox. Observe que o MSIE também não suporta as especificações, mas se você deseja adicionar hacks CSS específicos ao MSIE, é possível que ele se comporte. Eu sugeriria simplesmente ignorar o MSIE, porque mesmo a Microsoft diz que não deve mais ser usada.fonte
Solução de grade CSS
Apenas definindo a propriedade
body
with,display:grid
thegrid-template-rows
usingauto
e thefr
value.Um guia completo para grades @ CSS-Tricks.com
fonte
Por que não apenas assim?
Dar a você html e body (nessa ordem) uma altura e depois dar uma altura aos seus elementos?
Funciona para mim
fonte
Você pode realmente usar
display: table
para dividir a área em dois elementos (cabeçalho e conteúdo), onde o cabeçalho pode variar em altura e o conteúdo preenche o espaço restante. Isso funciona com toda a página, bem como quando a área é simplesmente o conteúdo de um outro elemento posicionado composition
conjunto pararelative
,absolute
oufixed
. Funcionará enquanto o elemento pai tiver uma altura diferente de zero.Veja este violino e também o código abaixo:
CSS:
HTML:
fonte
resolveu o problema para mim. No meu caso, apliquei isso na div requerida
fonte
Vincent, responderei novamente usando seus novos requisitos. Como você não se importa com o conteúdo oculto, se for muito longo, não precisa flutuar o cabeçalho. Basta colocar o excesso oculto nas tags html e body e definir a
#content
altura para 100%. O conteúdo sempre será maior que a janela de exibição pela altura do cabeçalho, mas ficará oculto e não causará barras de rolagem.fonte
table
porque funciona. Obrigado pela atualização embora.Tente isto
fonte
Encontrei uma solução bastante simples, porque para mim era apenas uma questão de design. Queria que o resto da página não ficasse branco abaixo do rodapé vermelho. Então, defino a cor de fundo das páginas para vermelho. E o conteúdo é colorido em branco. Com a altura do conteúdo definida como por exemplo. 20 ou 50%, uma página quase vazia não deixa a página inteira vermelha.
fonte
Eu tive o mesmo problema, mas não consegui fazer da solução a solução com caixas flexíveis acima. Então, eu criei meu próprio modelo, que inclui:
Usei flexboxes, mas de uma maneira mais simples, usando apenas propriedades display: flex e flex-direction: row | column :
Eu uso angular e quero que os tamanhos dos meus componentes sejam 100% do elemento pai.
A chave é definir o tamanho (em porcentagem) de todos os pais para limitar seu tamanho. No exemplo a seguir, a altura do myapp possui 100% da janela de visualização.
O componente principal possui 90% da janela de exibição, porque o cabeçalho e o rodapé têm 5%.
Publiquei meu modelo aqui: https://jsfiddle.net/abreneliere/mrjh6y2e/3
Html:
fonte
Para aplicativos móveis, uso apenas VH e VW
Demonstração - https://jsfiddle.net/u763ck92/
fonte
Girando a idéia do Sr. Alien ...
Essa parece uma solução mais limpa que a popular flex box para navegadores habilitados para CSS3.
Basta usar min-height (em vez de height) com calc () no bloco de conteúdo.
O calc () começa com 100% e subtrai as alturas dos cabeçalhos e rodapés (é necessário incluir valores de preenchimento)
Usar "min-height" em vez de "height" é particularmente útil para que ele possa trabalhar com conteúdo renderizado em javascript e estruturas JS como Angular2. Caso contrário, o cálculo não empurrará o rodapé para o final da página quando o conteúdo renderizado em javascript estiver visível.
Aqui está um exemplo simples de cabeçalho e rodapé usando 50px de altura e 20px de preenchimento para ambos.
Html:
Css:
Claro, a matemática pode ser simplificada, mas você entendeu ...
fonte
No Bootstrap:
Estilos CSS:
1) Basta preencher a altura do espaço restante da tela:
2) preencha a altura do espaço restante da tela e alinhando o conteúdo ao meio do elemento pai:
fonte
Esta é minha própria versão mínima da solução do Pebbl. Levou uma eternidade para encontrar o truque para fazê-lo funcionar no IE11. (Também testado no Chrome, Firefox, Edge e Safari.)
fonte