Selectable <optgroup> in HTML <select> tag

90,656

Solution 1

I don't think you can but you can easily reproduce the visual style with css and thus only have options in your select, so everything is selectable.

.optionGroup {
    font-weight: bold;
    font-style: italic;
}
    
.optionChild {
    padding-left: 15px;
}
<select multiple="multiple">
    <option value="0" class="optionGroup">Parent Tag</option>
    <option value="1" class="optionChild">Child Tag</option>
    <option value="2" class="optionChild">Child Tag</option>
</select>

The multiple attribute allow you to select more than one row (with ctrl click). You can remove it if it is not what you want. It was to show you that everything became selectable and that is looking the same as with optiongroup element.

Solution 2

This is not possible with plain html. A few browsers (mozilla) would allow you to achieve something similar using css, but at the time of this writing the majority of browsers (webkit, et.al) do not support styling of html select elements.

However there are a number of javascript libraries designed to enhance html-select widgets and provide missing features such as the one you've requested. To name a few:

Solution 3

Until this is supported in an html standard, any and all answers given have been problematic, including:

  1. Class attributes are allowed on the children of a select, but if/how the style is applied to the element varies enormously between browsers and browser versions.
  2. Prefixing with &nbsp; will have the consequence that if the select element is narrower than the selected option, the visual effect will not be pleasing, with readable text hidden off to the right (see example below).
  3. Any style you apply will not necessarily fit with the styling the user of the browser has become accustomed to. bold and italic is Firefox, but not necessarily every browser. Many browsers apply a style including gray color in order to help indicate the optgroup is NOT selectable
  4. The concept of a select optgroup label will not necessarily be expected by the user.

This has lead me to conclude the best way to work around the problem is either to use a library like UI-Selectable for all selects throughout your site (for consistency), OR use the first option in the optgroup to represent selecting all the children, with a clear description (such as 'ALL Swedish cars'):

<select multiple="multiple">
   <optgroup label="Parent">
      <option value="0" class="optionChild">ALL Children</option>
      <option value="1" class="optionChild">Child Tag 1</option>
      <option value="2" class="optionChild">Child Tag 2</option>
   </optgroup>
</select>

.my-select {
  width: 60px;
}
<select class="my-select">
  <option>Parent</option>
  <option selected="selected">&nbsp;&nbsp;&nbsp;Child</option>
</select>

Solution 4

a little different solution..

.optionGroup {
    font-weight: bold;

}
<select>
    <option value="0" class="optionGroup">Parent Tag</option>
    <option value="1">&nbsp;&nbsp;&nbsp;Child Tag1</option>
    <option value="2">&nbsp;&nbsp;&nbsp;Child Tag2</option>
</select>

Solution 5

@grifos's answer is not supported in WebKit Browsers and did not work when Tested in IE 11.

One suggestion might be to use an Unordered/Ordered list and to style it with CSS, then add the functionality with JavaScript/jQuery.

I have seen a nice implementation of this in the past, it can look really slick!

Share:
90,656
marcin_koss
Author by

marcin_koss

Updated on July 05, 2022

Comments

  • marcin_koss
    marcin_koss almost 2 years

    Is there any way to make the option group selectable?

    <select>
      <optgroup value="0" label="Parent Tag">
        <option value="1">Child Tag</option>
        <option value="2">Child Tag</option>
      </optgroup>
    </select>

  • marcin_koss
    marcin_koss over 12 years
    Sorry for not being clear enough. I want the optgroup to be selectable the same way you select option
  • grifos
    grifos over 12 years
    Sorry forgot option styling is a mess accross web browsers
  • grifos
    grifos over 12 years
    At least you can create indentation with adding &nbsp;
  • jeffdill2
    jeffdill2 almost 5 years
    Not the prettiest implementation but it produces the desired result. :-)
  • trliner
    trliner over 4 years
    From Select2 docs: "Furthermore, <optgroup> elements cannot be made selectable. This is a limitation of the HTML specification and is not a limitation that Select2 can overcome."
  • perry
    perry over 4 years
    Unless you wanna go down the library route this is by far my favourite solution. Thanks!
  • Andrew
    Andrew over 3 years
    Great info, but the conclusion as to which is the best route strongly depends on what the developer is after: which browsers they're targeting, whether they're trying to recreate optgroup or simply tab items out, and various other aspects of the use case.