Checkbox
A binary input that can be standalone or in a multiselect group.
When in a group, any number of checkboxes can be checked at a time.
Typical use will involve using v-for
to loop through an array of items and output a Checkbox component for each one. Each Checkbox will have the same v-model
prop, but different inputValue
props and label content.
For a single checkbox, the v-model
value will be a boolean true
when the checkbox is checked and false
when unchecked.
For multiple checkboxes, the v-model
value will be an array of the inputValue
props of any currently checked checkboxes (or an empty array if no checkboxes are checked).
Demos
Open up the browser console to see events emitted on input.
Configurable
Name | Value |
---|---|
Props | |
status | |
disabled | |
indeterminate | |
View | |
Reading direction |
Single checkbox with label and description
Always include label text via the default slot. You can also add description text via the #description
slot.
A single checkbox does not need an inputValue
prop. v-model
is bound to a boolean value: true
for checked, false
for unchecked.
Checkbox value: false
Name | Value |
---|---|
View | |
Reading direction |
Form field
When used in a form, a single Checkbox or group of Checkboxes can be wrapped in the Field component to add features like a semantic label, description and help text, validation messages, and more. See the Field page for more information.
When building a Checkbox field, always set isFieldset
to true
, even for a single Checkbox, to ensure accessibility support. This wraps the group in a <fieldset>
element and labels it with an associated <legend>
.
If using a Checkbox or Checkbox group outside of a form, follow the instructions in the next demo.
Checkbox group
For a group of related checkboxes, each Checkbox component's v-model
will be bound to an array of the inputValue
props of the checkboxes that are currently "on".
This demo shows what to do when using a Checkbox group outside of a form:
- Wrap the group in an element with
role="group"
- Connect the group with a label via the
aria-labelledby
attribute
Checkbox group value: [ "checkbox-2", "checkbox-6" ]
Inline checkboxes
Use the inline
prop to get an inline layout.
Indeterminate state
The indeterminate state indicates that a checkbox is neither on nor off. Within this component, this state is purely visual. The parent component must house the logic to set a checkbox to the indeterminate state via this prop (e.g. in the case of a set of nested checkboxes where some boxes are checked and some are not, making the parent checkbox neither fully on nor fully off).
This prop is independent of the value provided by v-model
. If indeterminate
is set to true
, the indeterminate visual state will display, but the value will not be affected. Nor will the value affect the visual state: indeterminate overrides the checked and unchecked visual states. If indeterminate changes to false, the visual state will reflect the current v-model value.
In the example below, all of the checkboxes have their indeterminate
prop set to true
initially. As a result, they all appear to be in the indeterminate state initially, whether they are checked or not. Checking or unchecking a checkbox will undo the indeterminate state since you have provided a definite value for the checkbox.
Checkbox group value: [ "checkbox-2", "checkbox-4" ]
Usage
Props
Prop name | Description | Type | Values | Default |
---|---|---|---|---|
modelValue | Value of the checkbox or checkbox group. Provided by v-model binding in the parent component. | boolean|string[]|number[] | - | false |
inputValue | HTML "value" attribute to assign to the input. Required for input groups. | string|number|boolean | - | false |
disabled | Whether the disabled attribute should be added to the input. | boolean | - | false |
indeterminate | Whether the indeterminate visual state should be displayed. This is unrelated to the value provided by v-model , and the indeterminate visual state will override the checked or unchecked visual state. | boolean | - | false |
inline | Whether the component should display inline. By default, display: block is set and a margin exists between sibling components, for a stacked layout. | boolean | - | false |
status | status attribute of the checkbox. | ValidationStatusType | 'default' , 'error' | 'default' |
Events
Event name | Properties | Description |
---|---|---|
update:modelValue | modelValue boolean|string[]|number[] - The new model value | Emitted when modelValue changes. |
Slots
Name | Description | Bindings |
---|---|---|
default | Label text. | |
description | Short description text. |
CSS-only version
Markup structure
The structure below can be used for most cases. If you need a description, see the section on that feature below.
With description
To add a description below the label:
- Add a span after the
<label>
element with an ID and classcdx-label__description
. Include the description text here. - Add class
cdx-label__label
to the<label>
element - Wrap the label and description in a div with classes
cdx-checkbox__label
andcdx-label
- Add an
aria-describedby
attribute to the<input>
element with the value of the ID of the description
Checkbox group
Native attributes of the <input>
element can be used. For example:
- Add the
checked
attribute to the<input>
element if it should be selected initially. - Add the
disabled
attribute to the<input>
element if it should be disabled.
Note that indeterminate
is not supported in the CSS-only version since it cannot be set without JavaScript.
Always include one of these two features for accessible grouping:
- If using the Checkbox group in a field, wrap the group in a
<fieldset>
element and add a<legend>
element with the group label. This method is demonstrated below and requires some style resets on<fieldset>
and<legend>
. You can use the CSS-only Field and Label components to reset browser styles of these elements. - If using the Checkbox group outside of a field, wrap the group in a
<div>
withrole="group"
andaria-labelledby
set to the ID of the group label. See an example of this above (you can just include a<label>
element instead of using the Label component).
Inline checkboxes
Add the cdx-checkbox--inline
class to the root element to get an inline layout.