组件
- 手风琴 (Accordion)
- 警告 (Alert)
- 警告对话框 (Alert Dialog)
- 宽高比 (Aspect Ratio)
- 头像 (Avatar)
- 徽章 (Badge)
- 面包屑 (Breadcrumb)
- 按钮 (Button)
- 按钮组 (Button Group)
- 日历 (Calendar)
- 卡片 (Card)
- 轮播图 (Carousel)
- 图表 (Chart)
- 复选框 (Checkbox)
- 折叠面板 (Collapsible)
- 组合框 (Combobox)
- 命令面板 (Command)
- 上下文菜单 (Context Menu)
- 数据表格 (Data Table)
- 日期选择器 (Date Picker)
- 对话框 (Dialog)
- 抽屉 (Drawer)
- 下拉菜单 (Dropdown Menu)
- 空状态 (Empty)
- 字段 (Field)
- 表单 (Form)
- 悬停卡片 (Hover Card)
- 输入框 (Input)
- 输入组 (Input Group)
- 验证码输入 (Input OTP)
- 项 (Item)
- 键盘按键 (Kbd)
- 标签 (Label)
- 菜单栏 (Menubar)
- 原生选择器 (Native Select)
- 导航菜单 (Navigation Menu)
- 数字输入框 (Number Field)
- 分页 (Pagination)
- 引脚输入 (Pin Input)
- 气泡卡片 (Popover)
- 进度条 (Progress)
- 单选框组 (Radio Group)
- 范围日历 (Range Calendar)
- 可调整大小 (Resizable)
- 滚动区域 (Scroll Area)
- 选择器 (Select)
- 分隔线 (Separator)
- 侧边栏抽屉 (Sheet)
- 侧边栏 (Sidebar)
- 骨架屏 (Skeleton)
- 滑块 (Slider)
- 轻量提示 (Sonner)
- 加载动画 (Spinner)
- 步骤条 (Stepper)
- 开关 (Switch)
- 表格 (Table)
- 标签页 (Tabs)
- 标签输入 (Tags Input)
- 文本域 (Textarea)
- 吐司提示 (Toast)
- 切换按钮 (Toggle)
- 切换按钮组 (Toggle Group)
- 工具提示 (Tooltip)
- 排版 (Typography)
开始使用
<script setup lang="ts">
import { ArrowUpIcon } from 'lucide-vue-next'
import { Button } from '@/components/ui/button'
</script>
<template>
<div class="flex flex-wrap items-center gap-2 md:flex-row">
<Button variant="outline">
Button
</Button>
<Button variant="outline" size="icon" aria-label="Submit">
<ArrowUpIcon />
</Button>
</div>
</template>安装
pnpm dlx shadcn-vue@latest add button
使用方法
<script setup lang="ts">
import { Button } from '@/components/ui/button'
</script>
<template>
<Button variant="outline">
Button
</Button>
</template>光标 (Cursor)
Tailwind v4 已将按钮组件的 cursor: pointer 更改为 cursor: default。
如果你想保留 cursor: pointer 行为,请将以下代码添加到你的 CSS 文件中:
@layer base {
button:not(:disabled),
[role="button"]:not(:disabled) {
cursor: pointer;
}
}示例
尺寸
<script setup lang="ts">
import { ArrowUpRightIcon } from 'lucide-vue-next'
import { Button } from '@/components/ui/button'
</script>
<template>
<div class="flex flex-col items-start gap-8 sm:flex-row">
<div class="flex items-start gap-2">
<Button size="sm" variant="outline">
Small
</Button>
<Button size="icon-sm" aria-label="Submit" variant="outline">
<ArrowUpRightIcon />
</Button>
</div>
<div class="flex items-start gap-2">
<Button variant="outline">
Default
</Button>
<Button size="icon" aria-label="Submit" variant="outline">
<ArrowUpRightIcon />
</Button>
</div>
<div class="flex items-start gap-2">
<Button variant="outline" size="lg">
Large
</Button>
<Button size="icon-lg" aria-label="Submit" variant="outline">
<ArrowUpRightIcon />
</Button>
</div>
</div>
</template>默认
<script setup lang="ts">
import { Button } from '@/components/ui/button'
</script>
<template>
<Button>
Default
</Button>
</template>大纲
<script setup lang="ts">
import { Button } from '@/components/ui/button'
</script>
<template>
<Button variant="outline">
Outline
</Button>
</template>次要 (Secondary)
<script setup lang="ts">
import { Button } from '@/components/ui/button'
</script>
<template>
<Button variant="secondary">
Secondary
</Button>
</template>幽灵 (Ghost)
<script setup lang="ts">
import { Button } from '@/components/ui/button'
</script>
<template>
<Button variant="ghost">
Ghost
</Button>
</template>危险 (Destructive)
<script setup lang="ts">
import { Button } from '@/components/ui/button'
</script>
<template>
<Button variant="destructive">
Destructive
</Button>
</template>链接 (Link)
<script setup lang="ts">
import { Button } from '@/components/ui/button'
</script>
<template>
<Button variant="link">
Link
</Button>
</template>图标
<script setup lang="ts">
import { CircleFadingArrowUpIcon } from 'lucide-vue-next'
import { Button } from '@/components/ui/button'
</script>
<template>
<Button variant="outline" size="icon">
<CircleFadingArrowUpIcon />
</Button>
</template><template>
<Button variant="outline" size="icon" aria-label="Submit">
<CircleFadingArrowUpIcon />
</Button>
</template>带图标
图标与文本之间的间距会根据按钮的大小自动调整。你无需为图标设置任何外边距 (margin)。
<script setup lang="ts">
import { GitBranchIcon } from 'lucide-vue-next'
import { Button } from '@/components/ui/button'
</script>
<template>
<Button variant="outline" size="sm">
<GitBranchIcon />
New Branch
</Button>
</template>圆角
使用 rounded-full 类名来让按钮呈现圆角。
<script setup lang="ts">
import { ArrowUpIcon } from 'lucide-vue-next'
import { Button } from '@/components/ui/button'
</script>
<template>
<div class="flex flex-col gap-8">
<Button variant="outline" size="icon" class="rounded-full">
<ArrowUpIcon />
</Button>
</div>
</template>加载指示器
<script setup lang="ts">
import { Button } from '@/components/ui/button'
import { Spinner } from '@/components/ui/spinner'
</script>
<template>
<Button size="sm" variant="outline" disabled>
<Spinner class="animate-spin" />
Submit
</Button>
</template>按钮组
<script setup lang="ts">
import { ArchiveIcon, ArrowLeftIcon, CalendarPlusIcon, ClockIcon, ListFilterPlusIcon, MailCheckIcon, MoreHorizontalIcon, TagIcon, Trash2Icon } from 'lucide-vue-next'
import { Button } from '@/components/ui/button'
import { ButtonGroup } from '@/components/ui/button-group'
import { DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger } from '@/components/ui/dropdown-menu'
const label = ref('personal')
</script>
<template>
<ButtonGroup>
<ButtonGroup class="hidden sm:flex">
<Button variant="outline" size="icon" aria-label="Go Back">
<ArrowLeftIcon />
</Button>
</ButtonGroup>
<ButtonGroup>
<Button variant="outline">
Archive
</Button>
<Button variant="outline">
Report
</Button>
</ButtonGroup>
<ButtonGroup>
<Button variant="outline">
Snooze
</Button>
<DropdownMenu>
<DropdownMenuTrigger as-child>
<Button variant="outline" size="icon" aria-label="More Options">
<MoreHorizontalIcon />
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent align="end" class="w-52">
<DropdownMenuGroup>
<DropdownMenuItem>
<MailCheckIcon />
Mark as Read
</DropdownMenuItem>
<DropdownMenuItem>
<ArchiveIcon />
Archive
</DropdownMenuItem>
</DropdownMenuGroup>
<DropdownMenuSeparator />
<DropdownMenuGroup>
<DropdownMenuItem>
<ClockIcon />
Snooze
</DropdownMenuItem>
<DropdownMenuItem>
<CalendarPlusIcon />
Add to Calendar
</DropdownMenuItem>
<DropdownMenuItem>
<ListFilterPlusIcon />
Add to List
</DropdownMenuItem>
<DropdownMenuSub>
<DropdownMenuSubTrigger>
<TagIcon class="mr-2 size-4" />
Label As...
</DropdownMenuSubTrigger>
<DropdownMenuSubContent>
<DropdownMenuRadioGroup v-model="label">
<DropdownMenuRadioItem value="personal">
Personal
</DropdownMenuRadioItem>
<DropdownMenuRadioItem value="work">
Work
</DropdownMenuRadioItem>
<DropdownMenuRadioItem value="other">
Other
</DropdownMenuRadioItem>
</DropdownMenuRadioGroup>
</DropdownMenuSubContent>
</DropdownMenuSub>
</DropdownMenuGroup>
<DropdownMenuSeparator />
<DropdownMenuGroup>
<DropdownMenuItem variant="destructive">
<Trash2Icon />
Trash
</DropdownMenuItem>
</DropdownMenuGroup>
</DropdownMenuContent>
</DropdownMenu>
</ButtonGroup>
</ButtonGroup>
</template>要创建按钮组,请使用 ButtonGroup 组件。详情请参阅 按钮组 (Button Group) 文档。
链接 (asChild)
你可以使用 as-child 属性使其他组件看起来像按钮。下面是一个看起来像按钮的链接示例。
<script setup lang="ts">
import { Button } from '@/components/ui/button'
</script>
<template>
<Button as-child>
<a href="/login">Login</a>
</Button>
</template>API 参考
按钮
Button 组件是原生 button 元素的封装,它增加了一系列样式和功能。
| 属性 | 类型 | 默认 |
|---|---|---|
variant | "default" | "outline" | "ghost" | "destructive" | "secondary" | "link" | "default" |
size | "default" | "sm" | "lg" | "icon" | "icon-sm" | "icon-lg" | "default" |
asChild | boolean | false |