233 lines
6.6 KiB
Markdown
233 lines
6.6 KiB
Markdown
# MetonaToast
|
||
|
||
轻量、零依赖、精致美观的 Toast 通知库。
|
||
|
||
[](https://www.npmjs.com/package/metona-toast)
|
||
[](https://bundlephobia.com/package/metona-toast)
|
||
[](https://github.com/metona/metona-toast/blob/main/LICENSE)
|
||
|
||
## 特性
|
||
|
||
- **零依赖** — 纯原生 JavaScript,gzip 后不到 10KB
|
||
- **80+ 图标类型** — success/error/warning/info/loading 及更多扩展类型
|
||
- **11 种动画** — slide/fade/scale/bounce/flip/rotate/zoom/slideUp/slideDown/slideLeft/slideRight,每种效果明显不同
|
||
- **主题系统** — light/dark/auto/warm 四种内置主题,支持 `registerTheme()` 注册自定义主题
|
||
- **国际化** — 内置 zh-CN / en-US 完整翻译,可通过 `addTranslations()` 扩展
|
||
- **插件系统** — 3 款预设插件 (keyboard/persistence/accessibility) + 自定义插件
|
||
- **可拖拽关闭** — 拖动 Toast 任意方向即可关闭
|
||
- **TypeScript** — 完整类型定义
|
||
|
||
## 安装
|
||
|
||
```bash
|
||
npm install metona-toast
|
||
```
|
||
|
||
### 引用方式
|
||
|
||
```javascript
|
||
// ES Module
|
||
import MeToast from 'metona-toast';
|
||
|
||
// CommonJS
|
||
const MeToast = require('metona-toast');
|
||
```
|
||
|
||
```html
|
||
<!-- CDN UMD 开发版 -->
|
||
<script src="https://unpkg.com/metona-toast@2.0.0/dist/metona-toast.js"></script>
|
||
|
||
<!-- CDN 压缩版(生产环境推荐) -->
|
||
<script src="https://unpkg.com/metona-toast@2.0.0/dist/metona-toast.min.js"></script>
|
||
|
||
<!-- CDN ES Module -->
|
||
<script type="module">
|
||
import MeToast from 'https://unpkg.com/metona-toast@2.0.0/dist/metona-toast.esm.js';
|
||
</script>
|
||
```
|
||
|
||
## 快速开始
|
||
|
||
```javascript
|
||
import MeToast from 'metona-toast';
|
||
|
||
// 基础用法
|
||
MeToast.success('操作成功!');
|
||
MeToast.error('操作失败!');
|
||
MeToast.warning('请注意检查');
|
||
MeToast.info('系统维护中');
|
||
|
||
// 带标题
|
||
MeToast.success({ title: '保存成功', message: '文件已同步到云端' });
|
||
|
||
// 加载 → 成功链式转换
|
||
const loading = MeToast.loading('正在提交...');
|
||
setTimeout(() => loading.success('提交成功!'), 2000);
|
||
|
||
// Promise 风格
|
||
await MeToast.promise(fetch('/api/data'), {
|
||
loading: '加载中...',
|
||
success: '加载完成!',
|
||
error: '加载失败',
|
||
});
|
||
```
|
||
|
||
## 全局配置
|
||
|
||
```javascript
|
||
MeToast.configure({
|
||
position: 'top-right', // top-left | top-center | top-right | bottom-left | bottom-center | bottom-right
|
||
duration: 4000, // 显示时长(ms),0 为不自动关闭
|
||
max: 6, // 同时最多显示条数
|
||
theme: 'auto', // light | dark | auto | warm
|
||
animation: 'slide', // slide | fade | scale | bounce | flip | rotate | zoom | slideUp | slideDown | slideLeft | slideRight
|
||
pauseOnHover: true, // 悬停暂停计时
|
||
closeOnClick: true, // 点击关闭
|
||
showProgress: true, // 显示进度条
|
||
draggable: true, // 允许拖拽关闭
|
||
locale: 'zh-CN', // 语言
|
||
});
|
||
```
|
||
|
||
## 动画效果
|
||
|
||
11 种动画,每种感官差异明显:
|
||
|
||
| 动画 | 效果描述 |
|
||
|------|----------|
|
||
| `slide` | 从右侧滑入 + 轻微过冲回弹 |
|
||
| `fade` | 纯淡入(blur→清晰),从容优雅 |
|
||
| `scale` | 弹性放大(0.55→1.07→1.0) |
|
||
| `bounce` | 从天而降四段弹跳 |
|
||
| `flip` | 3D 翻转入场 + 回摆 |
|
||
| `rotate` | 旋转摇摆进入 |
|
||
| `zoom` | 从中心爆发式弹出 |
|
||
| `slideUp` | 从下方弹入 |
|
||
| `slideDown` | 从上方弹入 |
|
||
| `slideLeft` | 从左侧滑入 |
|
||
| `slideRight` | 从右侧滑入 |
|
||
|
||
```javascript
|
||
MeToast.success('弹跳动画', { animation: 'bounce' });
|
||
|
||
// 注册自定义动画
|
||
MeToast.animations.register('myAnim', {
|
||
enter: { transform: 'rotate(-30deg) scale(0.5)', opacity: 0 },
|
||
leave: { transform: 'rotate(0) scale(1)', opacity: 1 },
|
||
duration: 500,
|
||
easing: 'cubic-bezier(0.34, 1.56, 0.64, 1)',
|
||
});
|
||
```
|
||
|
||
## 主题
|
||
|
||
```javascript
|
||
// 切换主题
|
||
MeToast.themes.switchTheme('dark');
|
||
MeToast.themes.switchTheme('warm');
|
||
|
||
// 注册自定义主题
|
||
MeToast.themes.registerTheme('ocean', {
|
||
bg: 'rgba(240, 249, 255, 0.96)',
|
||
text: '#0c4a6e',
|
||
border: 'rgba(14, 165, 233, 0.2)',
|
||
shadow: '0 10px 36px -10px rgba(14, 165, 233, 0.18)',
|
||
hoverShadow: '0 14px 48px -10px rgba(14, 165, 233, 0.22)',
|
||
progressBg: 'rgba(14, 165, 233, 0.1)',
|
||
closeHoverBg: 'rgba(14, 165, 233, 0.1)',
|
||
});
|
||
MeToast.themes.switchTheme('ocean');
|
||
```
|
||
|
||
## 高级功能
|
||
|
||
```javascript
|
||
// 确认对话框 → Promise<boolean>
|
||
const ok = await MeToast.confirm('确定删除?', { confirmText: '删除', confirmColor: '#ef4444' });
|
||
|
||
// 输入对话框 → Promise<string|null>
|
||
const name = await MeToast.prompt('请输入姓名', { placeholder: '请输入...' });
|
||
|
||
// 进度条
|
||
const p = MeToast.progress('上传中...');
|
||
p.setProgress(60);
|
||
p.complete('上传完成!');
|
||
|
||
// 倒计时({seconds} 自动替换)
|
||
MeToast.countdown('操作将在 {seconds} 秒后执行', 5, {
|
||
onComplete: () => MeToast.success('已执行'),
|
||
});
|
||
|
||
// 队列展示(顺序逐个)
|
||
await MeToast.queue(['步骤一', '步骤二', '步骤三'], { delay: 800 });
|
||
|
||
// 堆叠展示(同时错峰)
|
||
MeToast.stack(['消息1', '消息2', '消息3'], { stagger: 150 });
|
||
```
|
||
|
||
## 插件
|
||
|
||
```javascript
|
||
// 安装预设插件
|
||
MeToast.use('keyboard'); // ESC 关闭所有 Toast
|
||
MeToast.use('persistence'); // 配置持久化到 localStorage
|
||
MeToast.use('accessibility'); // 屏幕阅读器朗读公告
|
||
|
||
// 自定义插件(通过 install 中注册 Toast 生命周期钩子)
|
||
import MeToast, { Toast } from 'metona-toast';
|
||
|
||
MeToast.use({
|
||
name: 'my-plugin',
|
||
install() {
|
||
Toast.on('afterShow', (toast) => {
|
||
console.log('Toast shown:', toast.message);
|
||
});
|
||
},
|
||
});
|
||
```
|
||
|
||
## 国际化
|
||
|
||
```javascript
|
||
MeToast.i18n.switchLocale('en-US');
|
||
|
||
// 添加语言
|
||
MeToast.i18n.addTranslations('ja', {
|
||
success: '成功',
|
||
error: 'エラー',
|
||
confirm: '確認',
|
||
cancel: 'キャンセル',
|
||
});
|
||
|
||
// 格式化工具
|
||
MeToast.i18n.formatNumber(1234567); // "1,234,567"
|
||
MeToast.i18n.formatCurrency(99, 'CNY'); // "¥99.00"
|
||
```
|
||
|
||
## Toast 管理
|
||
|
||
```javascript
|
||
MeToast.count(); // 当前数量
|
||
MeToast.getToasts(); // 获取所有实例
|
||
MeToast.dismiss(); // 关闭所有
|
||
MeToast.dismiss(id); // 关闭指定
|
||
MeToast.pauseAll(); // 暂停所有计时
|
||
MeToast.resumeAll(); // 恢复所有计时
|
||
MeToast.destroy(); // 完全销毁
|
||
```
|
||
|
||
## 回调
|
||
|
||
```javascript
|
||
MeToast.success({
|
||
message: '操作成功',
|
||
onShow: (toast) => console.log('显示:', toast.id),
|
||
onClose: (toast) => console.log('关闭:', toast.id),
|
||
onClick: (toast) => console.log('点击:', toast.id),
|
||
});
|
||
```
|
||
|
||
## License
|
||
|
||
MIT
|