'Is there a way to achieve the same results as `align-items: bottom` on a multicolumn flex layout using legacy css?

I know this question probably seems very pointless, but I am very interested as to whether or not there were any ways on css prior to the modern flexbox without using javascript to achieve the same or similar results to:

section {
  width: 400px;
  height: 400px;
  display: flex;
  flex-wrap: wrap;
  align-items: end
}

div {
  flex-basis: calc(33.33% - 4px);
  height: 20px;
  background-color: blue;
  border: 2px solid black;
}
<section>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
</section>

I know I could modify the html, and make logical tables, rows, and cells, and just set the align-items: bottom of each cell, like this:

section {
  width: 400px;
  height: 400px;
  display: table;
}

.row {
  display: table-row;
}

.cell {
  display: table-cell;
  vertical-align: bottom;
  text-align: center;
}

.child {
  width: calc(33.33% - 4px);
  height: 20px;
  border: 2px solid black;
  background-color: blue;
  display: inline-block;
}

.child:nth-child(1n+2) {
  /*Compensating for the width of the newlines in the html code*/
  margin-left: -4px;
}
<section>
  <div class="row">
    <div class="cell">
      <div class="child">&nbsp;</div>
      <div class="child">&nbsp;</div>
      <div class="child">&nbsp;</div>
    </div>
  </div>
  <div class="row">
    <div class="cell">
      <div class="child">&nbsp;</div>
      <div class="child">&nbsp;</div>
      <div class="child">&nbsp;</div>
    </div>
  </div>
  <div class="row">
    <div class="cell">
      <div class="child">&nbsp;</div>
      <div class="child">&nbsp;</div>
      <div class="child">&nbsp;</div>
    </div>
  </div>
</section>

But I was wondering if there was a better and more dynamic way to do this, so that all someone would have to do is add divs, and they wouldn't have to create rows and tables to add more content. I know this doesn't really matter, since any method besides flexbox is obsolete. But I'm just extremely curious on this, and I would be extremely grateful for an answer!



Solution 1:[1]

What could be an answer to your question could be CSS Grid which I believe was the go to for situations like this before flexbox. You achieve a grid layout with a higher div (grid-container) and children (grid-item) from there you can control the spacing between the columns and grids. MDN docs

Here is my attempt at recreating your styling with a single div as well as a single set of child divs.

.grid-container {
  display: grid;
  row-gap: 120px;
  grid-template-columns: auto auto auto;
  padding: 10px;
  margin-top: 120px;
}

.grid-item {
  background-color: blue;
  height: 20px;
  border: 1px solid rgba(0, 0, 0, 0.8);
  padding: 20px;
  font-size: 30px;
  text-align: center;
}
<div class="grid-container">
  <div class="grid-item"></div>
  <div class="grid-item"></div>
  <div class="grid-item"></div>  
  <div class="grid-item"></div>
  <div class="grid-item"></div>
  <div class="grid-item"></div>  
  <div class="grid-item"></div>
  <div class="grid-item"></div>
  <div class="grid-item"></div>  
</div>

Hopefully this helps.

Solution 2:[2]

Another way to do this would be just using margin-top.

section {
  width: 400px;
  height: 400px;
  /* the white space interferes with the new lines */
  font-size: 0;
}

section>div {
  display: inline-block;
  height: 20px;
  width: calc(33.33% - 4px);
  background-color: blue;
  border: 2px solid black;
  padding: 0;
  /* set to the default font size */
  font-size: 1em;
  margin-top: 200px;
}
<section>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
</section>

It's not a very good approach but will still work.

Also, flexbox arguably has better browser support than calc().

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 daedadev
Solution 2