Como você faz um elemento posicionado absoluto honrar o preenchimento de seu pai? Eu quero que uma div interna se estenda pela largura do pai e seja posicionada na parte inferior desse pai, basicamente um rodapé. Mas a criança tem que honrar o estofamento dos pais e não está fazendo isso. A criança é pressionada contra a borda dos pais.
Então, eu quero isso:
mas estou entendendo isso:
<html>
<body>
<div style="background-color: blue; padding: 10px; position: relative; height: 100px;">
<div style="background-color: gray; position: absolute; left: 0px; right: 0px; bottom: 0px;">css sux</div>
</div>
</body>
</html>
Posso fazer isso acontecer com uma margem em torno da div interna, mas prefiro não ter que adicionar isso.
css
padding
css-position
d512
fonte
fonte
style="background-color: gray; position: absolute; left: 10px; right: 10px; bottom: 10px;"
?left:
eright:
sobre a criança (absoluto posicionada), o problema está resolvido. Estou adicionando este b / c que é a resposta que outras pessoas com o mesmo problema provavelmente estão procurando.Respostas:
Primeiro, vamos ver por que isso está acontecendo.
O motivo é que, surpreendentemente, quando uma caixa tem
position: absolute
sua caixa contendo a caixa de preenchimento dos pais (ou seja, a caixa em torno do preenchimento). Isso é surpreendente, porque geralmente (ou seja, ao usar o posicionamento estático ou relativo) a caixa que contém é a caixa de conteúdo dos pais .Aqui está a parte relevante da especificação CSS :
A abordagem mais simples - como sugerido na resposta de Winter - é usar
padding: inherit
no absolutamente posicionadodiv
. Só funciona, no entanto, se você não quiser que o absolutamente posicionadodiv
tenha algum preenchimento adicional próprio. Eu acho que as soluções de uso geral (em que ambos os elementos podem ter seu próprio preenchimento independente) são:Adicione um extra relativamente posicionado
div
(sem preenchimento) ao redor do absolutamente posicionadodiv
. Esse novodiv
respeitará o preenchimento de seu pai e o absolutamente posicionadodiv
o preencherá.A desvantagem, é claro, é que você está mexendo com o HTML simplesmente para fins de apresentação.
Repita o preenchimento (ou adicione a ele) no elemento absolutamente posicionado.
A desvantagem aqui é que você deve repetir os valores no seu CSS, que é quebradiço se você estiver escrevendo o CSS diretamente. No entanto, se você estiver usando uma ferramenta de pré-processamento como
SASS
ouLESS
pode evitar esse problema usando uma variável. Esse é o método que eu pessoalmente uso.fonte
position: absolute
? É surpreendente que a caixa que contém é a caixa de preenchimento, mas deve ter havido uma razão para isso, assim como tenho certeza de que há uma razão pela qual (sembox-sizing
) owidth
&height
não inclui o preenchimento ou a borda.box-sizing
propriedade, no pai ou no filho. Isso ocorre porque isso afeta o dimensionamento , como na largura / altura, mas não na caixa que contém, embora eu admita que faria mais sentido se afetasse os dois.padding: inherit
funciona bem se o absolutamente posicionadodiv
não precisar de preenchimento próprio, e eu adicionei uma menção a essa técnica. É menos flexível, porém, porque você não pode adicionar nenhum preenchimento adicional ao absolutamente posicionadodiv
(ou seja, você não pode dizerpadding: inherit + 5px
). Por isso prefiro as técnicas mencionadas aqui.position:absolute
elemento filho realmente funciona se você estiver apenas procurando que a criança respeite o preenchimento dos pais. No entanto, se você deseja adicionar preenchimento adicional à criança, você deve manter a proporção de preenchimentos em seu código. Não há maneira limpa de fazer isso apenas com CSS.Uma coisa que você pode tentar é usar o seguinte css:
Ele permite que o elemento filho herde o preenchimento do pai, e o filho pode ser posicionado para corresponder ao tamanho e ao preenchimento dos pais.
Além disso, estou usando
box-sizing: border-box;
os elementos envolvidos.Não testei isso em todos os navegadores, mas parece estar funcionando no Chrome, Firefox e IE10.
fonte
Bem, essa pode não ser a solução mais elegante (semanticamente), mas em alguns casos funcionará sem inconvenientes: em vez de preenchimento, use uma borda transparente no elemento pai. Os elementos filhos posicionados absolutos respeitarão a borda e ela será renderizada exatamente da mesma forma (exceto se você estiver usando a borda do elemento pai para estilizar).
fonte
Use margem em vez de preenchimento na div principal: http://blog.vjeux.com/2012/css/css-absolute-position-taking-into-account-padding.html
fonte
Aqui está minha melhor chance. Eu adicionei outra Div e a deixei vermelha e alterei a altura dos seus pais para 200px apenas para testá-la. A idéia é que o filho agora se torna neto e os pais se tornam avós. Portanto, o pai respeita o pai. Espero que você entenda minha ideia.
Editar:
Eu acho que o que você está tentando fazer não pode ser feito. Posição absoluta significa que você dará coordenadas que deve honrar. E se o pai tiver um preenchimento de 5px. E você absolutamente posiciona a criança no topo: -5px; esquerda: -5px . Como é supor honrar os pais e você ao mesmo tempo?
Minha solução
Se você quer homenagear os pais, não o posicione absolutamente.
fonte
1.) você não pode usar borda grande no pai - caso deseje ter uma borda específica
2.) você não pode adicionar margem - caso seu pai faça parte de algum outro contêiner e deseje que seu pai aproveite ao máximo largura desse grande pai.
A única solução que deve ser aplicável é embrulhar seus filhos em outro recipiente para que seus pais se tornem avós e, em seguida, aplique estofamento no novo invólucro / pai das crianças. Ou você pode aplicar diretamente estofamento às crianças.
No seu caso:
fonte
Poderia ter feito facilmente usando um nível extra de Div.
Demonstração: https://jsfiddle.net/soxv3vr0/
fonte
adicionar preenchimento: herdar em sua posição absoluta
fonte