Radio button
Create consistent cross-browser and cross-device radio buttons.
On this page
You can find here the OUDS Radio button design guidelines.
Basic exampleLink to this section: Basic example
<div class="radio-button-item">
<div class="control-item-assets-container">
<input class="control-item-indicator" type="radio" value="" id="radioDefault" name="radioBasic" />
</div>
<div class="control-item-text-container">
<label class="control-item-label" for="radioDefault">Label</label>
</div>
</div>
<div class="radio-button-item">
<div class="control-item-assets-container">
<input class="control-item-indicator" type="radio" value="" id="radioDefault2" name="radioBasic" />
</div>
<div class="control-item-text-container">
<label class="control-item-label" for="radioDefault2">Label</label>
</div>
</div>
Bootstrap
$enable-bootstrap-compatibility: true
This part is enabled only when $enable-bootstrap-compatibility is set to true. Read more
about Bootstrap compatibility.
<div class="form-check">
<input class="form-check-input" type="radio" value="" id="checkDefault" name="radioBasicBs" />
<label class="form-check-label" for="checkDefault">
Default radio button
</label>
</div>
<div class="form-check">
<input class="form-check-input" type="radio" value="" id="checkChecked" checked name="radioBasicBs" />
<label class="form-check-label" for="checkChecked">
Checked radio button
</label>
</div> ApproachLink to this section: Approach
Browser default radio buttons are replaced with the help of .control-item-indicator[type="radio"]. Radio buttons allows user to select a single option from a set of mutually exclusive choices.
Radio buttons are implemented using .control-item-* classes, see below.
Control itemLink to this section: Control item
Control item is an abstraction for several non-text input components that have similar behavior and layout. It contains an <input /> indicator, a text container for the label and an optional icon.
We use the future friendly child check selector (:has) for all our <input /> states, like :invalid or :disabled. When combined with the .control-item-label class, we can easily style the text for each item based on the <input />’s state.
.control-item-assets-container controls the position of the .control-item-indicator and the optional icon.
.control-item-text-container contains the label and optional helper text and controls their positioning.
.control-item-label extend their clickable area until a .checkbox-standalone, .radio-button-standalone, .switch-standalone or a position: relative; is found in the page hierarchy. This ensure a consistent approach, whatever the DOM is. Consequently, none of the elements next to the label should be interactive.
.control-item-indicator uses customized Solaris icons to indicate checked states.
VariantsLink to this section: Variants
OutlinedLink to this section: Outlined
You can display an outlined radio buttons by adding a .radio-button-item-outlined to .radio-button-item. If there is an outlined radio button item in a group, all its siblings should also be outlined.
<div class="radio-button-item radio-button-item-outlined control-item-divider">
<div class="control-item-assets-container">
<input class="control-item-indicator" type="radio" value="" id="radioOutlined1" name="radioOutlined" checked />
</div>
<div class="control-item-text-container">
<label class="control-item-label" for="radioOutlined1">Label</label>
</div>
</div>
<div class="radio-button-item radio-button-item-outlined control-item-divider">
<div class="control-item-assets-container">
<input class="control-item-indicator" type="radio" value="" id="radioOutlined2" name="radioOutlined" />
</div>
<div class="control-item-text-container">
<label class="control-item-label" for="radioOutlined2">Label</label>
</div>
</div> DividerLink to this section: Divider
You can display a divider by adding .control-item-divider to a .radio-button-item.
<div class="radio-button-item control-item-divider">
<div class="control-item-assets-container">
<input class="control-item-indicator" type="radio" value="" id="radioDivider" name="radioDivider" checked />
</div>
<div class="control-item-text-container">
<label class="control-item-label" for="radioDivider">Label</label>
</div>
</div>
<div class="radio-button-item control-item-divider">
<div class="control-item-assets-container">
<input class="control-item-indicator" type="radio" value="" id="radioDivider2" name="radioDivider" />
</div>
<div class="control-item-text-container">
<label class="control-item-label" for="radioDivider2">Label</label>
</div>
</div> IconLink to this section: Icon
You can display an icon by adding .control-item-assets-container with an icon (SVG or font-icon most likely) inside as a child of a .radio-button-item.
<div class="radio-button-item">
<div class="control-item-assets-container">
<input class="control-item-indicator" type="radio" value="" id="radioWithSVG" name="radioIcon" checked />
</div>
<div class="control-item-text-container">
<label class="control-item-label" for="radioWithSVG">Label</label>
</div>
<div class="control-item-assets-container">
<svg width="1rem" height="1rem" fill="currentColor" aria-hidden="true">
<use xlink:href="/docs/0.5/assets/img/ouds-web-sprite.svg#heart-recommend"/>
</svg>
</div>
</div>
<div class="radio-button-item">
<div class="control-item-assets-container">
<input class="control-item-indicator" type="radio" value="" id="radioWithIconFont" name="radioIcon" />
</div>
<div class="control-item-text-container">
<label class="control-item-label" for="radioWithIconFont">Label</label>
</div>
<div class="control-item-assets-container">
<span class="icon si si-settings" aria-hidden="true"></span>
</div>
</div> Additional labelLink to this section: Additional label
You can display an additional label for critical information for the option by adding a .radio-button-additional-label as a sibling of a .control-item-label, don’t forget to make it accessible by adding an aria-describedby attribute on the input.
<div class="radio-button-item">
<div class="control-item-assets-container">
<input class="control-item-indicator" type="radio" value="" id="radioAdditionalLabel" aria-describedby="radioAdditionalTextDescription" name="radioAdditionalLabel" checked />
</div>
<div class="control-item-text-container">
<label class="control-item-label" for="radioAdditionalLabel">Label</label>
<p class="radio-button-additional-label" id="radioAdditionalTextDescription">Additional label</p>
</div>
</div>
<div class="radio-button-item">
<div class="control-item-assets-container">
<input class="control-item-indicator" type="radio" value="" id="radioAdditionalLabel2" aria-describedby="radioAdditionalTextDescription2" name="radioAdditionalLabel" />
</div>
<div class="control-item-text-container">
<label class="control-item-label" for="radioAdditionalLabel2">Label</label>
<p class="radio-button-additional-label" id="radioAdditionalTextDescription2">Additional label</p>
</div>
</div> Helper textLink to this section: Helper text
You can display an helper text by adding a .control-item-helper as a sibling of a .control-item-label, don’t forget to make it accessible by adding an aria-describedby attribute on the input.
<div class="radio-button-item">
<div class="control-item-assets-container">
<input class="control-item-indicator" type="radio" value="" id="radioHelperText" aria-describedby="radioAdditionalTextHelper" name="radioTextHelper" checked />
</div>
<div class="control-item-text-container">
<label class="control-item-label" for="radioHelperText">Label</label>
<p class="control-item-helper" id="radioAdditionalTextHelper">Helper Text</p>
</div>
</div>
<div class="radio-button-item">
<div class="control-item-assets-container">
<input class="control-item-indicator" type="radio" value="" id="radioHelperText2" aria-describedby="radioAdditionalTextHelper2" name="radioTextHelper" />
</div>
<div class="control-item-text-container">
<label class="control-item-label" for="radioHelperText2">Label</label>
<p class="control-item-helper" id="radioAdditionalTextHelper2">Helper Text</p>
</div>
</div> ReverseLink to this section: Reverse
You can reverse the component by adding .control-item-reverse to a .radio-button-item.
<div class="radio-button-item control-item-reverse">
<div class="control-item-assets-container">
<input class="control-item-indicator" type="radio" value="" id="radioReverse" name="radioReverse" checked />
</div>
<div class="control-item-text-container">
<label class="control-item-label" for="radioReverse">Label</label>
</div>
</div>
<div class="radio-button-item control-item-reverse">
<div class="control-item-assets-container">
<input class="control-item-indicator" type="radio" value="" id="radioReverse2" name="radioReverse" />
</div>
<div class="control-item-text-container">
<label class="control-item-label" for="radioReverse2">Label</label>
</div>
</div>
Bootstrap
$enable-bootstrap-compatibility: true
This part is enabled only when $enable-bootstrap-compatibility is set to true. Read more
about Bootstrap compatibility.
Put your checkboxes, radios, and switches on the opposite side with the .form-check-reverse modifier class.
<div class="form-check form-check-reverse">
<input class="form-check-input" type="radio" value="" id="reverseCheck1" name="radioReverse" />
<label class="form-check-label" for="reverseCheck1">
Reverse radio
</label>
</div>
<div class="form-check form-check-reverse">
<input class="form-check-input" type="radio" value="" id="reverseCheck2" disabled name="radioReverse" />
<label class="form-check-label" for="reverseCheck2">
Disabled reverse radio
</label>
</div> StatesLink to this section: States
DisabledLink to this section: Disabled
Add the disabled attribute and the associated <label> are automatically styled to match with a lighter color to help indicate the input’s state.
<div class="radio-button-item">
<div class="control-item-assets-container">
<input class="control-item-indicator" type="radio" value="" id="radioDisabled" disabled name="radioDisabled" />
</div>
<div class="control-item-text-container">
<label class="control-item-label" for="radioDisabled">Label</label>
</div>
</div>
<div class="radio-button-item">
<div class="control-item-assets-container">
<input class="control-item-indicator" type="radio" value="" id="radioCheckedDisabled" checked disabled name="radioDisabled" />
</div>
<div class="control-item-text-container">
<label class="control-item-label" for="radioCheckedDisabled">Label</label>
</div>
</div>
Bootstrap
$enable-bootstrap-compatibility: true
This part is enabled only when $enable-bootstrap-compatibility is set to true. Read more
about Bootstrap compatibility.
<div class="form-check">
<input class="form-check-input" type="radio" value="" id="checkDisabled" disabled />
<label class="form-check-label" for="checkDisabled">
Disabled radio button
</label>
</div>
<div class="form-check">
<input class="form-check-input" type="radio" value="" id="checkCheckedDisabled" checked disabled />
<label class="form-check-label" for="checkCheckedDisabled">
Disabled checked radio button
</label>
</div> Read onlyLink to this section: Read only
To create a read only radio button the input should be replaced by a span element with role="radio" and aria-disabled attributes. All the radio buttons in the group must be surrounded by a container with role="radiogroup" and aria-readonly="true" attributes, this is the only way to be compliant with ARIA specifications. The radio button will be accessible to keyboard navigation and assistive technologies thanks to aria-labelledby and tabindex but other interactions will be prevented.
<div role="radiogroup" aria-readonly="true">
<div class="radio-button-item">
<div class="control-item-assets-container">
<span class="control-item-indicator" role="radio" aria-disabled="true" tabindex="0" aria-checked="false" aria-labelledby="radioReadonlyLabel"></span>
</div>
<div class="control-item-text-container">
<p class="control-item-label" id="radioReadonlyLabel">Label</p>
</div>
</div>
<div class="radio-button-item">
<div class="control-item-assets-container">
<span class="control-item-indicator" role="radio" aria-disabled="true" tabindex="0" aria-checked="true" aria-labelledby="radioReadonlyCheckedLabel"></span>
</div>
<div class="control-item-text-container">
<p class="control-item-label" id="radioReadonlyCheckedLabel">Label</p>
</div>
</div>
</div> InvalidLink to this section: Invalid
The invalid state is the equivalent of the ‘Error’ state that you can find in the design specification.
You can display an invalid radio button by adding .is-invalid to a .control-item-indicator. Please take a look at our Validation page to know more about this.
<div class="radio-button-item">
<div class="control-item-assets-container">
<input class="control-item-indicator is-invalid" type="radio" value="" name="radioInvalid" id="radioInvalid" />
</div>
<div class="control-item-text-container">
<label class="control-item-label" for="radioInvalid">Label</label>
</div>
</div>
<div class="radio-button-item">
<div class="control-item-assets-container">
<input class="control-item-indicator is-invalid" type="radio" value="" name="radioInvalid" id="radioInvalid2" />
</div>
<div class="control-item-text-container">
<label class="control-item-label" for="radioInvalid2">Label</label>
</div>
</div>
Bootstrap
$enable-bootstrap-compatibility: true
This part is enabled only when $enable-bootstrap-compatibility is set to true. Read more
about Bootstrap compatibility.
<div class="form-check">
<input class="form-check-input is-invalid" type="radio" value="" id="radioInvalidBootstrap" />
<label class="form-check-label" for="radioInvalidBootstrap">
Invalid radio
</label>
</div> Outlined invalidLink to this section: Outlined invalid
This also works for outlined variant of the component.
<div class="radio-button-item radio-button-item-outlined">
<div class="control-item-assets-container">
<input class="control-item-indicator is-invalid" type="radio" value="" name="outlinedInvalid" id="outlinedInvalid1" />
</div>
<div class="control-item-text-container">
<label class="control-item-label" for="outlinedInvalid1">Label</label>
</div>
</div>
<div class="radio-button-item radio-button-item-outlined">
<div class="control-item-assets-container">
<input class="control-item-indicator is-invalid" type="radio" value="" name="outlinedInvalid" id="outlinedInvalid2" />
</div>
<div class="control-item-text-container">
<label class="control-item-label" for="outlinedInvalid2">Label</label>
</div>
</div> GroupLink to this section: Group
When radio buttons belong to a group (e.g., in a form), you must provide clear context by using a <legend> element inside a <fieldset> for the group title, this way screen readers will read the legend before navigating through the radio buttons.
<div class="row">
<fieldset class="col-md-6">
<legend>Radio buttons group example</legend>
<div class="radio-button-item control-item-divider">
<div class="control-item-assets-container">
<input class="control-item-indicator" type="radio" value="" id="radioGroup1" name="radioGroup" aria-describedby="radioGroup1AdditionalLabel radioGroup1Description" />
</div>
<div class="control-item-text-container">
<label class="control-item-label" for="radioGroup1">Label</label>
<p class="radio-button-additional-label" id="radioGroup1AdditionalLabel">Additional label</p>
<p class="control-item-helper" id="radioGroup1Description">Helper text</p>
</div>
<div class="control-item-assets-container">
<svg width="1rem" height="1rem" fill="currentColor" aria-hidden="true">
<use xlink:href="/docs/0.5/assets/img/ouds-web-sprite.svg#heart-recommend"/>
</svg>
</div>
</div>
<div class="radio-button-item control-item-divider">
<div class="control-item-assets-container">
<input class="control-item-indicator" type="radio" value="" id="radioGroup2" checked name="radioGroup" aria-describedby="radioGroup2AdditionalLabel radioGroup2Description" />
</div>
<div class="control-item-text-container">
<label class="control-item-label" for="radioGroup2">A longer label for showing behavior in this case</label>
<p class="radio-button-additional-label" id="radioGroup2AdditionalLabel">Radio button indicator and icon will stick to the top area of the component</p>
<p class="control-item-helper" id="radioGroup2Description">Also a longer helper text, it will also wrap at some point depending on the component width</p>
</div>
<div class="control-item-assets-container">
<svg width="1rem" height="1rem" fill="currentColor" aria-hidden="true">
<use xlink:href="/docs/0.5/assets/img/ouds-web-sprite.svg#heart-recommend"/>
</svg>
</div>
</div>
</fieldset>
</div> StandaloneLink to this section: Standalone
This is commonly used to build custom component and shouldn’t be used alone. Remember to provide some sort of accessible name for assistive technologies (for instance, using aria-labelledby, a .visually-hidden, aria-label or a second label). See the forms overview accessibility section for details.
For the standalone Radio button, we provide a completely different architecture to ease the integration inside your projects.
<label class="radio-button-standalone">
<input class="control-item-indicator" type="radio" value="" />
<span class="visually-hidden">Label</span>
</label>
Bootstrap
$enable-bootstrap-compatibility: true
This part is enabled only when $enable-bootstrap-compatibility is set to true. Read more
about Bootstrap compatibility.
Be careful using this, you must implement the background on hover, focus and active states.
<div>
<input class="form-check-input" type="radio" id="radioNoLabel" value="" aria-label="..." />
</div>