Powered by NeGD | MeitY Government of India® UX4G
Checks & Radios
Create consistent cross-browser and cross-device checkboxes and radios with our completely rewritten checks component.
Approach #
With the aid of .form-check
, a set of classes for both input types
that enhances the style and behavior of their HTML elements, more customization
and cross-browser consistency are provided. Browser default checkboxes and
radio
buttons
are substituted. Checkboxes allow you to
choose one or more alternatives from a list, whereas radio buttons only allow to
choose one.
Our <input>
s and <label>
s are sibling
elements in terms of structure rather than an <input>
contained within a <label>
. This is a little bit more wordy
because you need to specify an id and attributes to link the input and label.
The sibling selector (~) is used for all of our <input>
states, such as :checked and or :disabled. We can easily style the wording for
each item depending on the status of the <input>
's when used
in conjunction with the .form-check-label
class.
Our checks use custom UX4G icons to indicate checked or indeterminate states.
Checks #
<div class="form-check">
<input class="form-check-input" type="checkbox" value="" id="flexCheckDefault"/>
<label class="form-check-label" for="flexCheckDefault">
Default checkbox
</label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox" value="" id="flexCheckChecked" checked/>
<label class="form-check-label" for="flexCheckChecked">
Checked checkbox
</label>
</div>
RESULT
Indeterminate #
The :indeterminate
pseudo class can be used by checkboxes when
manually specified via JavaScript (there is no HTML property for specifying it).
<div class="form-check">
<input class="form-check-input" type="checkbox" value="" id="flexCheckIndeterminate"/>
<label class="form-check-label" for="flexCheckIndeterminate">
Indeterminate checkbox
</label>
</div>
RESULT
Disabled #
In order to better convey the input's status, adding the disabled
property causes the related <label>
s to be automatically
formatted to match with a lighter color.
<div class="form-check">
<input class="form-check-input" type="checkbox" value="" id="flexCheckIndeterminateDisabled" disabled/>
<label class="form-check-label" for="flexCheckIndeterminateDisabled">
Disabled indeterminate checkbox
</label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox" value="" id="flexCheckDisabled" disabled/>
<label class="form-check-label" for="flexCheckDisabled">
Disabled checkbox
</label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox" value="" id="flexCheckCheckedDisabled" checked disabled/>
<label class="form-check-label" for="flexCheckCheckedDisabled">
Disabled checked checkbox
</label>
</div>
RESULT
Radios #
<div class="form-check">
<input class="form-check-input" type="radio" name="flexRadioDefault" id="flexRadioDefault1"/>
<label class="form-check-label" for="flexRadioDefault1">
Default radio
</label>
</div>
<div class="form-check">
<input class="form-check-input" type="radio" name="flexRadioDefault" id="flexRadioDefault2" checked/>
<label class="form-check-label" for="flexRadioDefault2">
Default checked radio
</label>
</div>
RESULT
Disabled #
In order to better convey the input's status, adding the disabled
property causes the related <label>
s to be automatically
formatted to match with a lighter color.
<div class="form-check">
<input class="form-check-input" type="radio" name="flexRadioDisabled" id="flexRadioDisabled" disabled/>
<label class="form-check-label" for="flexRadioDisabled">
Disabled radio
</label>
</div>
<div class="form-check">
<input class="form-check-input" type="radio" name="flexRadioDisabled" id="flexRadioCheckedDisabled" checked disabled/>
<label class="form-check-label" for="flexRadioCheckedDisabled">
Disabled checked radio
</label>
</div>
RESULT
Switches #
A switch uses the .form-switch
class to render a toggle switch but
has the markup of a custom checkbox. To more clearly describe the type of
control to assistive technologies that support this role, think about using
role="switch"
. It will default to being announced as a conventional
checkbox in older assistive technologies. The disabled
attribute is
also supported via switches.
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" role="switch" id="flexSwitchCheckDefault"/>
<label class="form-check-label" for="flexSwitchCheckDefault">Default switch checkbox input</label>
</div>
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" role="switch" id="flexSwitchCheckChecked" checked/>
<label class="form-check-label" for="flexSwitchCheckChecked">Checked switch checkbox input</label>
</div>
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" role="switch" id="flexSwitchCheckDisabled" disabled/>
<label class="form-check-label" for="flexSwitchCheckDisabled">Disabled switch checkbox input</label>
</div>
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" role="switch" id="flexSwitchCheckCheckedDisabled" checked disabled/>
<label class="form-check-label" for="flexSwitchCheckCheckedDisabled">Disabled checked switch checkbox input</label>
</div>
RESULT
Default (stacked) #
All checkboxes and radios that are immediate siblings will by default be vertically stacked and properly spaced apart
<div class="form-check">
<input class="form-check-input" type="checkbox" value="" id="defaultCheck1"/>
<label class="form-check-label" for="defaultCheck1">
Default checkbox
</label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox" value="" id="defaultCheck2" disabled/>
<label class="form-check-label" for="defaultCheck2">
Disabled checkbox
</label>
</div>
RESULT
<div class="form-check">
<input class="form-check-input" type="radio" name="exampleRadios" id="exampleRadios1" value="option1" checked/>
<label class="form-check-label" for="exampleRadios1">
Default radio
</label>
</div>
<div class="form-check">
<input class="form-check-input" type="radio" name="exampleRadios" id="exampleRadios2" value="option2"/>
<label class="form-check-label" for="exampleRadios2">
Second default radio
</label>
</div>
<div class="form-check">
<input class="form-check-input" type="radio" name="exampleRadios" id="exampleRadios3" value="option3" disabled/>
<label class="form-check-label" for="exampleRadios3">
Disabled radio
</label>
</div>
RESULT
Inline #
Add to group checkboxes or radio buttons on the same horizontal row .online
form-checking to any .form-check.
<div class="form-check form-check-inline">
<input class="form-check-input" type="checkbox" id="inlineCheckbox1" value="option1"//>
<label class="form-check-label" for="inlineCheckbox1">1</label>
</div>
<div class="form-check form-check-inline">
<input class="form-check-input" type="checkbox" id="inlineCheckbox2" value="option2"//>
<label class="form-check-label" for="inlineCheckbox2">2</label>
</div>
<div class="form-check form-check-inline">
<input class="form-check-input" type="checkbox" id="inlineCheckbox3" value="option3" disabled//>
<label class="form-check-label" for="inlineCheckbox3">3 (disabled)</label>
</div>
RESULT
<div class="form-check form-check-inline">
<input class="form-check-input" type="radio" name="inlineRadioOptions" id="inlineRadio1" value="option1"/>
<label class="form-check-label" for="inlineRadio1">1</label>
</div>
<div class="form-check form-check-inline">
<input class="form-check-input" type="radio" name="inlineRadioOptions" id="inlineRadio2" value="option2"/>
<label class="form-check-label" for="inlineRadio2">2</label>
</div>
<div class="form-check form-check-inline">
<input class="form-check-input" type="radio" name="inlineRadioOptions" id="inlineRadio3" value="option3" disabled/>
<label class="form-check-label" for="inlineRadio3">3 (disabled)</label>
</div>
RESULT
Reverse #
Use the .form-check-reverse
modifier class to position your
checkboxes, radio buttons, and switches on the other side.
<div class="form-check form-check-reverse">
<input class="form-check-input" type="checkbox" value="" id="reverseCheck1"/>
<label class="form-check-label" for="reverseCheck1">
Reverse checkbox
</label>
</div>
<div class="form-check form-check-reverse">
<input class="form-check-input" type="checkbox" value="" id="reverseCheck2" disabled/>
<label class="form-check-label" for="reverseCheck2">
Disabled reverse checkbox
</label>
</div>
<div class="form-check form-switch form-check-reverse">
<input class="form-check-input" type="checkbox" id="flexSwitchCheckReverse"/>
<label class="form-check-label" for="flexSwitchCheckReverse">Reverse switch checkbox input</label>
</div>
RESULT
Without labels #
Leave the wrapping off check the form for radio buttons and checkboxes without label text. It's important to keep in mind to give assistive technologies some kind of accessible name (for example, by utilizing aria-label). Details can be found in the accessibility part of the forms overview.
<div>
<input class="form-check-input" type="checkbox" id="checkboxNoLabel" value="" aria-label="..."/>
</div>
<div>
<input class="form-check-input" type="radio" name="radioNoLabel" id="radioNoLabel1" value="" aria-label="..."/>
</div>
RESULT
Toggle buttons #
Use the .btn
styles on the <label>
components
rather than the .form-check-label
styles to create checkboxes and
radio buttons
that resemble buttons
. If necessary,
these toggle buttons may also be placed together in a button group.
Checkbox toggle buttons #
<input type="checkbox" class="btn-check" id="btn-check" autocomplete="off"/>
<label class="btn btn-primary" for="btn-check">Single toggle</label>
RESULT
<input type="checkbox" class="btn-check" id="btn-check-2" checked autocomplete="off"/>
<label class="btn btn-primary" for="btn-check-2">Checked</label>
RESULT
<input type="checkbox" class="btn-check" id="btn-check-3" autocomplete="off" disabled/>
<label class="btn btn-primary" for="btn-check-3">Disabled</label>
RESULT
INFO
Visually, these checkbox toggle buttons are identical to the button plugin toggle buttons. However, they are conveyed differently by assistive technologies: the checkbox toggles will be announced by screen readers as "checked"/"not checked" (since, despite their appearance, they are fundamentally still checkboxes), whereas the button plugin toggle buttons will be announced as "button"/"button pressed". The choice between these two approaches will depend on the type of toggle you are creating, and whether or not the toggle will make sense to users when announced as a checkbox or as an actual button.
Radio toggle buttons #
<input type="radio" class="btn-check" name="options" id="option1" autocomplete="off" checked/>
<label class="btn btn-secondary" for="option1">Checked</label>
<input type="radio" class="btn-check" name="options" id="option2" autocomplete="off"/>
<label class="btn btn-secondary" for="option2">Radio</label>
<input type="radio" class="btn-check" name="options" id="option3" autocomplete="off" disabled/>
<label class="btn btn-secondary" for="option3">Disabled</label>
<input type="radio" class="btn-check" name="options" id="option4" autocomplete="off"/>
<label class="btn btn-secondary" for="option4">Radio</label>
RESULT
Outlined styles #
Different variants of .btn
, such at the various
outlined styles, are supported.
<input type="checkbox" class="btn-check" id="btn-check-outlined" autocomplete="off"/>
<label class="btn btn-outline-primary" for="btn-check-outlined">Single toggle</label><br/>
<input type="checkbox" class="btn-check" id="btn-check-2-outlined" checked autocomplete="off"/>
<label class="btn btn-outline-secondary" for="btn-check-2-outlined">Checked</label><br/>
<input type="radio" class="btn-check" name="options-outlined" id="success-outlined" autocomplete="off" checked/>
<label class="btn btn-outline-success" for="success-outlined">Checked success radio</label>
<input type="radio" class="btn-check" name="options-outlined" id="danger-outlined" autocomplete="off"/>
<label class="btn btn-outline-danger" for="danger-outlined">Danger radio</label>
RESULT
Sass #
Variables #
$form-check-input-width: 1em;
$form-check-min-height: $font-size-base * $line-height-base;
$form-check-padding-start: $form-check-input-width + .5em;
$form-check-margin-bottom: .125rem;
$form-check-label-color: null;
$form-check-label-cursor: null;
$form-check-transition: null;
$form-check-input-active-filter: brightness(90%);
$form-check-input-bg: $input-bg;
$form-check-input-border: var(--#{$prefix}border-width) solid var(--#{$prefix}border-color);
$form-check-input-border-radius: .25em;
$form-check-radio-border-radius: 50%;
$form-check-input-focus-border: $input-focus-border-color;
$form-check-input-focus-box-shadow: $focus-ring-box-shadow;
$form-check-input-checked-color: $component-active-color;
$form-check-input-checked-bg-color: $component-active-bg;
$form-check-input-checked-border-color: $form-check-input-checked-bg-color;
$form-check-input-checked-bg-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'><path fill='none' stroke='#{$form-check-input-checked-color}' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/></svg>");
$form-check-radio-checked-bg-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'><circle r='2' fill='#{$form-check-input-checked-color}'/></svg>");
$form-check-input-indeterminate-color: $component-active-color;
$form-check-input-indeterminate-bg-color: $component-active-bg;
$form-check-input-indeterminate-border-color: $form-check-input-indeterminate-bg-color;
$form-check-input-indeterminate-bg-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'><path fill='none' stroke='#{$form-check-input-indeterminate-color}' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/></svg>");
$form-check-input-disabled-opacity: .5;
$form-check-label-disabled-opacity: $form-check-input-disabled-opacity;
$form-check-btn-check-disabled-opacity: $btn-disabled-opacity;
$form-check-inline-margin-end: 1rem;