Estou tentando criar algumas classes CSS reutilizáveis para obter mais consistência e menos confusão no meu site, e estou tentando padronizar uma coisa que uso com frequência.
Eu tenho um contêiner para o <div>
qual não quero definir a altura (porque variará dependendo do local do site), e dentro dele há um cabeçalho <div>
e, em seguida, uma lista não ordenada de itens, todos com CSS aplicado a eles.
Parece muito com isso:
Quero que a lista não ordenada ocupe a sala restante no contêiner <div>
, sabendo que o cabeçalho <div>
é 18px
alto. Só não sei como especificar a altura da lista como "o resultado de 100%
menos 18px
".
Eu já vi essa pergunta em alguns outros contextos no SO, mas achei que valeria a pena perguntar novamente pelo meu caso particular. Alguém tem algum conselho nessa situação?
Respostas:
Sei que este é um post antigo, mas, como não foi sugerido, vale a pena mencionar que se você estiver escrevendo para navegadores compatíveis com CSS3, poderá usar
calc
:Vale a pena notar que nem todos os navegadores atualmente suportam a função CSS3 calc () padrão; portanto, a implementação de versões específicas da função pode ser necessária da seguinte maneira:
fonte
lessc --strict-math=on
para não avaliar a expressão dentro docalc
- apenas um problema que enfrentei e gastei muito tempo (a partir do Less 2.0.0)100%-18px
,100%- 18px
e100% -18px
não funcionou em todos os navegadores que eu testei com.Para uma abordagem um pouco diferente, você pode usar algo como isto na lista:
Isso funciona desde que o contêiner pai tenha
position: relative;
fonte
position: relative;
estava me tropeçando.absolute
no contêiner infantil, não pode estarrelative
.absolute
) e também precisa ser definido como 100% de altura.Eu uso o Jquery para isso
vinculo o redimensionamento da janela para recalcá-lo sempre que a janela do navegador é redimensionada (se o tamanho do contêiner for alterado com o redimensionamento da janela)
fonte
Não defina a altura como porcentagem, apenas defina
top=0
ebottom=0
, assim:fonte
height:100%
edisplay:block
. Caso contrário, seria uma solução muito elegante. Curiosamente,margin:auto
também falha ao centralizar verticalmente um objeto de largura fixa, mesmo que ele funcione bem horizontalmente.Presumindo 17px de altura do cabeçalho
Listar css:
CSS do cabeçalho:
fonte
ul { margin-top: -17px; }
overflow:hidden;
no elemento que contémoverflow:auto;
o elemento desejado.Funcionou para mim!
fonte
calc()
centralizá-lo no tempo de execução. Mas, em muitos casos, isso não deve ser um problema. Outra coisa a ter em mente é que o uso de muitos valores negativos para margens, preenchimento e compensações pode causar confusão ao depurar o código posteriormente, portanto, tente manter as coisas simples.Tente o tamanho da caixa. Para a lista:
Para o cabeçalho:
Obviamente, o contêiner pai deve ter algo como:
fonte
Outra maneira de alcançar o mesmo objetivo: caixas flexíveis . Torne o contêiner uma caixa flexível da coluna e você terá toda a liberdade para permitir que alguns elementos tenham tamanho fixo (comportamento padrão) ou preencham / encolhem no espaço do contêiner (com flex-grow: 1 e flex- encolher: 1).
Consulte https://jsfiddle.net/2Lmodwxk/ (tente estender ou reduzir a janela para perceber o efeito)
Nota: você também pode usar a propriedade taquigrafia:
fonte
Eu tentei algumas das outras respostas, e nenhuma delas funcionou exatamente como eu queria. Nossa situação era muito semelhante quando tínhamos um cabeçalho de janela e a janela era redimensionável com imagens no corpo da janela. Queríamos bloquear a proporção do redimensionamento sem precisar adicionar cálculos para levar em conta o tamanho fixo do cabeçalho e ainda assim fazer com que a imagem preencha o corpo da janela.
Abaixo, criei um snippet muito simples que mostra o que acabamos fazendo, que parece funcionar bem para a nossa situação e deve ser compatível com a maioria dos navegadores.
No elemento window, adicionamos uma margem de 20 px que contribui para o posicionamento em relação a outros elementos na tela, mas não contribui para o "tamanho" da janela. O cabeçalho da janela é então posicionado absolutamente (o que o remove do fluxo de outros elementos, para que não faça com que outros elementos como a lista não ordenada sejam deslocados) e seu topo é posicionado -20px, que coloca o cabeçalho dentro da margem da janela. Finalmente, nosso elemento ul é adicionado à janela e a altura pode ser definida como 100%, o que fará com que preencha o corpo da janela (excluindo a margem).
fonte
Obrigado, resolvi o meu com a sua ajuda, aprimorando-o um pouco, pois quero uma div 100% largura 100% de altura (menos altura de uma barra inferior) e nenhuma rolagem no corpo (sem hack / ocultar barras de rolagem).
Para CSS:
Para HTML:
Isso fez o truque, oh sim, eu coloquei um valor um pouco melhor em div.ajustado para a parte inferior do que para a altura da barra inferior, caso contrário a barra de rolagem vertical aparece, eu ajustei para ser o valor mais próximo.
Essa diferença é porque um dos elementos na área dinâmica está adicionando um orifício extra extra do qual eu não sei como me livrar ... é uma tag de vídeo (HTML5), observe que coloquei essa tag de vídeo com este css ( então não há razão para fazer um furo no fundo, mas sim):
O objetivo: ter um vídeo que use 100% do navegador (e redimensione dinamicamente quando o navegador é redimensionado, mas sem alterar a proporção) menos um espaço inferior que eu uso para uma div com alguns textos, botões, etc. (e validadores w3c & css, é claro).
EDIT: eu encontrei o motivo, tag de vídeo é como texto, não um elemento de bloco, então eu corrigi-lo com este css:
Observe a
display:block;
tag no vídeo.fonte
Não tenho certeza se isso funciona em sua situação específica, mas descobri que o preenchimento na div interna empurrará o conteúdo para dentro de uma div se a div contida tiver um tamanho fixo. Você precisaria flutuar ou posicionar absolutamente seu elemento de cabeçalho, mas, caso contrário, não tentei isso para divs de tamanho variável.
fonte