Tabs 选项卡 使用选项卡,你可以轻松地浏览和切换不同的视图。
对于在同一层次,并且息息相关的内容组,使用选项卡能够将它们分组并且在其之间切换。
基础选项卡 A basic example with tab panels.
< Box sx = { { borderBottom: 1 , borderColor: 'divider' } } >
< Tabs value = { value} onChange = { handleChange} aria-label = " basic tabs example" >
< Tab label = " Item One" { ... a11yProps ( 0 ) } />
< Tab label = " Item Two" { ... a11yProps ( 1 ) } />
< Tab label = " Item Three" { ... a11yProps ( 2 ) } />
</ Tabs >
</ Box >
< TabPanel value = { value} index = { 0 } >
Item One
</ TabPanel >
< TabPanel value = { value} index = { 1 } >
Item Two
</ TabPanel >
< TabPanel value = { value} index = { 2 } >
Item Three
</ TabPanel > Press Enter to start editing
Copy (Or Ctrl + C) 实验性的 API @mui/lab
offers utility components that inject props to implement accessible tabs following WAI-ARIA authoring practices .
< TabContext value = { value} >
< Box sx = { { borderBottom: 1 , borderColor: 'divider' } } >
< TabList onChange = { handleChange} aria-label = " lab API tabs example" >
< Tab label = " Item One" value = " 1" />
< Tab label = " Item Two" value = " 2" />
< Tab label = " Item Three" value = " 3" />
</ TabList >
</ Box >
< TabPanel value = " 1" > Item One</ TabPanel >
< TabPanel value = " 2" > Item Two</ TabPanel >
< TabPanel value = " 3" > Item Three</ TabPanel >
</ TabContext > Press Enter to start editing
Copy (Or Ctrl + C) 包装的标签 Long labels will automatically wrap on tabs. If the label is too long for the tab, it will overflow, and the text will not be visible.
< Tabs
value = { value}
onChange = { handleChange}
aria-label = " wrapped label tabs example"
>
< Tab
value = " one"
label = " New Arrivals in the Longest Text of Nonfiction that should appear in the next line"
wrapped
/>
< Tab value = " two" label = " Item Two" />
< Tab value = " three" label = " Item Three" />
</ Tabs > Press Enter to start editing
Copy (Or Ctrl + C)
< Tabs
value = { value}
onChange = { handleChange}
textColor = " secondary"
indicatorColor = " secondary"
aria-label = " secondary tabs example"
>
< Tab value = " one" label = " Item One" />
< Tab value = " two" label = " Item Two" />
< Tab value = " three" label = " Item Three" />
</ Tabs > Press Enter to start editing
Copy (Or Ctrl + C) 禁用选项卡 A tab can be disabled by setting the disabled
prop.
< Tabs value = { value} onChange = { handleChange} aria-label = " disabled tabs example" >
< Tab label = " Active" />
< Tab label = " Disabled" disabled />
< Tab label = " Active" />
</ Tabs > Press Enter to start editing
Copy (Or Ctrl + C) 固定的选项卡 Fixed tabs should be used with a limited number of tabs, and when a consistent placement will aid muscle memory.
全宽 若是较小的视图,则应使用 variant="fullWidth"
属性。 在这个演示中你还可以借鉴用 react-swipeable-views 来设置选项卡的过渡动画,并且在使用触摸设备时滑动标签。
居中对齐 而对于较大的视图,则应使用 centered
属性。
< Tabs value = { value} onChange = { handleChange} centered >
< Tab label = " Item One" />
< Tab label = " Item Two" />
< Tab label = " Item Three" />
</ Tabs > Press Enter to start editing
Copy (Or Ctrl + C) 左右滚动按钮将自动在桌面显示,并在移动设备上隐藏。 (基于视图宽度)
< Tabs
value = { value}
onChange = { handleChange}
variant = " scrollable"
scrollButtons = " auto"
aria-label = " scrollable auto tabs example"
>
< Tab label = " Item One" />
< Tab label = " Item Two" />
< Tab label = " Item Three" />
< Tab label = " Item Four" />
< Tab label = " Item Five" />
< Tab label = " Item Six" />
< Tab label = " Item Seven" />
</ Tabs > Press Enter to start editing
Copy (Or Ctrl + C) 通过使用 scrollButtons={true}
allowScrollButtonsMobile
属性,无论当前视图宽度如何,都会显示左右的滚动按钮(保留空间)
< Tabs
value = { value}
onChange = { handleChange}
variant = " scrollable"
scrollButtons
allowScrollButtonsMobile
aria-label = " scrollable force tabs example"
>
< Tab label = " Item One" />
< Tab label = " Item Two" />
< Tab label = " Item Three" />
< Tab label = " Item Four" />
< Tab label = " Item Five" />
< Tab label = " Item Six" />
< Tab label = " Item Seven" />
</ Tabs > Press Enter to start editing
Copy (Or Ctrl + C) 如果你想确保按钮始终可见,那么你应该自定义不透明度:
.MuiTabs-scrollButtons.Mui-disabled {
opacity : 0.3;
}
Copy (Or $keyC)
你可以使用 scrollButtons={false}
属性来永远隐藏左右的滚动按钮。 All scrolling must be initiated through user agent scrolling mechanisms (e.g. left/right swipe, shift mouse wheel, etc.)
< Tabs
value = { value}
onChange = { handleChange}
variant = " scrollable"
scrollButtons = { false }
aria-label = " scrollable prevent tabs example"
>
< Tab label = " Item One" />
< Tab label = " Item Two" />
< Tab label = " Item Three" />
< Tab label = " Item Four" />
< Tab label = " Item Five" />
< Tab label = " Item Six" />
< Tab label = " Item Seven" />
</ Tabs > Press Enter to start editing
Copy (Or Ctrl + C) 自定义的选项卡 以下是自定义组件的一个示例。 You can learn more about this in the overrides documentation page .
🎨 如果您还在寻找灵感,您可以看看 MUI Treasury 特别定制的一些例子 。
垂直的选项卡 使用 orientation="vertical"
来使垂直标签代替默认的水平标签。
请注意,你可以使用 visibleScrollbar
来恢复显示滚动条。
Nav tabs By default, tabs use a button
element, but you can provide your custom tag or component. 下面是一个实现导航选项卡的例子: 下面是一个实现导航选项卡的例子: Here's an example of implementing tabbed navigation:
< Tabs value = { value} onChange = { handleChange} aria-label = " nav tabs example" >
< LinkTab label = " Page One" href = " /drafts" />
< LinkTab label = " Page Two" href = " /trash" />
< LinkTab label = " Page Three" href = " /spam" />
</ Tabs > Press Enter to start editing
Copy (Or Ctrl + C) Icon tabs 选项卡的标签可以是所有的图标或者所有的文本。
< Tabs value = { value} onChange = { handleChange} aria-label = " icon tabs example" >
< Tab icon = { < PhoneIcon /> } aria-label = " phone" />
< Tab icon = { < FavoriteIcon /> } aria-label = " favorite" />
< Tab icon = { < PersonPinIcon /> } aria-label = " person" />
</ Tabs > Press Enter to start editing
Copy (Or Ctrl + C)
< Tabs value = { value} onChange = { handleChange} aria-label = " icon label tabs example" >
< Tab icon = { < PhoneIcon /> } label = " RECENTS" />
< Tab icon = { < FavoriteIcon /> } label = " FAVORITES" />
< Tab icon = { < PersonPinIcon /> } label = " NEARBY" />
</ Tabs > Press Enter to start editing
Copy (Or Ctrl + C) Third-party routing library(第三方路由库) By default, the icon is positioned at the top
of a tab. Other supported positions are start
, end
, bottom
. Other supported positions are start
, end
, bottom
.
< Tabs
value = { value}
onChange = { handleChange}
aria-label = " icon position tabs example"
>
< Tab icon = { < PhoneIcon /> } label = " top" />
< Tab icon = { < PhoneMissedIcon /> } iconPosition = " start" label = " start" />
< Tab icon = { < FavoriteIcon /> } iconPosition = " end" label = " end" />
< Tab icon = { < PersonPinIcon /> } iconPosition = " bottom" label = " bottom" />
</ Tabs > Press Enter to start editing
Copy (Or Ctrl + C) 无障碍设计 One frequent use case is to perform navigation on the client only, without an HTTP round-trip to the server. The Tab
component provides the component
prop to handle this use case. Here is a more detailed guide .
Accessibility (WAI-ARIA: https://www.w3.org/WAI/ARIA/apg/patterns/tabpanel/ )
您需要采取以下步骤,来为无障碍技术提供一些必要的信息:
在 Tabs
上应用 aria-label
或 aria-labelledby
标签。
通过设置 id
、aria-controls
和 aria-labelledby
,Tab
需要连接到其对应的 [role="tabpanel"]
。
实现这样的设计例子可以在本页面的演示中找到。 我们还在 @mui/lab
中发布了不需要额外工作就能使用的 一个实验性的 API 。
键盘导航 该组件使用“手动激活”的行为来实现键盘导航。 如果你想切换到“选择自动跟随焦点”(selection automatically follows focus)的行为,你必须将 selectionFollowsFocus
传递给 Tabs
组件。 The WAI-ARIA authoring practices have a detailed guide on how to decide when to make selection automatically follow focus .
演示 下面的两个演示只是在键盘导航行为上有所区别。 Focus a tab and navigate with arrow keys to notice the difference, e.g. Arrow Left .
< Tabs selectionFollowsFocus />
Copy (Or $keyC)
Unstyled The component also comes with an unstyled version . It's ideal for doing heavy customizations and minimizing bundle size.