Skip to content

Toggle 切换按钮 ​

按下 / 弹起两态的按钮,表示「这个格式 / 模式当前是否生效」,如编辑器工具栏里的「加粗」。 立即生效的设置项开关请用 Switch。

基础用法

点击在按下 / 弹起之间切换,受控值是 pressed + ptChange。按下态是浅灰底 + 最强文字色;outline 变体多一圈 1px 描边。

<pt-toggle>加粗</pt-toggle>
<pt-toggle pressed>斜体</pt-toggle>
<pt-toggle variant="outline">下划线</pt-toggle>
<pt-toggle variant="outline" pressed>删除线</pt-toggle>
尺寸

三档控件刻度:24 / 32 / 40。lg 档图标放大到 20px。

<pt-toggle size="sm" variant="outline">小</pt-toggle>
<pt-toggle size="md" variant="outline">中</pt-toggle>
<pt-toggle size="lg" variant="outline">大</pt-toggle>
纯图标与禁用

纯图标时必须给 aria-label(包装层里是 ariaLabelText),否则读屏只会读出「切换按钮」。

<pt-toggle aria-label="加粗">
  <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
    <path d="M6 12h9a4 4 0 0 1 0 8H7a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h7a4 4 0 0 1 0 8"></path>
  </svg>
</pt-toggle>
<pt-toggle aria-label="斜体" pressed>
  <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
    <line x1="19" x2="10" y1="4" y2="4"></line>
    <line x1="14" x2="5" y1="20" y2="20"></line>
    <line x1="15" x2="9" y1="4" y2="20"></line>
  </svg>
</pt-toggle>
<pt-toggle disabled>不可用</pt-toggle>
<pt-toggle disabled pressed>不可用(按下)</pt-toggle>

受控值 ​

受控值是 pressed + ptChange:用户点击切换后发 ptChange,detail 是切换后的 pressed; 外部改写 pressed 不发事件。Vue 的 v-model、Angular 的 [(ngModel)] 都绑在 pressed 上。

html
<pt-toggle id="bold">加粗</pt-toggle>
<script>
  document.getElementById('bold').addEventListener('ptChange', e => console.log(e.detail));
</script>

放进 pt-toggle-group(直接子元素)时,按下态由组统一管理:点击不自行切换、也不发自己的 ptChange, 由组发出组的 ptChange。这时要给每一项写 value —— 组按它认领按下态;value 只在组内有意义,单独使用时不起作用。

键盘操作 ​

按键行为
Space切换
Enter切换

无障碍 ​

内部是原生 <button type="button">,按下态写在 aria-pressed 上;放在切换按钮组里(包括 type="single") 也保持这一语义(见 ToggleGroup 的无障碍)。纯图标时必须给 aria-label —— 在 React / Vue / Angular 包装层里属性名是 ariaLabelText。

API ​

属性

属性Attribute类型默认值说明
ariaLabelTextaria-labelstring | undefined—无障碍名称:原生 HTML 里写 aria-label,React / Vue / Angular 包装层里属性名是 ariaLabelText。 纯图标的切换按钮**必须**给,否则读屏用户只会听到「切换按钮」。
disableddisabledbooleanfalse禁用。放在 pt-toggle-group 里时,组的 `disabled` 也会禁用它(组级优先,不改写本属性)
inheritedDisabledinherited-disabledbooleanfalse外层 pt-field-set 下发的禁用。内部继承通道:由它以 attribute 维护,不建议使用方直接写。 有效禁用是 `disabled` 与它的并集;父元素只写这一条、不碰 `disabled`,读 `el.disabled` 得到的始终是使用方自己写的值
pressedpressedbooleanfalse是否按下。受控值:与 ptChange 配对,包装层据此生成 v-model / ngModel。 在 pt-toggle-group 里由组按它的 `value` 回写,外部改了会被组改回去
sizesize"lg" | "md" | "sm"'md'尺寸档位。三档对应 24 / 32 / 40 的控件刻度。在写了 size 的 pt-toggle-group 里以组的为准
valuevaluestring | undefined—在 pt-toggle-group 里代表这一项的值:组的 `value` 里出现它就按下,点击时组按它改写 `value`。 同一组里要唯一;multiple 组写成 HTML attribute 时 `value` 以逗号分隔,所以值本身不要含逗号。 **只在组内有意义**,单独使用时不参与任何行为,也不提交表单。组内缺了它的项不能被选中
variantvariant"default" | "outline"'default'视觉变体:default 透明底;outline 带 1px 描边。在写了 variant 的 pt-toggle-group 里以组的为准

事件

事件detail 类型说明
ptChangeboolean用户点击切换后触发,detail 是切换后的 pressed。外部改写 pressed 不触发。 Vue 的 v-model 与 Angular 的 ngModel 绑在它上面。在 pt-toggle-group 里不触发(由组发)

插槽

名称说明
(默认)按钮内容:文字、图标(svg 默认 16px,lg 档 20px)或二者组合。纯图标时请给 aria-label

可定制的内部元素(::part())

part说明
base内部的 button 元素

CSS 变量

变量说明
--pt-toggle-radius圆角,默认取控件档位(md / lg 为 --pt-radius-md,sm 为 --pt-radius-sm)

Apache-2.0 协议开源