通知提示条(Toast 消息组件动画源码,带倒计时进度条)

CSSJS 许可:自研原创

通知提示条源码:JS 动态生成 Toast,右下角滑入、4 秒倒计时进度条自动消失、支持成功/错误/警告/信息四类样式与手动关闭,原生 JS 零依赖。

效果演示(真实可交互)

通知提示条(Toast)是表单提交、操作反馈里最常用的微交互:不用打断当前流程,在角落轻声告知结果。演示区有四个触发按钮,分别弹出成功、错误、警告、信息四种提示。点击后提示条从右下角弹性滑入,左侧带彩色圆角图标,底部有一条与类型同色的倒计时进度条,4 秒内从满到空,归零后提示条淡出消失;也可以点右上角的 × 立即关闭。连续点击多个按钮会向上堆叠,最多自然展示多条,互不干扰。全部提示条由 JS 动态创建,接入项目时只需调用 show('success') 一行即可。提示条文案、图标与配色都集中在 MAP 配置对象里,新增一种类型只需补一条记录。四个类型分别覆盖成功、失败、告警与普通信息四种情绪,颜色语义与常见设计系统一致,用户无需额外学习成本。提示条的最佳实践是「不打断、可追踪、可关闭」:不抢焦点、倒计时可见、随时手动关闭,三条都满足后,用户对异步操作结果的信任感会明显提升。

点击按钮弹出提示条,4 秒后自动消失,右上角可手动关闭

完整代码

HTML:页面只需要四个触发按钮,提示条由 JS 注入到固定定位的层容器:

<button class="nt-btn nt-success" data-type="success">成功通知</button>
<button class="nt-btn nt-error" data-type="error">错误通知</button>
<button class="nt-btn nt-warn" data-type="warn">警告通知</button>
<button class="nt-btn nt-info" data-type="info">信息通知</button>

CSS:层容器固定在右下角,倒序堆叠;提示条用弹性缓动滑入:

.nt-layer { position: fixed; right: 20px; bottom: 20px; display: flex; flex-direction: column-reverse; gap: 12px; z-index: 9999; }
.nt-toast {
  display: flex; align-items: center; gap: 12px; min-width: 280px;
  padding: 13px 14px 15px; border-radius: 14px; background: #fff;
  box-shadow: 0 12px 32px rgba(20,30,70,.22);
  animation: nt-in .45s cubic-bezier(.34,1.3,.64,1);
}
@keyframes nt-in { from { opacity: 0; transform: translateX(60px) scale(.9); } }
.nt-toast.nt-out { animation: nt-out .35s ease forwards; }
@keyframes nt-out { to { opacity: 0; transform: translateX(40px) scale(.9); } }

/* 倒计时进度条:scaleX 从 1 收到 0,时长与自动消失一致 */
.nt-bar { position: absolute; left: 0; bottom: 0; height: 3px; width: 100%;
  transform-origin: left; animation: nt-bar 4s linear forwards; }
@keyframes nt-bar { to { transform: scaleX(0); } }

原生 JS:动态创建提示条、绑定关闭、定时自动消失:

const MAP = {
  success: { icon: '✓', color: 'success', text: '操作成功,数据已保存' },
  error:   { icon: '✕', color: 'error',   text: '请求失败,请稍后重试' },
  warn:    { icon: '!',  color: 'warn',   text: '请注意,余额即将不足' },
  info:    { icon: 'i',  color: 'info',   text: '有新版本组件已发布' },
};

function show(type) {
  const cfg = MAP[type];
  const toast = document.createElement('div');
  toast.className = 'nt-toast';
  toast.innerHTML = `
    <span class="nt-icon nt-icon-${cfg.color}">${cfg.icon}</span>
    <span>${cfg.text}</span>
    <button class="nt-close">×</button>
    <span class="nt-bar" style="background:${barColor(cfg.color)}"></span>`;
  layer.appendChild(toast);

  toast.querySelector('.nt-close').addEventListener('click', () => dismiss(toast));
  setTimeout(() => dismiss(toast), 4000);   // 与进度条 4s 同步
}

function dismiss(toast) {
  toast.classList.add('nt-out');
  setTimeout(() => toast.remove(), 360);
}

参数说明

参数默认值说明
展示时长4000ms与 .nt-bar 动画时长保持一致,否则进度条与消失不同步
类型映射MAP 对象加新类型只需新增一条文案与颜色配置
堆叠方向flex-direction: column-reverse新消息从底部冒起,最新在最下
滑入缓动cubic-bezier(.34,1.3,.64,1)过冲系数让入场带一点弹跳
容器层级z-index: 9999确保盖过弹层与导航,可改为全局变量管理

兼容性与性能

常见问题

Q: 提示条太多会怎样? 会一直向上堆叠直到屏幕占满。生产环境建议加数量上限(如最多 5 条),超出时自动移除最早一条。

Q: 想改成顶部弹出? 把 .nt-layer 的 right/bottom 改为 top: 20px; left: 50%; transform: translateX(-50%),并把入场动画的 translateX 改成 translateY(-60px)。

Q: 点击提示条本身要触发跳转? 给 .nt-toast 绑定 click 事件并设置 cursor: pointer,同时保证关闭按钮 stopPropagation,避免点关闭时误触跳转。

Q: 可以商用吗? 可以。本组件为粤喵自研原创代码,免费商用无需署名。

许可与来源

  • 许可证:自研原创 —— 粤喵自研原创,可免费用于个人与商业项目,无需署名。查看来源公示与许可清单
  • 来源:粤喵团队原创自研(从效果思路到代码实现均为独立完成,未直接复制第三方代码)
  • 首次发布:2026-09-01 · 最近更新:2026-09-01
  • 修改日志:2026-09-01 首次发布;2026-09-13 补充许可证与来源标注、复制按钮说明与法务页入口
  • 纠错:联系页面 / min@cactus.asia,2 个工作日内核实处理

常见问题

这个组件可以商用吗?

可以。本组件为粤喵自研原创,可免费用于个人和商业项目,无需署名。

浏览器兼容性如何?

支持所有现代浏览器(Chrome / Firefox / Safari / Edge 最新版本)。旧版 IE 不支持 CSS 动画相关特性。

怎么修改动画参数?

直接调整 CSS 中的 animation-duration(时长)、animation-timing-function(缓动曲线)等属性即可,代码中有注释说明。

✍️ 作者与审核