Tenho um bloco que consiste em uma imagem com texto em volta dela:
* * * T T T
* * * T T T
* * * T T T
T T T T T T
H H H
Onde *
representa a imagem, T
representa o texto e H
é um cabeçalho que segue o bloco de texto/imagem.
Preciso de regras CSS que satisfaçam ambas as condições:
- O texto deve flutuar ao redor da imagem, enquanto a imagem em si tem preenchimento direito e inferior para evitar que o texto fique grudado nela.
- O bloco de texto/imagem não deve ter margem inferior ou preenchimento extra, ou pelo menos ter um que possa ser recolhido, para que o espaçamento entre H e o bloco de texto/imagem seja controlado somente pela margem superior de H.
- Isso funciona bem quando há texto suficiente para exceder a altura da imagem. No entanto, não consigo resolver o problema quando não há texto suficiente:
* * * T T T
* * * T T T
* * * T T T
* * *
* * *
H H H
Nesse caso, a margem da imagem não é recolhida e, em vez disso, é adicionada à margem superior de H, o que cria espaço extra indesejado.
Como posso alcançar o comportamento desejado?
Aqui está um exemplo que demonstra o problema:
.container {
max-width: 600px;
margin-bottom: 30px;
font-family: Arial, sans-serif;
line-height: 1.6;
display: block;
}
.float-image {
float: left;
margin-right: 15px;
margin-bottom: 15px;
width: 150px;
height: auto;
}
.container::after {
content: "";
display: block;
clear: both;
}
.header {
margin-top: 30px;
}
<div class="container">
<img src="https://dummyimage.com/150x150/c6ff83/000000" alt="Example Image" class="float-image">
<p>
This is an example of an image floated to the left with text wrapping around it.
</p>
</div>
<h3 class="header">Header</h3>
Já que você está usando um pseudoelemento para limpar o float, você pode usá-lo para adicionar uma margem negativa. Você também tem que adicionar a mesma margem ao
p
(ou qualquer último elemento no contêiner)Alterar a margem do contêiner de
margin-bottom: 30px
paramargin-bottom: -15px
pode ajudar a fazer isso.A margin-bottom da imagem e a margin-bottom do
p
, garantem que sempre haja espaçamento de 15px na parte inferior do contêiner, não importa em qual dos dois cenários estejamos. A margin-bottom do parágrafo (1em
,16px
com tamanho de fonte padrão) vem da folha de estilo do agente do usuário. Para não ter que depender disso, ou para ter uma margin-bottom apropriada para casos em que o conteúdo pode ser algo diferente de parágrafos, você pode aplicarmargin-bottom: 15px
a qualquer que seja o último filho do contêiner.Esse espaçamento no fundo do recipiente é então compensado pelo
margin-bottom: -15px
próprio recipiente.Removi as margens e o preenchimento padrão de todos os elementos e também removi a margem inferior do contêiner.
Como a imagem já tem margens de buffer, acho que deve funcionar.