vue-pointer-boxes 0.0.0-stage → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +252 -2
- package/dist/vue-pointer-boxes.es.js +2516 -0
- package/dist/vue-pointer-boxes.umd.cjs +57 -0
- package/dist/vue-pointer-boxes.umd.js +57 -0
- package/package.json +42 -4
package/README.md
CHANGED
|
@@ -1,3 +1,253 @@
|
|
|
1
|
-
#
|
|
1
|
+
# vue-pointer-boxes
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
模拟鼠标指针在页面上游走,从元素的边角拖拽放大并逐字打字的 Vue 3 动画组件。
|
|
4
|
+
|
|
5
|
+
## 特性
|
|
6
|
+
|
|
7
|
+
- **元素式引入**:给 DOM 元素加 `class="vpb-box"` 即可,组件自动识别
|
|
8
|
+
- **父子继承**:嵌套的子元素在父元素绘制完成后才会被指针发现并激活
|
|
9
|
+
- **边角拖拽**:指针从指定角落把元素拉开展开
|
|
10
|
+
- **逐字打字**:拖拽完成后文字逐个浮现
|
|
11
|
+
- **大文本支持**:长文本自动慢速 stagger 打字,指针变 I 形光标
|
|
12
|
+
- **自包含样式**:组件内部注入 CSS,无需额外引入样式文件
|
|
13
|
+
- **双格式分发**:ESM(构建环境)+ UMD(CDN / script 标签直引)
|
|
14
|
+
|
|
15
|
+
## 安装
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm install vue-pointer-boxes
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
依赖:`vue ^3.2.0`、`gsap ^3.12.5`
|
|
22
|
+
|
|
23
|
+
## 快速开始
|
|
24
|
+
|
|
25
|
+
### 方式一:Vue 单文件组件(推荐)
|
|
26
|
+
|
|
27
|
+
```vue
|
|
28
|
+
<template>
|
|
29
|
+
<PointerBoxes
|
|
30
|
+
:pointer-count="20"
|
|
31
|
+
hint-text="滚动查看动画"
|
|
32
|
+
>
|
|
33
|
+
<!-- 给元素加 class="vpb-box" 即可被识别 -->
|
|
34
|
+
<div
|
|
35
|
+
class="vpb-box"
|
|
36
|
+
style="width:220px;height:170px;border-radius:14px;background:#fff;"
|
|
37
|
+
data-dir="br"
|
|
38
|
+
data-growth-rate="3.0"
|
|
39
|
+
>
|
|
40
|
+
你好世界
|
|
41
|
+
</div>
|
|
42
|
+
|
|
43
|
+
<!-- 嵌套:子 box 会在父 box 完成后才激活 -->
|
|
44
|
+
<div
|
|
45
|
+
class="vpb-box"
|
|
46
|
+
style="width:200px;height:200px;border-radius:100px;background:#fff;"
|
|
47
|
+
data-dir="tr"
|
|
48
|
+
>
|
|
49
|
+
父元素
|
|
50
|
+
<div
|
|
51
|
+
class="vpb-box"
|
|
52
|
+
style="width:90px;height:90px;border-radius:50%;background:#fff8e1;"
|
|
53
|
+
data-dir="down"
|
|
54
|
+
>
|
|
55
|
+
子元素
|
|
56
|
+
</div>
|
|
57
|
+
</div>
|
|
58
|
+
</PointerBoxes>
|
|
59
|
+
</template>
|
|
60
|
+
|
|
61
|
+
<script setup>
|
|
62
|
+
import PointerBoxes from 'vue-pointer-boxes'
|
|
63
|
+
</script>
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### 方式二:UMD / CDN(无构建环境)
|
|
67
|
+
|
|
68
|
+
```html
|
|
69
|
+
<!DOCTYPE html>
|
|
70
|
+
<html>
|
|
71
|
+
<body>
|
|
72
|
+
<div id="app">
|
|
73
|
+
<div
|
|
74
|
+
class="vpb-box"
|
|
75
|
+
style="width:220px;height:170px;border-radius:14px;background:#fff;"
|
|
76
|
+
data-dir="br"
|
|
77
|
+
>
|
|
78
|
+
你好世界
|
|
79
|
+
</div>
|
|
80
|
+
</div>
|
|
81
|
+
|
|
82
|
+
<script src="./dist/vue-pointer-boxes.umd.js"></script>
|
|
83
|
+
<script>
|
|
84
|
+
VuePointerBoxes.mount('#app', {
|
|
85
|
+
pointerCount: 20,
|
|
86
|
+
hintText: '滚动查看动画',
|
|
87
|
+
})
|
|
88
|
+
</script>
|
|
89
|
+
</body>
|
|
90
|
+
</html>
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
> UMD 包内嵌了 Vue 3 与 GSAP,无需额外引入。
|
|
94
|
+
|
|
95
|
+
## 核心概念
|
|
96
|
+
|
|
97
|
+
### 标记元素
|
|
98
|
+
|
|
99
|
+
给任意 HTML 元素加 `class="vpb-box"`,组件会自动扫描并注入动画层(`.vpb-inner`)。
|
|
100
|
+
|
|
101
|
+
元素本身的 `width` / `height` / `border-radius` 即为最终状态的尺寸和圆角。
|
|
102
|
+
|
|
103
|
+
### 方向(data-dir)
|
|
104
|
+
|
|
105
|
+
决定指针从哪个角把元素拉开:
|
|
106
|
+
|
|
107
|
+
| 值 | 方向 | 锚点位置 |
|
|
108
|
+
|----|------|----------|
|
|
109
|
+
| `br` | 右下角 | 左上角 |
|
|
110
|
+
| `tr` | 右上角 | 左下角 |
|
|
111
|
+
| `bl` | 左下角 | 右上角 |
|
|
112
|
+
| `tl` | 左上角 | 右下角 |
|
|
113
|
+
| `right` | 正右方 | 左边缘中心 |
|
|
114
|
+
| `left` | 正左方 | 右边缘中心 |
|
|
115
|
+
| `down` | 正下方 | 上边缘中心 |
|
|
116
|
+
| `up` | 正上方 | 下边缘中心 |
|
|
117
|
+
|
|
118
|
+
### 父子继承
|
|
119
|
+
|
|
120
|
+
当一个 `.vpb-box` 嵌套在另一个 `.vpb-box` 内部时:
|
|
121
|
+
|
|
122
|
+
1. 父元素先进入等待状态,被指针拖拽展开并打字
|
|
123
|
+
2. 父元素完成(state=done)后,子元素才被激活进入等待状态
|
|
124
|
+
3. 支持任意层级嵌套
|
|
125
|
+
|
|
126
|
+
## 完整 API
|
|
127
|
+
|
|
128
|
+
### Props
|
|
129
|
+
|
|
130
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
131
|
+
|------|------|--------|------|
|
|
132
|
+
| `selector` | String | `'.vpb-box'` | 扫描的 CSS 选择器 |
|
|
133
|
+
| `scanRoot` | String / Element | `null` | 扫描根节点,默认组件自身 |
|
|
134
|
+
| `initialWidth` | Number | `48` | 元素初始宽度(px),可被 `data-initial-width` 覆盖 |
|
|
135
|
+
| `initialHeight` | Number | `48` | 元素初始高度(px) |
|
|
136
|
+
| `initialRadius` | Number | `10` | 元素初始圆角(px) |
|
|
137
|
+
| `pointerCount` | Number | `20` | 模拟指针数量 |
|
|
138
|
+
| `pointerSize` | Number | `26` | 指针空闲尺寸(px) |
|
|
139
|
+
| `pointerDragSize` | Number | `38` | 指针拖拽时尺寸(px) |
|
|
140
|
+
| `minSpeed` | Number | `0.3` | 指针最小速度 |
|
|
141
|
+
| `maxSpeed` | Number | `1.1` | 指针最大速度 |
|
|
142
|
+
| `nearRadius` | Number | `150` | 指针靠近元素的吸引半径(px) |
|
|
143
|
+
| `lockRadius` | Number | `90` | 指针触发拖拽的锁定半径(px) |
|
|
144
|
+
| `idleOpacity` | Number | `0.35` | 指针空闲透明度 |
|
|
145
|
+
| `nearOpacity` | Number | `0.75` | 指针靠近元素时透明度 |
|
|
146
|
+
| `pointerZIndex` | Number | `9999` | 指针层层级 |
|
|
147
|
+
| `hideNativeCursor` | Boolean | `true` | 是否隐藏系统鼠标光标 |
|
|
148
|
+
| `normalStagger` | Number | `0.14` | 普通文本打字间隔(秒) |
|
|
149
|
+
| `bigTextStagger` | Number | `0.045` | 大文本打字间隔(秒) |
|
|
150
|
+
| `typeDelay` | Number | `700` | 拖拽完成后打字延迟(毫秒) |
|
|
151
|
+
| `autoResetDistance` | Number | `500` | 元素离开视口多远后重置(px) |
|
|
152
|
+
| `background` | String | `'#f4f5fa'` | 根容器背景色 |
|
|
153
|
+
| `darkSaturation` | Number | `15` | 指针暗色饱和度(%) |
|
|
154
|
+
| `darkLightness` | Number | `28` | 指针暗色亮度(%) |
|
|
155
|
+
| `brightSaturation` | Number | `75` | 指针亮色饱和度(%) |
|
|
156
|
+
| `brightLightness` | Number | `62` | 指针亮色亮度(%) |
|
|
157
|
+
| `hintText` | String | `''` | 底部提示文字 |
|
|
158
|
+
|
|
159
|
+
### data-* 属性(单元素覆盖)
|
|
160
|
+
|
|
161
|
+
每个 `.vpb-box` 可通过 `data-*` 属性覆盖全局默认值:
|
|
162
|
+
|
|
163
|
+
| 属性 | 说明 | 示例 |
|
|
164
|
+
|------|------|------|
|
|
165
|
+
| `data-dir` | 展开方向 | `data-dir="br"` |
|
|
166
|
+
| `data-width` | 最终宽度(默认取元素自身 width) | `data-width="300"` |
|
|
167
|
+
| `data-height` | 最终高度(默认取元素自身 height) | `data-height="200"` |
|
|
168
|
+
| `data-radius` | 最终圆角(默认取元素 borderRadius) | `data-radius="20"` |
|
|
169
|
+
| `data-growth-rate` | 每帧拉伸增量,越大展开越快 | `data-growth-rate="3.5"` |
|
|
170
|
+
| `data-big-text` | 标记为大文本(慢 stagger + I 光标) | `data-big-text` |
|
|
171
|
+
| `data-placeholder` | 拖拽中占位符 | `data-placeholder="·"` |
|
|
172
|
+
| `data-initial-width` | 初始宽度 | `data-initial-width="60"` |
|
|
173
|
+
| `data-initial-height` | 初始高度 | `data-initial-height="60"` |
|
|
174
|
+
| `data-initial-radius` | 初始圆角 | `data-initial-radius="8"` |
|
|
175
|
+
| `data-text` | 强制指定文本(默认取元素文本内容) | `data-text="自定义文案"` |
|
|
176
|
+
|
|
177
|
+
### Events
|
|
178
|
+
|
|
179
|
+
| 事件 | 参数 | 说明 |
|
|
180
|
+
|------|------|------|
|
|
181
|
+
| `ready` | `{ count }` | 组件就绪,返回识别到的元素数量 |
|
|
182
|
+
| `dragstart` | `{ index }` | 某个元素开始被拖拽 |
|
|
183
|
+
| `dragend` | `{ index }` | 某个元素拖拽完成 |
|
|
184
|
+
| `typed` | `{ index, text }` | 某个元素打字完成 |
|
|
185
|
+
|
|
186
|
+
### 暴露的方法
|
|
187
|
+
|
|
188
|
+
通过 `ref` 调用:
|
|
189
|
+
|
|
190
|
+
```js
|
|
191
|
+
const pboxes = ref()
|
|
192
|
+
pboxes.value.restart() // 重置所有元素,重新播放动画
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
## 事件示例
|
|
196
|
+
|
|
197
|
+
```vue
|
|
198
|
+
<template>
|
|
199
|
+
<PointerBoxes
|
|
200
|
+
@dragstart="onDragStart"
|
|
201
|
+
@dragend="onDragEnd"
|
|
202
|
+
@typed="onTyped"
|
|
203
|
+
>
|
|
204
|
+
...
|
|
205
|
+
</PointerBoxes>
|
|
206
|
+
</template>
|
|
207
|
+
|
|
208
|
+
<script setup>
|
|
209
|
+
function onDragStart({ index }) {
|
|
210
|
+
console.log('开始拖拽第', index, '个元素')
|
|
211
|
+
}
|
|
212
|
+
function onDragEnd({ index }) {
|
|
213
|
+
console.log('第', index, '个元素拖拽完成')
|
|
214
|
+
}
|
|
215
|
+
function onTyped({ index, text }) {
|
|
216
|
+
console.log('第', index, '个元素打字完成:', text)
|
|
217
|
+
}
|
|
218
|
+
</script>
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
## 自定义样式
|
|
222
|
+
|
|
223
|
+
组件注入的 CSS 类可通过更高优先级的选择器覆盖:
|
|
224
|
+
|
|
225
|
+
```css
|
|
226
|
+
/* 已完成元素的边框颜色 */
|
|
227
|
+
.vpb-box.done .vpb-inner {
|
|
228
|
+
border-color: #4caf50 !important;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/* 拖拽中元素的阴影 */
|
|
232
|
+
.vpb-box.dragging .vpb-inner {
|
|
233
|
+
box-shadow: 0 10px 40px rgba(76, 175, 80, .4) !important;
|
|
234
|
+
}
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
## 常见问题
|
|
238
|
+
|
|
239
|
+
**Q:元素没有动画?**
|
|
240
|
+
A:检查元素是否有 `class="vpb-box"`,以及是否设置了明确的 `width` / `height`(需要是固定 px 值)。
|
|
241
|
+
|
|
242
|
+
**Q:文字不显示?**
|
|
243
|
+
A:确保元素内有文本内容,或通过 `data-text` 指定文本。
|
|
244
|
+
|
|
245
|
+
**Q:子元素不动画?**
|
|
246
|
+
A:子元素需等父元素完成拖拽+打字后才会激活,这是设计行为。
|
|
247
|
+
|
|
248
|
+
**Q:滚动后指针飞向错误位置?**
|
|
249
|
+
A:已修复——元素位置实时计算,滚动后自动校正。
|
|
250
|
+
|
|
251
|
+
## License
|
|
252
|
+
|
|
253
|
+
MIT
|