Иногда мне кажется, что 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 году для добавления ненужной разметки.
Альтернативное решение для этого с flex, используйте направление flex как столбец
div {
display: flex;
flex-direction:column;
justify-content: flex-end;
padding: 20px;
height: 300px;
background: #222;
flex-wrap: wrap;
}
Я забыл упомянуть в исходном ответе о 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/z6hopvqw, нужно изменить не только маржу, но и flex-направление. Маржа здесь необязательна!
Пожалуйста, прочитайте весь ответ, я объяснил это подробно
Ваш ответ совершенно прекрасен, и я приму его, хотя я пытался узнать что-то новое, и я до сих пор не совсем понимаю, почему мне нужно использовать макет «столбца» для данных, у которых вообще нет столбцов. Flexbox действительно странный.
Несмотря на то, что вы приняли это, позвольте мне обновить свой ответ, у меня есть другое решение вашей проблемы с изменением только одной строки css.
Я обновил свой ответ, в этом вам не нужно заставлять себя использовать макет столбца, просто измените одно слово, и оно сработает для вас. Если что-то не понятно сообщите мне, я постараюсь объяснить это более понятно
Спасибо, но я думаю, что вы можете ошибаться здесь, удаление полей не помогает, поэтому проблема должна быть где-то еще: jsfiddle.net/pno45L3c