Skip to content

Button 按钮 ​

触发一个操作。导航类的「操作」请给 href,组件会渲染成 <a>,样式不变。

变体

九种变体覆盖从高强调到静默的全部层级。深色底的三档用白字,其余走正文档。

<pt-button variant="default">高强调</pt-button>
<pt-button variant="brand">品牌</pt-button>
<pt-button variant="secondary">次要</pt-button>
<pt-button variant="tertiary">第三级</pt-button>
<pt-button variant="ghost">幽灵</pt-button>
<pt-button variant="destructive">危险</pt-button>
<pt-button variant="link">链接</pt-button>
尺寸

三档控件刻度:24 / 32 / 40。高度、字号、图标尺寸是联动的。

<pt-button size="sm">小</pt-button>
<pt-button size="md">中</pt-button>
<pt-button size="lg">大</pt-button>
加载与禁用

加载中时内容留在原位只是变透明,按钮宽度不会在加载前后跳变。

<pt-button loading>提交中</pt-button>
<pt-button disabled>不可用</pt-button>

下载 ​

给了 href 的按钮再加 download,就是一个下载链接。download=""(空字符串)同样生效, 表示用服务端 / URL 给的默认文件名;不写这个属性才是正常导航。禁用或加载中时按钮退化成 <button>,download 随之失效。

下载

download 透传给内部的 <a download>,只在有 href 且未禁用时生效。空字符串表示用默认文件名。

<pt-button href="data:text/plain,ptengine" download="ptengine.txt">下载 ptengine.txt</pt-button>
<pt-button variant="secondary" href="data:text/plain,ptengine" download="">默认文件名</pt-button>

横向内边距 ​

--pt-button-padding-x 覆盖三档尺寸的默认横向内边距(sm 8px / md 12px / lg 16px)。 变量在使用处兜底、不在宿主上声明,所以设在祖先容器上就能作用到一排按钮:

html
<div style="--pt-button-padding-x: 24px">
  <pt-button>确定</pt-button>
  <pt-button variant="secondary">取消</pt-button>
</div>

纯图标按钮(icon-only)与 link 变体的内边距恒为 0,不受它影响。

表单提交 ​

type="submit" 时会提交外层 <form>。Shadow DOM 里的按钮本来做不到这点 —— 事件到了影子边界就不再触发表单的默认行为 —— 组件通过 ElementInternals 找到宿主表单并调用 requestSubmit()(不是 submit(),后者会跳过表单校验)。

html
<form>
  <pt-input name="q"></pt-input>
  <pt-button type="submit">提交</pt-button>
</form>

无障碍 ​

纯图标按钮必须给 aria-label,否则读屏用户只会听到「按钮」:

html
<pt-button icon-only aria-label="关闭">
  <svg>…</svg>
</pt-button>

API ​

属性

属性Attribute类型默认值说明
ariaLabelTextaria-labelstring | undefined—无障碍名称:原生 HTML 里写 aria-label,React / Vue / Angular 包装层里属性名是 ariaLabelText。 纯图标按钮**必须**给,否则读屏用户只会听到「按钮」。
disableddisabledbooleanfalse禁用
downloaddownloadstring | undefined—下载链接:透传给 <a download>,仅在 href 存在且未禁用时有效。 空字符串也会透传(`download=""`),表示用服务端 / URL 给的默认文件名; 不写这个属性才是「不下载,正常导航」。
fullWidthfull-widthbooleanfalse撑满父容器宽度
hrefhrefstring | undefined—给了 href 就渲染成 <a>,按钮样式不变(导航类操作用它,别用 button + onClick 跳转)
iconOnlyicon-onlybooleanfalse纯图标按钮:宽高相等,无横向内边距。图标放默认插槽
inheritedDisabledinherited-disabledbooleanfalse外层 pt-field-set 下发的禁用。内部继承通道:由它以 attribute 维护,不建议使用方直接写。 有效禁用是 `disabled` 与它的并集;父元素只写这一条、不碰 `disabled`,读 `el.disabled` 得到的始终是使用方自己写的值
loadingloadingbooleanfalse加载中:视觉上换成转圈,同时按钮不可点
relrelstring | undefined—仅在 href 存在时有效;target="_blank" 时若未指定会自动补 noreferrer
sizesize"lg" | "md" | "sm"'md'尺寸档位。三档对应 24 / 32 / 40 的控件刻度
targettarget"_blank" | "_parent" | "_self" | "_top" | undefined—仅在 href 存在时有效
typetype"button" | "reset" | "submit"'button'原生 button 的 type;设为 submit / reset 时会作用到外层 form
variantvariant"brand" | "default" | "destructive" | "ghost" | "ghost-destructive" | "link" | "secondary" | "secondary-destructive" | "tertiary"'default'视觉变体

方法

方法说明
setFocus(options?: FocusOptions) => Promise<void>让按钮获得焦点

插槽

名称说明
(默认)按钮文案
end文案后的图标
start文案前的图标

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

part说明
base内部的 button / a 元素
end后置图标容器
start前置图标容器

CSS 变量

变量说明
--pt-button-min-width最小宽度,默认 auto
--pt-button-padding-x横向内边距,默认取控件档位(sm 8px / md 12px / lg 16px);纯图标与 link 变体恒为 0,不受它影响
--pt-button-radius圆角,默认取控件档位(md / lg 为 --pt-radius-md,sm 为 --pt-radius-sm)

Apache-2.0 协议开源