Gostaria de perguntar como a altura e a flutuação funcionam. Eu tenho uma div externa e uma div interna que tem conteúdo nela. Sua altura pode variar dependendo do conteúdo da div interna, mas parece que minha div interna transbordará da div externa. Qual seria a maneira correta de fazer isso?
<html>
<body>
<div style="margin:0 auto;width: 960px; min-height: 100px; background-color:orange">
<div style="width:500px; height:200px; background-color:black; float:right"></div>
</div>
</body>
</html>
Respostas:
Os elementos flutuantes não aumentam a altura do elemento do contêiner e, portanto, se você não os limpar, a altura do contêiner não aumentará ...
Eu vou te mostrar visualmente:
Mais explicações:
Você também pode adicionar
overflow: hidden;
elementos de contêiner, mas eu sugiro que você useclear: both;
.Além disso, se você quiser limpar um elemento automaticamente, poderá usar
Como funciona o CSS Float?
O que é float exatamente e o que ele faz?
A
float
propriedade é incompreendida pela maioria dos iniciantes. Bem, o que exatamente fazfloat
? Inicialmente, afloat
propriedade foi introduzida para fluir o texto em torno das imagens, que são flutuadasleft
ouright
. Aqui está outra explicação de @Madara Uchicha.Então, é errado usar a
float
propriedade para colocar caixas lado a lado? A resposta é não ; não há problema se você usar afloat
propriedade para definir caixas lado a lado.A flutuação de um elemento
Demoinline
oublock
level fará com que ele se comporte como uminline-block
elemento.Se você flutuar um elemento
left
ouright
, owidth
elemento será limitado ao conteúdo que ele contém, a menos quewidth
seja definido explicitamente ...Você não pode
float
um elementocenter
. Esse é o maior problema que eu sempre vi com iniciantes, usando, que não é um valor válido para afloat: center;
float
propriedade.float
geralmente é usado parafloat
/ mover o conteúdo para a esquerda ou para a direita . Existem apenas quatro valores válidos para afloat
propriedadeleft
, ou sejaright
,none
(padrão) einherit
.O elemento pai entra em colapso, quando ele contém elementos filhos flutuantes, para evitar isso, usamos a
clear: both;
propriedade para limpar os elementos flutuantes em ambos os lados, o que impedirá o colapso do elemento pai. Para mais informações, você pode consultar minha outra resposta aqui .(Importante) Pense nisso onde temos uma pilha de vários elementos. Quando usamos
float: left;
oufloat: right;
o elemento se move acima da pilha por um. Portanto, os elementos no fluxo normal de documentos se ocultam atrás dos elementos flutuantes porque estão no nível da pilha acima dos elementos flutuantes normais. (Por favor, não relacione issoz-index
como isso é completamente diferente.)Tomando um caso como exemplo para explicar como as flutuações CSS funcionam, supondo que precisamos de um layout simples de 2 colunas com cabeçalho, rodapé e 2 colunas, então aqui está a aparência do blueprint ...
No exemplo acima, nós estaremos flutuante apenas as caixas vermelhas, ou você pode
float
tanto àleft
, ou você podefloat
paraleft
, e outro pararight
assim, depende do layout, se é 3 colunas, você podefloat
2 colunas paraleft
onde outro umright
depende, embora neste exemplo, tenhamos um layout simplificado de 2 colunas, assim comofloat
umleft
e outroright
.Marcação e estilos para criar o layout explicados mais adiante ...
Vamos passo a passo com o layout e ver como o float funciona.
Primeiro de tudo, nós usamos o elemento envoltório principal, você pode simplesmente assumir que é a sua janela, então usamos
header
e atribuir umheight
de50px
modo nada extravagante lá. É apenas um elemento normal de nível de bloco não flutuante que ocupará100%
espaço horizontal, a menos que seja flutuado ou que atribuímosinline-block
a ele.O primeiro valor válido para
float
éleft
assim em nosso exemplo, usamosfloat: left;
for.floated_left
, então pretendemos flutuar um bloco noleft
elemento do nosso container.Coluna flutuada para a esquerda
E sim, se você vê, o elemento pai, que está
.wrapper
recolhido, o que você vê com uma borda verde não se expandiu, mas deveria estar certo? Voltaremos a isso em um tempo, por enquanto, temos uma coluna flutuada paraleft
.Chegando à segunda coluna, deixa esta
float
aqui para oright
Outra coluna flutuou para a direita
Aqui, temos uma
300px
coluna ampla na qual vamosfloat
pararight
, que fica ao lado da primeira coluna à medida que flutua para oleft
e, desde que flutuou para oleft
, ele criou uma calha vazia para oright
, e como havia um amplo espaço noright
, nossoright
o elemento flutuado estava perfeitamente ao lado doleft
outro.Ainda assim, o elemento pai está recolhido, bem, vamos corrigir isso agora. Existem várias maneiras de impedir que o elemento pai seja recolhido.
clear: both;
antes que o elemento pai termine, que contém elementos flutuantes. Agora, essa é uma solução barata paraclear
seus elementos flutuantes, que fará o trabalho por você, mas eu recomendo não usá-lo.Adicione,
<div style="clear: both;"></div>
antes do.wrapper
div
final, comoDemo
Bem, isso corrige muito bem, não há mais pai recolhido, mas adiciona marcação desnecessária ao DOM, sugerem alguns, para usar
overflow: hidden;
no elemento pai que contém elementos filhos flutuantes que funcionam como pretendido.Use
overflow: hidden;
em.wrapper
Demo
Isso nos poupa de um elemento toda vez que precisamos,
clear
float
mas ao testar vários casos com isso, ele falhou em um deles, que é usadobox-shadow
nos elementos filhos.Demo (Não é possível ver a sombra nos quatro lados,
overflow: hidden;
causa esse problema)E agora? Salve um elemento, não
overflow: hidden;
faça uma correção clara, use o trecho abaixo em seu CSS e, assim como você usaoverflow: hidden;
para o elemento pai, chame o elementoclass
abaixo no elemento pai para limpar automaticamente.Demo
Aqui, a sombra funciona como pretendido e também limpa automaticamente o elemento pai que impede o colapso.
E, finalmente, usamos o rodapé depois
clear
dos elementos flutuantes.Demo
Quando é
float: none;
usado de qualquer maneira, como é o padrão, então qualquer uso para declararfloat: none;
?Bem, depende, se você estiver buscando um design responsivo, usará esse valor várias vezes quando desejar que seus elementos flutuantes sejam renderizados um abaixo do outro em uma determinada resolução. Para essa
float: none;
propriedade desempenha um papel importante lá.Poucos exemplos reais de como
float
é útil.img
float insidep
que permitirá que nosso conteúdo flua.Demonstração (sem flutuação
img
)Demo 2 (
img
flutuou para oleft
)float
para criar o menu horizontal - DemoFlutue o segundo elemento também, ou use `margin`
Por último, mas não menos importante, quero explicar esse caso específico em que você
float
apenas um elemento para oleft
mas nãofloat
o outro, então o que acontece?Suponha que, se removermos
float: right;
do nosso.floated_right
class
, odiv
será processado do extremo,left
pois não é flutuado.Demo
Portanto, neste caso, seja possível
float
o para oleft
bemOU
Você pode usar o
margin-left
que será igual ao tamanho da coluna flutuante esquerda, ou seja,200px
larga .fonte
clear: both;
, mas tudo bem se você achar que a edição justifica, então vamos continuar assimVocê precisa adicionar
overflow:auto
ao seu div principal para que ele abranja o div flutuante interno:Exemplo de jsFiddle
fonte
Você está encontrando o erro de flutuação (embora eu não tenha certeza se é tecnicamente um erro devido a quantos navegadores exibem esse comportamento). Eis aqui o que está acontecendo:
Em circunstâncias normais, assumindo que nenhuma altura explícita foi definida, um elemento no nível do bloco, como uma div, definirá sua altura com base em seu conteúdo. A parte inferior da div principal se estenderá além do último elemento. Infelizmente, flutuar um elemento impede que o pai leve em consideração o elemento flutuante ao determinar sua altura. Isso significa que, se seu último elemento for flutuado, ele não "esticará" o pai da mesma maneira que um elemento normal faria.
Compensação
Existem duas maneiras comuns de corrigir isso. O primeiro é adicionar um elemento "clearing"; ou seja, outro elemento abaixo do flutuante que forçará o pai a se esticar. Portanto, adicione o seguinte html como o último filho:
Ele não deve estar visível e, usando clear: ambos, você garante que ele não fique ao lado do elemento flutuado, mas depois dele.
Transbordar:
O segundo método, que é preferido pela maioria das pessoas (eu acho), é alterar o CSS do elemento pai para que o estouro seja tudo menos "visível". Portanto, definir o estouro como "oculto" forçará o pai a esticar além da parte inferior do filho flutuante. Isso só é verdade se você não tiver definido uma altura no pai, é claro.
Como eu disse, o segundo método é preferido, pois não requer que você adicione elementos semanticamente sem sentido à sua marcação, mas há momentos em que você precisa
overflow
estar visível; nesse caso, adicionar um elemento de limpeza é mais do que aceitável .fonte
É por causa do flutuador da div. Adicione
overflow: hidden
o elemento externo.Demo
fonte
Você confunde como os navegadores renderizam os elementos quando existem elementos flutuantes. Se um elemento de bloco estiver flutuando (sua div interna no seu caso), outros elementos de bloco o ignorarão porque o navegador remove elementos flutuantes do fluxo normal da página da web. Então, como a div flutuante foi removida do fluxo normal, a div externa é preenchida, como se a div interna não estivesse lá. No entanto, os elementos embutidos (imagens, links, texto, citações em preto) respeitarão os limites do elemento flutuante. Se você introduzir texto na div externa, o texto será colocado ao redor da div interna.
Em outras palavras, os elementos do bloco (cabeçalhos, parágrafos, divs, etc) ignoram os elementos flutuantes e preenchem, e os elementos embutidos (imagens, links, texto, etc) respeitam os limites dos elementos flutuantes.
Um exemplo de violino aqui
fonte
Tente este
fonte
você pode usar a propriedade overflow na div do contêiner se não tiver nenhuma div para mostrar sobre o contêiner, por exemplo:
Aqui está o seguinte css:
-----------------------OU-------------------------- ----
Aqui está o seguinte css:
fonte