Currently my \"flex\" items look like this (vertically aligned: top)...
_____________________________________
1
_____________________________________
This is the Flex-way of solving your problem:
<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>
/* 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;
}
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
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;
}
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;
}