Exigences
Cela semble difficile à décrire. La boîte rose dans la démo est le look que je veux. La boîte verte est déjà bonne, mais je ne sais pas comment faire avec plusieurs éléments enfants.
Je pense que la solution peut être une combinaison des éléments suivants, mais je ne peux pas le faire.
align-items: center;
flex-direction: column;
body {
margin: 1em .5em;
}
article {
display: flex;
align-items: center;
flex-wrap: wrap;
}
section {
height: 18em;
background: #ccc;
margin: 0 .5em;
position: relative;
display: flex;
align-items: center;
}
section:after {
font-size: smaller;
color: blue;
position: absolute;
bottom: 0;
}
section.big {
width: 20%;
height: 5em;
}
section.small {
width: 10%;
flex: 1;
}
section div {
outline: 1px dotted green;
}
section.want {
background-color: pink;
}
section.want:after {
content: "1) want to do like this: vertically middle, horizontally left, while section will contain one or several child elements";
}
section.only1 {
background-color: lightgreen;
}
section.only1:after {
content: "2) all good except one point:the number of child element must be one.";
}
section.row:after {
content: "3) by default flex-diraction is row";
}
section.col {
flex-direction: column;
}
section.col:after {
content: "4) this can vertically stack multiple stacks, but they no longer horizontally left-align";
}
section.col.justify {
justify-content: center;
align-items: flex-start;
background-color: lightblue;
}
section.col.justify:after {
content: "6) this is good! Solved.";
}
section.colmar {
flex-direction: column;
}
section.colmar:after {
content: "5) this can vertically stack multiple stacks, and left-align divs, but divs are not vertically center";
}
section.colmar div {
margin-right: auto;
}
<article>
<section class="small want">
line1
<br/>line2
</section>
<section class="small only1">
<div>only 1 div</div>
</section>
<section class="small row">
<div>div1</div>
<div>div2</div>
</section>
<section class="small col">
<div>div1</div>
<div>div2</div>
</section>
<section class="small colmar">
<div>div1</div>
<div>div2</div>
</section>
<section class="small col justify">
<div>div1</div>
<div>div2</div>
</section>
</article>
justify-content
aligne les éléments flexibles le long de l'axe principal.
align-items
aligne les éléments flexibles le long de l'axe transversal, qui est toujours perpendiculaire à l'axe principal.
En fonction de la flex-direction
, l'axe principal peut être horizontal ou vertical.
Puisque flex-direction:column
signifie que l'axe principal est vertical, vous devez utiliser justify-content
ne pas align-items
pour centrer les éléments flexibles.
Voici un exemple:
#container {
display: flex;
flex-direction: column;
justify-content: center;
height: 200px;
background-color: lightpink;
}
<div id="container">
<div class="box">div 1</div>
<div class="box">div 2</div>
<div class="box">div 3</div>
<div class="box">div 4</div>
<div class="box">div 5</div>
</div>
En savoir plus sur l'alignement flexible le long de l'axe principal ici:
En savoir plus sur l'alignement flexible le long de axe transversal ici: