css - support - flexbox grid tutorial
CSS Flex Box: ¿Cómo alinear verticalmente los "elementos flexibles" a la mitad sin perder la altura del elemento flexible? (4)
Actualmente mis elementos "flexibles" se ven así (alineados verticalmente: arriba) ...
_____________________________________
1
_____________________________________
2
_____________________________________
3
_____________________________________
4
_____________________________________
Mi objetivo es hacer que se vean así (alineados verticalmente: en el medio) ...
_____________________________________
1
_____________________________________
2
_____________________________________
3
_____________________________________
4
_____________________________________
Mis requisitos:
- El contenedor flexible debe permanecer al 100% de altura
- Los elementos flexibles deben permanecer al 25% en altura (equivalentes al 100%, que es su valor predeterminado de todos modos).
- Los elementos flexibles deben estar centrados verticalmente.
- Esto debe ser receptivo y ser lo suficientemente inteligente como para permanecer en el medio por dispositivo (por lo tanto, no debe haber altura de línea / relleno)
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; }
Esta es la manera flexible de resolver su problema:
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;
}
Para alinear verticalmente el contenido de flexbox child, deberá aplicar algunas otras técnicas.
Creo que habrá contenido allí, envuelto en una etiqueta. Luego, puedes usar flex
y configurar child en margin:auto;
MANIFESTACIÓN
CSS actualizado:
/* 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 */
}
Estructura HTML:
<!-- 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>
Tal vez una alternativa con display:table
, puede ser útil: 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;
}
Su problema no está realmente relacionado con el llamado flex-box, de hecho, lo que quiere alinear es el contenido del div (no el div
), así que simplemente use algún truco para alinearlo normalmente. Este es uno de los trucos:
div:before {
content:'''';
height:100%;
display:inline-block;
vertical-align:middle;
}
Manifestación.
Tal vez estoy malinterpretando, pero no puedes hacer lo siguiente:
HTML (Delgado)
.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;
}
Aquí hay un Codepen