Pourquoi dans le code suivant la hauteur de la div
est supérieure à la hauteur de la img
? Il y a un espace sous l'image, mais il ne semble pas y avoir de marge/remplissage.
Quel est l'espace ou l'espace supplémentaire sous l'image?
#wrapper {
border: 1px solid red;
width:200px;
}
img {
width:200px;
}
<div id="wrapper">
<img src="http://i.imgur.com/RECDV24.jpg" />
</div>
Par défaut, une image est rendue en ligne, comme une lettre.
Il est assis sur la même ligne que les sièges a, b, c et d.
Il y a un espace en dessous de cette ligne pour les descendeurs que vous trouvez sur des lettres telles que f, j, p et q.
Vous pouvez ajuster le vertical-align
de l'image pour la positionner ailleurs (par exemple, le middle
) ou modifier le display
afin qu'il ne soit pas en ligne.
Une autre option suggérée ici définit le style de l'image comme style="display: block;"
Pour supprimer l’espace sous l’image , vous pouvez:
vertical-align: bottom;
vertical-align: top;
ou vertical-align: middle;
display:block;
Voir le code suivant pour une démonstration en direct:
#vAlign img {
vertical-align :bottom;
}
#block img{
display:block;
}
div {border: 1px solid red;width:100px;}
img {width:100px;}
<p>No fix:</p>
<div><img src="http://i.imgur.com/RECDV24.jpg" /></div>
<p>With vertical-align:bottom; on image:</p>
<div id="vAlign"><img src="http://i.imgur.com/RECDV24.jpg" /></div>
<p>With display:block; on image:</p>
<div id="block"><img src="http://i.imgur.com/RECDV24.jpg" /></div>
L'espace ou l'espace supplémentaire sous l'image n'est pas un bug ou un problème, c'est le comportement par défaut. La cause première est que les images sont des éléments remplacés (see MDN et W3C). Cela leur permet de "se comporter comme une image" et d’avoir leurs propres dimensions intrinsèques, leur rapport de format, etc.
Les navigateurs calculent leur propriété d’affichage sur inline
mais leur attribuent un comportement spécial qui les rapproche des éléments inline-block
(vous pouvez les aligner verticalement en leur donnant une hauteur supérieure/inférieure). marge et rembourrage, transforme ...).
Cela signifie également que:
[...] lorsque les images sont utilisées dans un contexte de formatage en ligne avec vertical-align: baseline, , le bas de l'image sera posé sur la ligne de base du conteneur . (source: MDN , c'est moi qui souligne)
Comme les navigateurs calculent par défaut la propriété vertical-align sur baseline, il s'agit du comportement par défaut. L'image suivante montre l'emplacement de la référence sur du texte:
Les éléments alignés sur la ligne de base doivent conserver un espace pour les descendeurs qui s'étendent en dessous de la ligne de base (comme j, p, g ...
), comme vous pouvez le voir dans l'image ci-dessus. Dans cette configuration, le bas de l'image est aligné sur la ligne de base comme vous pouvez le voir dans cet exemple:
div{border:1px solid red;}
img{width:100px;height:auto;}
<div>
<img src="http://i.imgur.com/RECDV24.jpg" />jpq are letters with descender
</div>
C'est pourquoi le comportement par défaut de la balise <img>
crée un espace au bas de son conteneur et pourquoi la modification de la propriété vertical-align ou de la propriété display le supprime comme dans la démo suivante:
div {width: 100px;border: 1px solid red;}
img {width: 100px;height: auto;}
.block img{
display:block;
}
.bottom img{
vertical-align:bottom;
}
<p>Default:</p>
<div>
<img src="http://i.imgur.com/RECDV24.jpg" />
</div>
<p>With display:block;</p>
<div class="block">
<img src="http://i.imgur.com/RECDV24.jpg" />
</div>
<p>With vertical-align:bottom;</p>
<div class="bottom">
<img src="http://i.imgur.com/RECDV24.jpg" />
</div>
On peut également annuler la hauteur de ligne du parent:
#wrapper {
line-height: 0;
}
Tous les correctifs: http://jsfiddle.net/FaPFv/
Tout ce que vous avez à faire est d’affecter cette propriété:
img {
display: block;
}
Les images par défaut ont cette propriété:
img {
display: inline;
}
Vous pouvez utiliser plusieurs méthodes pour ce problème, comme
Utiliser line-height
#wrapper { line-height: 0px; }
Utiliser display: flex
#wrapper { display: flex; }
#wrapper { display: inline-flex; }
Utilisation de display:
block
, table
, flex
et inherit
#wrapper img { display: block; }
#wrapper img { display: table; }
#wrapper img { display: flex; }
#wrapper img { display: inherit; }
J'ai utilisé line-height:0
et cela fonctionne bien pour moi.
J'ai trouvé que cela fonctionnait très bien avec display: block; sur l'image et vertical-align: top; sur le texte.
.imagebox {
width:200px;
float:left;
height:88px;
position:relative;
background-color: #999;
}
.container {
width:600px;
height:176px;
background-color: #666;
position:relative;
overflow:hidden;
}
.text {
color: #000;
font-size: 11px;
font-family: robotomeduim, sans-serif;
vertical-align:top;
}
.imagebox img{ display:block;}
<div class="container">
<div class="imagebox">
<img src="http://machdiamonds.com/n69xvs.jpg" /> <span class="text">Image title</span>
</div>
<div class="imagebox">
<img src="http://machdiamonds.com/n69xvs.jpg" /> <span class="text">Image title</span>
</div>
<div class="imagebox">
<img src="http://machdiamonds.com/n69xvs.jpg" /> <span class="text">Image title</span>
</div>
<div class="imagebox">
<img src="http://machdiamonds.com/n69xvs.jpg" /> <span class="text">Image title</span>
</div>
<div class="imagebox">
<img src="http://machdiamonds.com/n69xvs.jpg" /> <span class="text">Image title</span>
</div>
<div class="imagebox">
<img src="http://machdiamonds.com/n69xvs.jpg" /> <span class="text">Image title</span>
</div>
</div>
ou vous pouvez éditer le code a JS FIDDLE