Vertical alignement de tous(!) les éléments de TD?
j'ai un simple table
avec 1 TD
avec vertical-align:middle;
. Ce TD
contient un Image
:
<table>
<tr>
<td>
<img src='http://static.jsbin.com/images/favicon.png'/>
</td>
</tr>
</table>
tout est Ok et le IMG
est aligné à la verticale.
mais si j'ajoute un autre élément après cette Image (un span
par exemple):
<td>
<img src='http://static.jsbin.com/images/favicon.png'/>
<span>aaa</span>
</td>
le résultat est :
Question
est-ce que L'alignement vertical du TD ne devrait pas aligner vertical tous ses enfants ?
Comment puis-je faire le span
pour être centré ainsi que ?
Full JSBIN
NB
Je ne veux pas ajouter un autre TD
, ni utiliser float
avec rembourrage/marge. IE8+.
edit:
résultat souhaité:
11 réponses
Question
L'alignement vertical du TD ne devrait-il pas aligner tous ses enfants ?
NON .
Quand vous appliquez vertical-align
à td
, il est seulement appliqué à td
, et est pas hérité par l'un de ses enfants.
si j'ai un TD avec seulement portée en elle - il s'alignera verticalement. Si J'avais un TD avec seulement IMG à l'intérieur - il s'alignerait aussi.
C'est à cause de la façon dont vertical-align
pour td
. La hauteur totale de la cellule I. e td
est calculé et la cellule entière est alignée verticalement.
S'il y a un seul img
, alors la hauteur de td
est la même que celle de img
, ainsi il semble que vertical-align
pour img
est aussi middle
. Mais en fait ,le td
est verticalement aligné au milieu avec le img
comme vertical-align : baseline
il en est de même lorsqu'il n'y a qu'un seul span
.
mais si j'ai les deux - ce n'est pas le cas. pourquoi ?
Parce que maintenant, le height
de td
est le combiné height
des deux img
+ span
. Donc, en fait, td
est aligné verticalement au milieu, mais pas img
et span
.
Comment faire pour que la portée soit aussi centrée ?
vous devez appliquer cette CSS:
td > * {
vertical-align : middle;
}
cela s'appliquera à tous les enfants.
cocher la Case JSFiddle pour une meilleure image.
Hope, ceci répond à votre question.
vous pouvez simplement utiliser vertical-align: middle;
pour votre portée
img
{
height:43px;width:43px;
display: inline;
vertical-align: middle;
}
span
{
vertical-align:middle;
display: inline;
}
Comme par commentaire
vous pouvez penser comme si td est donné vertical-align: middle;
alors il devrait aligner tout le contenu à l'intérieur de ce mais ayant une image et une portée dans laquelle le navigateur est de comprendre l'image est quoi? est-ce de l'inline ou inline-block, de sorte que vous devez définir display: inline ou inline-block; alors vous pouvez voir son fonctionnement seulement en appliquant la propriété display pour l'image. démo
Modifier
img tag: source: display inline vs inline-block
Ils "bloc" éléments qu'ils ont une largeur et une hauteur.
c'est vrai, ils sont tous les deux - ou plus précisément, ils sont des éléments" inline block". Cela signifie qu'ils coulent en ligne comme du texte, mais ont aussi une largeur et une hauteur comme des éléments de bloc.
Éléments Remplacés
un élément remplacé est tout élément dont l'apparence et les dimensions sont définies par une ressource externe. Exemples: images ( tags), plugins (tags), et éléments de forme (,, et tags). Tous les autres éléments les types peuvent être appelés éléments non remplacés.
les éléments remplacés peuvent avoir des dimensions intrinsèques-des valeurs de largeur et de hauteur qui sont définies par l'élément lui-même, plutôt que par son environnement dans le document. Par exemple, si un élément image a une largeur définie à auto, la largeur du fichier image lié sera utilisée. Les dimensions intrinsèques définissent également un rapport intrinsèque qui est utilisé pour déterminer les dimensions calculées de l'élément devrait une seule dimension être défini. Par exemple, si seulement la largeur est spécifiée pour un élément d'image-à, disons, 100px-et que l'image réelle est large de 200 pixels et haute de 100 pixels, la hauteur de l'élément sera réduite de la même quantité, à 50px.
les éléments remplacés peuvent aussi avoir des exigences de formatage visuel imposées par l'élément, hors du contrôle de CSS; par exemple, l'interface utilisateur commande rendue pour les éléments de formulaire.
dans un formatage en ligne contexte, vous pouvez aussi penser qu'un élément remplacé est un élément qui agit comme un seul grand caractère pour les besoins de l'emballage et de la mise en page. Une largeur et une hauteur peuvent être spécifiées pour les éléments inline remplacés, auquel cas la hauteur de la boîte de ligne dans laquelle l'élément est placé est rendue assez haute pour accommoder l'élément remplacé, y compris toutes les propriétés de boîte spécifiées.
Voici un JS fiddle solution
voici le css
table
{
border:solid 1px red;
width:300px;
}
td
{
height:100px;
vertical-align:middle;
width:100%;
border:solid 1px green;
}
img
{
display: inline;
height: 43px;
width: 43px;
position: relative !important;
float: left;
}
span
{
height: auto !important;
width: 80%;
float: right;
position: relative;
vertical-align: middle !important;
text-align: left;
}
Dans tous les cas, le vertical-align: middle;
sur le td
fait ce qu'on attend de lui. C'est-à-dire, aligner le td
au centre de cette rangée et le contenu entier du td
au milieu vertical (par défaut) en laissant des espaces égaux en haut et en bas.
voici ce que le W3 Spec dit à propos de
vertical-align: middle
:le centre de La cellule est aligné avec le centre des lignes qu'il enjambe.
calcul de la hauteur de la rangée:
la hauteur de la boîte d'un élément' table-row 'est calculée une fois que l'agent utilisateur dispose de toutes les cellules de la rangée: c'est le maximum de la' hauteur 'calculée de la rangée, la' hauteur ' calculée de chaque cellule de la rangée et la hauteur minimale (MIN) exigé par les cellules.
dans la norme CSS 2.1, la hauteur d'une boîte de cellules est la hauteur minimale requise par le contenu. La propriété "hauteur" de la cellule de la table peut influencer la hauteur de la rangée (voir ci-dessus), mais elle n'augmente pas la hauteur de la boîte de la cellule.
Les boîtes de cellulesqui sont plus petites que la hauteur de la rangée reçoivent un rembourrage supérieur ou inférieur.
en raison de ce qui précède, la hauteur de la tr
et le td
devient 100px mais la boîte de cellules ne prend que la hauteur requise par le contenu ( img
hauteur = 43px). Maintenant, puisque la boîte de cellules est plus petite que la hauteur de la rangée, le rembourrage supplémentaire est ajouté comme indiqué dans la boîte 5 de l'image ci-dessus et rend ainsi le contenu aussi obtenir aligné au milieu.
TD a seulement l'image:
Lorsqu'il n'y a qu'un img
, la hauteur du contenu est égale à la hauteur du img
. Il se positionne donc au milieu.
comme on peut le voir dans l'image ci-dessus, cela ne nécessite pas un vertical-align: middle
sur le img
explicitement parce que le td
aligne son contenu au milieu.
TD a seulement des données en ligne:
lorsque le td
n'a qu'un span
ou span
plus un inline div
, la hauteur du contenu est égale à la valeur par défaut line-height
pour le texte (ou toute autre valeur spécifiée line-height
). Dans ce cas aussi, le td
l'aligne correctement.
lorsque le contenu du texte dépasse la première ligne (référez-vous à la démo), vous pouvez voir que le td
pousse automatiquement le first-line
(marqué en cyan en arrière-plan) vers le haut pour s'assurer que le contenu dans son ensemble est aligné au milieu (pas seulement une seule ligne).
TD a une image et une portée:
lorsque nous mettons un img
et un span
(texte en ligne) dans le td
, la hauteur du contenu devient égale à la hauteur du img
plus le line-height
de la deuxième et des suivantes ligne.
dans cette situation, il y a deux cas possibles décrits ci-dessous:
Cas 1 - img
balise n'a pas de vertical-align
spécifié
dans ce cas, le img
est aligné sur le baseline
(par défaut). Puis le td
aligne tout le contenu au milieu. Cela signifie que les feuilles td
28.5 px (= (100-43)/2) écart en haut et en bas du contenu. Encore une fois, le vertical-align
sur td
fait le travail, il met le contenu dans le milieu (c'est-à-dire, laisser l'écart égal sur le haut et le bas). Mais le texte est repoussé parce que la hauteur img
est plus.
si nous réduisons la hauteur img
à moins que la hauteur de la ligne (disons 10px), nous pouvons voir que même avec img
+ span
il est aligné au milieu.
Cas 2 - img
tag a vertical-align: middle
Dans ce cas également vertical-align
sur le td
fait la même chose que ce qu'il a fait pour le Cas 1. Toutefois, le texte dans ce cas est près du milieu parce que le img
est également aligné sur le middle
de la ligne.
table {
border: solid 1px red;
}
td {
height: 100px;
width: 200px;
vertical-align: middle;
border: solid 1px green;
}
img {
height: 43px;
width: 43px;
border: solid 1px green;
}
.one td + td img {
vertical-align: middle;
}
.three td + td img {
height: 10px;
width: 10px;
}
.four img {
vertical-align: middle;
}
.five img + img{
height: 50px;
width: 50px;
}
td:first-line {
background-color: cyan;
}
div {
display: inline;
}
<table>
<tr class='one'>
<td>
<img src='http://static.jsbin.com/images/favicon.png' />
</td>
<td>
<img src='http://static.jsbin.com/images/favicon.png' />
</td>
</tr>
<tr class='two'>
<td>
<div>aaa</div>
<span>aaa</span>
</td>
<td>
<div>aaa</div>
<span>aaa aaaaaaa aaaaaaaa aaaaaaaa</span>
</td>
</tr>
<tr class='three'>
<td>
Case 1
<img src='http://static.jsbin.com/images/favicon.png' />
<span>Image + Span</span>
</td>
<td>
Case 1
<img src='http://static.jsbin.com/images/favicon.png' />
<span>Image + Span</span>
</td>
</tr>
<tr class='four'>
<td>
Case 2
<img src='http://static.jsbin.com/images/favicon.png' />
<span>Image + Span</span>
</td>
<td>
<img src='http://static.jsbin.com/images/favicon.png' />
<span>Image + Span + more text.......</span>
</td>
</tr>
<tr class='five'>
<td>
Case 3
<img src='http://static.jsbin.com/images/favicon.png' />
<img src='http://static.jsbin.com/images/favicon.png' />
<span>Image + Span text...</span>
</td>
<td>
<img src='http://static.jsbin.com/images/favicon.png' />
<span>Image + Span + more text.......</span>
</td>
</tr>
</table>
<style>
table
{
border:solid 1px red;
width:300px;
}
td
{
height:100px;
width:100%;
border:solid 1px green;
vertical-align:middle;
line-height:100px;
}
img
{
height:43px;width:43px;
vertical-align:middle;
}
</style>
C'est ça? http://jsfiddle.net/JFVNq /
la raison est que les travées sont traitées comme en ligne, donc vous devez les bloquer.
CSS pour la durée:
td.vert span
{
vertical-align: middle;
display: block;
}
il suffit d'ajouter cette classe:
td *{
vertical-align:middle
}
Edit:
la question est pourquoi lorsque vous ajoutez un pic au texte td
va bas de pic et pas plus milieu de td.
c'est ma réponse:
quand vous mettez td
vertical-align
à middle
il ne devrait pas mettre tout le contenu vertical-align
à middle
, ils sont toujours baseline
. et quand vous ajoutez un pic au texte, la hauteur de la ligne monte à la hauteur de l'image et le texte est bas de cette hauteur, donc vous devez mettre vertical-align
à middle
pour corriger ce problème.
ici vous pouvez voir ce que j'ai dit: Démo
et désolé pour mon mauvais anglais
je pense que nous sommes tout près de là, mais
td img,
td span {
display:inline-block;
vertical-align:middle;
}
semble fonctionner.
ou est-ce que je rate quelque chose?
cet attribut CSS ne va sur aucun autre type d'éléments . Lorsque le développeur novice applique vertical-align aux éléments de bloc normaux (comme une norme), la plupart des navigateurs fixent la valeur à hériter à tous les enfants inline de cet élément.
il suffit d'ajouter vertical-align: middle
à la classe <img>
.
votre CSS devrait ressembler à ça...
table
{
border:solid 1px red;
width:300px;
}
td
{
height:100px;
vertical-align:middle;
width:100%;
border:solid 1px green;
}
img
{
height:43px;width:43px;
vertical-align: middle;
}
vous pouvez voir le Violon D'Échantillon ...
il suffit de déplacer votre vertical-align: middle de la portée à l'image.
L'image s'aligner sur le texte; marche mieux que l'inverse ;)
img
{
height:43px;width:43px;
vertical-align:middle;
}