Button 按钮
新粗野主义风格的按钮组件,支持 9 种变体、4 种尺寸 + icon 模式、加载状态和 asChild 组合支持。
预览
变体
尺寸
状态
提交按钮
装饰形态(flair)
安装
pnpm dlx brutx-vue@latest add button用法
<script setup>
import { Button } from 'brutx-ui-vue'
</script>
<template>
<Button variant="primary" size="default">
Click me
</Button>
</template>加载状态
<script setup>
import { ref } from 'vue'
import { Button } from 'brutx-ui-vue'
const isLoading = ref(false)
async function handleSubmit() {
isLoading.value = true
await new Promise(resolve => setTimeout(resolve, 2000))
isLoading.value = false
}
</script>
<template>
<Button variant="primary" :loading="isLoading" @click="handleSubmit">
Save Changes
</Button>
</template>禁用状态
<script setup>
import { Button } from 'brutx-ui-vue'
</script>
<template>
<Button variant="primary" disabled>
Disabled
</Button>
</template>提交按钮与等待文本
通过 type="submit" 将按钮渲染为表单提交按钮。配合 loading 与 pendingText 可在提交期间显示等待文本(替换插槽内容),未传入 pendingText 时回退到 i18n 默认值(submitButton.submitting):
<script setup>
import { ref } from 'vue'
import { Button } from 'brutx-ui-vue'
const isLoading = ref(false)
async function handleSubmit() {
isLoading.value = true
await new Promise(resolve => setTimeout(resolve, 2000))
isLoading.value = false
}
</script>
<template>
<form @submit.prevent="handleSubmit">
<Button type="submit" variant="primary" :loading="isLoading" pending-text="保存中...">
保存
</Button>
</form>
</template>仅当 type="submit" 且 loading=true 时才会显示等待文本并隐藏插槽内容;其他情况下插槽内容照常渲染,加载图标仍然显示。
asChild
使用 asChild 将按钮样式渲染到自定义元素上(例如路由链接):
<script setup>
import { Button } from 'brutx-ui-vue'
import { RouterLink } from 'vue-router'
</script>
<template>
<Button as-child>
<RouterLink to="/about">About</RouterLink>
</Button>
</template>故障效果
Button 内置 effect="glitch",可直接启用故障撕裂动画。
默认 effect="none" 不创建特效媒体监听、定时器或文本同步;glitch-trigger="autoplay" 和实例 play() 都受 effect 开关约束。设置为 glitch 后,禁用、loading 和减少动态效果会停止播放。KeepAlive 停用及卸载会释放资源,重新激活时读取当前系统偏好并按配置恢复。
<template>
<Button
effect="glitch"
variant="primary"
glitch-trigger="click"
glitch-speed="fast"
glitch-direction="both"
data-text="GLITCH"
>
GLITCH
</Button>
</template>提示:若直接使用导出的
buttonVariants({ effect: 'glitch' })构建 glitch 按钮,需显式传入glitchSpeed与glitchDirection(medium/horizontal默认值由<Button>组件提供,原始工具函数不注入默认 glitch 类)。
变体
| 变体 | 说明 |
|---|---|
default | 背景色,硬阴影 |
primary | Primary(珊瑚色)背景 |
secondary | Secondary(薄荷青)背景 |
accent | Accent(黄色)背景 |
danger | Destructive(红色)背景,白色文字 |
success | Success(绿色)背景 |
outline | 透明背景,悬停时反转 |
ghost | 无边框和阴影,柔和悬停效果 |
link | 无边框和阴影,悬停时显示下划线 |
<template>
<Button variant="primary">Primary 变体</Button>
</template>装饰形态
flair 与色系变体正交可组合,提供三种机械质感装饰形态:
| 形态 | 说明 |
|---|---|
none | 默认,不输出任何额外装饰类 |
stacked | 多层彩虹硬投影,按压时同源位移(1.5x 盖影) |
hazard | 外围警戒斜纹,中央黄色底板配黑字,悬停时保持文字对比 |
ticket | 票据撕口——左右中缝半圆缺口 |
<template>
<Button variant="primary" flair="stacked">多层投影</Button>
<Button variant="accent" flair="hazard">警戒斜纹</Button>
<Button variant="default" flair="ticket">票据撕口</Button>
</template>尺寸
| 尺寸 | 高度 | 内边距 | 字体大小 |
|---|---|---|---|
sm | h-9 | px-3 py-1 | text-sm |
default | h-11 | px-5 py-2 | text-base |
lg | h-14 | px-8 py-3 | text-lg |
xl | h-16 | px-10 py-4 | text-xl |
icon | h-11 w-11 | p-0 | — |
API 参考
| 名称 | 类型 | 默认值 | 说明 |
|---|---|---|---|
variant | "accent" | "danger" | "default" | "ghost" | "link" | "outline" | "primary" | "secondary" | "success" | undefined | "default" | 按钮的主视觉变体,控制配色和交互状态样式 |
详情声明类型NonNullable<"default" | "ghost" | "primary" | "secondary" | "success" | "danger" | "accent" | "outline" | "link" | null | undefined> | undefined 字面量
默认值详情
来源packages/ui/src/components/button/Button.vue | |||
size | "default" | "icon" | "lg" | "sm" | "xl" | undefined | "default" | 按钮的尺寸; icon 用于方形图标按钮 |
详情声明类型NonNullable<"default" | "lg" | "sm" | "xl" | "icon" | null | undefined> | undefined 字面量
默认值详情
来源packages/ui/src/components/button/Button.vue | |||
flair | "none" | "stacked" | "hazard" | "ticket" | undefined | "none" | 装饰形态:多层彩虹投影 / 警戒斜纹 / 票据撕口,与色系变体正交 |
详情声明类型"none" | "stacked" | "hazard" | "ticket" | undefined 字面量
默认值详情
来源packages/ui/src/components/button/Button.vue | |||
asChild | boolean | undefined | false | 将按钮属性、样式和交互行为合并到唯一子元素上 |
详情声明类型boolean | undefined 字面量
默认值详情
来源packages/ui/src/components/button/Button.vue | |||
type | "button" | "submit" | "reset" | undefined | undefined | 原生按钮类型;不传时由原生 button 的默认行为决定 |
详情声明类型"button" | "submit" | "reset" | undefined 字面量
默认值详情
来源packages/ui/src/components/button/Button.vue | |||
loading | boolean | undefined | false | 显示加载图标并将按钮置为禁用状态 |
详情声明类型boolean | undefined 字面量
默认值详情
来源packages/ui/src/components/button/Button.vue | |||
disabled | boolean | undefined | false | 禁止按钮的常规用户交互 |
详情声明类型boolean | undefined 字面量
默认值详情
来源packages/ui/src/components/button/Button.vue | |||
pendingText | string | undefined | undefined运行时回退: | 加载中显示的等待文本,作为默认插槽的回退内容;仅在 type="submit" 且 loading 时生效,未传入时回退到 i18n 默认值;提供插槽内容时优先显示插槽 |
详情声明类型string | undefined 默认值详情
来源packages/ui/src/components/button/Button.vue | |||
pressed | boolean | undefined | undefined | 按钮是否处于按下状态(切换按钮) |
详情声明类型boolean | undefined 字面量
默认值详情
来源packages/ui/src/components/button/Button.vue | |||
expanded | boolean | undefined | undefined | 按钮控制的内容是否展开 |
详情声明类型boolean | undefined 字面量
默认值详情
来源packages/ui/src/components/button/Button.vue | |||
effect | "none" | "glitch" | undefined | "none" | 是否启用故障撕裂视觉效果 |
详情声明类型"none" | "glitch" | undefined 字面量
默认值详情
来源packages/ui/src/components/button/Button.vue | |||
glitchTrigger | GlitchTrigger | undefined | "hover" | 故障效果的触发方式;仅在 effect="glitch" 时生效 |
详情声明类型GlitchTrigger | undefined 字面量
关联类型 GlitchTrigger 类型定义 — GlitchTriggerexport type GlitchTrigger = 'hover' | 'click' | 'autoplay' | 'none' 默认值详情
来源packages/ui/src/components/button/Button.vue | |||
glitchInterval | number | undefined | 3000 | 自动播放故障效果时的触发间隔,单位为毫秒 |
详情声明类型number | undefined 默认值详情
来源packages/ui/src/components/button/Button.vue | |||
glitchSpeed | ButtonGlitchSpeed | undefined | "medium" | 故障动画的播放速度 |
详情声明类型ButtonGlitchSpeed | undefined 字面量
关联类型 ButtonGlitchSpeed 类型定义 — ButtonGlitchSpeedtype ButtonGlitchSpeed = NonNullable<ButtonVariantProps['glitchSpeed']> 默认值详情
来源packages/ui/src/components/button/Button.vue | |||
glitchDirection | ButtonGlitchDirection | undefined | "horizontal" | 故障动画的撕裂方向 |
详情声明类型ButtonGlitchDirection | undefined 字面量
关联类型 ButtonGlitchDirection 类型定义 — ButtonGlitchDirectiontype ButtonGlitchDirection = NonNullable<ButtonVariantProps['glitchDirection']> 默认值详情
来源packages/ui/src/components/button/Button.vue | |||
class | string | undefined | undefined | 合并到按钮根元素上的补充 CSS 类名。 |
详情声明类型string | undefined 默认值详情
来源packages/ui/src/components/button/Button.vue | |||
| 名称 | 签名或类型 | 说明 |
|---|---|---|
@click | MouseEvent | 渲染根元素的原生点击事件通过 Vue 属性透传交给使用方监听;Button 本身不声明同名自定义事件。
|
详情声明类型MouseEvent 来源packages/ui/src/components/button/Button.vue | ||
| 名称 | 签名或类型 | 说明 |
|---|---|---|
#default | {} | 按钮主体内容。未提供插槽内容时,只有在 type="submit" 且 loading 为真时才显示等待文本;显式插槽内容优先。 |
详情声明类型{}来源packages/ui/src/components/button/Button.vue | ||
| 名称 | 签名或类型 | 说明 |
|---|---|---|
play | () => void | 手动激活故障动画。仅在 effect="glitch" 时生效;此方法绕过触发方式和禁用状态的检查,但减少动态效果偏好仍会隐藏动画。 |
详情声明类型() => void 来源packages/ui/src/components/button/Button.vue | ||
stop | () => void | 立即关闭故障动画状态。 |
详情声明类型() => void 来源packages/ui/src/components/button/Button.vue | ||
可访问性
- 键盘操作:支持
Space/Enter触发点击 - ARIA 属性:禁用状态自动设置
disabled属性(非asChild模式)或aria-disabled="true"(asChild模式);加载状态自动设置aria-busy="true" - 焦点管理:支持键盘导航和焦点样式(
focus:outline)