Flexbox: неправильный расчет ширины при гибком направлении: столбец, flex-wrap: wrap
У меня возникла проблема при использовании flexbox.
Я использую контейнер с flex-direction: column; flex-wrap: wrap
, поэтому мои внутренние элементы могут быть помещены в несколько столбцов.
Проблема заключается в том, что браузер по-прежнему вычисляет ширину контейнера как сумму внутренних элементов ширины!
Мой контейнерный блок должен иметь меньшую ширину (в зависимости от размера содержимого), но на самом деле он огромен.
В любом случае, очень неестественно вычислять ширину контейнера при использовании столбцов, а не строк.
Взгляните на зеленый блок в моем коде. У этого есть огромный, но он не должен иметь так. Кроме того, он становится меньше при удалении элемента из контейнера.
Я ожидаю, что контейнер будет иметь небольшую ширину, поэтому он не займет больше половины свободного места.
Проверено это на последних версиях Safari и Chrome на последней версии ОС.
JSFiddle
.container {
display: flex;
flex-wrap: wrap;
flex-direction: column;
background: #aa0000;
height: 100px;
}
.group {
display: flex;
flex-wrap: wrap;
flex-direction: column;
align-content: flex-start;
}
.g1 {
background: #00aa00;
}
.g2 {
background: #0000aa;
}
<div class="container">
<div class="group g1">
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
</div>
<div class="group g2">
<div class="item">Item</div>
</div>
</div>
Ответы
Ответ 1
Это, по-видимому, еще одна ошибка в Flex Lay Box Module, включающая flex-direction: column
и flex-wrap: wrap
.
Браузеры, кажется, повсюду в этом вопросе.
В этом конкретном случае, как указано в сообщении :
Мне кажется, что ширина вычисляется так, как если бы внутренние элементы были расположены горизонтально (flex-direction: row
) вместо вертикали.
В других случаях происходит обратное:
В обоих случаях в настоящее время нет гибких методов для решения проблемы.
Для этого конкретного вопроса один разработчик предлагает обходной путь CSS, но я не уверен, что он работает во всех браузерах. Я бы не рекомендовал его, если вы действительно не в отчаянии:
В некоторых случаях вы можете решить эту проблему, используя вертикальный режим записи.
То есть вместо использования flex-direction: column;
используйте flex-direction: row; writing-mode: vertical-lr;
. Помните resetдо writing-mode: initial;
в дочерних элементах flexbox.
https://bugs.chromium.org/p/chromium/issues/detail?id=507397
Отчеты об ошибках:
Ответ 2
У вас нет предварительно заданной ширины, чтобы он зарегистрировал его как поле ширины 50%. Как правило, вы задали ширину в группе g1, а затем flex: 1; в группе g2
Ответ 3
хорошо. две группы имеют ширину 50%
(половина) своего родительского .container
, который по умолчанию имеет width:100%
тела. поэтому, если вы хотите, чтобы ваши столбцы были меньше, либо уменьшите размер .container
, либо уменьшите одну группу, например .g1
width :30%
см. оба примера ниже:
.container {
display: flex;
flex-wrap: wrap;
flex-direction: column;
background: #aa0000;
height: 100px;
}
.group {
display: flex;
flex-wrap: wrap;
flex-direction: column;
align-content: flex-start;
}
.g1 {
background: #00aa00;
width:30%;
}
.g2 {
background: #0000aa;
/*flex:1; could also use this*/
}
<div class="container">
<div class="group g1">
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
</div>
<div class="group g2">
<div class="item">Item</div>
</div>
</div>