跳到主要内容

Switch

  • 组件说明:开关控件,在 On/Off 两态之间切换,固定尺寸。
  • 尺寸基线:轨道 36×20px,滑块 16×16px,左右留白 2px。
  • 实现约定:轨道保留结构骨架,视觉由 design token 控制;loading 当前保持 Default 视觉并禁止交互。
  • Figma 规范

状态

6 种状态:On / Off × 启用 / 禁用 / Loading。

结果
Loading...
实时编辑器
<div style={{ display: 'flex', gap: 32, flexWrap: 'wrap', alignItems: 'center' }}>
  <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 8 }}>
    <Switch defaultChecked aria-label="demo on" />
    <span style={{ fontSize: 12, color: '#999' }}>On</span>
  </div>
  <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 8 }}>
    <Switch aria-label="demo off" />
    <span style={{ fontSize: 12, color: '#999' }}>Off</span>
  </div>
  <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 8 }}>
    <Switch defaultChecked disabled aria-label="demo disabled on" />
    <span style={{ fontSize: 12, color: '#999' }}>禁用 On</span>
  </div>
  <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 8 }}>
    <Switch disabled aria-label="demo disabled off" />
    <span style={{ fontSize: 12, color: '#999' }}>禁用 Off</span>
  </div>
  <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 8 }}>
    <Switch defaultChecked loading aria-label="demo loading on" />
    <span style={{ fontSize: 12, color: '#999' }}>Loading On</span>
  </div>
  <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 8 }}>
    <Switch loading aria-label="demo loading off" />
    <span style={{ fontSize: 12, color: '#999' }}>Loading Off</span>
  </div>
</div>
状态轨道颜色滑块颜色透明度
On + 启用Foregrounds/Toggle On#1573D1Foregrounds/White#FFFFFF100%
Off + 启用Foregrounds/Toggle Off#D6D6D6Foregrounds/White#FFFFFF100%
On + 禁用Foregrounds/Toggle On#1573D1Foregrounds/White#FFFFFF60%
Off + 禁用Foregrounds/Toggle Off#D6D6D6Foregrounds/White#FFFFFF60%
On + LoadingForegrounds/Toggle On#1573D1Foregrounds/White#FFFFFF100%
Off + LoadingForegrounds/Toggle Off#D6D6D6Foregrounds/White#FFFFFF100%

受控模式

结果
Loading...
实时编辑器
function ControlledSwitch() {
  const [checked, setChecked] = useState(false)
  return (
    <div style={{ display: 'flex', alignItems: 'center', gap: 12 }}>
      <Switch checked={checked} onCheckedChange={setChecked} aria-label="controlled" />
      <span style={{ fontSize: 14 }}>{checked ? 'On' : 'Off'}</span>
    </div>
  )
}

尺寸规范

维度
轨道宽度36px
轨道高度20px
轨道圆角5px
滑块尺寸16×16px
滑块圆角Radius_5 - 2px
滑块内边距2px

Props

属性类型默认值说明
checkedboolean-受控选中状态
defaultCheckedbooleanfalse初始选中状态(非受控)
onCheckedChange(checked: boolean) => void-状态变化回调
disabledbooleanfalse禁用状态(60% 透明度)
loadingbooleanfalse加载态,当前保留 Default 视觉并禁止交互
aria-labelstring-无障碍标签