I've been having a few issues with flex boxes and having them span out of their container as the text/content grows, and only applying ellipses when a specified max-width of the container is reached.
This isn't ideal because the parent container can shrink to x pixels and the text just forces it to grow to the max-width which I do not want.
Looking at this fiddle,
if I remove overflow: hidden from child1 and apply it to main, the text will just be cut off.
If I remove overflow: hidden from main and apply it to child1, the behaviour I want is achieved.
If I remove overflow: hidden from both of them, the container and text just go on forever.
I just want to know why applying overflow: hidden to child1 produces the desired behaviour. Shouldn't the text just cut off as it did with overflow on main?
.main {
display: flex;
border: 1px solid black;
height: 200px;
padding: 10px;
//overflow: hidden;
}
.child1 {
display: flex;
border: 1px solid red;
height: 100px;
overflow: hidden;
}
.child2 {
flex: 1 1 auto;
text-align: center;
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
}
<div class="main">
<div class="child1">
<div class="child2">
Lots of words Lots of wordsLots of wordsLots of wordsLots of wordsLots of wordsLots of wordsLots of wordsLots of wordsLots of wordsLots of wordsLots of wordsLots of wordsLots of wordsLots of wordsLots of wordsLots of wordsLots of
</div>
</div>
</div>
That's because Flexbox introduces a new initial value for min-width and min-height: auto.
When you have the initial overflow: visible, min-width: auto computes to the width of the contents of the flex item (see the exact rules).
But when you use a different overflow, min-width: auto will compute to 0.
In your case, .child1 is a flex item. So by default it will be at least as wide as its contents. It can even overflow its container, in that case .main's overflow will be taken into account.
But if you want to prevent .main from growing too much, you can
Use a non-visible overflow, as you observed. This will make min-width: auto compute to 0.
.main {
display: flex;
border: 1px solid black;
height: 200px;
padding: 10px;
}
.child1 {
overflow: hidden;
display: flex;
border: 1px solid red;
height: 100px;
}
.child2 {
flex: 1 1 auto;
text-align: center;
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
}
<div class="main">
<div class="child1">
<div class="child2">
Lots of words Lots of wordsLots of wordsLots of wordsLots of wordsLots of wordsLots of wordsLots of wordsLots of wordsLots of wordsLots of wordsLots of wordsLots of wordsLots of wordsLots of wordsLots of wordsLots of wordsLots of
</div>
</div>
</div>
Don't make .child a flex item. This will make min-width: auto compute to 0.
.main {
border: 1px solid black;
height: 200px;
padding: 10px;
}
.child1 {
display: flex;
border: 1px solid red;
height: 100px;
}
.child2 {
flex: 1 1 auto;
text-align: center;
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
}
<div class="main">
<div class="child1">
<div class="child2">
Lots of words Lots of wordsLots of wordsLots of wordsLots of wordsLots of wordsLots of wordsLots of wordsLots of wordsLots of wordsLots of wordsLots of wordsLots of wordsLots of wordsLots of wordsLots of wordsLots of wordsLots of
</div>
</div>
</div>
Set min-width: 0 manually
.main {
display: flex;
border: 1px solid black;
height: 200px;
padding: 10px;
}
.child1 {
min-width: 0;
display: flex;
border: 1px solid red;
height: 100px;
}
.child2 {
flex: 1 1 auto;
text-align: center;
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
}
<div class="main">
<div class="child1">
<div class="child2">
Lots of words Lots of wordsLots of wordsLots of wordsLots of wordsLots of wordsLots of wordsLots of wordsLots of wordsLots of wordsLots of wordsLots of wordsLots of wordsLots of wordsLots of wordsLots of wordsLots of wordsLots of
</div>
</div>
</div>
When you apply overflow: hidden to .main, this clips .child1 but not .child2 (the div with text).
So .child2 overflows .main because there is no overflow: hidden on .child1 (demo).
To understand this better, try overflow: scroll on .main instead of hidden.
When you use overflow: hidden on .child1, this clips .child2.
Now the width of .child2 is limited, and ellipsis works as intended (demo).
Again, this can be illustrated more clearly with overflow: scroll on .main.
Also keep in mind, the overflow property applies only to content of a block container.
From the spec:
11.1.1 Overflow: the
overflowpropertyThis property specifies whether content of a block container element is clipped when it overflows the element's box. It affects the clipping of all of the element's content except any descendant elements (and their respective content and descendants) whose containing block is the viewport or an ancestor of the element.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With