CSS - не позволяйте новым строкам текста нарушать выравнивание flex

У меня есть следующий CSS, который позволяет мне создать строку, которая переносится в зависимости от размера экрана. Если места достаточно, все элементы отображаются в одной строке, в противном случае они переносятся на следующую строку с правильным выравниванием.

Моя проблема в том, что у меня есть текст описания под каждым «квадратным» div. Если этот текст состоит только из одной строки, проблем нет, но если этот текст состоит из 2 или более строк, квадрат, находящийся под ним, поднимается вверх и больше не выравнивается со своими братьями и сестрами. Как я могу предотвратить это? Я включил пример кода в виде фрагмента, его проще всего открыть в полноэкранном режиме, чтобы увидеть, о чем я говорю. Я хочу, чтобы вершины квадратов всегда были выровнены

.flex-row {
  display: flex;
  flex-direction: row;
  justify-content: space-evenly;
  flex-wrap: wrap;
  align-self: stretch;
}

.flex-col {
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
  align-items: center;
}

.sub-row {
  display: flex;
  flex-direction: row;
  justify-content: space-evenly;
  width: 300px;
}

.square {
  height: 250px;
  width: 250px;
  background-color: #900;
}
<body>
  <div class = "flex-row">
    <div class = "flex-col">
      <div class = "square">
      </div>
      <div class = "sub-row">
        <p>
          Placeholder text Placeholder text Placeholder text Placeholder text Placeholder text
        </p>
        <p>
          00
        </p>
      </div>
    </div>
        <div class = "flex-col">
      <div class = "square">
      </div>
      <div class = "sub-row">
        <p>
          Placeholder text
        </p>
        <p>
          00
        </p>
      </div>
    </div>
        <div class = "flex-col">
      <div class = "square">
      </div>
      <div class = "sub-row">
        <p>
          Placeholder text
        </p>
        <p>
          00
        </p>
      </div>
    </div>
        <div class = "flex-col">
      <div class = "square">
      </div>
      <div class = "sub-row">
        <p>
          Placeholder text
        </p>
        <p>
          00
        </p>
      </div>
    </div>
  </div>
</body>

Я пытался обосновать столбцы для flex-start и flex-end, но это не работает. Я также пытался использовать свойство align self для самого элемента p, но я не могу выровнять квадраты, если текст занимает 2 или более строк.

Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
3
0
1 102
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Дайте align-items: flex-startflex-row (это переопределяет поведение дефолтstretch).

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

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

.flex-row {
  display: flex;
  flex-direction: row;
  justify-content: space-evenly;
  flex-wrap: wrap;
  /* align-self: stretch;*/
  align-items: flex-start; /* ADDED */
}

.flex-col {
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
  align-items: center;
}

.sub-row {
  display: flex;
  flex-direction: row;
  justify-content: space-evenly;
  width: 300px;
}

.square {
  height: 250px;
  width: 250px;
  background-color: #900;
}
<body>
  <div class = "flex-row">
    <div class = "flex-col">
      <div class = "square">
      </div>
      <div class = "sub-row">
        <p>
          Placeholder text Placeholder text Placeholder text Placeholder text Placeholder text
        </p>
        <p>
          00
        </p>
      </div>
    </div>
        <div class = "flex-col">
      <div class = "square">
      </div>
      <div class = "sub-row">
        <p>
          Placeholder text
        </p>
        <p>
          00
        </p>
      </div>
    </div>
        <div class = "flex-col">
      <div class = "square">
      </div>
      <div class = "sub-row">
        <p>
          Placeholder text
        </p>
        <p>
          00
        </p>
      </div>
    </div>
        <div class = "flex-col">
      <div class = "square">
      </div>
      <div class = "sub-row">
        <p>
          Placeholder text
        </p>
        <p>
          00
        </p>
      </div>
    </div>
  </div>
</body>

это кажется очевидным в ретроспективе, но я испытываю трудности с гибкостью, большое спасибо, это вызывало у меня головную боль. Вопрос, почему строка все равно заполняет ширину экрана без align-self stretch? Я думал, что мне это нужно, чтобы правильно применить выравнивание контента или, по крайней мере, как width: 100% или flex: 1 или что-то в этом роде.

Robbie Milejczak 27.02.2019 18:27

это потому, что ваши square и sub-row имеют ширину определенный, поэтому они заполняют строку, а затем оборачивают...

kukkuz 27.02.2019 18:28

но даже при отображении всего одного квадрата основная строка заполняет всю ширину экрана. Даже если я удалю все свойства ширины и оставлю единственный текстовый узел, он будет правильно оправдан

Robbie Milejczak 27.02.2019 19:14

при отображении одного квадрата он выравнивается по строке с помощью justify-content: space-evenly, который добавляется в ваш flexbox...

kukkuz 27.02.2019 19:33

Почему вы заканчиваете каждое свое утверждение многоточием? Насколько я понимаю, гибкий контейнер не будет иметь полную ширину, если она не указана, поэтому свойство justify-content не должно ничего делать, поскольку ширина — это просто ширина содержимого. Очевидно, я неправильно понимаю, но вы не хотите или не можете помочь, поэтому у меня больше нет к вам вопросов, спасибо за ваш ответ.

Robbie Milejczak 27.02.2019 19:44

Эй, чувак, здесь уже больше 12 часов, и я слишком сонный, извини, если ты считаешь, что я бесполезен. display: flex — это элемент блочного уровня (также есть версия inline-flex). Если у вас есть один гибкий элемент во флексбоксе, он получает полную ширину области просмотра до сгибаться. А многоточие - это привычка :)

kukkuz 27.02.2019 19:54

вы были очень полезны, и даже больше с этим объяснением. Думаю, у меня есть привычка раздражаться многоточием, лол, никаких обид

Robbie Milejczak 27.02.2019 21:42

Другие вопросы по теме