代码演示
如何引入
import { Tabs, TabPane } from '@fibrous/semi-ui-solid';
基本用法
标签栏支持四种样式的显示:线条式,按钮式,卡片式,斜线式。默认选中第一个启用的标签页。
标签页支持两种传入方式,两者渲染流程上有所区别:
- 通过
tabList传入标签页对象的数组,当使用tabList时每次只渲染当前传入的节点 - 或使用
<TabPane>逐项显式传入,使用<TabPane>时默认会渲染所有面板,可以通过将keepDOM设为false只渲染当前面板,此时不会有动画效果。
tabList 的数据项只放数据(itemKey、tab、disabled、closable),需要节点时使用 Tabs 的 renderTab、renderIcon,参数为该项与其下标,不传 renderTab 时显示该项的 tab 文本。渲染函数在页签、「更多」菜单项与面板名称等每个显示位置各调用一次,该项的数据或下标变化时才重新调用。
代码
import { Tabs, TabPane } from '@fibrous/semi-ui-solid';
export default function TabsDemo() {
return (
<div>
<Tabs type="line">
<TabPane tab="文档" itemKey="1">
<h3>文档</h3>
<p style={{ 'line-height': '1.8' }}>Semi Design 是由抖音前端团队与 UED 团队共同设计开发并维护的设计系统。设计系统包含设计语言以及一整套可复用的前端组件,帮助设计师与开发者更容易地打造高质量的、用户体验一致的、符合设计规范的 Web 应用。</p>
<p style={{ 'line-height': '1.8' }}>区别于其他的设计系统而言,Semi Design 以用户中心、内容优先、设计人性化为设计理念,具有以下优势:</p>
<ul>
<li>
<p>Semi Design 以内容优先进行设计。</p>
</li>
<li>
<p>更容易地自定义主题。</p>
</li>
<li>
<p>适用国际化场景。</p>
</li>
<li>
<p>效率场景加入人性化关怀。</p>
</li>
</ul>
</TabPane>
<TabPane tab="快速起步" itemKey="2">
<h3>快速起步</h3>
<pre
style={{
margin: '24px 0',
padding: '20px',
border: 'none',
'white-space': 'normal',
'border-radius': 'var(--semi-border-radius-medium)',
color: 'var(--semi-color-text-1)',
'background-color': 'var(--semi-color-fill-0)',
}}
>
<code>yarn add @fibrous/semi-ui-solid</code>
</pre>
</TabPane>
<TabPane tab="帮助" itemKey="3">
<h3>帮助</h3>
<p style={{ 'line-height': '1.8', color: 'var(--semi-color-text-0)', 'font-weight': '600' }}>Q:有新组件需求、或者现有组件feature不能满足业务需求?</p>
<p style={{ 'line-height': '1.8', color: 'var(--semi-color-text-1)' }}>右上角问题反馈,提交issue,label选择Feature Request / New Component Request 我们会高优处理这些需求。</p>
<p style={{ 'line-height': '1.8', color: 'var(--semi-color-text-0)', 'font-weight': '600' }}>Q:对组件的使用有疑惑?</p>
<p style={{ 'line-height': '1.8', color: 'var(--semi-color-text-1)' }}>欢迎进我们的客服lark群进行咨询提问。</p>
</TabPane>
</Tabs>
</div>
);
}代码
import { Tabs, TabPane } from '@fibrous/semi-ui-solid';
export default function TabsDemo() {
return (
<Tabs type="button">
<TabPane tab="文档" itemKey="1">
文档
</TabPane>
<TabPane tab="快速起步" itemKey="2">
快速起步
</TabPane>
<TabPane tab="帮助" itemKey="3">
帮助
</TabPane>
</Tabs>
);
}代码
import { createSignal } from 'solid-js';
import { Tabs } from '@fibrous/semi-ui-solid';
const contentList = ['文档', '快速起步', '帮助'];
const tabList = [
{ tab: '文档', itemKey: '1' },
{ tab: '快速起步', itemKey: '2' },
{ tab: '帮助', itemKey: '3' },
];
export default function TabsDemo() {
const [key, setKey] = createSignal('1');
return (
<Tabs type="card" tabList={tabList} onChange={setKey}>
<div>{contentList[Number(key()) - 1]}</div>
</Tabs>
);
}代码
import { createSignal } from 'solid-js';
import { Tabs } from '@fibrous/semi-ui-solid';
const contentList = ['文档', '快速起步', '帮助'];
const tabList = [
{ tab: '文档', itemKey: '1' },
{ tab: '快速起步', itemKey: '2' },
{ tab: '帮助', itemKey: '3' },
];
export default function TabsDemo() {
const [key, setKey] = createSignal('1');
return (
<Tabs type="slash" tabList={tabList} onChange={setKey}>
<div>{contentList[Number(key()) - 1]}</div>
</Tabs>
);
}带图标的
有图标的标签栏。
代码
import { IconFile, IconGlobe, IconHelpCircle } from '@fibrous/semi-icons-solid';
import { Tabs, TabPane } from '@fibrous/semi-ui-solid';
export default function TabsDemo() {
return (
<Tabs>
<TabPane
tab={
<span>
<IconFile />
文档
</span>
}
itemKey="1"
>
文档
</TabPane>
<TabPane
tab={
<span>
<IconGlobe />
快速起步
</span>
}
itemKey="2"
>
快速起步
</TabPane>
<TabPane
tab={
<span>
<IconHelpCircle />
帮助
</span>
}
itemKey="3"
>
帮助
</TabPane>
</Tabs>
);
}更多选项收入 More 展示
支持将多余 Tab 合并为「更多」下拉菜单,more 传入数字即可,数字表示收入下拉菜单的 Tab 数量。
代码
import { For } from 'solid-js';
import { Tabs, TabPane } from '@fibrous/semi-ui-solid';
const indexes = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
export default function TabsDemo() {
return (
<Tabs more={4} style={{ width: '60%', margin: '20px' }} type="card">
<For each={indexes}>
{(i) => (
<TabPane tab={`Tab-${i}`} itemKey={`Tab-${i}`}>
Content of card tab {i}
</TabPane>
)}
</For>
</Tabs>
);
}也支持高级配置,向 more 传入对象,内可传入
count: 表示收入下拉菜单的 Tab 数量render: 自定义触发器的渲染函数,返回的 JSX 会被渲染为下拉菜单的触发器dropdownProps: 传入 Dropdown 属性,会被透传到下拉菜单
代码
import { For } from 'solid-js';
import { Tabs, TabPane, Button } from '@fibrous/semi-ui-solid';
const indexes = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
export default function TabsDemo() {
return (
<Tabs
more={{
count: 4,
render: () => <Button type="tertiary">Click to show More</Button>,
dropdownProps: { trigger: 'click', position: 'bottomRight' },
}}
style={{ width: '60%', margin: '20px' }}
type="card"
>
<For each={indexes}>
{(i) => (
<TabPane tab={`Tab-${i}`} itemKey={`Tab-${i}`}>
Content of card tab {i}
</TabPane>
)}
</For>
</Tabs>
);
}垂直的标签栏
type 为 line, card, button 支持水平和垂直两种模式,tabPosition='left|top', 默认为 top。type 为 slash 仅支持水平模式,无需设置。
代码
import { createSignal } from 'solid-js';
import { IconFile, IconGlobe, IconHelpCircle } from '@fibrous/semi-icons-solid';
import { Tabs, TabPane, RadioGroup, Radio, type TabType, type RadioChangeEvent } from '@fibrous/semi-ui-solid';
const contentStyle = { padding: '0 24px' };
const paragraphStyle = { 'line-height': '1.8' };
const questionStyle = { 'line-height': '1.8', color: 'var(--semi-color-text-0)', 'font-weight': '600' };
const answerStyle = { 'line-height': '1.8', color: 'var(--semi-color-text-1)' };
const codeStyle = {
margin: '24px 0',
padding: '20px',
border: 'none',
'white-space': 'normal',
'border-radius': '6px',
color: 'var(--semi-color-text-1)',
'background-color': 'var(--semi-color-fill-0)',
};
export default function TabsDemo() {
const [type, setType] = createSignal<TabType>('line');
const onSelect = (e: RadioChangeEvent) => {
setType(e.target.value);
};
return (
<>
<RadioGroup
onChange={onSelect}
value={type()}
type="button"
style={{
display: 'flex',
width: '200px',
'justify-content': 'center',
}}
>
<Radio value="line">Line</Radio>
<Radio value="card">Card</Radio>
<Radio value="button">Button</Radio>
</RadioGroup>
<br />
<br />
<Tabs tabPosition="left" type={type()}>
<TabPane
tab={
<span>
<IconFile />
文档
</span>
}
itemKey="1"
>
<div style={contentStyle}>
<h3>文档</h3>
<p style={paragraphStyle}>Semi Design 是由抖音前端团队与 UED 团队共同设计开发并维护的设计系统。设计系统包含设计语言以及一整套可复用的前端组件,帮助设计师与开发者更容易地打造高质量的、用户体验一致的、符合设计规范的 Web 应用。</p>
<p style={paragraphStyle}>区别于其他的设计系统而言,Semi Design 以用户中心、内容优先、设计人性化为设计理念,具有以下优势:</p>
</div>
</TabPane>
<TabPane
tab={
<span>
<IconGlobe />
快速起步
</span>
}
itemKey="2"
>
<div style={contentStyle}>
<h3>快速起步</h3>
<pre style={codeStyle}>
<code>yarn add @fibrous/semi-ui-solid</code>
</pre>
</div>
</TabPane>
<TabPane
tab={
<span>
<IconHelpCircle />
帮助
</span>
}
itemKey="3"
>
<div style={contentStyle}>
<h3>帮助</h3>
<p style={questionStyle}>Q:有新组件需求、或者现有组件feature不能满足业务需求?</p>
<p style={answerStyle}>右上角问题反馈,提交issue,label选择Feature Request / New Component Request 我们会高优处理这些需求。</p>
<p style={questionStyle}>Q:对组件的使用有疑惑?</p>
<p style={answerStyle}>欢迎进我们的客服lark群进行咨询提问。</p>
</div>
</TabPane>
</Tabs>
</>
);
}滚动折叠
通过设置 collapsible 可以支持滚动折叠,目前只支持 horizontal 模式。
代码
import { For } from 'solid-js';
import { Tabs, TabPane } from '@fibrous/semi-ui-solid';
const indexes = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
export default function TabsDemo() {
return (
<Tabs style={{ width: '60%', margin: '20px' }} type="card" collapsible>
<For each={indexes}>
{(i) => (
<TabPane tab={`Tab-${i}`} itemKey={`Tab-${i}`}>
Content of card tab {i}
</TabPane>
)}
</For>
</Tabs>
);
}自定义滚动箭头渲染
通过 renderArrow 修改滚动折叠模式下,左右切换箭头的渲染,入参依次为溢出的 items、位置 pos、点击处理函数 handleArrowClick,以及创建默认箭头的函数 defaultNode,在插入处调用 defaultNode()。items 是普通数据;TabPane 写法下不带 tab,需要标签文本时用 tabList。
代码
import { createSignal, For } from 'solid-js';
import { Tabs, TabPane, Dropdown, type TabsProps } from '@fibrous/semi-ui-solid';
const indexes = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
const arrowStyle = {
width: '32px',
height: '32px',
margin: '0 12px',
display: 'flex',
'justify-content': 'center',
'align-items': 'center',
padding: '0',
border: 'none',
'border-radius': '100%',
background: 'var(--semi-grey-1)',
color: 'var(--semi-color-text)',
'font-family': 'inherit',
'font-size': 'inherit',
cursor: 'pointer',
};
export default function TabsDemo() {
const [activeKey, setActiveKey] = createSignal('Tab-0');
const renderArrow: TabsProps['renderArrow'] = (items, pos, handleArrowClick) => (
<Dropdown
render={
<Dropdown.Menu>
<For each={items}>{(item) => <Dropdown.Item onClick={() => setActiveKey(item.itemKey)}>{item.itemKey}</Dropdown.Item>}</For>
</Dropdown.Menu>
}
>
{(trigger) => (
<button type="button" {...trigger()} style={arrowStyle} onClick={handleArrowClick}>
{pos === 'start' ? '←' : '→'}
</button>
)}
</Dropdown>
);
return (
<Tabs renderArrow={renderArrow} style={{ width: '50%', margin: '20px' }} activeKey={activeKey()} type="card" collapsible onChange={setActiveKey}>
<For each={indexes}>
{(i) => (
<TabPane tab={`Tab-${i}`} itemKey={`Tab-${i}`}>
Content of card tab {i}
</TabPane>
)}
</For>
</Tabs>
);
}修改切换箭头的渲染位置
通过 arrowPosition 来修改溢出指示器的位置,可选 start both end
代码
import { For } from 'solid-js';
import { Tabs, TabPane } from '@fibrous/semi-ui-solid';
const indexes = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
const positions = ['start', 'both', 'end'] as const;
export default function TabsDemo() {
return (
<For each={positions}>
{(position) => (
<Tabs style={{ width: '60%', margin: '20px' }} type="card" collapsible arrowPosition={position}>
<For each={indexes}>
{(i) => (
<TabPane tab={`Tab-${i}`} itemKey={`Tab-${i}`}>
Content of card tab {i}
</TabPane>
)}
</For>
</Tabs>
)}
</For>
);
}自动溢出检测
通过设置 collapsible="auto" 可以启用自动溢出检测功能。组件会自动检测 Tab 是否溢出容器:
- 当 Tab 超出容器宽度或发生换行时,自动启用折叠模式(显示左右箭头)
- 当容器宽度增加或 Tab 数量减少后,所有 Tab 可以完整显示时,自动退出折叠模式
这个功能避免了开发者需要手动判断是否需要折叠的问题,特别适用于响应式布局场景。
collapsible="auto" - 自动检测溢出
固定宽度 400px,测试较窄容器
代码
import { createSignal, For } from 'solid-js';
import { Tabs, TabPane, Button } from '@fibrous/semi-ui-solid';
export default function TabsDemo() {
const [count, setCount] = createSignal(8);
const indexes = () => Array.from({ length: count() }, (_, i) => i);
// Nodes can be placed once, so each Tabs gets its own copy
const panes = () => (
<For each={indexes()}>
{(i) => (
<TabPane tab={`Tab-${i + 1}`} itemKey={`${i}`}>
Content of Tab {i + 1}
</TabPane>
)}
</For>
);
return (
<div>
<div style={{ 'margin-bottom': '12px' }}>
<Button onClick={() => setCount(Math.max(3, count() - 2))} style={{ 'margin-right': '8px' }}>
减少 Tab
</Button>
<Button onClick={() => setCount(Math.min(15, count() + 2))}>增加 Tab</Button>
<span style={{ 'margin-left': '12px' }}>当前 Tab 数量: {count()}</span>
</div>
<div style={{ border: '1px solid var(--semi-color-border)', padding: '12px', 'margin-bottom': '16px' }}>
<p style={{ 'margin-bottom': '8px', color: 'var(--semi-color-text-2)', 'font-size': '12px' }}>collapsible="auto" - 自动检测溢出</p>
<Tabs type="card" collapsible="auto">
{panes()}
</Tabs>
</div>
<div style={{ border: '1px solid var(--semi-color-border)', padding: '12px', 'max-width': '400px' }}>
<p style={{ 'margin-bottom': '8px', color: 'var(--semi-color-text-2)', 'font-size': '12px' }}>固定宽度 400px,测试较窄容器</p>
<Tabs type="card" collapsible="auto">
{panes()}
</Tabs>
</div>
</div>
);
}禁用
禁用标签栏中的某一个标签页。
代码
import { Tabs, TabPane } from '@fibrous/semi-ui-solid';
export default function TabsDemo() {
return (
<Tabs defaultActiveKey="1">
<TabPane tab="文档" itemKey="1">
文档
</TabPane>
<TabPane tab="快速起步" itemKey="2" disabled>
快速起步
</TabPane>
<TabPane tab="帮助" itemKey="3">
帮助
</TabPane>
</Tabs>
);
}标签栏内容扩展
传入 tabBarExtraContent 属性可以在标签栏右侧添加附加操作。
代码
import { Tabs, TabPane, Button } from '@fibrous/semi-ui-solid';
export default function TabsDemo() {
return (
<Tabs
defaultActiveKey="1"
tabBarExtraContent={
<Button
onClick={() => {
alert('you have clicked me!');
}}
>
Extra Action
</Button>
}
>
<TabPane tab="文档" itemKey="1">
文档
</TabPane>
<TabPane tab="快速起步" itemKey="2">
快速起步
</TabPane>
<TabPane tab="帮助" itemKey="3">
帮助
</TabPane>
</Tabs>
);
}标签栏二次封装
传入 renderTabBar 函数可对标签栏进行二次封装,同一个函数只调用一次。tabBarProps 是活的标签栏属性,字段需要在返回的 JSX 中读取;DefaultTabBar 是默认标签栏组件,用 <DefaultTabBar {...tabBarProps} /> 渲染。
用 renderTabBar 完全替换标签栏时,Tabs 的 aria-label、aria-labelledby 在 tabBarProps 中,不会自动落到你自己的元素上:可访问名称写在自定义的 role="tablist" 元素上。TabPane 写法下,tabBarProps.list 的各项是普通数据,不带 tab;需要标签文本时用 tabList。
代码
import { Tabs, TabPane } from '@fibrous/semi-ui-solid';
export default function TabsDemo() {
return (
<Tabs
defaultActiveKey="1"
renderTabBar={(tabBarProps, DefaultTabBar) => (
<div class="tab-bar-box">
这是二次封装的Tab Bar,当前ActiveKey:{tabBarProps.activeKey}
<DefaultTabBar {...tabBarProps} />
</div>
)}
>
<TabPane tab="文档" itemKey="1">
文档
</TabPane>
<TabPane tab="快速起步" itemKey="2">
快速起步
</TabPane>
<TabPane tab="帮助" itemKey="3">
帮助
</TabPane>
</Tabs>
);
}拖拽排序
通过 renderTabBar 结合第三方拖拽库(如 @dnd-kit)可以实现标签栏的拖拽排序功能:在自己的 role="tablist" 元素里用 Tabs.TabItem 渲染各个标签。TabItem 不会自行选中所在的标签页,需要在 onClick 中更新 activeKey。
代码
import { createSignal, For } from 'solid-js';
import { Accessibility } from '@dnd-kit/dom';
import { arrayMove } from '@dnd-kit/helpers';
import { DragDropProvider } from '@dnd-kit/solid';
import { isSortable, useSortable } from '@dnd-kit/solid/sortable';
import { Tabs, TabPane, type PlainTab, type TabsProps, type TabItemProps } from '@fibrous/semi-ui-solid';
// The Provider drops the Accessibility plugin so TabItem keeps role="tab" and roving tabIndex, without aria-pressed
interface SortableTabItemProps extends Pick<TabItemProps, 'selected' | 'size' | 'type' | 'tabPosition' | 'onClick'> {
item: PlainTab;
index: number;
}
function SortableTabItem(props: SortableTabItemProps) {
const { ref, isDragging } = useSortable({
get id() {
return props.item.itemKey;
},
get index() {
return props.index;
},
get disabled() {
return props.item.disabled;
},
});
return (
<Tabs.TabItem
ref={(node) => ref(node)}
style={{ cursor: props.item.disabled ? 'not-allowed' : 'grab', opacity: isDragging() ? 0.5 : 1, display: 'inline-flex' }}
itemKey={props.item.itemKey}
tab={props.item.tab}
disabled={props.item.disabled}
selected={props.selected}
size={props.size}
type={props.type}
tabPosition={props.tabPosition}
onClick={props.onClick}
/>
);
}
export default function TabsDemo() {
const [activeKey, setActiveKey] = createSignal('1');
const [items, setItems] = createSignal([
{ itemKey: '1', tab: '文档', content: '文档内容' },
{ itemKey: '2', tab: '表格', content: '表格内容' },
{ itemKey: '3', tab: '幻灯片', content: '幻灯片内容' },
{ itemKey: '4', tab: '表单', content: '表单内容' },
]);
const renderTabBar: TabsProps['renderTabBar'] = (tabBarProps) => (
<DragDropProvider
plugins={(defaults) => defaults.filter((plugin) => plugin !== Accessibility)}
onDragEnd={(event) => {
const { source } = event.operation;
if (!event.canceled && isSortable(source)) {
setItems((prev) => arrayMove(prev, source.initialIndex, source.index));
}
}}
>
<div class={`semi-tabs-bar semi-tabs-bar-${tabBarProps.type} semi-tabs-bar-${tabBarProps.tabPosition}`} role="tablist">
<For each={items()}>{(item, index) => <SortableTabItem item={item} index={index()} selected={activeKey() === item.itemKey} size={tabBarProps.size} type={tabBarProps.type} tabPosition={tabBarProps.tabPosition} onClick={(key) => setActiveKey(key)} />}</For>
</div>
</DragDropProvider>
);
return (
<Tabs type="line" activeKey={activeKey()} onChange={setActiveKey} renderTabBar={renderTabBar}>
<For each={items()}>
{(item) => (
<TabPane tab={item.tab} itemKey={item.itemKey}>
<div style={{ padding: '20px' }}>{item.content}</div>
</TabPane>
)}
</For>
</Tabs>
);
}动态更新
通过绑定事件,可以使标签栏动态更新。
代码
import { createSignal, For } from 'solid-js';
import { Tabs, TabPane, ButtonGroup, Button } from '@fibrous/semi-ui-solid';
export default function TabsDemo() {
let newTabIndex = 0;
const [panes, setPanes] = createSignal([
{ title: 'Tab 1', content: 'Content of Tab Pane 1', itemKey: '1' },
{ title: 'Tab 2', content: 'Content of Tab Pane 2', itemKey: '2' },
]);
const [activeKey, setActiveKey] = createSignal('1');
const add = () => {
const index = newTabIndex++;
setPanes([...panes(), { title: `New Tab ${index}`, content: 'New Tab Pane', itemKey: `newTab${index}` }]);
setActiveKey(`newTab${index}`);
};
const remove = () => {
if (panes().length > 1) {
const rest = panes().slice(0, -1);
setPanes(rest);
setActiveKey(rest[rest.length - 1].itemKey);
}
};
return (
<Tabs
activeKey={activeKey()}
onChange={setActiveKey}
tabBarExtraContent={
<ButtonGroup>
<Button onClick={add}>新增</Button>
<Button onClick={remove}>删除</Button>
</ButtonGroup>
}
>
<For each={panes()}>
{(pane) => (
<TabPane tab={pane.title} itemKey={pane.itemKey}>
{pane.content}
</TabPane>
)}
</For>
</Tabs>
);
}关闭
关闭标签栏中的某一个标签页。
四种样式的页签都支持关闭选项,在对应的标签页上设置 closable 来开启。禁用的标签页不能关闭。标签页的移除由使用方在关闭回调中完成。
代码
import { createSignal, For } from 'solid-js';
import { Tabs, TabPane } from '@fibrous/semi-ui-solid';
export default function TabsDemo() {
const [tabList, setTabList] = createSignal([
{ tab: '文档', itemKey: '1', text: '文档', closable: true },
{ tab: '快速起步', itemKey: '2', text: '快速起步', closable: true },
{ tab: '帮助', itemKey: '3', text: '帮助' },
]);
const close = (key: string) => {
setTabList(tabList().filter((t) => t.itemKey !== key));
};
return (
<Tabs type="card" defaultActiveKey="1" onTabClose={close}>
<For each={tabList()}>
{(t) => (
<TabPane closable={t.closable} tab={t.tab} itemKey={t.itemKey}>
{t.text}
</TabPane>
)}
</For>
</Tabs>
);
}API 参考
Tab
Props
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| activeKey | 当前激活的标签页的 itemKey,受控。传 null 时不激活任何标签页,仍是受控;不传或为 undefined 时按非受控处理。 | string | null | - |
| aria-label | 标签栏的可访问名称,落在 role="tablist" 元素上。 | string | - |
| aria-labelledby | 指向标签栏名称元素的 id,落在 role="tablist" 元素上。 | string | - |
| arrowPosition | 折叠模式下,左右切换箭头的位置。 | TabBarProps['arrowPosition'] | "both" |
| children | TabPane 子元素,必须是 Tabs 的直接子元素;其余节点按原顺序作为内容渲染。传了 tabList 时,TabPane 被忽略,其余节点是当前标签页的内容。 | JSX.Element | - |
| collapsible | 是否开启滚动折叠(仅水平模式)。传 'auto' 时在标签溢出或换行时自动折叠,放得下时自动退出。 | boolean | 'auto' | false |
| contentStyle | 内容区域外层的样式,可传对象或字符串。 | JSX.CSSProperties | string | - |
| defaultActiveKey | 非受控时初始选中的 itemKey。不传时取第一个启用且有 itemKey 的标签页。 | string | - |
| dropdownProps | 折叠模式下,分别透传给起始侧(start)与末尾侧(end)箭头下拉菜单的 Dropdown 属性。 | TabsDropdownProps | - |
| keepDOM | 使用 TabPane 子元素时,是否渲染未激活面板的 DOM。为 false 时只渲染当前面板,没有切换动画。 | boolean | true |
| lazyRender | 懒渲染,面板被激活过才渲染内容,之后保留。 | boolean | false |
| more | 将末尾的一部分标签页收入「更多」下拉菜单。传数字表示收入菜单的标签数;传对象时 count 为标签数,render 返回自定义的触发器,dropdownProps 透传给下拉菜单。 | TabsMore | - |
| onChange | 切换标签页时触发,参数为新激活的 itemKey。 | Type(activeKey: string) => void | - |
| onTabClick | 单击,或用 Enter、Space 激活标签页时触发;用键盘激活时事件是 KeyboardEvent。 | Type(activeKey: string, event: MouseEvent | KeyboardEvent) => void | - |
| onTabClose | 关闭标签页时触发,参数为被关闭标签页的 itemKey。标签页的移除由使用方完成。 | Type(tabKey: string) => void | - |
| onVisibleTabsChange | 折叠模式下溢出项的可见状态变化时触发,参数为 itemKey 到是否可见的 Map。 | TabBarProps['onVisibleTabsChange'] | - |
| preventScroll | 组件内部调用 focus 时,是否阻止浏览器滚动文档以显示新聚焦的元素。 | boolean | - |
| renderArrow | 替换折叠模式下的每个滚动箭头。参数依次为被滚出的 items、位置 pos、点击处理函数 handleArrowClick 与创建默认箭头的函数 defaultNode,在插入处调用 defaultNode()。items 是普通数据;TabPane 写法下不带 tab,需要标签文本时用 tabList。 | TabBarProps['renderArrow'] | - |
| renderIcon | tabList 每一项的图标,参数为该项与其下标。在页签、菜单项等每个插入处各调用一次,该项数据或下标变化时重新调用。 | TabRender | - |
| renderTab | tabList 每一项的标签内容,参数为该项与其下标;不传时显示该项的 tab。在页签、菜单项与面板名称等每个插入处各调用一次,该项数据或下标变化时重新调用。 | TabRender | - |
| renderTabBar | 替换整个标签栏,同一个函数只调用一次。tabBarProps 是活的标签栏属性,在返回的 JSX 中读取;DefaultTabBar 是默认标签栏组件。 | Type(tabBarProps: TabBarProps, DefaultTabBar: Component<TabBarProps>) => JSX.Element | - |
| showRestInDropdown | 折叠模式下,是否将被收起的标签页展示在下拉菜单中。 | boolean | true |
| size | 标签栏尺寸,目前仅线条式(line)标签栏支持。 | TabSize | "large" |
| tabBarClassName | 标签栏的类名。 | string | - |
| tabBarExtraContent | 标签栏的附加内容,位于 tablist 之外。 | JSX.Element | - |
| tabBarStyle | 标签栏的样式,可传对象或字符串。 | JSX.CSSProperties | string | - |
| tabList | 标签页的数据数组,每项只含数据:itemKey、tab(文字)、disabled、closable,节点内容交给 renderTab、renderIcon。只要传了数组(含空数组),children 就是当前标签页的内容,并优先于 TabPane 子元素。 | PlainTab[] | - |
| tabPaneMotion | 是否使用动画切换面板。 | boolean | true |
| tabPosition | 标签栏位置:top 为水平,left 为垂直。 | TabPosition | "top" |
| type | 标签栏样式:line、card、button、slash。slash 仅支持水平模式。 | TabType | "line" |
| visibleTabsStyle | 折叠模式下,整体滚动区域的样式,可传对象或字符串。 | TabBarProps['visibleTabsStyle'] | - |
class、style、ref 与其他原生属性和事件落在根元素上;aria-label、aria-labelledby 落在 role="tablist" 元素上。
TabPane
Props
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| children | 面板内容。 | JSX.Element | - |
| closable | 是否允许关闭该标签页,关闭时触发 Tabs 的 onTabClose。 | boolean | - |
| disabled | 是否禁用该标签页。 | boolean | - |
| icon | 标签栏中该标签的图标,由 Tabs 渲染。 | JSX.Element | - |
| itemKey | 标签页的唯一标识,对应 activeKey。 | string | - |
| tab | 标签栏中的标签内容,由 Tabs 渲染。 | JSX.Element | - |
class、style、ref 与原生属性和事件(包括 id、role、aria-*、tabIndex)落在 role="tabpanel" 的面板元素上;id、role、aria-hidden 与同标签页配对的 aria-labelledby 由组件生成,不会被覆盖,tabIndex 默认为 0,可以覆盖。
TabItem
自定义标签栏(renderTabBar)中单个标签的组件,通过 Tabs.TabItem 使用。在 Tabs 内,它使用 Tabs 的键盘与关闭处理,但点击时不会自行选中标签页,需要在 onClick 中更新 activeKey。
Props
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| closable | 是否显示关闭按钮。 | boolean | - |
| deleteTabItem | 点击关闭按钮时的处理函数,参数为 itemKey 与事件。在 Tabs 内默认由 Tabs 处理,触发 onTabClose。 | TabBarProps['deleteTabItem'] | - |
| disabled | 是否禁用;禁用时点击与关闭按钮不生效,关闭按钮仍会显示。 | boolean | - |
| handleKeyDown | 键盘处理函数,参数为事件、itemKey 与 closable。在 Tabs 内默认由 Tabs 处理方向键、Home、End、Enter、Space 与 Delete。 | TabBarProps['handleKeyDown'] | - |
| icon | 标签图标;没有内容则不渲染图标。 | JSX.Element | - |
| itemKey | 标签的唯一标识。 | string | - |
| onClick | 点击标签时触发,参数为 itemKey 与事件;禁用时不触发。TabItem 本身不会选中标签页,需在回调中更新 Tabs 的 activeKey。 | Type(itemKey: string, event: MouseEvent) => void | - |
| selected | 是否为选中状态。 | boolean | - |
| size | 尺寸,small 与 medium 带对应的类名。 | TabSize | - |
| tab | 标签内容。 | JSX.Element | - |
| tabPosition | 位置,默认取所在 Tabs 的 tabPosition。 | TabPosition | - |
| type | 样式,默认取所在 Tabs 的 type。 | TabType | - |
class、style、ref 与原生属性和事件落在根元素上;role、id、aria-selected、aria-disabled、aria-controls 与 tabIndex 由组件管理,不会被覆盖。
Accessibility
ARIA
- 关于 role
- TabBar 中只包含 Tab 的元素对应的 role 为
tablist,切换箭头、「更多」和tabBarExtraContent在它之外 - TabBar 中的 Tab 对应的 role 为
tab - TabPane 对应的 role 为
tabpanel
- TabBar 中只包含 Tab 的元素对应的 role 为
- aria-label、aria-labelledby: 传给 Tabs 时落在
role="tablist"的元素上,用于给标签栏命名 - aria-orientation: 表明 TabBar 的方向,有
vertical和horizontal两种。当传入 tabPosition 为 left 时, aria-orientation 会被设置为vertical,tabPosition 为 top 时,设置为horizontal - aria-disabled: 当 TabPane 设置为 disabled 时,对应 Tab 的 aria-disabled 会被设置为 true
- aria-selected: 表明 Tab 是否被选中
- aria-controls: 指向 Tab 标签所控制的 TabPane;文档中只有当前选中项的面板时(使用
tabList,或keepDOM为 false),只有选中的 Tab 带有此属性 - aria-labelledby: 指向设置 TabPane 标签的元素
键盘和焦点
WAI-ARIA: https://www.w3.org/WAI/ARIA/apg/patterns/tabpanel/
- 选项卡可以被获取到焦点,但禁用的选项卡除外
- 键盘用户可以使用
Tab键,将焦点移动到已被选择的选项卡元素的选项卡面板上 - 当焦点位于水平选项卡列表中的选项卡元素上时,使用
左右箭头来切换选项(RTL 页面中左右箭头方向对调) - 当焦点位于垂直选项卡列表中的选项卡元素上时,使用
上下箭头来切换选项 - 当焦点位于选项卡列表中的未被激活的选项卡元素上时,可以使用
Space或Enter键来激活该选项卡 - 当键盘用户想要直接将焦点聚焦到选项卡列表中的最后一个选项卡元素时:
- Mac 用户:
fn+右箭头 - Windows 用户:
End
- Mac 用户:
- 当键盘用户想要直接将焦点聚焦到选项卡列表中的第一个选项卡元素时:
- Mac 用户:
fn+左箭头 - Windows 用户:
Home
- Mac 用户:
- 使用
more时,默认的「更多」触发器是原生button,可以用Tab键聚焦,Enter或Space打开下拉菜单,并带有aria-haspopup="menu"与aria-expanded - 当选项卡允许被删除时:
- 用户可以使用
Delete或Backspace键删除选项卡,禁用的选项卡除外 - 删除后,焦点转移到被删除选项卡元素的后一个元素上;若被删除元素无后一个元素则转移到前一个元素上
- 用户可以使用
设计变量
| Sass 变量 | 值 | 用法 |
|---|---|---|
| $transition_duration-tabs_tab_line-border | var(--semi-transition_duration-none) | 线条式标签页标示线-边框-动画持续时间 |
| $transition_function-tabs_tab_line-border | var(--semi-transition_function-easeIn) | 线条式标签页标示线-边框-过渡曲线 |
| $transition_delay-tabs_tab_line-border | var(--semi-transition_delay-none) | 线条式标签页标示线-边框-延迟时间 |
| $transition_duration-tabs_tab_line-text | var(--semi-transition_duration-none) | 线条式标签页-文字-动画持续时间 |
| $transition_function-tabs_tab_line-text | var(--semi-transition_function-easeIn) | 线条式标签页-文字-过渡曲线 |
| $transition_delay-tabs_tab_line-text | var(--semi-transition_delay-none) | 线条式标签页-文字-延迟时间 |
| $transition_duration-tabs_tab_button-bg | var(--semi-transition_duration-none) | 按钮式标签页-背景色-动画持续时间 |
| $transition_function-tabs_tab_button-bg | var(--semi-transition_function-easeIn) | 按钮式标签页-背景色-过渡曲线 |
| $transition_delay-tabs_tab_button-bg | var(--semi-transition_delay-none) | 按钮式标签页-背景色-延迟时间 |
| $transition_duration-tabs_tab_card-bg | var(--semi-transition_duration-none) | 卡片式标签页文字-背景色-动画持续时间 |
| $transition_function-tabs_tab_card-bg | var(--semi-transition_function-easeIn) | 卡片式标签页文字-背景色-过渡曲线 |
| $transition_delay-tabs_tab_card-bg | var(--semi-transition_delay-none) | 卡片式标签页文字-背景色-延迟时间 |
| $transform_scale-tabs_tab_line-item | var(--semi-transform_scale-none) | 线条式标签页item 放大 |
| $transform_scale-tabs_tab_button-item | var(--semi-transform_scale-none) | 按钮式标签页item 放大 |
| $transform_scale-tabs_tab_card-item | var(--semi-transform_scale-none) | 线条式标签页item 放大 |
| $animation_transform_translateX-tabs_tabPanel-leftShow | 60px | 左侧展示时,tabPanel的水平偏移值 |
| $animation_transform_translateX-tabs_tabPanel-rightShow | -60px | 右侧展示时,tabPanel的水平偏移值 |
| $animation_opacity-tabs_tabPanel_show | 0 | tabPanel的动画开始时透明度 |
| $animation_duration-tabs_tabPanel-show | 200ms | tabPanel的展示动画持续时间 |
| $animation_function-tabs_tabPanel-show | ease-in-out | tabPanel的展示动画曲线 |
| $animation_delay-tabs_tabPanel-show | 0s | tabPanel的展示动画延迟时间 |
| $color-tabs_tab_line_default-border-default | var(--semi-color-border) | 线条式页签轨道颜色 - 默认 |
| $color-tabs_tab_line_default-text-default | var(--semi-color-text-2) | 线条式页签文本颜色 - 默认 |
| $color-tabs_tab_line_default-text-hover | var(--semi-color-text-0) | 线条式页签文本颜色 - 悬浮 |
| $color-tabs_tab_line_default-border-hover | var(--semi-color-fill-0) | 线条式页签标示线颜色 - 悬浮 |
| $color-tabs_tab_line_default-text-active | var(--semi-color-text-0) | 线条式页签文本颜色 - 按下 |
| $color-tabs_tab_line_default-border-active | var(--semi-color-fill-1) | 线条式页签标示线颜色 - 按下 |
| $color-tabs_tab_line_selected-text-default | var(--semi-color-text-0) | 线条式页签文本颜色 - 选中 |
| $color-tabs_tab_line_indicator_selected-icon-default | var(--semi-color-primary) | 线条式页签标示线颜色 - 选中 |
| $color-tabs_tab_line_vertical_selected-bg-default | var(--semi-color-primary-light-default) | 垂直线条式页签背景颜色 - 选中 |
| $color-tabs_tab_line_vertical-bg-hover | var(--semi-color-fill-0) | 垂直线条式页签背景颜色 - 悬浮 |
| $color-tabs_tab_line_vertical-bg-active | var(--semi-color-fill-1) | 垂直线条式页签背景颜色 - 按下 |
| $color-tabs_tab_line_disabled-text-default | var(--semi-color-disabled-text) | 禁用线条式页签文本颜色 - 默认 |
| $color-tabs_tab_line_disabled-text-hover | var(--semi-color-disabled-text) | 禁用线条式页签文本颜色 - 悬浮 |
| $color-tabs_tab_card_default-border-default | var(--semi-color-border) | 卡片式页签容器底部长线颜色 - 默认 |
| $color-tabs_tab_button_selected-bg-default | var(--semi-color-primary-light-default) | 按钮式页签背景颜色 - 选中 |
| $color-tabs_tab_button_selected-text-default | var(--semi-color-primary) | 按钮式页签文本颜色 - 选中 |
| $color-tabs_tab_button-text-default | var(--semi-color-text-2) | 按钮式页签文本颜色 - 默认 |
| $color-tabs_tab_button-bg-hover | var(--semi-color-fill-0) | 按钮式页签背景颜色 - 悬浮 |
| $color-tabs_tab_button-bg-active | var(--semi-color-fill-1) | 按钮式页签背景颜色 - 按下 |
| $color-tabs_tab_card_indicator_selected-icon-default | var(--semi-color-border) | 卡片式页签选中页签描边 |
| $color-tabs_tab_card-bg-hover | var(--semi-color-fill-0) | 卡片式页签背景颜色 - 悬浮 |
| $color-tabs_tab_card_selected-bg-default | var(--semi-color-bg-1) | 卡片式页签背景颜色 - 选中 |
| $color-tabs_tab_card-bg-active | var(--semi-color-fill-1) | 卡片式页签背景颜色 -按下 |
| $color-tabs_tab-icon-default | var(--semi-color-text-2) | 页签图标颜色 - 默认 |
| $color-tabs_tab-icon-hover | var(--semi-color-text-0) | 页签图标颜色 - 悬浮 |
| $color-tabs_tab-icon-active | var(--semi-color-text-0) | 页签图标颜色 - 按下 |
| $color-tabs_tab_selected-icon-default | var(--semi-color-primary) | 页签图标颜色 - 选中 |
| $color-tabs_tab-outline-focus | $color-focus-ring | 页签轮廓 - 聚焦 |
| $color-tabs_tab-pane-text-default | var(--semi-color-text-0) | 标签页内容文本颜色 - 默认 |
| $color-tabs_tab-pane_arrow-text-default | var(--semi-color-primary) | 滚动折叠箭头颜色 - 默认 |
| $color-tabs_tab-pane_arrow-border-default | transparent | 滚动折叠箭头边框颜色 - 默认 |
| $color-tabs_tab-pane_arrow-bg-default | transparent | 滚动折叠箭头背景色 - 默认 |
| $color-tabs_tab-pane_arrow-text-hover | var(--semi-color-primary) | 滚动折叠箭头颜色 - 悬浮 |
| $color-tabs_tab-pane_arrow-border-hover | transparent | 滚动折叠箭头边框颜色 - 悬浮 |
| $color-tabs_tab-pane_arrow-text-active | var(--semi-color-primary) | 滚动折叠箭头颜色 - 按下 |
| $color-tabs_tab-pane_arrow-border-active | transparent | 滚动折叠箭头边框颜色 - 按下 |
| $color-tabs_tab-pane_arrow_disabled-bg-default | transparent | |
| $color-tabs_tab-pane_arrow_disabled-bg-hover | transparent | |
| $color-tabs_tab-pane_arrow_disabled-text-default | var(--semi-color-disabled-text) | |
| $color-tabs_tab-pane_arrow_disabled-text-hover | var(--semi-color-disabled-text) | |
| $color-tabs_tab_slash_line | var(--semi-color-text-2) | 斜线式页签分割线颜色 |
| $font-tabs_tab-fontWeight | $font-weight-regular | 页签文本字重 - 默认 |
| $font-tabs_tab_active-fontWeight | $font-weight-bold | 页签文本字重 - 选中 |
| $height-tabs_overflow_list | 300px | 页签折叠收起菜单高度 |
| $width-tabs_bar_line-border | $border-thickness-control | 线条式页签底部分割线宽度 |
| $width-tabs_bar_line_tab-border | 2px | 页签标示线宽度 |
| $width-tabs_bar_card-border | $border-thickness-control | 卡片式页签容器底部长线宽度 |
| $width-tabs-outline | $width-focus-ring | 聚焦轮廓宽度 |
| $width-tabs-outline-offset | -2px | 聚焦轮廓偏移宽度 |
| $width-tabs_bar_line-outline-offset | -1px | 线条式页签聚焦轮廓偏移宽度 |
| $width-tabs_tab-pane_arrow-border | 0px | 滚动折叠箭头边框宽度 |
| $width-tabs_tab_slash_line | 8px | 斜线式页签分割线宽度 |
| $height-tabs_tab_slash_line | 14px | 斜线式页签分割线高度 |
| $height-tabs_bar_extra_large | 50px | 大尺寸页签高度 |
| $font-tabs_bar_extra_large-lineHeight | $height-tabs_bar_extra_large | 大尺寸页签文字行高 |
| $height-tabs_bar_extra_small | 36px | 小尺寸页签高度 |
| $font-tabs_bar_extra_small-lineHeight | $height-tabs_bar_extra_small | 小尺寸页签文字行高 |
| $spacing-tabs_tab-more_trigger_icon-marginLeft | 8px | |
| $spacing-tabs_tab-more_trigger_icon-marginRight | 8px | |
| $spacing-tabs_tab-more_trigger_icon-marginTop | 0px | |
| $spacing-tabs_tab-more_trigger_icon-marginBottom | 0px | |
| $spacing-tabs_tab-pane_arrow | 8px | 滚动折叠箭头内边距 |
| $spacing-tabs_bar_extra-paddingY | 0px | 附加操作垂直内边距 |
| $spacing-tabs_bar_extra-paddingX | 5px | 附加操作水平内边距 |
| $spacing-tabs_tab_icon-marginRight | $spacing-tight | 附加操作垂直内边距 |
| $spacing-tabs_tab_icon-top | 3px | 页签图标顶部位置 |
| $spacing-tabs_overflow_icon-marginRight | 4px | 页签折叠切换按钮右侧外边距 |
| $spacing-tabs_overflow_icon-marginLeft | 4px | 页签折叠切换按钮左侧外边距 |
| $spacing-tabs_bar_line_tab-paddingTop | $spacing-base | 线条式页签 |
| $spacing-tabs_bar_line_tab-paddingRight | $spacing-extra-tight | 线条式页签右侧内边距 |
| $spacing-tabs_bar_line_tab-paddingBottom | $spacing-base - $width-tabs_bar_line_tab-border | 线条式页签底部内边距 |
| $spacing-tabs_bar_line_tab-paddingLeft | $spacing-extra-tight | 线条式页签左侧内边距 |
| $spacing-tabs_bar_line_tab-marginRight | $spacing-loose | 线条式页签右侧外边距 |
| $spacing-tabs_bar_line_tab_small-paddingTop | $spacing-tight | 小尺寸线条式页签顶部内边距 |
| $spacing-tabs_bar_line_tab_small-paddingRight | $spacing-extra-tight | 小尺寸线条式页签右侧内边距 |
| $spacing-tabs_bar_line_tab_small-paddingBottom | $spacing-tight - $width-tabs_bar_line_tab-border | 小尺寸线条式页签底部内边距 |
| $spacing-tabs_bar_line_tab_small-paddingLeft | $spacing-extra-tight | 小尺寸线条式页签左侧内边距 |
| $spacing-tabs_bar_line_tab_medium-paddingTop | $spacing-base-tight | 中等尺寸线条式页签顶部内边距 |
| $spacing-tabs_bar_line_tab_medium-paddingRight | $spacing-extra-tight | 中等尺寸线条式页签右侧内边距 |
| $spacing-tabs_bar_line_tab_medium-paddingBottom | $spacing-base-tight - $width-tabs_bar_line_tab-border | 中等尺寸线条式页签底部内边距 |
| $spacing-tabs_bar_line_tab_medium-paddingLeft | $spacing-extra-tight | 中等尺寸线条式页签左侧内边距 |
| $spacing-tabs_bar_line_tab_left-padding | 12px | 垂直线条式页签左侧内边距 |
| $spacing-tabs_bar_line_tab_left_small-padding | $spacing-tight - 2px | 小尺寸垂直线条式页签左侧内边距 |
| $spacing-tabs_bar_line_tab_left_medium-padding | $spacing-base-tight - 2px | 中等尺寸垂直线条式页签左侧内边距 |
| $spacing-tabs_bar_slash_tab-paddingY | 12px | 斜线式页签上下内边距 |
| $spacing-tabs_bar_slash_tab-paddingX | 0px | 斜线式页签水平内边距 |
| $spacing-tabs_bar_slash-marginRight | 16px | 斜线式页签右侧外边距 |
| $spacing-tabs_bar_slash_line_marginLeft | 16px | 斜线式页签斜线左侧外边距 |
| $spacing-tabs_bar_slash_line_marginTop | 3px | 斜线式页签斜线顶部外边距 |
| $spacing-tabs_bar_slash_line_marginBottom | 3px | 斜线式页签斜线底部外边距 |
| $spacing-tabs_content-paddingY | 5px | 页签内容区垂直方向内边距 |
| $spacing-tabs_content-paddingX | 0 | 页签内容区水平方向内边距 |
| $spacing-tabs_content_left-paddingX | 5px | 垂直页签内容区垂直方向内边距 |
| $spacing-tabs_content_left-paddingY | 0 | 垂直页签内容区水平方向内边距 |
| $spacing-tabs_bar_card_tab-marginRight | $spacing-tight | 卡片式页签右侧外边距 |
| $spacing-tabs_bar_card_tab_active-paddingTop | $spacing-tight | 卡片式选中页签顶部内边距 |
| $spacing-tabs_bar_card_tab_active-paddingBottom | $spacing-tight - 1px | 卡片式选中页签底部内边距 |
| $spacing-tabs_bar_card_tab_active-paddingLeft | $spacing-base-tight | 卡片式选中页签左侧内边距 |
| $spacing-tabs_bar_card_tab_active-paddingRight | $spacing-base-tight | 卡片式选中页签右侧内边距 |
| $spacing-tabs_bar_card_tab_left-marginBottom | $spacing-tight | 垂直卡片式页签底部外边距 |
| $spacing-tabs_bar_card_tab_left_active-paddingY | $spacing-tight | 垂直卡片式选中页签垂直内边距 |
| $spacing-tabs_bar_card_tab_left_active-paddingX | $spacing-base-tight | 垂直卡片式选中页签水平内边距 |
| $spacing-tabs_bar_card_tab-paddingY | $spacing-tight | 卡片式选中页签垂直内边距 |
| $spacing-tabs_bar_card_tab-paddingX | $spacing-base-tight | 卡片式选中页签水平内边距 |
| $spacing-tabs_bar_button_tab_left-marginBottom | $spacing-tight | 垂直按钮式页签底部外边距 |
| $spacing-tabs_bar_button_tab-marginRight | $spacing-tight | 按钮式页签右侧外边距 |
| $spacing-tabs_bar_button_tab-paddingY | $spacing-tight | 按钮式页签垂直内边距 |
| $spacing-tabs_bar_button_tab-paddingX | $spacing-base-tight | 按钮式页签水平内边距 |
| $radius-tabs_tab_card | var(--semi-border-radius-small) var(--semi-border-radius-small) 0 0 | 卡片式页签四向圆角 |
| $radius-tabs_tab_card_left | var(--semi-border-radius-small) 0 0 var(--semi-border-radius-small) | 垂直卡片式页签四向圆角 |
| $radius-tabs_tab_button | var(--semi-border-radius-small) | 按钮式页签圆角 |
| $font-tabs_bar_large-fontSize | $font-size-regular | 大号模式 字体大小 |
| $font-tabs_bar_small-fontSize | $font-size-regular | 小号模式 字体大小 |
| $font-tabs_bar_medium-fontSize | $font-size-regular | 中等模式 字体大小 |
文案规范
- 标签文案需要准确清晰地解释标签内容
- 用简短的,易区分的标签
- 尽量保持在一个词以内
FAQ
-
为什么在 Tabs 中使用 Typography 的省略 ellipsis 失效?
因为 Tabs 渲染 TabPane 时,默认是全部渲染 display: none。此时这些组件无法获取到正确的宽度或高度值。建议开启 lazyRender,或者关闭 keepDOM。
-
为什么在 Tabs 中使用 Collapse/Collapsible/Resizable Table 等组件的高度或宽度值不对?
原因同上,另外如果 collapse 不需要动画,也可以把它的
motion设为 false 来关闭动画效果。此时无需获取组件的高度。