滚动卡片交错入场特效(网格卡片错峰动画,方向可调)

JSCSS 许可:自研原创

滚动卡片交错入场特效:卡片网格随滚动进入视口,以每批 4 张、每张间隔 90ms 的节奏错峰显现,支持上浮、左滑、右滑、翻转四种方向,零依赖自研实现。

效果演示(真实可交互)

🎴 向下滚动:卡片按进入视口的先后交错入场,节奏错落有致

01

极光渐变

青紫渐变背景卡片,作为作品集网格的第一类视觉元素。

02

数据看板

统计卡片交错入场,让数字面板多一分仪式感。

03

产品卖点

卖点卡片依次浮现,引导视线按阅读顺序浏览。

04

团队介绍

成员卡片错峰出现,每个人的名字都值得被看见。

05

案例列表

案例缩略图网格配合交错入场,浏览体验更轻盈。

06

功能清单

功能块两两交错浮现,页面层次感立刻提升。

07

时间线

里程碑卡片依次点亮,叙事节奏由动画掌控。

08

结语卡片

最后一张卡片收尾,整套网格完成优雅谢幕。

演示区用内嵌滚动容器模拟页面滚动,8 张卡片组成 2×4 网格。滚动时卡片按「每批 4 张、批内每张延迟 90ms」的节奏交错入场,方向控件可切换四种动效。

完整代码

<div class="sct-scroller" id="sctScroller">
  <div class="sct-grid">
    <div class="sct-card"><h4>极光渐变</h4></div>
    <!-- 更多卡片…… -->
  </div>
</div>
.sct-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 14px; }
.sct-card {
  opacity: 0;
  transform: translateY(30px);
  transition: opacity .55s ease, transform .55s ease;
}
.sct-card.in { opacity: 1; transform: none; }
const cards = scroller.querySelectorAll('.sct-card');
let batch = [];

const io = new IntersectionObserver(entries => {
  entries.forEach(en => {
    if (en.isIntersecting) {
      batch.push(en.target);
      io.unobserve(en.target);
      if (batch.length >= 4) revealBatch();   // 攒够一批就播放
    }
  });
  setTimeout(() => { if (batch.length) revealBatch(); }, 80);
}, { root: scroller, threshold: 0.2 });

function revealBatch() {
  batch.forEach((card, i) => {
    card.classList.add('in');
    card.style.transitionDelay = (i * 90) + 'ms';  // 批内错峰
    setTimeout(() => { card.style.transitionDelay = ''; }, 900);
  });
  batch = [];
}

核心思路:观察器把进入视口的卡片收集进「批次」,攒满 4 张(或滚动停顿后不足一批)统一播放;批内每张卡片的 transition-delay 依次递增 90ms,形成波浪般的错峰入场。方向切换只需替换 .sct-card 的初始 transform。

参数说明

参数位置说明
批大小JS 中 batch.length >= 42-6 合适,网格列数相同观感最佳
错峰间隔transitionDelay = i * 9060-120ms 区间节奏最舒服
入场方向data-dir 属性up / left / right / flip 四种
触发阈值threshold: 0.2卡片进入视口 20% 时入队
批次兜底setTimeout(..., 80)防止最后几张卡永远攒不满一批

兼容性与性能

常见问题

Q: 最后几张卡片一直不出现? 当剩余卡片不足一批时不会触发播放,本组件用「滚动停顿 80ms 兜底」解决;正式使用时也可在 unobserve 后立即播放。

Q: 每批 4 张的节奏是怎么来的? 网格是 2 列,一屏大约能放下 4 张,以「一屏」为批单位最自然。改成 3 列网格时把批大小设为 6 即可保持节奏。

Q: 切换方向后动画会重新播放吗? 会。本组件切换方向时先移除所有 .in 类并清空延迟,再重建观察器,保证新方向从头生效。

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

✍️ 作者与审核