When I reduce the width of my browser window, select elements within the fieldset does not reduce in size despite the max-width command:
<fieldset style="background:blue;">
<select name=countries style="max-width:90%;">
<option value=gs>South Georgia and the South Sandwich Islands</option>
</select>
</fieldset>
However, this works perfectly outside fieldset element. How do I make the select elements shrink to the max-width (percentage) within the fieldset?
Note: I have tested both Firefox 12.0 and Google Chrome. I am now sure that it is a cross-browser problem.
Clarification: Please refer to this example and note the difference between the behaviour of a select element inside a fieldset and another outside the fieldset. What I want to achieve is for the select element within the fieldset to behave like the one outside the fieldset element.
The problem
This isn’t possible, at least if you only use
max-width(see below for solution).<select>s are always a little bit tricky to style, as they’re interactive content elements and form control elements. As such, they have to follow some implicit rules. For one, you cannot make a select less wide than one of its options when usingmax-width. Think of the following scenario:Let’s say that you want to squeeze this
<select>– what will happen? The select’s width will get lesser, until…+------------------------------------+-+ +-----------------------------------+-+ |Another entry |v| |Another entry |v| +------------------------------------+-+ +-----------------------------------+-+ |Another entry | |Another entry | |Select box, select anything, please |-->|Select box, select anything, please | |Another entry | |Another entry | |Another entry | |Another entry | +------------------------------------+-+ +-----------------------------------+-+ | +---------------------------------------+ v +----------------------------------+-+ +---------------------------------+-+ |Another entry |v| |Another entry |v| +----------------------------------+-+ +---------------------------------+-+ |Another entry | |Another entry | |Select box, select anything, please |-->|Select box, select anything, please| |Another entry | |Another entry | |Another entry | |Another entry | +----------------------------------+-+ +---------------------------------+-+And then the process will stop, as the
<option>s wouldn’t fit anymore. Keep in mind that you can’t style<option>sor at least only a little bit (color, font-variant) without getting some nasty quirks. However, the border-box can be changed, if the select is prepared correctly:The solution
Use a
widthvalue on theselect. Yep, it’s easy as that:Why does this work? Because the
optionwill now recognize thewidthof theselectcorrectly and won’t force theselectto have a implicitmin-width. Notice that thewidthis absurd, as it is more than themax-width. Most browsers won’t care and use themax-widthin this case, as it provides an upper bound.JSFiddle Demo (works in FF12, Chrome 18, IE9, Opera 11.60)
Edit
Wrapper based solution, this won’t change the original width:
JSFiddle Demo (works in browsers listed above)