图标类型
80+ 内置图标类型
位置
6 种预设位置
动画效果
11 种动画,每种效果明显不同
主题
四种基础主题,支持 registerTheme() 自定义注册
高级功能
Promise / 确认框 / 输入框 / 进度条 / 倒计时 / 队列 / 堆叠
插件系统
3 款预设插件,按需安装
国际化
切换语言查看效果
Toast 管理
统计、关闭、清除
diff --git a/build.sh b/build.sh index c48e4f5..273850c 100644 --- a/build.sh +++ b/build.sh @@ -78,5 +78,6 @@ echo " 2. ES Module: import MeToast from 'dist/metona-toast.esm.js'" echo " 3. CommonJS: const MeToast = require('dist/metona-toast.cjs.js')" echo "" echo "📝 示例:" -echo " 打开 examples/demo.html 查看完整示例" +echo " 打开 site/index.html 查看官网" +echo " 打开 site/demo.html 查看演示" echo "" diff --git a/examples/demo.html b/examples/demo.html deleted file mode 100644 index baf5629..0000000 --- a/examples/demo.html +++ /dev/null @@ -1,395 +0,0 @@ - - -
- - -轻量 · 零依赖 · 精致美观 — 全功能演示
-80+ 内置图标类型
6 种预设位置
11 种动画,每种效果明显不同
四种基础主题,支持 registerTheme() 自定义注册
Promise / 确认框 / 输入框 / 进度条 / 倒计时 / 队列 / 堆叠
3 款预设插件,按需安装
切换语言查看效果
统计、关闭、清除
轻量 · 零依赖 · 精致美观的 Toast 通知库
-# 安装 -npm install metona-toast - -# ES Module -import MeToast from 'metona-toast'; - -# CommonJS -const MeToast = require('metona-toast');-
<!-- UMD 开发版 --> -<script src="https://unpkg.com/metona-toast@2.0.0/dist/metona-toast.js"></script> - -<!-- 压缩版(生产环境推荐)--> -<script src="https://unpkg.com/metona-toast@2.0.0/dist/metona-toast.min.js"></script> - -<!-- ES Module 直接引用 --> -<script type="module"> - import MeToast from 'https://unpkg.com/metona-toast@2.0.0/dist/metona-toast.esm.js'; -</script>-
五种核心类型,一行代码搞定
-// 五种类型,一行搞定 -MeToast.success('操作成功!'); -MeToast.error('操作失败!'); -MeToast.warning('请注意检查'); -MeToast.info('系统维护中'); -MeToast.show('默认消息');-
标题、位置、时长、主题、动画……灵活可控
-// 带标题 -MeToast.success({ title: '保存成功', message: '文件已同步到云端' }); - -// 自定义时长 — 显示10秒 -MeToast.info('显示10秒', { duration: 10000 }); - -// 自定义位置 — 底部居中 -MeToast.warning('底部居中', { position: 'bottom-center' }); - -// 手动关闭 — 不自动消失 -MeToast.info('手动关闭', { duration: 0, closeButton: true }); - -// 自定义动画 — 弹跳效果 -MeToast.success('弹跳动画', { animation: 'bounce' });-
加载中 → 成功/失败/警告/信息,优雅切换
-// loading → success -const loading = MeToast.loading('正在提交...'); -setTimeout(() => loading.success('提交成功!'), 2000); - -// loading → error -const loading = MeToast.loading('正在提交...'); -setTimeout(() => loading.error('提交失败,请重试'), 2000);-
一行代码自动处理 loading / success / error
-await MeToast.promise( - fetch('/api/data'), - { - loading: '加载中...', - success: '加载完成!', - error: '加载失败', - } -);-
内置对话框,返回 Promise
-// 确认对话框 → Promise<boolean> -const ok = await MeToast.confirm('确定删除吗?', { - confirmText: '删除', - confirmColor: '#ef4444', -}); - -// 输入对话框 → Promise<string|null> -const name = await MeToast.prompt('请输入姓名', { - placeholder: '请输入...', -});-
实时更新的进度通知和自动倒计时
-// 进度条 — 实时更新 -const p = MeToast.progress('上传中...'); -let v = 0; -const t = setInterval(() => { - v += Math.random() * 28; - if (v >= 100) { clearInterval(t); p.complete('上传完成!'); } - else p.setProgress(v); -}, 400); - -// 倒计时 — {seconds} 自动替换 -MeToast.countdown('{seconds} 秒后执行', 5, { - onComplete: () => MeToast.success('已执行'), -});-
顺序逐个展示 or 同时错峰展示
-// 队列 — 一个接一个 -await MeToast.queue(['步骤一', '步骤二', '步骤三'], { - delay: 800, - duration: 2000, - type: 'info', -}); - -// 堆叠 — 同时错峰 -MeToast.stack(['消息 1', '消息 2', '消息 3', '消息 4'], { - stagger: 150, - type: 'info', -});-
3 款预设插件,按需安装
-// keyboard — ESC 关闭所有 Toast -MeToast.use('keyboard'); - -// persistence — 配置持久化(自动保存/加载) -MeToast.use('persistence'); - -// accessibility — 屏幕阅读器朗读公告 -MeToast.use('accessibility');-
一次配置,所有 Toast 自动继承
-MeToast.configure({ - position: 'top-right', // 默认位置 - duration: 4000, // 默认显示时长(ms) - max: 6, // 同时最多显示条数 - theme: 'auto', // light | dark | auto | warm - animation: 'slide', // 默认动画效果 - pauseOnHover: true, // 悬停暂停计时 - closeOnClick: true, // 点击关闭 - showProgress: true, // 显示进度条 - draggable: true, // 允许拖拽关闭 - locale: 'zh-CN', // 默认语言 -});-
内置四种主题,支持自定义注册;内置中英文,可扩展
-// 切换主题(switchTheme + configure 同步全局配置) -MeToast.themes.switchTheme('warm'); -MeToast.configure({ theme: 'warm' }); - -// 切换语言 — 英文 -MeToast.i18n.switchLocale('en-US'); - -// 切换回中文 -MeToast.i18n.switchLocale('zh-CN'); - -// 注册自定义主题 -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.count(); // 当前数量 -MeToast.getToasts(); // 获取所有实例 -MeToast.dismiss(); // 关闭全部 -MeToast.dismiss(id); // 关闭指定 -MeToast.pauseAll(); // 暂停全部计时 -MeToast.resumeAll(); // 恢复全部计时 -MeToast.destroy(); // 完全销毁-
| 方法 | 说明 | 示例 |
|---|---|---|
success(msg, opts?) | 成功通知 | MeToast.success('保存成功') |
error(msg, opts?) | 错误通知 | MeToast.error('网络错误') |
warning(msg, opts?) | 警告通知 | MeToast.warning('请注意') |
info(msg, opts?) | 信息通知 | MeToast.info('系统维护中') |
loading(msg, opts?) | 加载状态 | MeToast.loading('加载中...') |
promise(p, opts) | Promise 自动状态 | MeToast.promise(fetch(...), opts) |
confirm(msg, opts?) | 确认对话框 → boolean | await MeToast.confirm('删除?') |
prompt(msg, opts?) | 输入对话框 → string | await MeToast.prompt('姓名?') |
progress(msg, opts?) | 进度条通知 | MeToast.progress('上传中...') |
countdown(msg, s, opts?) | 倒计时 | MeToast.countdown('{seconds}s', 10) |
queue(msgs, opts?) | 队列顺序展示 | MeToast.queue(['a','b','c']) |
stack(msgs, opts?) | 堆叠错峰展示 | MeToast.stack(['a','b','c']) |
configure(opts) | 全局配置 | MeToast.configure({duration:5000}) |
dismiss(id?) | 关闭 toast | MeToast.dismiss() |
所有功能均可点击体验 — 192 个测试用例全部通过验证
+MetonaToast v2.0.0 完整 API 参考。所有方法均支持链式调用和配置覆盖。
+ + +显示默认类型的 Toast 通知。
+// 字符串 +MeToast.show('默认消息'); + +// 带配置 +MeToast.show('自定义', { duration: 2000, position: 'bottom-center' }); + +// 对象形式 +MeToast.show({ title: '标题', message: '内容' });+ +
显示成功通知。绿色对勾图标。
+MeToast.success('保存成功!'); +MeToast.success({ title: '已保存', message: '文件已同步到云端' });+ +
显示错误通知。红色叉号图标。
+MeToast.error('网络错误,请重试');+ +
显示警告通知。黄色三角图标。
+MeToast.warning('请注意检查输入内容');+ +
显示信息通知。蓝色圆形图标。
+MeToast.info('系统将于 22:00 进行维护');+ +
显示加载状态。返回一个控制对象,支持链式转换为 success/error/info/warning。
+const loading = MeToast.loading('正在提交...'); +setTimeout(() => loading.success('提交成功!'), 2000); + +// 返回对象方法 +loading.success(msg, opts?) // 转为成功 +loading.error(msg, opts?) // 转为错误 +loading.info(msg, opts?) // 转为信息 +loading.warning(msg, opts?) // 转为警告 +loading.update(partial) // 原地更新 +loading.dismiss() // 关闭+ + +
自动根据 Promise 状态切换 Toast。显示 loading → 自动 success/error。
+await MeToast.promise( + fetch('/api/data'), + { + loading: '加载中...', + success: '加载完成!', + error: '加载失败', + } +);+
| 参数 | 类型 | 说明 |
|---|---|---|
| promise | Promise | 要监听的 Promise 对象 |
| opts.loading | string | 加载中文本 |
| opts.success | string | 成功时文本 |
| opts.error | string | 失败时文本 |
确认对话框。返回 Promise<boolean>,用户点击确认返回 true。
const ok = await MeToast.confirm('确定删除吗?', { + confirmText: '删除', + confirmColor: '#ef4444', + cancelText: '取消', +}); +if (ok) MeToast.success('已删除');+ +
输入对话框。返回 Promise<string|null>,用户取消返回 null。
const name = await MeToast.prompt('请输入姓名', { + placeholder: '请输入...', + defaultValue: '张三', +}); +if (name) MeToast.info('你好,' + name + '!');+ +
进度条通知。返回控制对象,可调用 setProgress / complete / error。
+const p = MeToast.progress('上传中...'); +p.setProgress(30); +p.setProgress(70); +p.complete('上传完成!'); +// 或 +p.error('上传失败'); +p.dismiss();+ +
倒计时 Toast。{seconds} 占位符自动替换为剩余秒数。
MeToast.countdown('操作将在 {seconds} 秒后执行', 5, { + onComplete: () => MeToast.success('已执行'), +}); + +// 返回控制对象 +const c = MeToast.countdown('{seconds}s', 10); +c.cancel(); // 取消并关闭 +c.pause(); // 暂停 +c.resume(); // 恢复+ +
队列展示:顺序逐个显示消息。返回可取消的 thenable 对象。
+const q = MeToast.queue(['步骤一', '步骤二', '步骤三'], { + delay: 800, + duration: 2000, + type: 'info', +}); +q.cancel(); // 取消队列 +await q; // 等待队列完成+ +
堆叠展示:同时错峰显示多条消息。
+MeToast.stack(['消息1', '消息2', '消息3', '消息4'], { + stagger: 150, + type: 'info', +});+ +
Action Toast:内嵌操作按钮的通知。类似 Android Snackbar。
+MeToast.action('文件已删除', [ + { text: '撤销', onClick: () => restore(), color: '#3b82f6' }, + { text: '查看', onClick: () => openFile() }, +]);+
| 按钮字段 | 类型 | 说明 |
|---|---|---|
| text | string | 按钮文本 |
| onClick | function | 点击回调,参数为 toast 实例 |
| color | string | 按钮背景色,默认 #6366f1 |
| close | boolean | 点击后是否关闭 toast,默认 true |
创建 Toast 分组。返回一个自动添加 group 参数的子对象,支持按组管理。
const orders = MeToast.group('orders'); +orders.success('订单已创建'); +orders.error('支付失败'); +orders.count(); // 该组的 toast 数量 +orders.dismiss(); // 关闭整组 + +// 也可通过主对象关闭 +MeToast.dismissGroup('orders');+ +
关闭 Toast。无参数关闭所有,传 id 关闭指定。
+MeToast.dismiss(); // 关闭所有 +MeToast.dismiss(toastId); // 关闭指定+
其他管理方法:count() getToasts() pauseAll() resumeAll() destroy() clear()
全局配置。影响后续所有 Toast。
+MeToast.configure({ + position: 'top-right', + duration: 4000, + theme: 'dark', + animation: 'slide', + locale: 'zh-CN', +});+ +
安装插件。支持字符串(预设)和对象(自定义)。
+MeToast.use('keyboard'); // ESC 关闭所有 Toast +MeToast.use('persistence'); // 配置持久化到 localStorage +MeToast.use('accessibility'); // 屏幕阅读器朗读 + +// 自定义插件 +MeToast.use({ + name: 'my-plugin', + install() { + Toast.on('afterShow', (t) => console.log(t.message)); + }, +});+ +
完全销毁:关闭所有 Toast、移除 DOM 容器和样式标签。
+MeToast.destroy();
+
+
+以下配置可用于 configure() 或单个 Toast 的第二个参数。
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| position | string | 'top-right' | 位置:top-left/center/right、bottom-left/center/right |
| duration | number | 4000 | 显示时长(ms),0=不自动关闭 |
| max | number | 6 | 同时最多显示条数 |
| gap | number | 12 | Toast 之间的间距(px) |
| offset | number | 24 | 容器边距(px) |
| pauseOnHover | boolean | true | 悬停时暂停计时 |
| closeOnClick | boolean | true | 点击 Toast 关闭 |
| draggable | boolean | true | 允许拖拽关闭 |
| showProgress | boolean | true | 显示进度条 |
| progressDirection | string | 'horizontal' | 进度条方向:horizontal / vertical |
| icon | boolean | true | 显示类型图标 |
| closeButton | boolean | true | 显示关闭按钮 |
| theme | string | 'auto' | 主题:light / dark / auto / warm |
| animation | string | 'slide' | 动画效果(见下方列表) |
| zIndex | number | 9999 | CSS z-index |
| width | number/string | 360 | Toast 宽度(px) |
| className | string | '' | 附加 CSS 类名 |
| style | object | {} | 内联样式对象 |
| locale | string | 'zh-CN' | 语言代码 |
| resetTimerOnUpdate | boolean | false | update()时重置计时器 v2.0 |
| notifyWhenHidden | boolean | false | 页面不可见时发系统通知 v2.0 |
| render | function | — | 自定义渲染函数 v2.0 |
| 回调 | 签名 | 触发时机 |
|---|---|---|
| onShow | (toast) => void | Toast 显示后 |
| onClose | (toast) => void | Toast 关闭后 |
| onClick | (toast) => void | Toast 被点击时 |
| onUpdate | (toast) => void | Toast 内容更新后 v2.0 |
| 名称 | 效果 | 时长 |
|---|---|---|
| slide | 从右侧滑入 + 回弹 | 400ms |
| fade | 纯淡入 (blur→清晰) | 500ms |
| scale | 弹性放大 (0.55→1.07→1) | 450ms |
| bounce | 从天而降四段弹跳 | 650ms |
| flip | 3D 翻转入场 + 回摆 | 500ms |
| rotate | 旋转摇摆进入 | 500ms |
| zoom | 从中心爆发式弹出 | 500ms |
| slideUp | 从下方弹入 | 400ms |
| slideDown | 从上方弹入 | 400ms |
| slideLeft | 从左侧滑入 | 400ms |
| slideRight | 从右侧滑入 | 400ms |
// 内置主题 +light — 白色玻璃质感 +dark — 深色玻璃质感 +auto — 跟随系统 +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');+ +
轻量 · 零依赖 · 精致美观的 Toast 通知库。纯原生 JavaScript,gzip 不到 10KB。
+一切你需要的,都在一个不到 10KB 的包中
+success / error / warning / info / loading 以及 100+ 扩展类型,覆盖所有常见场景。
+slide / fade / scale / bounce / flip / rotate / zoom / slideUp / slideDown / slideLeft / slideRight,每种感官差异明显。
+内置 light / dark / auto / warm 四种主题,支持 registerTheme() 自定义注册任意主题。
内置 zh-CN 和 en-US 完整翻译,400+ 词汇。支持 addTranslations() 扩展任意语言。
3 款预设插件 + 自定义插件架构。keyboard / persistence / accessibility 开箱即用。
+任意方向拖动 Toast 即可关闭。支持 Pointer Events,移动端和桌面端体验一致。
+纯原生 JavaScript 实现,无需任何运行时依赖。兼容所有现代浏览器。
+完整类型定义,智能提示全覆盖。MeToast.success()、.confirm()、.action() 全部有类型。
一行安装,三行代码即可使用
+# npm 安装 +npm install metona-toast + +// 导入 +import MeToast from 'metona-toast'; + +// 使用 +MeToast.success('操作成功!'); +MeToast.error('操作失败!'); +MeToast.loading('加载中...'); + +// CDN 直接引用 +<script src="https://unpkg.com/metona-toast/dist/metona-toast.min.js"></script>+
不仅仅是一个 Toast——确认框、输入框、进度条、倒计时、队列,应有尽有
+// Promise 风格 — 自动 loading → success/error +await MeToast.promise(fetch('/api/data'), { + loading: '加载中...', + success: '加载完成!', + error: '加载失败', +}); + +// 确认对话框 → Promise<boolean> +const ok = await MeToast.confirm('确定删除吗?', { confirmText: '删除' }); + +// 输入对话框 → Promise<string|null> +const name = await MeToast.prompt('请输入姓名'); + +// Action Toast — 内嵌操作按钮 +MeToast.action('文件已删除', [ + { text: '撤销', onClick: () => restore() }, + { text: '查看', onClick: () => open() }, +]); + +// Toast 分组管理 +const orderGroup = MeToast.group('orders'); +orderGroup.success('订单已创建'); +orderGroup.dismiss(); // 一键关闭整组+
点击按钮实时预览四种内置主题
+