531438cc9ce9c98a03111c694e14995d8f1c6f25
MetonaToast
轻量、零依赖、精致美观的 Toast 通知库。
特性
- 零依赖 — 纯原生 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 — 完整类型定义
安装
npm install metona-toast
引用方式
// ES Module
import MeToast from 'metona-toast';
// CommonJS
const MeToast = require('metona-toast');
<!-- 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>
快速开始
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: '加载失败',
});
全局配置
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 |
从右侧滑入 |
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)',
});
主题
// 切换主题
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');
高级功能
// 确认对话框 → 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 });
插件
// 安装预设插件
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);
});
},
});
国际化
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 管理
MeToast.count(); // 当前数量
MeToast.getToasts(); // 获取所有实例
MeToast.dismiss(); // 关闭所有
MeToast.dismiss(id); // 关闭指定
MeToast.pauseAll(); // 暂停所有计时
MeToast.resumeAll(); // 恢复所有计时
MeToast.destroy(); // 完全销毁
回调
MeToast.success({
message: '操作成功',
onShow: (toast) => console.log('显示:', toast.id),
onClose: (toast) => console.log('关闭:', toast.id),
onClick: (toast) => console.log('点击:', toast.id),
});
License
MIT
Languages
JavaScript
79.3%
HTML
20%
Shell
0.7%