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.
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: