问题
Currently my "flex" items look like this (vertically aligned: top)...
_____________________________________
1
_____________________________________
2
_____________________________________
3
_____________________________________
4
_____________________________________
My Goal is to make them look like this (vertically aligned: middle)...
_____________________________________
1
_____________________________________
2
_____________________________________
3
_____________________________________
4
_____________________________________
My requirements:
- The flex container must stay at 100% in height
- The flex items must stay 25% in height (equaling 100%, which is its default anyway).
- The flex items must be vertically centered.
- This must be responsive and be smart enough to stay in the middle per device (so no line-height/padding)
http://jsfiddle.net/oneeezy/p4XtA/
HTML
<!-- Flex Box -->
<section>
<!-- Flex Items -->
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
</section>
CSS
/* Flex Box */
section { padding: 1em; background: black; display: flex; flex-flow: column; height: 100%; justify-content: space-around; }
/* Flex Items */
div { border-top: 1px solid #ccc; background: #f2f2f2; height: 25%; }
div:first-child { border-top: 1px solid transparent; }
div:hover { background: white; }
回答1:
Perhaps I'm misunderstanding, but can't you just do:
HTML (Slim)
.container
.item 1
.item 2
.item 3
.item 4
CSS
.container {
display:flex;
flex-direction: column;
height: 100vh;
}
.item {
flex-grow: 1;
display:flex;
align-items:center;
border-bottom:2px solid #e8e288;
}
Here's a Codepen
回答2:
To vertical align content of flexbox child, you will need to apply some other techniques.
I believe there will be content there , wrapped in tag, You can then again use flex and set child in margin:auto;
DEMO
CSS updated :
/* Flex Box */
section {
padding: 1em;
background: black;
display: flex;
flex-flow: column;
height: 100%;
justify-content: space-around;
}
/* Flex Items */
div {
border-top: 1px solid #ccc;
background: #f2f2f2;
height: 25%;
display:flex;/* be a flexbox too */
}
div:first-child {
border-top: 1px solid transparent;
}
div:hover {
background: white;
}
p { /* or any child of flex box used */
margin:auto;/* here center/middle align */
}
HTML structure :
<!-- Flex Box -->
<section>
<!-- Flex Items , Flex Box themselves -->
<div>
<p style="width:100%;/* to fill entire width*/">1</p> <!-- Flex Items -->
</div>
<div>
<p>2</p><!-- Flex Items -->
</div>
<div>
<p>3</p><!-- Flex Items -->
</div>
<div>
<p>4</p><!-- Flex Items -->
</div>
</section>
Maybe a fallback with display:table , can be usefull : DEMO 2
/* fall back IE8 ie */
html, body, section {
-moz-box-sizing:border-box;
box-sizing:border-box;
height:100%;
width:100%;
}
section {
display:table;
}
section > div {
display:table-cell;
vertical-align:middle;
}
/* Flex Box */
section {
padding: 1em;
background: black;
display: flex;
flex-flow: column;
height: 100%;
justify-content: space-around;
}
/* Flex Items */
section > div {
border-top: 1px solid #ccc;
background: #f2f2f2;
height: 25%;
display:flex;
}
section > div:first-child {
border-top: 1px solid transparent;
}
section > div:hover {
background: white;
}
p {
margin:auto;
}
回答3:
Your problem is not really related to the so-called flex-box, in fact what you want to align is the content of the div (not the div), so just use some trick to align it normarlly. Here is one of the tricks:
div:before {
content:'';
height:100%;
display:inline-block;
vertical-align:middle;
}
Demo.
回答4:
This is the Flex-way of solving your problem:
HTML
<div style="height:300px;"> <!-- Just to test/change the height of <section> element -->
<!-- Flex Box -->
<section>
<!-- Flex Items -->
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
</section>
</div>
CSS
/* Flex Box */
section {
padding: 1em;
background: black;
display: flex;
flex-flow: column;
height:100%;
justify-content: space-around;
}
/* Flex Items */
/* Child selector(>) is used to select <div> elements inside <section> element*/
section > div {
border-top: 1px solid #ccc;
background: #f2f2f2;
height: 25%;
/* Added code */
display: flex; /* Gives inner div flex display */
align-items: center; /* Centers the div in the cross axis */
/**************/
}
section > div:first-child {
border-top: 1px solid transparent;
}
section > div:hover {
background: white;
}
来源:https://stackoverflow.com/questions/23442692/css-flex-box-how-to-vertically-align-flex-items-to-middle-without-losing-flex