Fill remaining vertical space - only CSS

前端 未结 9 1378
日久生厌
日久生厌 2020-11-28 09:15

I need to fill the remaining vertical space of #wrapper under #first with #second div.

I need an only CSS sol

相关标签:
9条回答
  • You can use CSS Flexbox instead another display value, The Flexbox Layout (Flexible Box) module aims at providing a more efficient way to lay out, align and distribute space among items in a container, even when their size is unknown and/or dynamic.

    Example

    /* CONTAINER */
    #wrapper
    {
       width:300px;
       height:300px;
        display: -webkit-box; /* OLD - iOS 6-, Safari 3.1-6 */
        display: -moz-box; /* OLD - Firefox 19- (buggy but mostly works) */
        display: -ms-flexbox; /* TWEENER - IE 10 */
        display: -webkit-flex; /* NEW - Chrome */
        display: flex; /* NEW, Spec - Opera 12.1, Firefox 20+ */
        -ms-flex-direction: column;
        -moz-flex-direction: column;
        -webkit-flex-direction: column;
        flex-direction: column;
    }
    
    /* SOME ITEM CHILD ELEMENTS */
    #first
    {
       width:300px;
        height: 200px;
       background-color:#F5DEB3;
    
    }
    
    #second
    {
       width:300px;
       background-color: #9ACD32;
        -webkit-box-flex: 1; /* OLD - iOS 6-, Safari 3.1-6 */
        -moz-box-flex: 1; /* OLD - Firefox 19- */
        -webkit-flex: 1; /* Chrome */
        -ms-flex: 1; /* IE 10 */
        flex: 1; /* NEW, */
    }
    

    jsfiddle Example

    If you want to have full support for old browsers like IE9 or below, you will have to use a polyfills like flexy, this polyfill enable support for Flexbox model but only for 2012 spec of flexbox model.

    Recently I found another polyfill to help you with Internet Explorer 8 & 9 or any older browser that not have support for flexbox model, I still have not tried it but I leave the link here

    You can find a usefull and complete Guide to Flexbox model by Chris Coyer here

    0 讨论(0)
  • 2020-11-28 09:29

    You can just add the overflow:auto option:

    #second
    {
       width:300px;
       height:100%;
       overflow: auto;
       background-color:#9ACD32;
    }
    
    0 讨论(0)
  • 2020-11-28 09:31

    All you need is a bit of improved markup. Wrap the second within the first and it will render under.

    <div id="wrapper">
        <div id="first">
            Here comes the first content
            <div id="second">I will render below the first content</div>
        </div>
    </div>
    

    Demo

    0 讨论(0)
  • 2020-11-28 09:33

    Flexbox solution

    html, body {
      height: 100%;
    }
    
    .wrapper {
      display: flex;
      flex-direction: column;
      width: 300px;
      height: 100%;
    }
    
    .first {
      height: 50px;
    }
    
    .second {
      flex-grow: 1;
    }
    <div class="wrapper">
      <div class="first" style="background:#b2efd8">First</div>
      <div class="second" style="background:#80c7cd">Second</div>
    </div>

    0 讨论(0)
  • 2020-11-28 09:33

    If you can add an extra couple of divs so your html looks like this:

    <div id="wrapper">
        <div id="first" class="row">
            <div class="cell"></div>
        </div>
        <div id="second" class="row">
            <div class="cell"></div>
        </div>
    </div>
    

    You can make use of the display:table properties:

    #wrapper
    {
       width:300px;
       height:100%;
       display:table;
    }
    
    .row 
    {
       display:table-row;
    }
    
    .cell 
    {
       display:table-cell;
    }
    
    #first .cell
    {
       height:200px;
       background-color:#F5DEB3;
    }
    
    #second .cell
    {
       background-color:#9ACD32;
    }
    

    Example

    0 讨论(0)
  • 2020-11-28 09:34

    Have you tried changing the wrapper height to vh instead of %?

    #wrapper {
    width:300px;
    height:100vh;
    }
    

    That worked great for me when I wanted to fill my page with a gradient background for instance...

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