CSS Flex Box: How to vertically align “flex items” to middle without losing flex item height?

后端 未结 4 667
野性不改
野性不改 2020-12-31 11:03

Currently my \"flex\" items look like this (vertically aligned: top)...

 _____________________________________
   1

 _____________________________________
          


        
相关标签:
4条回答
  • 2020-12-31 11:43

    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;
    }
    
    0 讨论(0)
  • 2020-12-31 12:00

    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

    0 讨论(0)
  • 2020-12-31 12:02

    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;
    }
    
    0 讨论(0)
  • 2020-12-31 12:04

    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.

    0 讨论(0)
提交回复
热议问题