Reference
Button Group
The ButtonGroup component allows for the grouping of related buttons into a single unit.
Basic button group
Buttons can be grouped by enclosing them within the
ButtonGroup
component, where they must be direct children.import * as React from 'react'; import Button from '@mui/material/Button'; import ButtonGroup from '@mui/material/ButtonGroup'; export default function BasicButtonGroup() { return ( <ButtonGroup variant="contained" aria-label="Basic button group"> <Button>One</Button> <Button>Two</Button> <Button>Three</Button> </ButtonGroup> ); }
Button variants
All standard button styles are supported.
import * as React from 'react'; import Button from '@mui/material/Button'; import ButtonGroup from '@mui/material/ButtonGroup'; import Box from '@mui/material/Box'; export default function VariantButtonGroup() { return ( <Box sx={{ display: 'flex', flexDirection: 'column', alignItems: 'center', '& > *': { m: 1, }, }} > <ButtonGroup variant="outlined" aria-label="Basic button group"> <Button>One</Button> <Button>Two</Button> <Button>Three</Button> </ButtonGroup> <ButtonGroup variant="text" aria-label="Basic button group"> <Button>One</Button> <Button>Two</Button> <Button>Three</Button> </ButtonGroup> </Box> ); }
Sizes and colors
The
size
and color
props allow customization of the button group's appearance.import * as React from 'react'; import Button from '@mui/material/Button'; import Box from '@mui/material/Box'; import ButtonGroup from '@mui/material/ButtonGroup'; const buttons = [ <Button key="one">One</Button>, <Button key="two">Two</Button>, <Button key="three">Three</Button>, ]; export default function GroupSizesColors() { return ( <Box sx={{ display: 'flex', flexDirection: 'column', alignItems: 'center', '& > *': { m: 1, }, }} > <ButtonGroup size="small" aria-label="Small button group"> {buttons} </ButtonGroup> <ButtonGroup color="secondary" aria-label="Medium-sized button group"> {buttons} </ButtonGroup> <ButtonGroup size="large" aria-label="Large button group"> {buttons} </ButtonGroup> </Box> ); }
Vertical group
The button group can be arranged vertically by utilizing the
orientation
prop.import * as React from 'react'; import Button from '@mui/material/Button'; import ButtonGroup from '@mui/material/ButtonGroup'; import Box from '@mui/material/Box'; const buttons = [ <Button key="one">One</Button>, <Button key="two">Two</Button>, <Button key="three">Three</Button>, ]; export default function GroupOrientation() { return ( <Box sx={{ display: 'flex', '& > *': { m: 1, }, }} > <ButtonGroup orientation="vertical" aria-label="Vertical button group"> {buttons} </ButtonGroup> <ButtonGroup orientation="vertical" aria-label="Vertical button group" variant="contained" > {buttons} </ButtonGroup> <ButtonGroup orientation="vertical" aria-label="Vertical button group" variant="text" > {buttons} </ButtonGroup> </Box> ); }
Split button
The
ButtonGroup
component can be used to create a split button, where the dropdown can modify the button's action (as shown in this example) or trigger a related action immediately.import * as React from 'react'; import Button from '@mui/material/Button'; import ButtonGroup from '@mui/material/ButtonGroup'; import ArrowDropDownIcon from '@mui/icons-material/ArrowDropDown'; import ClickAwayListener from '@mui/material/ClickAwayListener'; import Grow from '@mui/material/Grow'; import Paper from '@mui/material/Paper'; import Popper from '@mui/material/Popper'; import MenuItem from '@mui/material/MenuItem'; import MenuList from '@mui/material/MenuList'; const options = ['Create a merge commit', 'Squash and merge', 'Rebase and merge']; export default function SplitButton() { const [open, setOpen] = React.useState(false); const anchorRef = React.useRef<HTMLDivElement>(null); const [selectedIndex, setSelectedIndex] = React.useState(1); const handleClick = () => { console.info(`You clicked ${options[selectedIndex]}`); }; const handleMenuItemClick = ( event: React.MouseEvent<HTMLLIElement, MouseEvent>, index: number, ) => { setSelectedIndex(index); setOpen(false); }; const handleToggle = () => { setOpen((prevOpen) => !prevOpen); }; const handleClose = (event: Event) => { if ( anchorRef.current && anchorRef.current.contains(event.target as HTMLElement) ) { return; } setOpen(false); }; return ( <React.Fragment> <ButtonGroup variant="contained" ref={anchorRef} aria-label="Button group with a nested menu" > <Button onClick={handleClick}>{options[selectedIndex]}</Button> <Button size="small" aria-controls={open ? 'split-button-menu' : undefined} aria-expanded={open ? 'true' : undefined} aria-label="select merge strategy" aria-haspopup="menu" onClick={handleToggle} > <ArrowDropDownIcon /> </Button> </ButtonGroup> <Popper sx={{ zIndex: 1 }} open={open} anchorEl={anchorRef.current} role={undefined} transition disablePortal > {({ TransitionProps, placement }) => ( <Grow {...TransitionProps} style={{ transformOrigin: placement === 'bottom' ? 'center top' : 'center bottom', }} > <Paper> <ClickAwayListener onClickAway={handleClose}> <MenuList id="split-button-menu" autoFocusItem> {options.map((option, index) => ( <MenuItem key={option} disabled={index === 2} selected={index === selectedIndex} onClick={(event) => handleMenuItemClick(event, index)} > {option} </MenuItem> ))} </MenuList> </ClickAwayListener> </Paper> </Grow> )} </Popper> </React.Fragment> ); }
Disabled elevation
The
disableElevation
prop can be used to remove the elevation effect from the button group.import * as React from 'react'; import ButtonGroup from '@mui/material/ButtonGroup'; import Button from '@mui/material/Button'; export default function DisableElevation() { return ( <ButtonGroup disableElevation variant="contained" aria-label="Disabled button group" > <Button>One</Button> <Button>Two</Button> </ButtonGroup> ); }
Loading
The
loading
prop on the Button
component can be used to place buttons in a loading state, preventing user interactions.import * as React from 'react'; import ButtonGroup from '@mui/material/ButtonGroup'; import Button from '@mui/material/Button'; import SaveIcon from '@mui/icons-material/Save'; export default function LoadingButtonGroup() { return ( <ButtonGroup variant="outlined" aria-label="Loading button group"> <Button>Submit</Button> <Button>Fetch data</Button> <Button loading loadingPosition="start" startIcon={<SaveIcon />}> Save </Button> </ButtonGroup> ); }