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>

enter image description here

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 :

enter image description here

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é:

enter image description here

40
demandé sur Royi Namir 2013-09-22 10:39:14

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.

55
répondu Nikhil Patel 2013-09-24 10:43:03

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;

}

votre jsbin


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.

vérifiez aussi:

É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.

7
répondu Bhojendra Rauniyar 2017-05-23 12:17:45

Voici un JS fiddle solution

violon

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;
}
3
répondu Anobik 2013-09-26 04:54:07

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.

enter image description here

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 cellules

qui 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.

enter image description here

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.

enter image description here

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.

enter image description here

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.

enter image description here

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>
3
répondu Harry 2015-07-13 09:03:12

il suffit d'ajouter vertical-align:middle; à votre style img?

Démo

2
répondu Jazcash 2013-09-24 07:48:33
<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>
1
répondu Ankit Agrawal 2013-09-24 19:03:57

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;
}
0
répondu andrewb 2013-09-22 06:43:55

DÉMO

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

0
répondu Mohsen Safari 2013-09-24 09:10:06

je pense que nous sommes tout près de là, mais

td img,
td span {
display:inline-block;
vertical-align:middle;
}

semble fonctionner.

Exemple De Code

ou est-ce que je rate quelque chose?

0
répondu Paulie_D 2013-09-24 11:24:51

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 ...

0
répondu webfrogs 2013-09-24 13:46:34

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;
}

http://jsfiddle.net/ZnpNF/1 /

-1
répondu hvgeertruy 2013-09-24 11:03:31