Com HTML / CSS, como criar um elemento com largura e / ou altura que seja 100% do elemento pai e ainda ter margens ou preenchimento adequados?
Por "apropriado", quero dizer que, se meu elemento pai for 200px
alto e eu especificar height = 100%
com, padding = 5px
eu esperaria que eu recebesse um 190px
elemento alto border = 5px
de todos os lados, bem centralizado no elemento pai.
Agora, eu sei que não é assim que o modelo de caixa padrão especifica que ele funcione (embora eu queira saber exatamente o porquê ...), portanto a resposta óbvia não funciona:
#myDiv {
width: 100%
height: 100%;
padding: 5px;
}
Mas parece-me que deve haver ALGUM modo de produzir esse efeito de maneira confiável para um pai de tamanho arbitrário. Alguém sabe como realizar essa tarefa (aparentemente simples)?
Ah, e para constar, não estou muito interessado na compatibilidade com o IE, de modo que (espero) torne as coisas um pouco mais fáceis.
EDIT: Como um exemplo foi solicitado, aqui está o mais simples que consigo pensar:
<html style="height: 100%">
<body style="height: 100%">
<div style="background-color: black; height: 100%; padding: 25px"></div>
</body>
</html>
O desafio é fazer com que a caixa preta apareça com um preenchimento de 25 pixels em todas as bordas, sem que a página fique grande o suficiente para exigir barras de rolagem.
Respostas:
Eu aprendi como fazer esse tipo de coisa lendo " PRO HTML e CSS Design Patterns ". O
display:block
é o valor de exibição padrão para odiv
, mas eu gosto de torná-lo explícito. O contêiner deve ser do tipo certo;position
atributo éfixed
,relative
, ouabsolute
.Fiddle pelo comentário de Nooshu
fonte
top:0
,bottom:0
essencialmente "esticar" o elemento. Eu só posso fazê-lo funcionar composition:absolute
emboratop:20px;bottom:20px;left:20px;right:20px;
vez de usar margens?Há uma nova propriedade no CSS3 que você pode usar para alterar a maneira como o modelo de caixa calcula largura / altura, chamado de dimensionamento de caixa.
Ao definir essa propriedade com o valor "border-box", faz com que o elemento aplicado não seja esticado ao adicionar um preenchimento ou borda. Se você definir algo com largura de 100 px e preenchimento de 10 px, ele ainda terá 100 px de largura.
Veja aqui para suporte ao navegador . Ele não funciona no IE7 e inferior, no entanto, acredito que o IE7.js de Dean Edward adiciona suporte a ele. Desfrutar :)
fonte
border-box
é de todos herói :)A solução é NÃO usar altura e largura! Anexe a caixa interna usando as partes superior, esquerda, direita, inferior e adicione margem.
fonte
A melhor maneira é com a propriedade calc (). Portanto, seu caso seria semelhante a:
Simples, limpo, sem soluções alternativas. Apenas certifique-se de não esquecer o espaço entre os valores e o operador (por exemplo,
(100%-5px)
isso interromperá a sintaxe. Aproveite!fonte
De acordo com a altura da especificação w3c, refere-se à altura da área visível, por exemplo, em um monitor com resolução de 1280x1024 pixels, 100% de altura = 1024 pixels.
min-height refere-se à altura total da página, incluindo o conteúdo, portanto, em uma página em que o conteúdo seja maior que 1024px min-height: 100% se estenderá para incluir todo o conteúdo.
O outro problema é que o preenchimento e a borda são adicionados à altura e largura na maioria dos navegadores modernos, exceto ie6 (ie6 é realmente bastante lógico, mas não está em conformidade com as especificações). Isso é chamado de modelo de caixa. Então, se você especificar
Ele fornecerá 100% + 5px + 5px para a altura. Para contornar isso, você precisa de um contêiner de embalagem.
fonte
1. Altura total com
padding
2. Altura total com
margin
3. Altura total com
border
fonte
Essa é uma das idiotices definitivas do CSS - ainda não entendi o raciocínio (se alguém souber, por favor, explique).
100% significa 100% da altura do contêiner - à qual são adicionadas margens, bordas e preenchimentos. Portanto, é efetivamente impossível obter um contêiner que preencha seu pai e que tenha uma margem, borda ou preenchimento.
Observe também que definir altura também é notoriamente inconsistente entre os navegadores.
Outra coisa que aprendi desde que postei isso é que a porcentagem é relativa ao comprimento do contêiner , ou seja, sua largura, tornando uma porcentagem ainda mais inútil para a altura.
Atualmente, as unidades de janela de visualização vh e vw são mais úteis, mas ainda não são especialmente úteis para outras coisas que não os contêineres de nível superior.
fonte
Outra solução é usar display: table que possui um comportamento de modelo de caixa diferente.
Você pode definir uma altura e largura para o pai e adicionar preenchimento sem expandi-lo. A criança tem 100% de altura e largura, menos os forros.
JSBIN
Outra opção seria usar propriedades de tamanho de caixa. O único problema com ambos seria que eles não funcionam no IE7.
fonte
Outra solução: você pode usar unidades de porcentagem para margens e tamanhos. Por exemplo:
O principal problema aqui é que as margens aumentarão / diminuirão ligeiramente com o tamanho do elemento pai. Presumivelmente, a funcionalidade que você prefere é que as margens permaneçam constantes e o elemento filho aumente / diminua para preencher as alterações no espaçamento. Portanto, dependendo do quão apertado você precisa que sua tela seja, isso pode ser problemático. (Eu também optaria por uma margem menor, como 0,3%).
fonte
Uma solução com flexbox (trabalhando no IE11): ( ou visualize no jsfiddle )
(A redefinição de CSS não é necessariamente importante para o problema real.)
A parte importante é
flex: 1
(em combinação comdisplay: flex
o pai). Curiosamente, a explicação mais plausível que conheço para o funcionamento da propriedade Flex vem de uma documentação nativa de reação, por isso me refiro a ela de qualquer maneira :fonte
O exemplo de Frank me confundiu um pouco - não funcionou no meu caso porque eu ainda não entendia o posicionamento o suficiente. É importante observar que o elemento do contêiner pai precisa ter uma posição não estática (ele mencionou isso, mas eu o ignorei, e não estava no exemplo dele).
Aqui está um exemplo em que o filho - preenchimento e borda - usa posicionamento absoluto para preencher 100% dos pais. O pai usa o posicionamento relativo para fornecer um ponto de referência para a posição da criança enquanto permanece no fluxo normal - o próximo elemento "mais conteúdo" não é afetado:
Um link útil para aprender rapidamente o posicionamento CSS
fonte
Borda em torno da div, em vez da margem do corpo da página
Outra solução - eu só queria uma borda simples em torno da borda da minha página e queria 100% de altura quando o conteúdo fosse menor que isso.
A caixa de borda não funcionou e o posicionamento fixo parecia errado para uma necessidade tão simples.
Acabei adicionando uma borda ao meu contêiner, em vez de depender da margem do corpo da página - fica assim:
fonte
Esse é o comportamento padrão de
display: block
A maneira mais rápida de corrigi-lo em 2020 é definir odisplay: 'flex'
elemento pai e o preenchimento, por exemplo, 20 px, todos os filhos terão 100% de altura em relação à sua altura.fonte
Adicionar -webkit e -moz seria mais apropriado
fonte
fonte