I have an input
in a flex container in Chrome and it does not respect the width of the container unless I add a min-width: 0
. This seems to work properly in IE.
What is going on here?
.input-with-button {
display: flex;
width: 100px;
border: 5px solid blue;
margin-bottom: 10px;
}
.input-with-button input {
flex-basis: 100%;
}
<div class='input-with-button'>
<div>Test</div>
</div>
<div class='input-with-button'>
<input>
</div>
The reason it works in IE is because it picks up the flex-basis: 100%
, but it shouldn't.
The reason it overflows in Chrome (and should in IE), is that a flex item can't by default be smaller than its content since its min-width
is set to auto
, and in this case form
elements, such as input
, have a default width set using the browsers built it style sheet.
The reason min-width: 0
works, is when set to 0
the flex item will, since its flex-shrink value is 1
(the default), be allowed to shrink, and does to adjust to its parent's width.
Stack snippet
.input-with-button {
display: flex;
width: 100px;
border: 5px solid blue;
margin-bottom: 10px;
}
.input-with-button input {
flex-basis: 100%;
min-width: 0; /* added */
}
<div class='input-with-button'>
<div>Test</div>
</div>
<div class='input-with-button'>
<input>
</div>
As a side note, and as been mentioned in other answer(s), changing the default width of the element would of course also be an option, whether it is a form
element or not.
Stack snippet
.input-with-button {
display: flex;
width: 100px;
border: 5px solid blue;
margin-bottom: 10px;
}
.input-with-button input {
/*flex-basis: 100%; removed */
width: 100%; /* added */
}
<div class='input-with-button'>
<div>Test</div>
</div>
<div class='input-with-button'>
<input>
</div>
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