Search code examples
htmlcssscrollbarvertical-alignmentalignment

Stacking Divs from Bottom to Top


When appending divs to a div with a fixed height, the child divs will appear from top to bottom, sticking at the top border.

┌─────────────────────────┐
│ Child Div 1             │
│ Child Div 2             │
│                         │
│                         │
│                         │
└─────────────────────────┘

I'm now trying to display them from bottom to top like this (sticking to the bottom border):

┌─────────────────────────┐
│                         │
│                         │
│                         │
│ Child Div 1             │
│ Child Div 2             │
└─────────────────────────┘
┌─────────────────────────┐
│                         │
│                         │
│ Child Div 1             │
│ Child Div 2             │
│ Child Div 3             │
└─────────────────────────┘
┌───────────────────────┬─┐
│ Child Div 2           │▲│
│ Child Div 3           │ │
│ Child Div 4           │ │
│ Child Div 5           │█│
│ Child Div 6           │▼│
└───────────────────────┴─┘

And so on... I hope you get what I mean.

Is this simply doable with CSS (something like vertical-align: bottom)? Or do I have to hack something together with JavaScript?


Solution

  • All the answers miss the scrollbar point of your question. And it's a tough one. If you only need this to work for modern browsers and IE 8+ you can use table positioning, vertical-align:bottom and max-height. See MDN for specific browser compatibility.

    Demo (vertical-align)

    .wrapper {
      display: table-cell;
      vertical-align: bottom;
      height: 200px;
    }
    .content {
      max-height: 200px;
      overflow: auto;
    }
    

    html

    <div class="wrapper">
      <div class="content">
         <div>row 1</div>
         <div>row 2</div>
         <div>row 3</div>  
      </div>
    </div>  
    

    Other than that, I think it's not possible with CSS only. You can make elements stick to the bottom of their container with position:absolute, but it'll take them out of the flow. As a result they won't stretch and make the container to be scrollable.

    Demo (position-absolute)

    .wrapper {
      position: relative;
      height: 200px;
    }
    .content {
      position: absolute;
      bottom: 0;
      width: 100%;
    }