Button
A control for executing JavaScript or submitting/resetting form values (Updated: March 23, 2022)
Last updated
A control for executing JavaScript or submitting/resetting form values (Updated: March 23, 2022)
Last updated
The button pattern allows the user to input a command, with one of the following possible action types:
Submit form (type="submit")
Reset form (type="reset")
Run JavaScript (type="button")
The first two types of button are for use inside of a form only, due to their specific behaviour.
The third type is a general purpose button used for running client-side script. This type of button appears in many patterns:
and more
TIP: If left unspecified, the type attribute has a default value of "submit".
Experience the pattern in action on our companion eBay MIND Patterns examples website.
View a fully styled example on our Skin CSS Framework.
The label must clearly indicate the purpose of the button (i.e. not 'click here' or 'click me').
For buttons with labels that are not unique to the page (e.g. 'Add to Cart', 'Edit' or 'Delete', see the Ambiguous Label technique.
A button must not open a new page. Use a link instead.
A button may update the hash fragment of the URL. For example, if building a single page app experience and explicitly managing the History API.
A button may open any kind of flyout, dialog or menu overlay.
A button may display a waiting/loading state, but should not be a live-region (see: FAQ: When should a live-region be used?). Some screen readers automatically announce any changes to the programmatic label, and so using a live-region would trigger a second, redundant announcement.
TIP: Remember that buttons outside of forms do nothing when clicked until JavaScript is available. Either render the button on the client or disable it initially on the server.
Buttons should not have a hand cursor.
If button has focus, SPACEBAR
and ENTER
keys should activate button.
If button has focus, TAB
and SHIFT-TAB
keys should move to the next or previous focusable page element respectively.
If virtual cursor is on button, it must be invokable by virtual cursor (e.g. VO+SPACE in VoiceOver).
Role of 'button' must be announced.
Label must be announced.
Any state must be announced (e.g. expanded, haspopup).
Any description must be announced (i.e. via aria-describedby).
Any change in label (e.g. a waiting/loading state) may be announced by the screen reader (NOTE: a live-region should not be used for this).
We do not supply a developer guide for buttons because you should always use the button tag!
The only exception to this rule is an anchor tag that is progressively enhanced into a button.
The button tag is straightforward, 100% accessible, and 100% style-able with CSS. However, there are three cases that might need extra care and attention:
Icon buttons
Links enhanced into buttons
This section lists all relevant ARIA roles, states and properties for a button.
Informs AT that the button opens a menu or dialog etc. when clicked.
Informs AT that the button controls another element.
Informs AT of the expanded state of any associated element or content
Creates a label for the button. Warning! This label will override any inner text that may be present. This property is most commonly used for icon buttons.
Informs AT of any extended description or context related to the button. Note that this property has no effect on the accessible label of the button.