Очень короткая предыстория
Моя история начинается с попытки заставить overflow-wrap: break-word;
работать во флексбоксе. Контейнер Flexbox не хотел понимать, что его элемент можно сжать, несмотря на то, что элемент может разбить длинные слова:
.body {
width: 300px;
border: 1px solid black;
padding: 8px;
background-color: #ccc;
}
.flex-column {
display: flex;
}
.item {
overflow-wrap: break-word;
background-color: #fff;
padding: 8px;
}
<div class="body">
<div class="flex-column">
<div class="item">
This is Spaaaaaaaaaaaaaaaarrrrrrrrrrrrrttttttttttttttaaaaaaaaaaaaaaaaaaaaaa!11 It's not a bug. Firefox is correctly implementing min-width: auto for flex items. When you change it to min-width: 0, you're just using a different value for min-width to get your example looking how you want it to look. But both values are being rendered correctly.
</div>
</div>
</div>
К счастью, мы можем помочь flexbox понять, что он может уменьшить свой элемент, используя min-width: 0;
для элемента:
.body {
width: 300px;
border: 1px solid black;
padding: 8px;
background-color: #ccc;
}
.flex-column {
display: flex;
}
.item {
overflow-wrap: break-word;
background-color: #fff;
padding: 8px;
/* Okay, it fixes this */
min-width: 0;
}
<div class="body">
<div class="flex-column">
<div class="item">
This is Spaaaaaaaaaaaaaaaarrrrrrrrrrrrrttttttttttttttaaaaaaaaaaaaaaaaaaaaaa!11 It's not a bug. Firefox is correctly implementing min-width: auto for flex items. When you change it to min-width: 0, you're just using a different value for min-width to get your example looking how you want it to look. But both values are being rendered correctly.
</div>
</div>
</div>
Однако реальный мир немного сложнее.
проблема
В нашем приложении у нас много вложенных флексбоксов. Так что пример должен выглядеть так:
.body {
width: 300px;
border: 1px solid black;
padding: 8px;
background-color: #ccc;
}
.flex {
display: flex;
}
.flex-column {
display: flex;
}
.item {
min-width: 0;
padding: 8px;
background-color: #fff;
overflow-wrap: break-word;
}
<div class="body">
<div class="flex">
<div class="flex">
<div class="flex">
<div class="flex-column">
<div class="item">
This is Spaaaaaaaaaaaaaaaarrrrrrrrrrrrrttttttttttttttaaaaaaaaaaaaaaaaaaaaaa!11 It's not a bug. Firefox is correctly implementing min-width: auto for flex items. When you change it to min-width: 0, you're just using a different value for min-width to get your example looking how you want it to look. But both values are being rendered correctly.
</div>
</div>
</div>
</div>
</div>
</div>
</div>
Как видите, контейнер flex
нашего flex-column
игнорирует тот факт, что его дочерние элементы могут очень хорошо сжиматься. Я не понимаю, почему так себя ведет. Не могли бы вы объяснить это мне? Почему flexbox-контейнер не уважает его дочерний flexbox min-width: 0
?
Решение, которое я нашел, состоит в том, чтобы установить min-width: 0
на все flexbox в иерархии, что выглядит очень странно и опасно, потому что я могу сломать макет нашего приложения в неожиданных местах.