J'ai une div externe (horizontalement) centrée contenant deux éléments de largeur inconnue:
<div style='width:800px; margin:0 auto'>
<div style='float:left'>...</div>
<div style='float:right'>...</div>
</div>
Les deux flotteurs sont alignés en haut par défaut, et ont des hauteurs différentes/inconnues et différentes. Est-il possible de les centrer verticalement?
J'ai finalement fait la div externe
display: table
et les divs intérieurs
display: table-cell;
vertical-align: middle;
text-align: left/right;
mais je suis juste curieux de savoir s'il existe un moyen de faire cela avec les flotteurs.
Vous ne pouvez pas le faire directement, car floats sont alignés en haut:
S'il existe une boîte de ligne, le haut extérieur de la boîte flottante est aligné sur le haut de la boîte de ligne actuelle.
Le exact règles dites (emphase mienne):
- Une boîte flottante extérieur supérieur ne peut pas être plus haute que le sommet de son bloc contenant le bloc .
- Le extérieur supérieur d'une boîte flottante ne peut pas être plus haut que le haut extérieur de tout bloc ou flotté boîte générée par un élément plus tôt dans le document source.
- Le extérieur supérieur de la boîte flottante d'un élément ne peut pas être plus haut que le haut de la line-box contenant une boîte générée par un élément antérieur au document source .
- Une boîte flottante doit être placée aussi haut que possible.
Cela dit, vous pouvez profiter de la règle n ° 4:
display: inline-block
.vertical-align
pour aligner ces enveloppes verticalement.Sachez qu’il peut y avoir un espace entre les enveloppes de bloc en ligne. Voir Comment supprimer l'espace entre les éléments du bloc inline? pour le corriger.
.float-left {
float: left;
}
.float-right {
float: right;
}
#main {
border: 1px solid blue;
margin: 0 auto;
width: 500px;
}
/* Float wrappers */
#main > div {
display: inline-block;
vertical-align: middle;
width: 50%;
}
<div id="main">
<div>
<div class="float-left">
<p>AAA</p>
</div>
</div>
<div>
<div class="float-right">
<p>BBB</p>
<p>BBB</p>
</div>
</div>
</div>
Une autre approche serait d'utiliser flex
- cela pourrait remplacer un float
si vous avez deux parties. L'un (flottant) serait de taille automatique, et le second deviendrait occuper tout le conteneur. Sur l'axe transversal, sélectionnez center
et le tour est joué, vous obtenez l'effet des éléments float et centré.
Voici une belle feuille de notes sur flex: http://jonibologna.com/flexbox-cheatsheet/
Nope c'est quand les cellules de table semblent soudainement être une bonne idée. Si c'est une hauteur fixe, vous pouvez utiliser line-height.