通知卡片(未读红点 + 全部已读列表 CSS 源码)

CSSJS 许可:自研原创

通知卡片组件源码:未读蓝点标记、单条点击已读、右上角关闭单条、一键全部已读、徽章计数与空状态,纯 CSS + 原生 JS 实现,适合消息中心与站内信面板。

效果演示(真实可交互)

下方为通知卡片:三条未读通知右侧带渐变蓝点,点击任意一条即可标记已读;鼠标悬停单条时出现关闭按钮,点击后通知向右滑出消失;右上角”全部标为已读”按钮让徽章计数归零并消失;全部关闭后展示空状态。

通知 3

  • 💬

    鱼崽 评论了你的组件:「玻璃卡片太漂亮了!」

  • ⭐

    猫叔 收藏了你的 价格卡片组件

  • 🎉

    你的组件 《天气卡片》 通过了审核并已上线

  • 📢

    粤喵团队 发布了新组件:音乐播放器卡片

完整代码

HTML 结构:卡片由头部(标题 + 未读徽章 + 全部已读按钮)与列表组成,每条通知包含图标、正文、时间与关闭按钮:

<div class="nc-card">
  <div class="nc-head">
    <h3>通知 <span class="nc-badge">3</span></h3>
    <button class="nc-mark">全部标为已读</button>
  </div>
  <ul class="nc-list">
    <li class="nc-item unread">
      <span class="nc-ico">💬</span>
      <div class="nc-body">
        <p class="nc-text"><b>鱼崽</b> 评论了你的组件</p>
        <time>2 分钟前</time>
      </div>
      <button class="nc-x">✕</button>
    </li>
  </ul>
  <div class="nc-empty" hidden>🔔 暂无通知</div>
</div>

核心 CSS:未读标记用伪元素实现右上角渐变圆点,关闭动画为透明度 + 右移,之后才移除节点:

.nc-item.unread::before {
  content: ""; position: absolute; right: 16px; top: 18px;
  width: 8px; height: 8px; border-radius: 50%;
  background: linear-gradient(135deg, #6c8cff, #a96cff);
}
.nc-item.gone { opacity: 0; transform: translateX(24px); }
.nc-badge.zero { display: none; }

原生 JS 事件委托(无第三方库):

list.addEventListener('click', e => {
  const item = e.target.closest('.nc-item');
  if (!item) return;
  if (e.target.closest('.nc-x')) {
    item.classList.add('gone');
    setTimeout(() => { item.remove(); refresh(); }, 300);
  } else {
    item.classList.remove('unread');   // 点击任意区域标记已读
    refresh();
  }
});
mark.addEventListener('click', () => {
  list.querySelectorAll('.nc-item.unread')
    .forEach(i => i.classList.remove('unread'));
  refresh();
});

参数说明

参数默认值说明
未读标记位置right:16px top:18px伪元素圆点坐标,可调整
关闭动画时长300ms滑出动画结束后移除 DOM
徽章计数动态实时统计 .unread 数量,归零自动隐藏
列表最大高度330px超出后纵向滚动
空状态图标🔔全部关闭后展示的提示区块

兼容性与性能

常见问题

Q: 通知数据从接口来怎么接? 保留 .nc-item 的模板结构,用 JS 循环生成列表并挂到 .nc-list 上,事件委托逻辑无需改动。

Q: 想区分”评论/点赞/系统”三种图标颜色? 给 .nc-ico 按类型加 .type-comment/.type-like/.type-system 类,分别设置不同背景色即可。

Q: 点击通知要跳转详情页? 把 .nc-item 内的内容包进 <a>,或在点击处理中根据 data-id 跳转,注意不要让关闭按钮触发跳转(已通过 closest('.nc-x') 分支隔离)。

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(缓动曲线)等属性即可,代码中有注释说明。

✍️ 作者与审核