I am seeing some strange behavior in Firefox in regards to form select fields.
Depending on viewport width, a select with, say, a width of 33.333%
will sometimes have its right borders cut off.
please see this fiddle for an example: http://jsfiddle.net/pjv0adhw/
What I have is a horizontally centered parent container with an absolute width, containing a select with a fractional width, like so:
.parent {
margin: 0 auto; /* centered on viewports > 1200px */
width: 300px;
}
.select {
width: 33.333%;
}
Simplified markup:
<body>
<div class="parent">
<select class="select">
<option>cat</option>
<option>dog</option>
<option>manatee</option>
</select>
</div>
</body>
Now, on Firefox, when the viewport width is wider than 300px and the .parent
element is centered, the select
starts behaving weirdly.
In even viewport widths (302px
, 1326px
), all is well. But in odd viewport widths (301px
, 1317px
), the select's right border is being cut off.
I've seen this in Firefox 32-35. Other browser vendors don't seem to be affected.
Also, this happens only when the option
s are narrower than the select
.
I'm guessing that what happens is that, if the left-over viewport width is an odd number, some calculations for the margin: auto;
property are counting half-pixels and making rounding errors.
What I can't seem to grasp is how the margins on the parent can have any impact at all on its children, whose fractional width, as I understand it, should always be calculated based on the parent's absolute width of 300px
.
Am I missing something fundamental about the box model here, or is this simply a bug in Firefox? Is there a known workaround for this issue that I haven't dug up yet?
On a sidenote, box-sizing: border-box;
does not seem to have any effect on this behavior.
DEMO
This is easily solved using flexbox
to resize your select
s
here's a screen shot ran from firefox
HTML
<div>
<select class='flex-1'>
<option>abc</option>
<option>def</option>
</select>
<select class='flex-2'>
<option>cat</option>
<option>dog</option>
<option>manatee</option>
</select>
<span class='flex-3'></span>
</div>
CSS
* {
margin: 0;
outline: 0;
padding: 0;
}
div{
margin: 5em auto;
padding: 1em;
width: 300px;
background-color: slategray;
display: flex;
}
[class*='flex']{
flex-basis: 0;
}
.flex-1{ flex-grow: 1; }
.flex-2{ flex-grow: 2; }
.flex-3{ flex-grow: 3; }
more info about flexbox here
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