Pourquoi ne vertical-align: middle
marche pas ? Et pourtant, vertical-align: top
ça marche.
span{
vertical-align: middle;
}
<div>
<img src="http://lorempixel.com/30/30/" alt="small img" />
<span>Doesn't work.</span>
</div>
Pourquoi ne vertical-align: middle
marche pas ? Et pourtant, vertical-align: top
ça marche.
span{
vertical-align: middle;
}
<div>
<img src="http://lorempixel.com/30/30/" alt="small img" />
<span>Doesn't work.</span>
</div>
Réponses:
En fait, dans ce cas, c'est assez simple: appliquez l'alignement vertical à l'image. Comme tout est sur une seule ligne, c'est vraiment l'image que vous souhaitez aligner, pas le texte.
<!-- moved "vertical-align:middle" style from span to img -->
<div>
<img style="vertical-align:middle" src="https://placehold.it/60x60">
<span style="">Works.</span>
</div>
Testé en FF3.
Vous pouvez maintenant utiliser flexbox pour ce type de mise en page.
.box {
display: flex;
align-items:center;
}
<div class="box">
<img src="https://placehold.it/60x60">
<span style="">Works.</span>
</div>
span
taille de la police. Voir ma réponse .
width:16px;height:16px
), vous pouvez voir que l'image sera trop basse ...
Voici quelques techniques simples d'alignement vertical:
Celui-ci est simple: définissez la hauteur de ligne de l'élément de texte sur celle du conteneur
<div>
<img style="width:30px; height:30px;">
<span style="line-height:30px;">Doesn't work.</span>
</div>
Positionner absolument une div intérieure par rapport à son conteneur
<div style="position:relative;width:30px;height:60px;">
<div style="position:absolute;bottom:0">This is positioned on the bottom</div>
</div>
<div style="display:table;width:30px;height:60px;">
<div style="display:table-cell;height:30px;">This is positioned in the middle</div>
</div>
Pour que cela fonctionne correctement dans tous les domaines, vous devrez pirater un peu le CSS. Heureusement, il existe un bug IE qui fonctionne en notre faveur. En plaçant top:50%
sur le récipient et top:-50%
sur la div intérieure, vous pouvez obtenir le même résultat. Nous pouvons combiner les deux en utilisant une autre fonctionnalité qu'IE ne prend pas en charge: les sélecteurs CSS avancés.
<style type="text/css">
#container {
width: 30px;
height: 60px;
position: relative;
}
#wrapper > #container {
display: table;
position: static;
}
#container div {
position: absolute;
top: 50%;
}
#container div div {
position: relative;
top: -50%;
}
#container > div {
display: table-cell;
vertical-align: middle;
position: static;
}
</style>
<div id="wrapper">
<div id="container">
<div><div><p>Works in everything!</p></div></div>
</div>
</div>
Cette solution nécessite un navigateur légèrement plus moderne que les autres solutions, car elle utilise la transform: translateY
propriété. ( http://caniuse.com/#feat=transforms2d )
L'application des 3 lignes CSS suivantes à un élément le centrera verticalement dans son parent, quelle que soit la hauteur de l'élément parent:
position: relative;
top: 50%;
transform: translateY(-50%);
display:table
et display:table-cell
CSS fonctionnent très bien, sauf, bien sûr, dans IE7 et ci-dessous. Après m'être arraché les cheveux pendant plusieurs heures, j'ai décidé que je n'avais pas vraiment besoin de m'occuper de quelqu'un qui utilisait encore IE7-.
display:table
a quelques limitations dans divers navigateurs (dans IE11 max-height
ne fonctionne pas si l'élément est à l'intérieur d'une cellule de tableau), donc dans certains cas extrêmes , ce n'est pas une bonne idée de s'aligner verticalement en utilisant des cellules de tableau.
Changez votre div
en un conteneur flexible:
div { display:flex; }
Il existe maintenant deux méthodes pour centrer les alignements pour tout le contenu:
Méthode 1:
div { align-items:center; }
Méthode 2:
div * { margin-top:auto; margin-bottom:auto; }
Essayez différentes valeurs de largeur et de hauteur sur le img
et différentes valeurs de taille de police sur le span
et vous verrez qu'elles restent toujours au milieu du conteneur.
justify-content: center;
et pour l'espacement (sans utiliser de balises <br/>), vous pouvez également ajouter un padding: 1em;
. Grande mise à jour pour nous, développeurs de navigateurs modernes.
Vous devez appliquer vertical-align: middle
aux deux éléments pour qu'il soit parfaitement centré.
<div>
<img style="vertical-align:middle" src="http://lorempixel.com/60/60/">
<span style="vertical-align:middle">Perfectly centered</span>
</div>
La réponse acceptée centre l'icône autour de la moitié de la hauteur x du texte à côté (comme défini dans les spécifications CSS ). Ce qui pourrait être assez bon mais peut sembler un peu différent, si le texte a des ascendants ou des descendants se détachant juste en haut ou en bas:
À gauche, le texte n'est pas aligné, à droite, comme indiqué ci-dessus. Une démonstration en direct peut être trouvée dans cet article sur l'alignement vertical .
Quelqu'un a-t-il expliqué pourquoi vertical-align: top
fonctionnait dans le scénario? L'image dans la question est probablement plus haute que le texte et définit ainsi le bord supérieur de la zone de ligne. vertical-align: top
sur l'élément span puis le positionne simplement en haut de la zone de ligne.
La principale différence de comportement entre vertical-align: middle
et top
est que le premier déplace les éléments par rapport à la ligne de base de la boîte (qui est placée là où cela est nécessaire pour remplir tous les alignements verticaux et se sent donc plutôt imprévisible ) et la seconde par rapport aux limites extérieures de la boîte de ligne (qui est plus tangible).
La technique utilisée dans la réponse acceptée ne fonctionne que pour le texte à ligne simple ( démo ), mais pas le texte à plusieurs lignes ( démo ) - comme indiqué ici.
Si quelqu'un a besoin de centrer verticalement du texte à plusieurs lignes sur une image, voici quelques façons (méthodes 1 et 2 inspirées de cet article CSS-Tricks )
CSS:
div {
display: table;
}
span {
vertical-align: middle;
display: table-cell;
}
CSS:
div {
height: 200px; /* height of image */
}
div:before {
content: '';
display: inline-block;
height: 100%;
vertical-align: middle;
margin-right: -0.25em; /* Adjusts for spacing */
}
img {
position: absolute;
}
span {
display: inline-block;
vertical-align: middle;
margin-left: 200px; /* width of image */
}
CSS (le violon ci-dessus contient des préfixes de fournisseurs):
div {
display: flex;
align-items: center;
}
img {
min-width: 200px; /* width of image */
}
Ce code fonctionne aussi bien dans IE que dans FF:
<div>
<img style="width:auto; height:auto;vertical-align: middle;">
<span>It does work on all browsers</span>
</div>
Pour mémoire, les "commandes" d'alignement ne devraient pas fonctionner sur un SPAN, car il s'agit d'une balise en ligne , pas d'une balise de niveau bloc . Des choses comme l'alignement, la marge, le remplissage, etc. ne fonctionneront pas sur une balise en ligne, car le point d'inline n'est pas de perturber le flux de texte.
CSS divise les balises HTML en deux groupes: en ligne et au niveau du bloc. Recherchez "css block vs inline" et un excellent article apparaît ...
http://www.webdesignfromscratch.com/html-css/css-block-and-inline/
(Comprendre les principes CSS de base est la clé pour qu'il ne soit pas si ennuyeux)
text-align
et vertical-align
(à l'exception de son application sur des td
éléments à des fins patrimoniales) sont spécifiquement destinés à inline
et inline-block
éléments ( span
, img
, etc.).
Utilisez line-height:30px
pour la portée de sorte que le texte soit aligné avec l'image:
<div>
<img style="width:30px; height:30px;">
<span style="line-height:30px;">Doesn't work.</span>
</div>
Une autre chose que vous pouvez faire est de définir le texte line-height
à la taille des images dans le <div>
. Réglez ensuite les images survertical-align: middle;
C'est vraiment le moyen le plus simple.
Je n'ai pas encore trouvé de solution margin
dans aucune de ces réponses, alors voici ma solution à ce problème.
Cette solution ne fonctionne que si vous connaissez la largeur de votre image.
<div>
<img src="https://placehold.it/80x80">
<span>This is my very long text what should align. This is my very long text what should align.</span>
</div>
div {
overflow:hidden;
}
img {
width:80px
margin-right:20px;
display:inline-block;
vertical-align:middle;
}
span {
width:100%;
margin-right:-100px;
padding-right:100px;
display:inline-block;
vertical-align:middle;
box-sizing:border-box;
-moz-box-sizing:border-box;
-webkit-box-sizing:border-box;
}
background:url(../images/red_bullet.jpg) left 3px no-repeat;
J'utilise généralement 3px à la place de top
. En augmentant / diminuant cette valeur, l'image peut être modifiée à la hauteur requise.
Vous pouvez définir l'image comme inline element
utilisant la display
propriété
<div>
<img style="vertical-align: middle; display: inline;" src="https://placehold.it/60x60">
<span style="vertical-align: middle; display: inline;">Works.</span>
</div>
Solution multiligne:
<div style="display:table;width:30px;height:160px;">
<img style="display:table-cell;width:30px;height:60px;padding:50px" src='...' />
<div style="display:table-cell;height:30px;vertical-align:middle">
Multiline text centered vertically
</div>
</div>
<!-- note: img (height + 2x padding) must be equal to root div height -->
Fonctionne dans tous les browers et ie9 +
Cela peut être déroutant, je suis d'accord. Essayez d'utiliser les fonctions de table. J'utilise cette astuce CSS simple pour positionner les modaux au centre de la page Web. Il prend en charge un grand navigateur:
<div class="table">
<div class="cell">
<img src="..." alt="..." />
<span>It works now</span>
</div>
</div>
et partie CSS:
.table { display: table; }
.cell { display: table-cell; vertical-align: middle; }
Notez que vous devez styliser et ajuster la taille du conteneur d'image et de table pour le faire fonctionner comme vous le souhaitez. Prendre plaisir.
Tout d' abord CSS en ligne n'est pas recommandé du tout, il gâche vraiment votre code HTML.
Pour aligner l'image et la portée, vous pouvez simplement le faire vertical-align:middle
.
.align-middle {
vertical-align: middle;
}
<div>
<img class="align-middle" src="https://i.stack.imgur.com/ymxaR.png">
<span class="align-middle">I'm in the middle of the image! thanks to CSS! hooray!</span>
</div>
Je ne sais pas pourquoi il ne s'affiche pas sur le navigateur de votre navigation, mais j'utilise normalement un extrait comme celui-ci lorsque j'essaie d'afficher un en-tête avec une image et un texte centré, j'espère que cela aide!
https://output.jsbin.com/jeqorahupo
<hgroup style="display:block; text-align:center; vertical-align:middle; margin:inherit auto; padding:inherit auto; max-height:inherit">
<header style="background:url('http://lorempixel.com/30/30/') center center no-repeat; background-size:auto; display:inner-block; vertical-align:middle; position:relative; position:absolute; top:inherit; left:inherit; display: -webkit-box; display: -webkit-flex;display: -moz-box;display: -ms-flexbox;display: flex;-webkit-flex-align: center;-ms-flex-align: center;-webkit-align-items: center;align-items: center;">
<image src="http://lorempixel.com/60/60/" title="Img title" style="opacity:0.35"></img>
http://lipsum.org</header>
</hgroup>
<!DOCTYPE html>
<html>
<head>
<style>
.block-system-branding-block {
flex: 0 1 40%;
}
@media screen and (min-width: 48em) {
.block-system-branding-block {
flex: 0 1 420px;
margin: 2.5rem 0;
text-align: left;
}
}
.flex-containerrow {
display: flex;
}
.flex-containerrow > div {
justify-content: center;
align-items: center;
}
.flex-containercolumn {
display: flex;
flex-direction: column;
}
.flex-containercolumn > div {
width: 300px;
margin: 10px;
text-align: left;
line-height: 20px;
font-size: 16px;
}
.flex-containercolumn > site-slogan {font-size: 12px;}
.flex-containercolumn > div > span{ font-size: 12px;}
</style>
</head>
<body>
<div id="block-umami-branding" class="block-system block-
system-branding-block">
<div class="flex-containerrow">
<div>
<a href="/" rel="home" class="site-logo">
<img src="https://placehold.it/120x120" alt="Home">
</a>
</div><div class="flex-containerrow"><div class="flex-containercolumn">
<div class="site-name ">
<a href="/" title="Home" rel="home">This is my sitename</a>
</div>
<div class="site-slogan "><span>Department of Test | Ministry of Test |
TGoII</span></div>
</div></div>
</div>
</div>
</body>
</html>
Vous voulez probablement ceci:
<div>
<img style="width:30px; height:30px;">
<span style="vertical-align:50%; line-height:30px;">Didn't work.</span>
</div>
Comme d'autres l'ont suggéré, essayez vertical-align
l'image:
<div>
<img style="width:30px; height:30px; vertical-align:middle;">
<span>Didn't work.</span>
</div>
CSS n'est pas ennuyeux. Vous ne lisez simplement pas la documentation . ; P
vertical-align