Linha acima

O ponto principal demonstrado aqui é o uso de justify-content: space-between, que coloca o primeiro e o último elementos filhos nas bordas da caixa delimitadora, com o espaço restante distribuído uniformemente entre os elementos. Para esses cards, eles são colocados no modo de exibição flexbox, com a direção definida como coluna usando flex-direction: column.

Isso coloca o título, a descrição e o bloco de imagens em uma coluna vertical dentro do card principal. Em seguida, aplicar justify-content: space-between ancora os primeiros elementos (título) e o último (bloco de imagem) às bordas do contêiner flexível, e o texto descritivo entre eles é colocado com espaçamento igual entre cada endpoint.

.container {
  display: flex;
  flex-direction: column;
  justify-content: space-between;
}

HTML

<div class="container">
  <div class="card">
    <h3>Title - Card 1</h3>
    <p contenteditable>Medium length description with a few more words here.</p>
    <div class="visual"></div>
  </div>
  <div class="card">
    <h3>Title - Card 2</h3>
    <p contenteditable>Long Description. Lorem ipsum dolor sit, amet consectetur adipisicing elit.</p>
    <div class="visual"></div>
  </div>
  <div class="card">
    <h3>Title - Card 3</h3>
    <p contenteditable>Short Description.</p>
    <div class="visual"></div>
  </div>
</div>

CSS


        .container {
  display: grid;
  grid-gap: 1rem;
  grid-template-columns: repeat(3, 1fr);
}

.visual {
  height: 100px;
  width: 100%;
}

.card {
  display: flex;
  flex-direction: column;
  padding: 1rem;
  justify-content: space-between;
}

h3 {
  margin: 0
}