Using flex with a ribbon card component with offset cards. How to align items which are variable in length

Viewed 200

Apologies in advance if this is a badly worded question. I am trying to build a component which looks like this from the design: enter image description here

We have a tagline and title then the option to have 1 to 4 cards in the ribbon. These are ordered using flex-direction: row-reverse (so they stack from the right hand side first).

We pass a data attribute via the backend, so we can target a ribbon with 1 - 4 cards.

So far I have built this using offsets of padding, margins and height, this works well when we have copy as we expect, but if the title is very short (or long) everything gets messed up. I am not even sure (given the way the component has been built) if this is even possible. Mobile is fine, and 1 or 2 cards is OK, but 3 or 4 gets tricky. We want to align the first two at the top (from the right hand side) then the third is taller and should align at the bottom with the 4th card (so 3 and 4 have an offset). Maybe it is better to think of the title and tagline as being offset?

I have made this jsfiddle using the 4 card layout.

Here is the sample HTML:

<section class="ribbon-icon grid grid-container content-wrapper" data-columns="4">
    <div class="row">
        <div class="ribbon-icon__title col col--md-6">
            <p class="ribbon-icon__tagline">Solutions</p>
            <p class="h1">Improve the benefits that health care can provide Improve the benefits that health care can provide..</p>
            <p class="ribbon-icon__description">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cursus porta rhoncus pharetra amet, consequat ullamcorper vitae sed. Dolor sem tellus nec risus magna.</p>
        </div>
        <div class="ribbon-icon__items row col">
                <a class="ribbon-icon__items--item col col--md-3" href="/en-gb">
                    <div>
                        <img src="/jssmedia/Eisai-Emea/Shared/Icons/icon-microscope.svg?iar=0&amp;hash=277AE31475485774CD0094CBB39EC102">
                    </div>
                    <div>
                        <h3 class="ribbon-icon__item-title">Clinical studies</h3>
                        <p>Clinical trials, safety studies</p>
                    </div>
                </a>
                <a class="ribbon-icon__items--item col col--md-3" href="/en-gb">
                    <div>
                        <img src="/jssmedia/Eisai-Emea/Shared/Icons/icon-microscope.svg?iar=0&amp;hash=277AE31475485774CD0094CBB39EC102">
                    </div>
                    <div>
                        <h3 class="ribbon-icon__item-title">Clinical studies</h3>
                        <p>Clinical trials, safety studies</p>
                    </div>
                </a>
                <a class="ribbon-icon__items--item col col--md-3" href="/en-gb">
                    <div>
                        <img src="/jssmedia/Eisai-Emea/Shared/Icons/icon-documents.svg?iar=0&amp;hash=13316F3944BF062DA0708F1A38BDFF3D">
                    </div>
                    <div>
                        <h3 class="ribbon-icon__item-title">Patient information material</h3>
                        <p>Handouts, treatment guides, patient support material</p>
                    </div>
                </a>
                <a class="ribbon-icon__items--item col col--md-3" href="/en-gb">
                    <div>
                        <img src="/jssmedia/Eisai-Emea/Shared/Icons/icon-pills.svg?iar=0&amp;hash=1FDCEF23CA8F9B5C6E1327B9A6FD4DAF">
                    </div>
                    <div>
                        <h3 class="ribbon-icon__item-title">Product information</h3>
                        <p>Learn about safety, administration, efficacy and more</p>
                    </div>
                </a>
        </div>
    </div>
</section>

We are using scss but I have made a dump of the core css this relates to (it's in the fiddle of course) but here is the block:

.ribbon-icon {
    margin-bottom: -4.5rem
}

@media (min-width:992px) {
    .ribbon-icon {
        margin-bottom: -2.5rem
    }
}

.ribbon-icon__title {
    margin: 0!important;
    padding-left: 0;
    padding-right: 0;
    padding-bottom: 0
}

@media (min-width:768px) {
    .ribbon-icon__title {
        margin: 0 0 6rem!important
    }
}

@media (min-width:768px) {
    .ribbon-icon__title .h1 {
        font-size: 2.5rem!important
    }
}

.ribbon-icon__description {
    margin-bottom: 0
}

.ribbon-icon__item-title {
    font-weight: 600;
    font-size: 1.4rem;
    line-height: 1.5rem
}

@media (min-width:768px) {
    .ribbon-icon__item-title {
        font-size: 1.875rem;
        line-height: 2.25rem
    }
}

.ribbon-icon__items {
    flex-direction: row-reverse!important;
    padding-left: 0;
    padding-right: 0;
    padding-top: 0
}

@media (min-width:992px) {
    .ribbon-icon__items {
        position: relative;
        top: -7rem
    }
}

.ribbon-icon__items--item {
    position: relative;
    color: initial;
    margin: 1.25rem 0 2.25rem;
    text-decoration: none
}

.ribbon-icon__items--item:before {
    content: "";
    border-width: 0;
    border-left: 1px solid;
    border-image: linear-gradient(#b5007c, #007da3) 0 100%;
    height: 100%;
    position: absolute;
    left: 0;
    height: calc(100% - 1.2rem)
}

.ribbon-icon__items--item:hover {
    color: initial
}

.ribbon-icon__items--item p {
    margin: 0
}

.ribbon-icon__items--item img,
.ribbon-icon__items--item svg {
    max-width: 3.25rem
}

@media (min-width:768px) {
    .ribbon-icon__items--item img,
    .ribbon-icon__items--item svg {
        max-width: 5rem
    }
}

@media (min-width:992px) {
    .ribbon-icon__items--item {
        position: relative;
        margin: 0;
        padding-bottom: 0
    }
}

.ribbon-icon[data-columns="1"] .ribbon-icon__title {
    flex: 0 0 75%;
    max-width: 75%
}

@media (min-width:992px) {
    .ribbon-icon[data-columns="3"] .ribbon-icon__items--item:nth-child(2),
    .ribbon-icon[data-columns="4"] .ribbon-icon__items--item:nth-child(2) {
        min-height: 30rem
    }
}

@media (min-width:992px) {
    .ribbon-icon[data-columns="3"] .ribbon-icon__items--item:nth-child(3),
    .ribbon-icon[data-columns="3"] .ribbon-icon__items--item:nth-child(4),
    .ribbon-icon[data-columns="4"] .ribbon-icon__items--item:nth-child(3),
    .ribbon-icon[data-columns="4"] .ribbon-icon__items--item:nth-child(4) {
        top: 7rem;
    }
}
3 Answers

You can use float:left for the title and float:right for items:

.row {
  border-top: 1px dotted gray;
  margin-top: 4rem;
  height: 100vh;
}

.row * {
  box-sizing: border-box;
}

.ribbon-icon__title {
  width: 40%;
  float: left;
  margin-left: 1rem;
}

.ribbon-icon__tagline {
  font-size: 0.5rem;
  font-style: italic;
  font-weight: bold;
}

.row .h1 {
  font-size: 0.8rem;
  font-weight: bold;
}

.row p {
  margin: 0.3rem;
}

.row .ribbon-icon__description {
  font-size: 0.4rem;
}

.ribbon-icon__items--item {
  float: right;
  width: 24%;
  margin-left: -1px;
  margin-top: 1rem;
  border-left: 1px solid pink;
  border-right: 1px solid pink;
}

.ribbon-icon__items--item:first-of-type {
  border-right: none;
}

.ribbon-icon__items--item:last-of-type {
  border-right: none;
}

.ribbon-icon__items--item div {
  display: inline-block;
  width: 100%;
  height: 110px;
  margin: 0.5rem;
  padding: 0.5rem;
}

.ribbon-icon__items--item img {
  width: 50%;
  height: 50%;
  margin: 0 auto;
}

.ribbon-icon__items--item p {
  font-size: 0.5rem;
  margin: 0.2rem;
  color: gray;
}

.ribbon-icon__item-title {
  font-size: 0.6rem;
  text-decoration: none;
  color: black;
}
<section class="ribbon-icon grid grid-container content-wrapper" data-columns="4" data-tracking="ribbon-icon">
<span>To see all the use cases scroll down till bottom.</span>
  <div class="row">
    <div class="ribbon-icon__title col col--md-6">
      <p class="ribbon-icon__tagline">Solutions</p>
      <p class="h1">Improve the benefits that health care can provide.</p>
      <p class="ribbon-icon__description">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cursus porta rhoncus pharetra amet, consequat ullamcorper vitae sed. Dolor sem tellus nec risus magna.</p>
    </div>

    <a class="ribbon-icon__items--item col col--md-3">
      <div>
        <img src="/-/jssmedia/Eisai-Emea/Shared/Icons/icon-pills.svg?iar=0&amp;hash=1FDCEF23CA8F9B5C6E1327B9A6FD4DAF" />
        <h3 class="ribbon-icon__item-title">Product information4</h3>
        <p>Learn about safety, administration, efficacy and more</p>
      </div>
    </a>

    <a class="ribbon-icon__items--item col col--md-3">
      <div>
        <img src="/-/jssmedia/Eisai-Emea/Shared/Icons/icon-documents.svg?iar=0&amp;hash=13316F3944BF062DA0708F1A38BDFF3D" />
        <h3 class="ribbon-icon__item-title">Patient information material3</h3>
        <p>Handouts, treatment guides, patient support material</p>
      </div>
    </a>

    <a class="ribbon-icon__items--item col col--md-3">
      <div>
        <img src="/-/jssmedia/Eisai-Emea/Shared/Icons/icon-microscope.svg?iar=0&amp;hash=277AE31475485774CD0094CBB39EC102" />
        <h3 class="ribbon-icon__item-title">Clinical in-depth studies2</h3>
        <p>Clinical trials, safety studies</p>
      </div>
    </a>

    <a class="ribbon-icon__items--item col col--md-3">
      <div>
        <img src="/-/jssmedia/Eisai-Emea/Shared/Icons/icon-pills.svg?iar=0&amp;hash=1FDCEF23CA8F9B5C6E1327B9A6FD4DAF" />
        <h3 class="ribbon-icon__item-title">Webinars and e-learning</h3>
        <p>Clinical trials, safety studies</p>
      </div>
    </a>
  </div>

  <div class="row">
    <div class="ribbon-icon__title col col--md-6" style="width: 60%;">
      <p class="ribbon-icon__tagline">Solutions</p>
      <p class="h1">Improve the benefits that health care can provide.</p>
      <p class="ribbon-icon__description">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cursus porta rhoncus pharetra amet, consequat ullamcorper vitae sed. Dolor sem tellus nec risus magna.</p>
    </div>

    <a class="ribbon-icon__items--item col col--md-3">
      <div>
        <img src="/-/jssmedia/Eisai-Emea/Shared/Icons/icon-pills.svg?iar=0&amp;hash=1FDCEF23CA8F9B5C6E1327B9A6FD4DAF" />
        <h3 class="ribbon-icon__item-title">Product information4</h3>
        <p>Learn about safety, administration, efficacy and more</p>
      </div>
    </a>

    <a class="ribbon-icon__items--item col col--md-3">
      <div>
        <img src="/-/jssmedia/Eisai-Emea/Shared/Icons/icon-documents.svg?iar=0&amp;hash=13316F3944BF062DA0708F1A38BDFF3D" />
        <h3 class="ribbon-icon__item-title">Patient information material3</h3>
        <p>Handouts, treatment guides, patient support material</p>
      </div>
    </a>

    <a class="ribbon-icon__items--item col col--md-3">
      <div>
        <img src="/-/jssmedia/Eisai-Emea/Shared/Icons/icon-microscope.svg?iar=0&amp;hash=277AE31475485774CD0094CBB39EC102" />
        <h3 class="ribbon-icon__item-title">Clinical in-depth studies2</h3>
        <p>Clinical trials, safety studies</p>
      </div>
    </a>

    <a class="ribbon-icon__items--item col col--md-3">
      <div>
        <img src="/-/jssmedia/Eisai-Emea/Shared/Icons/icon-pills.svg?iar=0&amp;hash=1FDCEF23CA8F9B5C6E1327B9A6FD4DAF" />
        <h3 class="ribbon-icon__item-title">Webinars and e-learning</h3>
        <p>Clinical trials, safety studies</p>
      </div>
    </a>
  </div>

  <div class="row">
    <div class="ribbon-icon__title col col--md-6" style="width: 20%;">
      <p class="ribbon-icon__tagline">Solutions</p>
      <p class="h1">Improve the benefits that health care can provide.</p>
      <p class="ribbon-icon__description">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cursus porta rhoncus pharetra amet, consequat ullamcorper vitae sed. Dolor sem tellus nec risus magna.</p>
    </div>

    <a class="ribbon-icon__items--item col col--md-3">
      <div>
        <img src="/-/jssmedia/Eisai-Emea/Shared/Icons/icon-pills.svg?iar=0&amp;hash=1FDCEF23CA8F9B5C6E1327B9A6FD4DAF" />
        <h3 class="ribbon-icon__item-title">Product information4</h3>
        <p>Learn about safety, administration, efficacy and more</p>
      </div>
    </a>

    <a class="ribbon-icon__items--item col col--md-3">
      <div>
        <img src="/-/jssmedia/Eisai-Emea/Shared/Icons/icon-documents.svg?iar=0&amp;hash=13316F3944BF062DA0708F1A38BDFF3D" />
        <h3 class="ribbon-icon__item-title">Patient information material3</h3>
        <p>Handouts, treatment guides, patient support material</p>
      </div>
    </a>

    <a class="ribbon-icon__items--item col col--md-3">
      <div>
        <img src="/-/jssmedia/Eisai-Emea/Shared/Icons/icon-microscope.svg?iar=0&amp;hash=277AE31475485774CD0094CBB39EC102" />
        <h3 class="ribbon-icon__item-title">Clinical in-depth studies 2</h3>
        <p>Clinical trials, safety studies, and some more studies</p>
      </div>
    </a>

    <a class="ribbon-icon__items--item col col--md-3">
      <div>
        <img src="/-/jssmedia/Eisai-Emea/Shared/Icons/icon-pills.svg?iar=0&amp;hash=1FDCEF23CA8F9B5C6E1327B9A6FD4DAF" />
        <h3 class="ribbon-icon__item-title">Webinars and e-learning</h3>
        <p>Clinical trials, safety studies</p>
      </div>
    </a>
  </div>

  <div class="row">
    <div class="ribbon-icon__title col col--md-6">
      <p class="ribbon-icon__tagline">Solutions</p>
      <p class="h1">Improve the benefits that health care can provide.</p>
      <p class="ribbon-icon__description">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cursus porta rhoncus pharetra amet, consequat ullamcorper vitae sed. Dolor sem tellus nec risus magna.</p>
    </div>

    <a class="ribbon-icon__items--item col col--md-3">
      <div>
        <img src="/-/jssmedia/Eisai-Emea/Shared/Icons/icon-pills.svg?iar=0&amp;hash=1FDCEF23CA8F9B5C6E1327B9A6FD4DAF" />
        <h3 class="ribbon-icon__item-title">Product information4</h3>
        <p>Learn about safety, administration, efficacy and more</p>
      </div>
    </a>

    <a class="ribbon-icon__items--item col col--md-3">
      <div>
        <img src="/-/jssmedia/Eisai-Emea/Shared/Icons/icon-documents.svg?iar=0&amp;hash=13316F3944BF062DA0708F1A38BDFF3D" />
        <h3 class="ribbon-icon__item-title">Patient information material3</h3>
        <p>Handouts, treatment guides, patient support material</p>
      </div>
    </a>

    <a class="ribbon-icon__items--item col col--md-3">
      <div>
        <img src="/-/jssmedia/Eisai-Emea/Shared/Icons/icon-microscope.svg?iar=0&amp;hash=277AE31475485774CD0094CBB39EC102" />
        <h3 class="ribbon-icon__item-title">Clinical in-depth studies2</h3>
        <p>Clinical trials, safety studies</p>
      </div>
    </a>
  </div>

  <div class="row">
    <div class="ribbon-icon__title col col--md-6">
      <p class="ribbon-icon__tagline">Solutions</p>
      <p class="h1">Improve the benefits that health care can provide.</p>
      <p class="ribbon-icon__description">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cursus porta rhoncus pharetra amet, consequat ullamcorper vitae sed. Dolor sem tellus nec risus magna.</p>
    </div>

    <a class="ribbon-icon__items--item col col--md-3">
      <div>
        <img src="/-/jssmedia/Eisai-Emea/Shared/Icons/icon-pills.svg?iar=0&amp;hash=1FDCEF23CA8F9B5C6E1327B9A6FD4DAF" />
        <h3 class="ribbon-icon__item-title">Product information4</h3>
        <p>Learn about safety, administration, efficacy and more</p>
      </div>
    </a>

    <a class="ribbon-icon__items--item col col--md-3">
      <div>
        <img src="/-/jssmedia/Eisai-Emea/Shared/Icons/icon-documents.svg?iar=0&amp;hash=13316F3944BF062DA0708F1A38BDFF3D" />
        <h3 class="ribbon-icon__item-title">Patient information material3</h3>
        <p>Handouts, treatment guides, patient support material</p>
      </div>
    </a>
  </div>
  <div class="row">
    <div class="ribbon-icon__title col col--md-6">
      <p class="ribbon-icon__tagline">Solutions</p>
      <p class="h1">Improve the benefits that health care can provide.</p>
      <p class="ribbon-icon__description">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cursus porta rhoncus pharetra amet, consequat ullamcorper vitae sed. Dolor sem tellus nec risus magna.</p>
    </div>

    <a class="ribbon-icon__items--item col col--md-3">
      <div>
        <img src="/-/jssmedia/Eisai-Emea/Shared/Icons/icon-pills.svg?iar=0&amp;hash=1FDCEF23CA8F9B5C6E1327B9A6FD4DAF" />
        <h3 class="ribbon-icon__item-title">Product information4</h3>
        <p>Learn about safety, administration, efficacy and more</p>
      </div>
    </a>
  </div>
</section>

To avoid complications I've not used all of your CSS rules. This is just a bare minimum code to demonstrate the layout. You can polish it further.

I guess it will help.

I use eventlistener on button element because StackOverFlows snippet window calculates Title[h2] width not for a full screen but you can use window.addEventListener('load', () => {} )

When you change title it will recalculate cards margin-Top

Click resize button please.

This is for 4

const mainContainer = document.querySelector('div');

const headerContainer = document.querySelector('.header-container');

let firstCard = document.querySelectorAll('.card')[0];
let secondCard = document.querySelectorAll('.card')[1];
let thirdCard = document.querySelectorAll('.card')[2];
let fourthCard = document.querySelectorAll('.card')[3];

const btn = document.querySelector('button')

btn.addEventListener('click', () => {
    let childCount = mainContainer.childElementCount;
    
    if(childCount == 2){
        mainContainer.setAttribute('class','one-item-container')

        firstCard.setAttribute('class','card one-item-first-card ')
    }
    else if(childCount == 3){
        
        mainContainer.setAttribute('class','two-item-container')

        firstCard.setAttribute('class','card two-item-first-card ')

        secondCard.setAttribute('class','card two-item-second-card ')
    }

    else if(childCount > 3){

        mainContainer.setAttribute("class","more-item-container");
        headerContainer.setAttribute("class","more-header-container");
        firstCard.setAttribute('class','card more-first-card ');
        secondCard.setAttribute('class','card more-second-card');
        thirdCard.setAttribute('class','card third-card');

        const cardH2Element =  document.getElementById('cardTitle')

        const titleHeight = parseInt(cardH2Element.offsetHeight);

        firstCard.style.marginTop = `${titleHeight + 40}px`
        secondCard.style.marginTop = `${titleHeight + 40}px`
        thirdCard.style.marginTop = `${titleHeight + 100}px`

        if(childCount == 5){
            fourthCard.setAttribute('class','card fourth-card');
            fourthCard.style.marginTop = `${titleHeight + 100}px`
        }
    }
})
*,
*::before,
*::after {
  box-sizing: border-box;
  margin: 0;
}

body{
  min-height: 100vh;
  background-color: grey;
  display: grid;
  place-content: center;
  font-family: Arial, Helvetica, sans-serif;
}

h2{
  font-weight:100;
  font-size: 2rem;
}

h3{
  font-size: 1.5rem;
}

img{
  height: 60px;
  max-width: 100%;
  display: block;
}

.one-item-container{
  display: grid;
  max-width: 1100px;
  grid-template-columns: 1fr 1fr;
  background-color: beige;
  padding: 0 3rem;
  border-radius: 2rem;
}

.two-item-container{
  display: grid;
  max-width: 1100px;
  grid-template-columns: 2fr 1fr 1fr;
  background-color: beige;
  padding: 0 3rem;
  border-radius: 2rem;
}

.more-item-container{
  display: grid;
  max-width: 1100px;
  grid-template-columns: repeat(4, 1fr);
  grid-template-rows: repeat(2,1fr);
  background-color: beige;
  padding: 0 3rem;
  border-radius: 2rem;
}

.header-container{
  padding: 2rem 6rem 0 0;
}

.header-container > * {
  margin-bottom: 1rem;
}

.more-header-container{
  padding: 2rem 6rem 0 0;
  grid-column: 1 / 3;
  grid-row: 1;
}
.more-header-container > * {
  margin-bottom: 1rem;
}

.card{
  margin: 1rem 0;
  padding: 0 1rem;
  position: relative;
  display: flex;
  flex-direction: column;
  cursor: pointer;
}

.card::before,
.card::after {
  content: "";
  position: absolute;
  inset: 0;
  height: 100%;
  box-shadow: inset 1.5px 0  var(--c, #e0b9da);
  mask: linear-gradient(var(--p, 0deg), #0000 45%, #000 55%);
  pointer-events: none;
}

.card::after {
  --c: #b6dae7;
  --p: 180deg;
}


.card img{
  margin-bottom: 2rem;
}

.card h3{
  margin-bottom: 1rem;
  line-height: 2rem;
}

.card p{
  font-size: 0.9rem;
}

.one-item-first-card{
  grid-column: 2;
}

.two-item-first-card{
  grid-column: 3;
  grid-row: 1;
}

.two-item-second-card{
  grid-column: 2 / 3;
  grid-row: 1;
}

.more-first-card{
  margin-bottom: calc(45%) ;
  grid-column: 4;
  grid-row:1 / 3;
}

.more-second-card{
  grid-column: 3 / 4;
  grid-row:1 / 3;
}

.third-card{
  grid-column: 2 / 3;
  grid-row: 1 / 3;
}

.fourth-card{
  grid-column: 1 / 2;
  grid-row: 1 / 3;
}


button {
  position: absolute;
  top:5rem;
  right:5rem;
  padding: 3rem;
}
 <div class="container">
      <div class="header-container">
        <p>Solutions</p>
        <h2 id="cardTitle">
          Lorem ipsum dolor sit amet consectetur Lorem ipsum dolor sit amet
          consectetur adipisicing elit. Iure, tenetur.
        </h2>
      </div>
      <div class="card">
        <div class="card__image">
          <img
            src="/-/jssmedia/Eisai-Emea/Shared/Icons/icon-pills.svg?iar=0&amp;hash=1FDCEF23CA8F9B5C6E1327B9A6FD4DAF"
            alt="Product Information"
          />
        </div>
        <div class="card__text">
          <h3>Product Information</h3>
          <p>Learn about safety, administration, efficacy and more</p>
        </div>
      </div>
      <div class="card">
        <div class="card__image">
          <img
            src="/-/jssmedia/Eisai-Emea/Shared/Icons/icon-documents.svg?iar=0&amp;hash=13316F3944BF062DA0708F1A38BDFF3D"
            alt="Patient Information"
          />
        </div>
        <div class="card__text">
          <h3>Patient information material</h3>
          <p>Handouts, treatment guides, patient support material</p>
        </div>
      </div>
      <div class="card">
        <div class="card__image">
          <img
            src="/-/jssmedia/Eisai-Emea/Shared/Icons/icon-microscope.svg?iar=0&amp;hash=277AE31475485774CD0094CBB39EC102"
            alt="Clinical Studies second"
          />
        </div>
        <div class="card__text">
          <h3>Clinical Studies</h3>
          <p>Clinical trials, safety studies</p>
        </div>
      </div>
      <div class="card">
        <div class="card__image">
          <img
            src="/-/jssmedia/Eisai-Emea/Shared/Icons/icon-microscope.svg?iar=0&amp;hash=277AE31475485774CD0094CBB39EC102"
            alt="Webinars and eLearning"
          />
        </div>
        <div class="card__text">
          <h3>Webinars and eLearning</h3>
          <p>
            Get insights on pathophysiology, treatment and safety from experts
          </p>
        </div>
      </div>
    </div>

    <button>Resize</button>

This is for 3

const mainContainer = document.querySelector('div');

const headerContainer = document.querySelector('.header-container');

let firstCard = document.querySelectorAll('.card')[0];
let secondCard = document.querySelectorAll('.card')[1];
let thirdCard = document.querySelectorAll('.card')[2];
let fourthCard = document.querySelectorAll('.card')[3];

const btn = document.querySelector('button')

btn.addEventListener('click', () => {
    let childCount = mainContainer.childElementCount;
    
    if(childCount == 2){
        mainContainer.setAttribute('class','one-item-container')

        firstCard.setAttribute('class','card one-item-first-card ')
    }
    else if(childCount == 3){
        
        mainContainer.setAttribute('class','two-item-container')

        firstCard.setAttribute('class','card two-item-first-card ')

        secondCard.setAttribute('class','card two-item-second-card ')
    }

    else if(childCount > 3){

        mainContainer.setAttribute("class","more-item-container");
        headerContainer.setAttribute("class","more-header-container");
        firstCard.setAttribute('class','card more-first-card ');
        secondCard.setAttribute('class','card more-second-card');
        thirdCard.setAttribute('class','card third-card');

        const cardH2Element =  document.getElementById('cardTitle')

        const titleHeight = parseInt(cardH2Element.offsetHeight);

        firstCard.style.marginTop = `${titleHeight + 40}px`
        secondCard.style.marginTop = `${titleHeight + 40}px`
        thirdCard.style.marginTop = `${titleHeight + 100}px`

        if(childCount == 5){
            fourthCard.setAttribute('class','card fourth-card');
            fourthCard.style.marginTop = `${titleHeight + 100}px`
        }
    }
})
*,
*::before,
*::after {
  box-sizing: border-box;
  margin: 0;
}

body{
  min-height: 100vh;
  background-color: grey;
  display: grid;
  place-content: center;
  font-family: Arial, Helvetica, sans-serif;
}

h2{
  font-weight:100;
  font-size: 2rem;
}

h3{
  font-size: 1.5rem;
}

img{
  height: 60px;
  max-width: 100%;
  display: block;
}

.one-item-container{
  display: grid;
  max-width: 1100px;
  grid-template-columns: 1fr 1fr;
  background-color: beige;
  padding: 0 3rem;
  border-radius: 2rem;
}

.two-item-container{
  display: grid;
  max-width: 1100px;
  grid-template-columns: 2fr 1fr 1fr;
  background-color: beige;
  padding: 0 3rem;
  border-radius: 2rem;
}

.more-item-container{
  display: grid;
  max-width: 1100px;
  grid-template-columns: repeat(4, 1fr);
  grid-template-rows: repeat(2,1fr);
  background-color: beige;
  padding: 0 3rem;
  border-radius: 2rem;
}

.header-container{
  padding: 2rem 6rem 0 0;
}

.header-container > * {
  margin-bottom: 1rem;
}

.more-header-container{
  padding: 2rem 6rem 0 0;
  grid-column: 1 / 3;
  grid-row: 1;
}
.more-header-container > * {
  margin-bottom: 1rem;
}

.card{
  margin: 1rem 0;
  padding: 0 1rem;
  position: relative;
  display: flex;
  flex-direction: column;
  cursor: pointer;
}

.card::before,
.card::after {
  content: "";
  position: absolute;
  inset: 0;
  height: 100%;
  box-shadow: inset 1.5px 0  var(--c, #e0b9da);
  mask: linear-gradient(var(--p, 0deg), #0000 45%, #000 55%);
  pointer-events: none;
}

.card::after {
  --c: #b6dae7;
  --p: 180deg;
}


.card img{
  margin-bottom: 2rem;
}

.card h3{
  margin-bottom: 1rem;
  line-height: 2rem;
}

.card p{
  font-size: 0.9rem;
}

.one-item-first-card{
  grid-column: 2;
}

.two-item-first-card{
  grid-column: 3;
  grid-row: 1;
}

.two-item-second-card{
  grid-column: 2 / 3;
  grid-row: 1;
}

.more-first-card{
  margin-bottom: calc(45%) ;
  grid-column: 4;
  grid-row:1 / 3;
}

.more-second-card{
  grid-column: 3 / 4;
  grid-row:1 / 3;
}

.third-card{
  grid-column: 2 / 3;
  grid-row: 1 / 3;
}

.fourth-card{
  grid-column: 1 / 2;
  grid-row: 1 / 3;
}


button {
  position: absolute;
  top:5rem;
  right:5rem;
  padding: 3rem;
}
<div class="container">
      <div class="header-container">
        <p>Solutions</p>
        <h2 id="cardTitle">
          Lorem ipsum dolor sit amet consectetur Lorem ipsum dolor sit amet
          consectetur adipisicing elit. Iure, tenetur.
        </h2>
      </div>
      <div class="card">
        <div class="card__image">
          <img
            src="/-/jssmedia/Eisai-Emea/Shared/Icons/icon-pills.svg?iar=0&amp;hash=1FDCEF23CA8F9B5C6E1327B9A6FD4DAF"
            alt="Product Information"
          />
        </div>
        <div class="card__text">
          <h3>Product Information</h3>
          <p>Learn about safety, administration, efficacy and more</p>
        </div>
      </div>
      <div class="card">
        <div class="card__image">
          <img
            src="/-/jssmedia/Eisai-Emea/Shared/Icons/icon-documents.svg?iar=0&amp;hash=13316F3944BF062DA0708F1A38BDFF3D"
            alt="Patient Information"
          />
        </div>
        <div class="card__text">
          <h3>Patient information material</h3>
          <p>Handouts, treatment guides, patient support material</p>
        </div>
      </div>
      <div class="card">
        <div class="card__image">
          <img
            src="/-/jssmedia/Eisai-Emea/Shared/Icons/icon-microscope.svg?iar=0&amp;hash=277AE31475485774CD0094CBB39EC102"
            alt="Clinical Studies second"
          />
        </div>
        <div class="card__text">
          <h3>Clinical Studies</h3>
          <p>Clinical trials, safety studies</p>
        </div>
      </div>
      <!-- <div class="card">
        <div class="card__image">
          <img
            src="/-/jssmedia/Eisai-Emea/Shared/Icons/icon-microscope.svg?iar=0&amp;hash=277AE31475485774CD0094CBB39EC102"
            alt="Webinars and eLearning"
          />
        </div>
        <div class="card__text">
          <h3>Webinars and eLearning</h3>
          <p>
            Get insights on pathophysiology, treatment and safety from experts
          </p>
        </div>
      </div>
    </div> -->

    <button>Resize</button>

And This is for 2

const mainContainer = document.querySelector('div');

const headerContainer = document.querySelector('.header-container');

let firstCard = document.querySelectorAll('.card')[0];
let secondCard = document.querySelectorAll('.card')[1];
let thirdCard = document.querySelectorAll('.card')[2];
let fourthCard = document.querySelectorAll('.card')[3];

const btn = document.querySelector('button')

btn.addEventListener('click', () => {
    let childCount = mainContainer.childElementCount;

    if(childCount == 2){
        mainContainer.setAttribute('class','one-item-container')

        firstCard.setAttribute('class','card one-item-first-card ')
    }
    else if(childCount == 3){
        
        mainContainer.setAttribute('class','two-item-container')

        firstCard.setAttribute('class','card two-item-first-card ')

        secondCard.setAttribute('class','card two-item-second-card ')
    }

    else if(childCount > 3){
        
        mainContainer.setAttribute("class","more-item-container");
        headerContainer.setAttribute("class","more-header-container");
        firstCard.setAttribute('class','card more-first-card ');
        secondCard.setAttribute('class','card more-second-card');
        thirdCard.setAttribute('class','card third-card');

        const cardH2Element =  document.getElementById('cardTitle')

        const titleHeight = parseInt(cardH2Element.offsetHeight);

        firstCard.style.marginTop = `${titleHeight + 40}px`
        secondCard.style.marginTop = `${titleHeight + 40}px`
        thirdCard.style.marginTop = `${titleHeight + 100}px`

        if(childCount == 5){
            fourthCard.setAttribute('class','card fourth-card');
            fourthCard.style.marginTop = `${titleHeight + 100}px`
        }
    }
})
*,
*::before,
*::after {
  box-sizing: border-box;
  margin: 0;
}

body{
  min-height: 100vh;
  background-color: grey;
  display: grid;
  place-content: center;
  font-family: Arial, Helvetica, sans-serif;
}

h2{
  font-weight:100;
  font-size: 2rem;
}

h3{
  font-size: 1.5rem;
}

img{
  height: 60px;
  max-width: 100%;
  display: block;
}

.one-item-container{
  display: grid;
  max-width: 1100px;
  grid-template-columns: 1fr 1fr;
  background-color: beige;
  padding: 0 3rem;
  border-radius: 2rem;
}

.two-item-container{
  display: grid;
  max-width: 1100px;
  grid-template-columns: 2fr 1fr 1fr;
  background-color: beige;
  padding: 0 3rem;
  border-radius: 2rem;
}

.more-item-container{
  display: grid;
  max-width: 1100px;
  grid-template-columns: repeat(4, 1fr);
  grid-template-rows: repeat(2,1fr);
  background-color: beige;
  padding: 0 3rem;
  border-radius: 2rem;
}

.header-container{
  padding: 2rem 6rem 0 0;
}

.header-container > * {
  margin-bottom: 1rem;
}

.more-header-container{
  padding: 2rem 6rem 0 0;
  grid-column: 1 / 3;
  grid-row: 1;
}
.more-header-container > * {
  margin-bottom: 1rem;
}

.card{
  margin: 1rem 0;
  padding: 0 1rem;
  position: relative;
  display: flex;
  flex-direction: column;
  cursor: pointer;
}

.card::before,
.card::after {
  content: "";
  position: absolute;
  inset: 0;
  height: 100%;
  box-shadow: inset 1.5px 0  var(--c, #e0b9da);
  mask: linear-gradient(var(--p, 0deg), #0000 45%, #000 55%);
  pointer-events: none;
}

.card::after {
  --c: #b6dae7;
  --p: 180deg;
}


.card img{
  margin-bottom: 2rem;
}

.card h3{
  margin-bottom: 1rem;
  line-height: 2rem;
}

.card p{
  font-size: 0.9rem;
}

.one-item-first-card{
  grid-column: 2;
}

.two-item-first-card{
  grid-column: 3;
  grid-row: 1;
}

.two-item-second-card{
  grid-column: 2 / 3;
  grid-row: 1;
}

.more-first-card{
  margin-bottom: calc(45%) ;
  grid-column: 4;
  grid-row:1 / 3;
}

.more-second-card{
  grid-column: 3 / 4;
  grid-row:1 / 3;
}

.third-card{
  grid-column: 2 / 3;
  grid-row: 1 / 3;
}

.fourth-card{
  grid-column: 1 / 2;
  grid-row: 1 / 3;
}


button {
  position: absolute;
  top:5rem;
  right:5rem;
  padding: 3rem;
}
 <div class="container">
      <div class="header-container">
        <p>Solutions</p>
        <h2 id="cardTitle">
          Lorem ipsum dolor sit amet consectetur Lorem ipsum dolor sit amet
          consectetur adipisicing elit. Iure, tenetur.
        </h2>
      </div>
      <div class="card">
        <div class="card__image">
          <img
            src="/-/jssmedia/Eisai-Emea/Shared/Icons/icon-pills.svg?iar=0&amp;hash=1FDCEF23CA8F9B5C6E1327B9A6FD4DAF"
            alt="Product Information"
          />
        </div>
        <div class="card__text">
          <h3>Product Information</h3>
          <p>Learn about safety, administration, efficacy and more</p>
        </div>
      </div>
      <div class="card">
        <div class="card__image">
          <img
            src="/-/jssmedia/Eisai-Emea/Shared/Icons/icon-documents.svg?iar=0&amp;hash=13316F3944BF062DA0708F1A38BDFF3D"
            alt="Patient Information"
          />
        </div>
        <div class="card__text">
          <h3>Patient information material</h3>
          <p>Handouts, treatment guides, patient support material</p>
        </div>
      </div>
</div>

<button>Resize</button>

there are several ways in which you can implement it,

Using flexbox and set widths

so, we would want to set the width that we want the cards to take a maximum, and for the title, we would set flex-wrap, so when it has no space the line breaks. Eventually, the lines would break so much that it is not readable, but you can adjust the size when the screen gets smaller with media queries.

in this example, the cards and their container have a set width.

@import url('https://fonts.googleapis.com/css2?family=Antonio:wght@100;200;300;400;500;600;700&family=Roboto:wght@300;400;500&display=swap');

* {
  box-sizing: border-box;
}

body {
  font-family: roboto, sans-serif;
}

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

.row {
  width: 100vw;
  display: flex;
  flex-direction: row;
  flex-grow: 1;
  height: 200px;
  justify-content: space-between;
  align-items: center;

  &__headers {
    display: flex;
    flex-direction: column;
    
  
    &__tagline {
      font-family: antonio, sans-serif;
      font-weight: 800;
      font-size: 14px;
      line-height: 1.5rem;
    }

    &__title {
      display: flex;
      font-weight: 400;
      font-size: 24px;
      max-width: 80%;
      flex-wrap: wrap;
    }
  }

  &__cards {
    display: flex;
    flex-direction: row;
    flex-grow: 1;
    justify-content: space-between;
    &__card {
      width: 200px;
      height: 100px;
      margin: 0 20px;
      background-color: #ef546d;
    }
  }
}
<div class="container">
    <div class="row">
    <div class="row__headers">
      <div class="row__headers__tagline">Solutions</div>
      <div class="row__headers__title">Improve the benefits that health care can provide</div>
    </div>
    <div class="row__cards">
      <div class="row__cards__card"></div>
    </div>
  </div>
    <div class="row">
    <div class="row__headers">
      <div class="row__headers__tagline">Solutions</div>
      <div class="row__headers__title">Improve the benefits that health care can provide</div>
    </div>
    <div class="row__cards">
      <div class="row__cards__card"></div>
      <div class="row__cards__card"></div>
    </div>
  </div>
    <div class="row">
    <div class="row__headers">
      <div class="row__headers__tagline">Solutions</div>
      <div class="row__headers__title">Improve the benefits that health care can provide</div>
    </div>
    <div class="row__cards">
      <div class="row__cards__card"></div>
      <div class="row__cards__card"></div>
      <div class="row__cards__card"></div>
    </div>
  </div>
    <div class="row">
    <div class="row__headers">
      <div class="row__headers__tagline">Solutions</div>
      <div class="row__headers__title">Improve the benefits that health care can provide</div>
    </div>
    <div class="row__cards">
      <div class="row__cards__card"></div>
      <div class="row__cards__card"></div>
      <div class="row__cards__card"></div>
      <div class="row__cards__card"></div>
    </div>
  </div>
</div>

using flexbox and flex-flow - title goes up

we will take advantage of the flexibility of flexbox and will set our row and row__cards flex-flow to row wrap (combination of flex-wrap and flex-direction). this results in the title going above the cards when it runs out of space and in the cards wrapping to a new line when they run out of space. you can take a look here

$title-max-width: 38%;  // You can change it to whatever you`d like
$card-size: 200px; 

* {
  box-sizing: border-box;
}

body {
  margin: 0;
}

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

.row {
  background-color: coral;
  padding: 20px;
  display: flex;
  flex-flow: row wrap;
  align-items: center;
  justify-content: space-between;
  
  &__headers {
    max-width: $title-max-width;
  }
  
  &__cards {
    display: flex;
    flex-flow: row wrap;
    flex-grow: 1;
    justify-content: space-evenly;
    padding: 20px;
    
    &__card {
      background-color: white;
      height: $card-size;
      width: $card-size;
    }
  }
}
<div class="container">
  <div class="row">
    <div class="row__headers">
      <div class="row__headers__tagline">solutions</div>
      <div class="row__headers__title">
        Improve the benefits that health care can provide
      </div>
    </div>
    <div class="row__cards">
      <div class="row__cards__card">
        <div class="row__cards__card__text"></div>
      </div>
    </div>
  </div>
  <div class="row">
    <div class="row__headers">
      <div class="row__headers__tagline">solutions</div>
      <div class="row__headers__title">
        Improve the benefits that health care can provide
      </div>
    </div>
    <div class="row__cards">
      <div class="row__cards__card">
        <div class="row__cards__card__text"></div>
      </div>
      <div class="row__cards__card">
        <div class="row__cards__card__text"></div>
      </div>
    </div>
  </div>
  <div class="row">
    <div class="row__headers">
      <div class="row__headers__tagline">solutions</div>
      <div class="row__headers__title">
        Improve the benefits that health care can provide
      </div>
    </div>
    <div class="row__cards">
      <div class="row__cards__card">
        <div class="row__cards__card__text"></div>
      </div>
      <div class="row__cards__card">
        <div class="row__cards__card__text"></div>
      </div>
      <div class="row__cards__card">
        <div class="row__cards__card__text"></div>
      </div>
    </div>
  </div>
  <div class="row">
    <div class="row__headers">
      <div class="row__headers__tagline">solutions</div>
      <div class="row__headers__title">
        Improve the benefits that health care can provide
      </div>
    </div>
    <div class="row__cards">
      <div class="row__cards__card">
        <div class="row__cards__card__text"></div>
      </div>
      <div class="row__cards__card">
        <div class="row__cards__card__text"></div>
      </div>
      <div class="row__cards__card">
        <div class="row__cards__card__text"></div>
      </div>
      <div class="row__cards__card">
        <div class="row__cards__card__text"></div>
      </div>
    </div>
  </div>
</div>


let me know if it doesn't fit your needs!

Related