Как сделать элементы flexbox равными по высоте и / или начать в одной точке - PullRequest
1 голос
/ 10 апреля 2019

Я создаю карты flexbox для отображения трех элементов. Название, <hr> и абзац. Длина текста заголовка варьируется, что создает различную высоту.

Я бы хотел, чтобы все заголовки имели одинаковую высоту, чтобы каждая карта была одинаковой. Если это невозможно, я бы хотел, чтобы абзацы были выровнены по горизонтали на каждой карточке.

Я пытался присвоить заголовку свойство flex: 1 для перемещения абзаца вниз, но оно создает слишком много места.

Вот кодовый код и демоверсия:

  body {
  max-width: 1180px;
  margin: 0 auto;
  }
  h2,
  p {
  margin: 0;
  padding: 0;
  }
  h2 {
  font-size: 18px;
  }
  /*******************************************************/
  .cards {
    display: flex;
  }
  .card {
    border: 1px solid;
    display: flex;
    flex-direction: column;
    margin: 0 0 25px 0;
    width: 50%;
  }
  .card-title {
    text-transform: uppercase;
    text-align: center;
    margin: 0 0 25px 0;
  }
  .card-paragraph {
    text-align: center;
  }
  hr {
    height: 3px;
    width: 100%;
    background: #333;
  }
  /*******************************************************/
<body>

  <div class="cards">
    <div class="card">
      <div class="card-title">
        Title one IS LONGER THAN TITLE TWO
      </div>
      <hr>
      <div class="card-paragraph">  
        Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum is simply dummy text.
      </div>
    </div>
    <div class="card">
      <div class="card-title">
        TITLE TWO
      </div>
      <hr>
      <div class="card-paragraph">  
        Lorem Ipsum is simply dummy text of the printing and typesetting industry.
      </div>
    </div>
  </div>
  
</body>

Что я хочу :

enter image description here

Что происходит :

enter image description here

Ответы [ 3 ]

2 голосов
/ 10 апреля 2019

Выравнивание смежных контейнеров flexbox может оказаться невозможным - CSS Grid может быть хорошим выбором:

  • используйте display: contents на card или полностью удалите обертку

  • используйте сетку из 2 столбцов и поместите card-title в первую строку, используя grid-row: 1

  • поместите card-paragraph в третий ряд, используя grid-row: 3, и поместите hr между ними, используя grid-row: 2.

См. Демо ниже:

body {
  max-width: 1180px;
  margin: 0 auto;
}

h2,
p {
  margin: 0;
  padding: 0;
}

h2 {
  font-size: 18px;
}

.cards {
  /* display: flex; */
  display: grid;
  grid-template-columns: 1fr 1fr;
}

.card {
  /* border: 1px solid;
  display: flex;
  flex-direction: column;
  margin: 0 0 25px 0;
  width: 50%;*/
  display: contents; /* added */
}

.card-title {
  text-transform: uppercase;
  text-align: center;
  /* margin: 0 0 25px 0;*/
  grid-row: 1; /* added */
  border: 1px solid;  /* added */
}

.card-paragraph {
  text-align: center;
  grid-row: 3; /* added */
  border: 1px solid;  /* added */
}

hr {
  height: 3px;
  /* width: 100%; */
  background: #333;
  margin: 0; /* added */
  grid-row: 2; /* added */
}
<div class="cards">
    <div class="card">
      <div class="card-title">
        Title one IS LONGER THAN TITLE TWO
      </div>
      <hr>
      <div class="card-paragraph">
        Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum is simply dummy text.
      </div>
    </div>
    <div class="card">
      <div class="card-title">
        TITLE TWO
      </div>
      <hr>
      <div class="card-paragraph">
        Lorem Ipsum is simply dummy text of the printing and typesetting industry.
      </div>
    </div>
  </div>
2 голосов
/ 10 апреля 2019

Я бы предложил CSS Grid для чего-то вроде этого:

body {
  max-width: 1180px;
  margin: 0 auto;
}

h2,
p {
  margin: 0;
  padding: 0;
}

h2 {
  font-size: 18px;
}


/*******************************************************/

.cards {
  display: grid;
  grid-auto-columns: auto;
  grid-auto-rows: auto;
}

.card {
  border: 1px solid;
  grid-row: 1;
  display: grid;
  grid-auto-rows: 1fr;
}

.card-title {
  text-transform: uppercase;
  text-align: center;
  margin: 0 0 25px 0;
}

.card-paragraph {
  text-align: center;
}

hr {
  height: 3px;
  width: 100%;
  background: #333;
}


/*******************************************************/
<body>

  <div class="cards">
    <div class="card">
      <div class="card-title">
        Title one IS LONGER THAN TITLE TWO Title one IS LONGER THAN TITLE TWO Title one IS LONGER THAN TITLE TWO
      </div>
      <hr>
      <div class="card-paragraph">
        Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum is simply dummy text.
      </div>
    </div>
    <div class="card">
      <div class="card-title">
        TITLE TWO
      </div>
      <hr>
      <div class="card-paragraph">
        Lorem Ipsum is simply dummy text of the printing and typesetting industry.
      </div>
    </div>
  </div>

</body>
1 голос
/ 10 апреля 2019

Это возможно с flexbox, только установив высоту заголовка: .card-title { ... height: 50px; } Codepen

...