6

I have a CSS Grid below and I would like the content(letters for now) to be vertically aligned within the cells. What's the best way to accomplish this? vertical-align:middle on the cells doesn't seem to do anything, align-items:center; on the grid container worked, but then the heights were all different.

body {
  margin: 40px;
}

.wrapper {
  display: grid;
    grid-gap: 10px;
  grid-template-columns: [col] 100px [col] 100px [col] 100px;
  grid-template-rows: [row] auto [row] auto [row] ;
  background-color: #fff;
  color: #444;
 }

 .box {
  background-color:#444;
  color:#fff;
  padding:20px;
  font-size:150%;
 }

 .a {
  grid-column: col / span 2;
  grid-row: row 1 / 3;
 }
 .b {
  grid-column: col 3 / span 1;
  grid-row: row ;
 }
 .c {
  grid-column: col 3 / span 1;
  grid-row: row 2 ;
 }
 .d {
  grid-column: col / span 1;
  grid-row: row 3;
 }

 .e {
  grid-column: col 2 / span 1;
  grid-row: row 3;
 }

.f {
  grid-column: col 3 / span 1;
  grid-row: row 3;
}
<div class="wrapper">
  <div class="box a">A</div>
  <div class="box b">B</div>
  <div class="box c">C</div>
  <div class="box d">D</div>
  <div class="box e">E</div>
  <div class="box f">F</div>
</div>
Michael Benjamin
  • 346,931
  • 104
  • 581
  • 701
user13286
  • 3,027
  • 9
  • 45
  • 100

1 Answers1

10

If you just want them vertically centered you can add display:flex; and align-items: center; to the box class:

body {
  margin: 40px;
}

.wrapper {
  display: grid;
  grid-gap: 10px;
  grid-template-columns: [col] 100px [col] 100px [col] 100px;
  grid-template-rows: [row] auto [row] auto [row];
  background-color: #fff;
  color: #444;
}

.box {
  background-color: #444;
  color: #fff;
  padding: 20px;
  font-size: 150%;
  display: flex;
  align-items: center;
}

.a {
  grid-column: col / span 2;
  grid-row: row 1 / 3;
}

.b {
  grid-column: col 3 / span 1;
  grid-row: row;
}

.c {
  grid-column: col 3 / span 1;
  grid-row: row 2;
}

.d {
  grid-column: col / span 1;
  grid-row: row 3;
}

.e {
  grid-column: col 2 / span 1;
  grid-row: row 3;
}

.f {
  grid-column: col 3 / span 1;
  grid-row: row 3;
}
<div class="wrapper">
  <div class="box a">A</div>
  <div class="box b">B</div>
  <div class="box c">C</div>
  <div class="box d">D</div>
  <div class="box e">E</div>
  <div class="box f">F</div>
</div>
Scath
  • 3,777
  • 10
  • 29
  • 40
  • It's working. But there are side effects if there is not only text in cells. E.g. links, other elements. It's better to wrap flex content in divs. I.e:
    A
    See https://dev.to/afif/never-make-your-text-container-a-flexbox-container-m9p
    – Sergey Beloglazov Aug 09 '23 at 16:40