组件
抽屉 Drawer
Drawer:抽屉。整高面板从所在边缘滑入,并与边缘对齐,滑动位置由状态机的 translate 控制,顶部提供抓取条。部件:Root、Trigger、Backdrop、Positioner、Content、Grabber、GrabberIndicator、Title、Description、CloseTrigger、SwipeArea。
#基础用法
<script setup lang="ts">
import { x } from "@bysages/icons";
import { Drawer, Icon } from "@bysages/vue";
</script>
<template>
<Drawer.Root>
<Drawer.Trigger>Open drawer</Drawer.Trigger>
<Teleport to="body">
<Drawer.Backdrop />
<Drawer.Positioner>
<Drawer.Content>
<Drawer.Grabber><Drawer.GrabberIndicator /></Drawer.Grabber>
<Drawer.Title>Settings</Drawer.Title>
<Drawer.Description>
Preferences travel with the sheet — pull the grabber to put them away.
</Drawer.Description>
<p>The rest of the sheet is yours to fill.</p>
<Drawer.CloseTrigger>
<Icon :glyph="x" />
</Drawer.CloseTrigger>
</Drawer.Content>
</Drawer.Positioner>
</Teleport>
</Drawer.Root>
</template>
<script setup lang="ts">
import { x } from "@bysages/icons";
import { Drawer, Icon } from "@bysages/vue";
const directions = [
{ value: "down", edge: "bottom" },
{ value: "up", edge: "top" },
{ value: "start", edge: "left" },
{ value: "end", edge: "right" },
] as const;
</script>
<template>
<div class="flex flex-wrap gap-3">
<Drawer.Root v-for="d in directions" :key="d.value" :swipe-direction="d.value">
<Drawer.Trigger>From the {{ d.edge }}</Drawer.Trigger>
<Teleport to="body">
<Drawer.Backdrop />
<Drawer.Positioner>
<Drawer.Content>
<Drawer.Grabber><Drawer.GrabberIndicator /></Drawer.Grabber>
<Drawer.Title>The {{ d.edge }} sheet</Drawer.Title>
<Drawer.Description>
The sheet rises from the {{ d.edge }} edge; drag it back where it came from.
</Drawer.Description>
<p>
The same anatomy serves every edge — the positioner seats it, the corners turn toward
the page, and the grabber rides the leading edge on the side sheets.
</p>
<Drawer.CloseTrigger>
<Icon :glyph="x" />
</Drawer.CloseTrigger>
</Drawer.Content>
</Drawer.Positioner>
</Teleport>
</Drawer.Root>
</div>
</template>
#属性
#Backdrop
纯造型的部件——自身没有属性,沿用部件结构的共享样式。
#CloseTrigger
纯造型的部件——自身没有属性,沿用部件结构的共享样式。
#Content
纯造型的部件——自身没有属性,沿用部件结构的共享样式。
#Description
纯造型的部件——自身没有属性,沿用部件结构的共享样式。
#GrabberIndicator
纯造型的部件——自身没有属性,沿用部件结构的共享样式。
#Grabber
纯造型的部件——自身没有属性,沿用部件结构的共享样式。
#IndentBackground
纯造型的部件——自身没有属性,沿用部件结构的共享样式。
#Indent
纯造型的部件——自身没有属性,沿用部件结构的共享样式。
#Positioner
纯造型的部件——自身没有属性,沿用部件结构的共享样式。
#Root
| 属性 | 类型 | 默认值 | 描述 |
|---|---|---|---|
closeOnEscape | boolean | true | 按下 Esc 键时是否关闭抽屉 |
closeOnInteractOutside | boolean | true | 点击外部时是否关闭抽屉 |
closeThreshold | number | 0.25 | 关闭抽屉的距离阈值 |
defaultOpen | boolean | 抽屉初始是否打开 | |
defaultSnapPoint | drawer.SnapPoint | null | 1 | 抽屉的默认吸附点 |
defaultTriggerValue | string | null | 初始触发器值;无需控制触发器值时使用 | |
finalFocusEl | () => HTMLElement | null | 抽屉关闭后聚焦的元素 | |
id | string | 组件内部状态机的唯一标识 | |
ids | Partial<{ backdrop: string; positioner: string; content: string; title: string; trigger: string; grabber: string; grabberIndicator: string; closeTrigger: string; }> | 抽屉内各元素的 id;便于组合使用 | |
initialFocusEl | () => HTMLElement | null | 抽屉打开后聚焦的元素 | |
modal | boolean | true | 是否阻止元素外部的指针交互,并隐藏其下方内容 |
open | boolean | 抽屉是否打开 | |
preventDragOnScroll | boolean | true | 是否阻止在可滚动元素上拖拽 |
preventScroll | boolean | true | 抽屉打开时是否阻止背后的页面滚动 |
restoreFocus | boolean | 是否把焦点恢复到抽屉打开前聚焦的元素 | |
role | 'dialog' | 'alertdialog' | "dialog" | 抽屉的 role |
snapPoint | drawer.SnapPoint | null | 当前启用的吸附点 | |
snapPoints | (number | string)[] | [1] | 抽屉的吸附点 |
snapToSequentialPoints | boolean | false | 滑动时是否依次吸附到相邻吸附点 |
swipeDirection | drawer.SwipeDirection | "down" | 抽屉可滑动的方向 |
swipeVelocityThreshold | number | 700 | 关闭抽屉的速度阈值(像素/秒) |
trapFocus | boolean | true | 抽屉打开时是否把焦点限制在内部 |
triggerValue | string | null | 当前打开抽屉的触发器值 |
#Stack
纯造型的部件——自身没有属性,沿用部件结构的共享样式。
#SwipeArea
纯造型的部件——自身没有属性,沿用部件结构的共享样式。
#Title
纯造型的部件——自身没有属性,沿用部件结构的共享样式。
#Trigger
纯造型的部件——自身没有属性,沿用部件结构的共享样式。