Flex align-items не работает с flex-wrap?

Иногда мне кажется, что Flex слишком сложен.

Демо: https://jsfiddle.net/304xhguw/

Я пытаюсь создать контейнер с несколькими строками текста в конце:

С Flex это должно быть очень просто, верно?

div {
  display: flex;
  align-items: flex-end;
  padding: 20px;
  height: 300px;
  background: #222;
  flex-wrap: wrap;
}

h1 {
  width: 100%;
}

h1, p {
  color: #fff;
}

Готово, контейнер использует flex, выравнивает элементы в конце, а h1 создает новую строку из-за wrap и width из 100%. Идеальный.

Не совсем:

Подождите, что здесь только что произошло? <p> выравнивается по низу, а <h1> - нет? Но у родительского контейнера есть align-items: flex-end;, что это за колдовство?

Не волнуйтесь, есть удивительные свойства, которые должны работать, давайте попробуем:

h1 { align-self: flex-end; }

Ничего не меняется, хм, ладно, тогда, может быть:

h1 { align-self: end; }

Ладно, какого черта теперь?

Пожалуйста, кто-нибудь может объяснить мне, что, черт возьми, здесь произошло и почему Flex настолько глупо неинтуитивен? Я мог бы сделать это, используя старый добрый position: relative или даже tables (знаю, знаю...) за 20 секунд. Мне кажется, или Flexbox кажется отличным мощным инструментом, который является излишним и головной болью в ~ 95% самых простых случаев?

Примечание. Я НЕ ХОЧУ ДОБАВЛЯТЬ КАКИЕ-ЛИБО ДОПОЛНИТЕЛЬНЫЕ Обертки DIVS ИЛИ КОНТЕЙНЕРЫ. Я чувствую, что обернуть h1 и p в div, а затем выровнять их было бы довольно легко, но я не использую Flex в 2021 году для добавления ненужной разметки.

Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Введение в 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. Это простой сайт, ничего вычурного. Основная цель -...
CSS: FlexBox
CSS: FlexBox
Ранее разработчики использовали макеты с помощью Position и Float. После появления flexbox сценарий полностью изменился.
0
0
1 306
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Альтернативное решение для этого с flex, используйте направление flex как столбец

div {
display: flex;
flex-direction:column;
justify-content: flex-end;
padding: 20px;
height: 300px;
background: #222;
flex-wrap: wrap;
}
Ответ принят как подходящий

Редактировать 1:

Я забыл упомянуть в исходном ответе о flex-wrap, что, когда он включен, элементы строки завернуты и создается многострочный flexbox. В том случае, когда вы выравниваете содержимое (я не упомянул элементы, так как вы хотите учитывать все элементы, а не только элементы, которые находятся в одной строке), вам нужно использовать align-content: flex-end.

Это упакует все многострочные элементы, встречающиеся в вашем гибком макете, в конце flexbox, а ваши элементы будут выровнены внизу.

Когда вы использовали align-items: flex-end, flexbox выравнивал элементы на основе строк, на которых был размещен элемент.

Когда вы использовали align-items: flex-end, элементы выравниваются в соответствии с их строкой.

Heading
--------- // line 1
Paragraph
--------- // line 2

А когда вы использовали align-content: flex-end, строки перемещаются вниз.

Heading
Paragraph
--------- // multi lines are packed at the end of the flexbox

Вот рабочий пример для вас:

body { margin: 0; padding: 0; }

div {
  display: flex;
  align-content: flex-end;
  padding: 20px;
  height: 300px;
  background: #222;
  flex-wrap: wrap;
}

h1 {
  width: 100%;
}

h1, p {
  color: #fff;
}
<div>
  <h1>Header something something something header more of header and more and more</h1>
  <p>Just some content at the end of the div not sure what more to write</p>
</div>

https://jsfiddle.net/h9ykz0ue/


В вашем коде действительно нет проблем. Я бы рекомендовал вам использовать align-items: flex-end; вместо align-items: end; в вашем гибком контейнере.

Проблема, с которой вы сталкиваетесь здесь, - это маржа. И <h1>, и <p> имеют свои поля.

Так как эти элементы рендерятся рядом из-за гибкой компоновки (но визуально они расположены вертикально, благодаря flex-wrap). Также свертывание полей не отображается в вашем макете, поскольку оно не поддерживается в гибких макетах, оно появляется только в блочных макетах.

Я бы порекомендовал вам вместо flex-wrap: wrap использовать flex-direction: column с justify-content: flex-end следующим образом:

div {
  .
  .
  flex-direction: column;
  justify-content: flex-end;
  .
  .
}

Вот краткая демонстрация того, о чем я говорил:

body {
  margin: 0;
  padding: 0;
}

div {
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
  padding: 20px;
  height: 300px;
  background: #222;
}

h1 {
  width: 100%;
}

h1, p {
  color: #fff;
}

p {
  margin: 0;
}
<div>
  <h1>Header something something something header more of header and more and more</h1>
  <p>Just some content at the end of the div not sure what more to write</p>
</div>

Здесь я также удалил поле <p>, чтобы <h1> было ближе к нему. Если не нужно, вы можете удалить стиль.

Спасибо, но я думаю, что вы можете ошибаться здесь, удаление полей не помогает, поэтому проблема должна быть где-то еще: jsfiddle.net/pno45L3c

Wordpressor 15.12.2020 13:38

Можете ли вы уточнить ваше требование. Что вы ожидаете здесь?

Prathamesh Koshti 15.12.2020 13:39

Вот проверьте это: jsfiddle.net/z6hopvqw, нужно изменить не только маржу, но и flex-направление. Маржа здесь необязательна!

Prathamesh Koshti 15.12.2020 13:43

Пожалуйста, прочитайте весь ответ, я объяснил это подробно

Prathamesh Koshti 15.12.2020 13:45

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

Wordpressor 15.12.2020 14:22

Несмотря на то, что вы приняли это, позвольте мне обновить свой ответ, у меня есть другое решение вашей проблемы с изменением только одной строки css.

Prathamesh Koshti 15.12.2020 14:30

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

Prathamesh Koshti 15.12.2020 14:55

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