Handling Overflow in Flexbox: Preventing Fixed-Width Elements from Being Crushed
This article explains why a flex:1 element can cause a fixed-width sibling to be squeezed when its child exceeds the container width, and presents solutions such as using overflow:hidden, width:0, min-width:0, and analogous vertical-direction fixes.
In front‑end development we often encounter a layout where a container holds two elements: element A with a fixed width and element B that should adapt to the remaining space.
We can quickly write CSS for this:
<div class="card-content-wrap">
<div class="left">左边元素固定宽度308px------------------</div>
<div class="right">
右边元素flex:1
</div>
</div>
<style lang="less" scoped>
.card-content-wrap {
width: 1000px;
border: 1px solid blue;
display: flex;
justify-content: space-between;
.left {
width: 308px;
margin-right: 16px;
}
.right {
flex: 1;
}
}
</style>The flex: 1 property makes the right element occupy the remaining space.
Problem Description
When the adaptive element contains a child whose width exceeds the parent, the fixed‑width element gets squeezed.
“Child element too wide, causing left fixed element to be compressed:”
<div class="card-content-wrap">
<div class="left">左边元素固定宽度308px------------------</div>
<div class="right">
右边元素flex:1
<div style="width: 920px; border: 1px #ff2d2d solid">子元素较大,导致左侧固定元素被挤压</div>
</div>
</div>“Child element extremely wide, left element squeezed and right element overflows the safe area:”
<div class="card-content-wrap">
<div class="left">左边元素固定宽度308px------------------</div>
<div class="right">
右边元素flex:1
<div style="width: 1220px; border: 1px #ff2d2d solid">子元素宽度过大,导致父元素被挤出屏幕</div>
</div>
</div>How can we elegantly solve this?
Solution
Use overflow: hidden
Setting overflow: hidden on the flex:1 element’s parent resolves the issue, though it is unsuitable when a scrollbar is needed.
.card-content-wrap {
width: 1000px;
border: 1px solid blue;
display: flex;
justify-content: space-between;
.left {
width: 308px;
margin-right: 16px;
}
.right {
flex: 1;
overflow: hidden;
}
}Use width:0
This is the best solution.
.card-content-wrap {
width: 1000px;
border: 1px solid blue;
display: flex;
justify-content: space-between;
.left {
width: 308px;
margin-right: 16px;
}
.right {
flex: 1;
width: 0;
}
}It also works when the parent needs a scrollbar.
.right {
flex: 1;
width: 0;
overflow: auto;
}Use min-width:0
The effect of min-width:0 is identical to width:0.
.right {
flex: 1;
min-width: 0;
overflow: auto;
}Vertical direction layout
The same issue appears in vertical flex layouts.
Solutions are analogous: set overflow: hidden, or height: 0, or min-height: 0 on the flex item.
.bottom{
flex: 1;
overflow: hidden;
} .bottom{
flex: 1;
height: 0;
} .bottom{
flex: 1;
min-height: 0;
}Root Cause
The flex: 1 shorthand combines flex-grow, flex-shrink and flex-basis. By default browsers set min-width:auto and min-height:auto on flex items, preventing them from shrinking smaller than their content. Overriding with min-width:0 (or width:0) allows the flex item to shrink correctly.
Signed-in readers can open the original source through BestHub's protected redirect.
This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactand we will review it promptly.
Rare Earth Juejin Tech Community
Juejin, a tech community that helps developers grow.
How this landed with the community
Was this worth your time?
0 Comments
Thoughtful readers leave field notes, pushback, and hard-won operational detail here.
