Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Flexbox - align items baseline in multiple columns

Tags:

html

css

flexbox

is there a way to achieve, that rows in columns side by side are aligned to baseline?

In the example, only "A" is aligned correctly. What I want is to make align baseline also "B" and "C" with the same html structure.

https://jsfiddle.net/hxzuar7f/

I know that something like this will work

<div class="row">
  <div class="column">A</div>
  <div class="column">A</div>
  <div class="column">A</div>
</div>
<div class="row">
  <div class="column">B</div>
  <div class="column">B</div>
  <div class="column">B</div>
</div>

But I want to work this

<div class="container">
    <div class="element">
        <div class="row">
            <h1>A</h1>
        </div>
        <div class="row">
            <div>B</div>
        </div>
        <div class="row">
            <div>C</div>
        </div>
    </div>
    <div class="element">
        <div class="row">
            <div>A</div>
        </div>
        <div class="row">
            <div>B</div>
        </div>
    </div>
</div>

(green lines are correct, red lines are wrong)

this is what I want to achieve with CSS: this is what I want to achieve with CSS

this is what I got now: this is what I got now

like image 859
Arťom Pozdnyakov Avatar asked Aug 26 '26 07:08

Arťom Pozdnyakov


1 Answers

Solution 1 : column → row

That's because your element are in column instead of inline. The align-items: baseline attribut works when elements are horizontaly align. So the best way to acheive what's on your image is with flex-direction: row like this:

h1, h3, div {
  display: flex;
  align-items: baseline;
  flex-direction: row;
  box-sizing: border-box;
}

.element {
  display: flex;
  padding: 20px;
  width: 200px;
  justify-content: space-between;
}

.container {
  width: 100%;
  display: flex;
  flex-direction: column;
}

.row {
  display: flex;
}
<div class="container">
    <div class="element">
      <div class="row">
        <h1>A</h1>
      </div>
      <div class="row">
        <div>B</div>
      </div>
      <div class="row">
        <div>C</div>
      </div>
    </div>
    <div class="element">  
      <div class="row">
        <div>A</div>
      </div>
      <div class="row">
        <div>B</div>
      </div>
    </div>
    <div class="element">
      <div class="row">
        <div>A</div>
      </div>
      <div class="row">
        <h3>B</h3>
      </div>
      <div class="row">
        <div>C</div>
      </div>
    </div>
</div>

Solution 2 : add a margin-bottom

If you really want to keep element in column, you need to add a margin-bottom to each row element. But remove some padding of h1and h2. Like this:

h1, h3, div {
  display: flex;
  align-items: baseline;
  flex-direction: row;
  box-sizing: border-box;
  margin:0;
}

.element {
  display: flex;
  padding: 20px;
  width: 200px;
  flex-direction: column;
}

.container {
  flex-direction: row;
}

.row {
  margin-bottom: 40px;
  display: flex;
}
<div class="container">
    <div class="element">
      <div class="row">
        <h1>A</h1>
      </div>
      <div class="row">
        <div>B</div>
      </div>
      <div class="row">
        <div>C</div>
      </div>
    </div>
    <div class="element">  
      <div class="row">
        <div>A</div>
      </div>
      <div class="row">
        <div>B</div>
      </div>
    </div>
    <div class="element">
      <div class="row">
        <div>A</div>
      </div>
      <div class="row">
        <h3>B</h3>
      </div>
      <div class="row">
        <div>C</div>
      </div>
    </div>
</div>
like image 112
Pol Avatar answered Aug 28 '26 21:08

Pol