Buttons
Buttons allow users to take actions, and make choices, with a single tap.
There are four types of buttons:
Note: Toggle buttons are implemented using the mdc-icon-button
component.
For more information, see the mdc-icon-button
page.

Using buttons
Installation
npm install @material/button
Styles
@use "@material/button/styles";
JavaScript instantiation
The button will work without JavaScript, but you can enhance it to have a ripple effect by instantiating MDCRipple
on the root element. See MDC Ripple for details.
import {MDCRipple} from '@material/ripple';
const buttonRipple = new MDCRipple(document.querySelector('.mdc-button'));
Note: See Importing the JS component for more information on how to import JavaScript.
Making buttons accessible
Material Design spec advises that touch targets should be at least 48 x 48 px.
To meet this requirement, add the following to your button:
<div class="mdc-touch-target-wrapper">
<button class="mdc-button mdc-button--touch">
<span class="mdc-button__ripple"></span>
<span class="mdc-button__touch"></span>
<span class="mdc-button__focus-ring"></span>
<span class="mdc-button__label">My Accessible Button</span>
</button>
</div>
Note: The outer mdc-touch-target-wrapper
element is only necessary if you want to avoid potentially overlapping touch targets on adjacent elements (due to collapsing margins).
The mdc-button__focus-ring
element ensures that a focus indicator is displayed in high contrast mode around the active/focused button.
Text button
Text buttons are typically used for less-pronounced actions, including those located in dialogs and cards. In cards, text buttons help maintain an emphasis on card content.
Text button example
<button class="mdc-button">
<span class="mdc-button__ripple"></span>
<span class="mdc-button__focus-ring"></span>
<span class="mdc-button__label">Text Button</span>
</button>
Text button with icon example
<button class="mdc-button mdc-button--icon-leading">
<span class="mdc-button__ripple"></span>
<span class="mdc-button__focus-ring"></span>
<i class="material-icons mdc-button__icon" aria-hidden="true"
>bookmark</i
>
<span class="mdc-button__label">Text Button plus icon</span>
</button>
Outlined button
Outlined buttons are medium-emphasis buttons. They contain actions that are important, but aren’t the primary action in an app.
Outlined button example
<button class="mdc-button mdc-button--outlined">
<span class="mdc-button__ripple"></span>
<span class="mdc-button__focus-ring"></span>
<span class="mdc-button__label">Outlined Button</span>
</button>
Outlined button with icon example
<button class="mdc-button mdc-button--outlined mdc-button--icon-leading">
<span class="mdc-button__ripple"></span>
<span class="mdc-button__focus-ring"></span>
<i class="material-icons mdc-button__icon" aria-hidden="true">bookmark</i>
<span class="mdc-button__label">Outlined Button plus Icon</span>
</button>
Contained button
Contained buttons are high-emphasis, distinguished by their use of elevation and fill. They contain actions that are primary to your app.
Contained button example
<button class="mdc-button mdc-button--raised">
<span class="mdc-button__ripple"></span>
<span class="mdc-button__focus-ring"></span>
<span class="mdc-button__label">Contained Button</span>
</button>
Note: mdc-button--raised
is applied for a contained button with elevation,
and mdc-button--unelevated
is applied for a contained button flush with the surface.
Contained button with icon example
<button class="mdc-button mdc-button--raised mdc-button--icon-leading">
<span class="mdc-button__ripple"></span>
<span class="mdc-button__focus-ring"></span>
<i class="material-icons mdc-button__icon" aria-hidden="true"
>bookmark</i
>
<span class="mdc-button__label">Contained Button plus Icon</span>
</button>
Toggle button
Toggle buttons can be used to select from a group of choices.
There are two types of toggle buttons:
MDC Web currently does not support toggle button groups.
Icon
Icons can be used as toggle buttons when they allow selection, or deselection, of a single choice, such as marking an item as a favorite.
For more details, see the mdc-icon-button
page.
Other Variants
Icon
We recommend using Material Icons from Google Fonts:
<head>
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
</head>
However, you can also use SVG, Font Awesome, or any other icon library you wish.
To add an icon, add an element with the mdc-button__icon
class inside the button element and set the attribute aria-hidden="true"
. The icon is set to 18px to meet legibility requirements.
<button class="mdc-button">
<span class="mdc-button__ripple"></span>
<span class="mdc-button__focus-ring"></span>
<i class="material-icons mdc-button__icon" aria-hidden="true">favorite</i>
<span class="mdc-button__label">Button</span>
</button>
It's also possible to use an SVG icon:
<button class="mdc-button">
<span class="mdc-button__ripple"></span>
<span class="mdc-button__focus-ring"></span>
<svg class="mdc-button__icon" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" viewBox="...">
...
</svg>
<span class="mdc-button__label">Button</span>
</button>
Trailing Icon
Certain icons make more sense to appear after the button's text label rather than before. This can be accomplished by
putting the icon markup after the mdc-button__label
element.
<button class="mdc-button mdc-button--icon-trailing">
<span class="mdc-button__ripple"></span>
<span class="mdc-button__focus-ring"></span>
<span class="mdc-button__label">Button</span>
<i class="material-icons mdc-button__icon" aria-hidden="true">favorite</i>
</button>
Note: The mdc-button__label
element is required in order for the trailing icon to be styled appropriately.
Disabled
To disable a button, add the disabled
attribute directly to the <button>
, or set the disabled
attribute on the <fieldset>
containing the button.
Disabled buttons cannot be interacted with and have no visual interaction effect.
<button class="mdc-button" disabled>
<span class="mdc-button__ripple"></span>
<span class="mdc-button__focus-ring"></span>
<span class="mdc-button__label">Button</span>
</button>
Button theming example
The following example shows text, contained, and outlined button types with Material Theming.
Theming with Sass variables
Before importing any MDC Web modules, set the theme colors in your Sass file:
@use "@material/theme" with (
$primary: #FEDBD0,
$on-primary: #442C2E
);
In this case we also want to customize the label color of the text and outlined
buttons, to fulfill color contrast requirements. Assuming that you've applied
the custom-text-button
and custom-outlined-button
classes to your buttons:
@use "@material/button";
.custom-text-button,
.custom-outlined-button {
@include button.ink-color(#84565E);
}
Theming with CSS custom properties
If you want to customize the theme for buttons without changing the theme
across the app, you can also use CSS custom properties:
@use "@material/button";
.custom-text-button,
.custom-outlined-button {
--mdc-theme-primary: #FEDBD0;
--mdc-theme-on-primary: #442C2E;
@include button.ink-color(#84565E);
}
For a more information on theming in general, see
this page.
API
CSS classes
mdc-button | Mandatory. Defaults to a text button that is flush with the surface. |
mdc-button__ripple | Mandatory. Indicates the element which shows the ripple styling. |
mdc-button--raised | Optional. Styles a contained button that is elevated above the surface. |
mdc-button--unelevated | Optional. Styles a contained button that is flush with the surface. |
mdc-button--outlined | Optional. Styles an outlined button that is flush with the surface. |
mdc-button--icon-leading | Optional. Styles a button with a leading icon. |
mdc-button--icon-trailing | Optional. Styles a button with a trailing icon. |
mdc-button__label | Recommended.* Indicates the element containing the button's text label. |
mdc-button__icon | Optional. Indicates the element containing the button's icon. |
mdc-button__focus-ring | Recommended. Indicates the element which shows the high contrast mode focus ring styling. |
Note: The mdc-button__label
element is required for buttons with a trailing icon, but it is currently optional for
buttons with no icon or a leading icon. In the latter cases, it is acceptable for the text label to simply exist
directly within the mdc-button
element.
However, the mdc-button__label
class may become mandatory for all cases in the future so we recommend always including it.
Sass mixins
To customize a button's color and properties, you can use the following mixins.
Basic Sass mixins
MDC Button uses MDC Theme's primary
color by default. Use the following mixins to customize it.
filled-accessible($container-fill-color) | Sets the container fill color for a contained (raised or unelevated) button, and updates the button's ink, icon, and ripple colors to meet accessibility standards |
Advanced Sass mixins
These mixins will override the color of the container, ink, outline or ripple. It is up to you to ensure your button meets accessibility standards.
container-fill-color($color-or-map) | If a color is passed, sets the default container fill color to the given color. If a map is passed whose keys are in the set {default, hover, focus, pressed, disabled}, sets the color in each specified state to its corresponding value. |
icon-color($color-or-map) | If a color is passed, sets the default icon color to the given color. If a map is passed whose keys are in the set {default, hover, focus, pressed, disabled}, sets the color in each specified state to its corresponding value. |
ink-color($color-or-map) | If a color is passed, sets the default ink color to the given color, and sets the icon color to the given color unless icon-color is also used. If a map is passed whose keys are in the set {default, hover, focus, pressed, disabled}, sets the color in each specified state to its corresponding value. |
density($density-scale) | Sets density scale for button. Supported density scale values (-3 , -2 , -1 , 0 ). |
height($height) | Sets custom height for button. |
shape-radius($radius, $density-scale, $rtl-reflexive) | Sets rounded shape to button with given radius size. $density-scale is only required when $radius value is in percentage unit, defaults to $density-default-scale . Set $rtl-reflexive to true to flip radius values in RTL context, defaults to false. |
horizontal-padding($padding) | Sets horizontal padding to the given number. |
outline-color($color-or-map) | If a color is passed, sets the default outline color to the given color. If a map is passed whose keys are in the set {default, hover, focus, pressed, disabled}, sets the color in each specified state to its corresponding value. |
outline-width($width, $padding) | Sets the outline width to the given number (defaults to 2px) and adjusts padding accordingly. $padding is only required in cases where $horizontal-padding is also included with a custom value. |
14.0.0 (2022-04-27)
Bug Fixes
- button: update HCM shim to use the existing focus-ring (a657abb)
- checkbox: Add explicit system color for checkmark in HCM. (8c4da22)
- checkbox: move forced-colors theme out of static styles (bbd1126)
- checkbox: Update checkbox theme styles mixin to accept css vars (c14e977)
- chips: Fix typography selector in GMDC-Wiz chips theming (43c7d87)
- datatable: Adjust data table last row border-radius to support setting row background-color. (ba78e87)
- dialog: Render dividers in Firefox 94 on Windows HCM (fae6c65)
- dialog: Set default z-index for close button in FloatingSheet dialog. (3366a71)
- fab: Add focus ring in HCM. (d57ec74)
- focus-ring: add 2d padding customizability, RTL bugfix (f81fb1d)
- focus-ring: box-sizing bugfix to content-box. If box-sizing border-box is inherited the ring spacing will collapse. (e58552c)
- focus-ring: ignore pointer events (3ef470e)
- focus-ring: RTL bugfix (e00181e)
- iconbutton: Fixed max width and height for high contrast mode focus ring on icon buttons. Display only in forced colors mode. (cf42927)
- iconbutton: Set icon button ripple z-index to -1. (586e740)
- list: Improve a11y for multi-select lists (9736ddc)
- list: Remove conflicting validation for checkbox list in setEnabled (353ca7e)
- list: Update lastSelectedIndex when toggling a checkbox range (dcba26f)
- menusurface: Add a getOwnerDocument() method to MDCMenuSurfaceAdapter to provide a reference to the document that owns the menu surface DOM element. (3486659)
- radio: Fix disabled state in Firefox Windows high contrast mode (23043ac)
- radio: Modify theme styles Sass mixin validation to validate only keys (390220e)
- select: Add border to select menu in HCM. (5d80969)
- select: revert down/up arrow on anchor changing selected index (43d08ba)
- slider: Fix bug where secondary click moves slider thumb. (3ab9565)
- slider: Fix IE11 bug -
unset
is unsupported in IE. (f460e23)
- slider: In updateUI, fix behavior to match jsdoc claim that when thumb param is undefined it updates both thumbs. Input attributes were not being updated at all. (cc4ed13)
- slider: Make the slider errors easier to debug by providing all relevant values in the error message. (8687937)
- snackbar: address Trusted Types violation (cbd9358)
- tooltip: Adjusts logic in
validateTooltipWithCaretDistances
method. (3e30054)
- typography: Fixes typography
theme-styles
mixin... the value being retreived from the $theme
map and css property name was swapped. The mixin would request font-size
/font-weight
/letter-spacing
from the $theme
map (which expects size
/weight
/tracking
)... so these values would always be null
. (32b3913)
- Remove /** @override */ tags from TypeScript code. (c3cdff0)
- Simplify MDCAttachable interface to be any object (Function) that has
attachTo
. (05db65e)
- Snackbar action button ripple color is applied to the ripple element. (4e66fb2)
- Work around bug in Sass (037285f), closes sass/sass#3259
- switch: Restore Firefox 94 HCM outlines (39cf14b)
- textfield: Fix breaking tests due to no valid pointerId being associated with pointer events. (15db4f1)
- tooltip: Only sends notification of a tooltip being hidden if
showTimeout
is not set (indicating that this tooltip is about to be re-shown). (6ca8b8f)
Features
- banner: Add disableAutoClose params for both banner actions to prevent the banner buttons from automatically closing the banner. Add adapter #notifyActionClicked method. (b094eaa)
- chips: add focus ring styles (783f6fd)
- chips: Added elevation tint layer color support in chips (c78ff04)
- data-table: separate table structure into its own mixin (9f9d928)
- dialog: Add styling for floating sheets (78305b6)
- dialog: Add styling for floating sheets with content padding (3e20c1d)
- Dialog: Adds an API to hide the header for GMDC Fullscreen Dialog in non-fullscreen mode (ab4aba1)
- Dialog: Adds an API to set custom position for GMDC Dialog (ea9b5b4)
- Dialog: Adds an API to set custom z-index for GMDC Dialog (96ea061)
- focus-ring: added a new mixin so we can override just the focus-ring color (641ed08)
- focus-ring: added a new mixin so we can override just the focus-ring radius (7321d62)
- iconbutton: Add link icon button Sass. (9803d2d)
- mdc-list: introduce selection change event (7d8ea46)
- menu: allow preferentially opening surface below anchor (261f2db)
- MenuSurface: Add opening event for menus. (53b3cad)
- select: Add theming mixin boilerplate code to select (ae8a6a3)
- select: Add validation getter methods. (bdf1d37)
- select: Added theme mixins to MDC select (dcfe49c)
- slider: Add
minRange
param to range sliders to request a minimum gap between the two thumbs. (8fffcb5)
- slider: Add an option to hide focus styles after pointer interaction. (ec54d90)
- slider: Keep the slider value indicator within the bounds of the slider if possible. (c047f7c)
- state: make context aware (b2fe352)
- switch: Add high contrast mode focus ring to switch (f31a833)
- text-field: Add theming mixin boilerplate code to text-field (eb382f3)
- text-field: Added theme mixins to MDC text field (344d528)
- textfield: adding input-font-size mixin (207230e)
- theme: allow custom property strings in theme.validate-theme() (4e372fb)
- add new class and mixin for open state of a menu item (9a02b6e)
- Indicate which thumb
valueToAriaValueTextFn
and valueToValueIndicatorTextFn
functions are called for. (b6510c8)
- textfield: adding input-font-family mixin (991fb99)
- Describe how to add child lists into a list item. (758ce31)
BREAKING CHANGES
- MenuSurface: Adds #notifyOpening method to menu surface adapter.
PiperOrigin-RevId: 444830518
- slider: Adds #getValueIndicatorContainerWidth method to slider adapter.
PiperOrigin-RevId: 419837612