Reference
Bottom Navigation
The Bottom Navigation bar enables navigation between key destinations within an application.
Bottom navigation bars present three to five destinations at the screen’s base. Each destination is denoted by an icon and, optionally, a text label. Tapping a bottom navigation icon directs the user to the corresponding top-level navigation destination.
Bottom navigation
For three actions, consistently display both icons and text labels.
import * as React from 'react'; import Box from '@mui/material/Box'; import BottomNavigation from '@mui/material/BottomNavigation'; import BottomNavigationAction from '@mui/material/BottomNavigationAction'; import RestoreIcon from '@mui/icons-material/Restore'; import FavoriteIcon from '@mui/icons-material/Favorite'; import LocationOnIcon from '@mui/icons-material/LocationOn'; export default function SimpleBottomNavigation() { const [value, setValue] = React.useState(0); return ( <Box sx={{ width: 500 }}> <BottomNavigation showLabels value={value} onChange={(event, newValue) => { setValue(newValue); }} > <BottomNavigationAction label="Recents" icon={<RestoreIcon />} /> <BottomNavigationAction label="Favorites" icon={<FavoriteIcon />} /> <BottomNavigationAction label="Nearby" icon={<LocationOnIcon />} /> </BottomNavigation> </Box> ); }
Bottom navigation with no label
For four or five actions, show inactive views using only icons.
import * as React from 'react'; import BottomNavigation from '@mui/material/BottomNavigation'; import BottomNavigationAction from '@mui/material/BottomNavigationAction'; import FolderIcon from '@mui/icons-material/Folder'; import RestoreIcon from '@mui/icons-material/Restore'; import FavoriteIcon from '@mui/icons-material/Favorite'; import LocationOnIcon from '@mui/icons-material/LocationOn'; export default function LabelBottomNavigation() { const [value, setValue] = React.useState('recents'); const handleChange = (event: React.SyntheticEvent, newValue: string) => { setValue(newValue); }; return ( <BottomNavigation sx={{ width: 500 }} value={value} onChange={handleChange}> <BottomNavigationAction label="Recents" value="recents" icon={<RestoreIcon />} /> <BottomNavigationAction label="Favorites" value="favorites" icon={<FavoriteIcon />} /> <BottomNavigationAction label="Nearby" value="nearby" icon={<LocationOnIcon />} /> <BottomNavigationAction label="Folder" value="folder" icon={<FolderIcon />} /> </BottomNavigation> ); }
Fixed positioning
This example ensures the bottom navigation remains anchored to the bottom of the screen, regardless of the content volume displayed.
import * as React from 'react'; import Box from '@mui/material/Box'; import CssBaseline from '@mui/material/CssBaseline'; import BottomNavigation from '@mui/material/BottomNavigation'; import BottomNavigationAction from '@mui/material/BottomNavigationAction'; import RestoreIcon from '@mui/icons-material/Restore'; import FavoriteIcon from '@mui/icons-material/Favorite'; import ArchiveIcon from '@mui/icons-material/Archive'; import Paper from '@mui/material/Paper'; import List from '@mui/material/List'; import ListItemButton from '@mui/material/ListItemButton'; import ListItemAvatar from '@mui/material/ListItemAvatar'; import ListItemText from '@mui/material/ListItemText'; import Avatar from '@mui/material/Avatar'; function refreshMessages(): MessageExample[] { const getRandomInt = (max: number) => Math.floor(Math.random() * Math.floor(max)); return Array.from(new Array(50)).map( () => messageExamples[getRandomInt(messageExamples.length)], ); } export default function FixedBottomNavigation() { const [value, setValue] = React.useState(0); const ref = React.useRef<HTMLDivElement>(null); const [messages, setMessages] = React.useState(() => refreshMessages()); React.useEffect(() => { (ref.current as HTMLDivElement).ownerDocument.body.scrollTop = 0; setMessages(refreshMessages()); }, [value, setMessages]); return ( <Box sx={{ pb: 7 }} ref={ref}> <CssBaseline /> <List> {messages.map(({ primary, secondary, person }, index) => ( <ListItemButton key={index + person}> <ListItemAvatar> <Avatar alt="Profile Picture" src={person} /> </ListItemAvatar> <ListItemText primary={primary} secondary={secondary} /> </ListItemButton> ))} </List> <Paper sx={{ position: 'fixed', bottom: 0, left: 0, right: 0 }} elevation={3}> <BottomNavigation showLabels value={value} onChange={(event, newValue) => { setValue(newValue); }} > <BottomNavigationAction label="Recents" icon={<RestoreIcon />} /> <BottomNavigationAction label="Favorites" icon={<FavoriteIcon />} /> <BottomNavigationAction label="Archive" icon={<ArchiveIcon />} /> </BottomNavigation> </Paper> </Box> ); } interface MessageExample { primary: string; secondary: string; person: string; } const messageExamples: readonly MessageExample[] = [ { primary: 'Brunch this week?', secondary: "I'll be in the neighbourhood this week. Let's grab a bite to eat", person: '/material-ui-static/images/avatar/5.jpg', }, { primary: 'Birthday Gift', secondary: `Do you have a suggestion for a good present for John on his work anniversary. I am really consingularityd & would love your thoughts on it.`, person: '/material-ui-static/images/avatar/1.jpg', }, { primary: 'Recipe to try', secondary: 'I am try out this new BBQ recipe, I think this might be amazing', person: '/material-ui-static/images/avatar/2.jpg', }, { primary: 'Yes!', secondary: 'I have the tickets to the ReactConf for this year.', person: '/material-ui-static/images/avatar/3.jpg', }, { primary: "Doctor's Appointment", secondary: 'My appointment for the doctor was rescheduled for next Saturday.', person: '/material-ui-static/images/avatar/4.jpg', }, { primary: 'Discussion', secondary: `Menus that are generated by the bottom app bar (such as a bottom navigation drawer or overflow menu) open as bottom sheets at a higher elevation than the bar.`, person: '/material-ui-static/images/avatar/5.jpg', }, { primary: 'Summer BBQ', secondary: `Who wants to have a cookout this weekend? I just got some furniture for my backyard and would love to fire up the grill.`, person: '/material-ui-static/images/avatar/1.jpg', }, ];
Third-party routing library
A common scenario involves client-side navigation without a server round-trip. The
BottomNavigationAction
component supports this through the component
prop. For further details, refer to this comprehensive guide.