滚动卡片交错入场特效(网格卡片错峰动画,方向可调)
滚动卡片交错入场特效:卡片网格随滚动进入视口,以每批 4 张、每张间隔 90ms 的节奏错峰显现,支持上浮、左滑、右滑、翻转四种方向,零依赖自研实现。
效果演示(真实可交互)
🎴 向下滚动:卡片按进入视口的先后交错入场,节奏错落有致
极光渐变
青紫渐变背景卡片,作为作品集网格的第一类视觉元素。
数据看板
统计卡片交错入场,让数字面板多一分仪式感。
产品卖点
卖点卡片依次浮现,引导视线按阅读顺序浏览。
团队介绍
成员卡片错峰出现,每个人的名字都值得被看见。
案例列表
案例缩略图网格配合交错入场,浏览体验更轻盈。
功能清单
功能块两两交错浮现,页面层次感立刻提升。
时间线
里程碑卡片依次点亮,叙事节奏由动画掌控。
结语卡片
最后一张卡片收尾,整套网格完成优雅谢幕。
演示区用内嵌滚动容器模拟页面滚动,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 >= 4 | 2-6 合适,网格列数相同观感最佳 |
| 错峰间隔 | transitionDelay = i * 90 | 60-120ms 区间节奏最舒服 |
| 入场方向 | data-dir 属性 | up / left / right / flip 四种 |
| 触发阈值 | threshold: 0.2 | 卡片进入视口 20% 时入队 |
| 批次兜底 | setTimeout(..., 80) | 防止最后几张卡永远攒不满一批 |
兼容性与性能
- 每张卡片只触发一次动画,触发后立即
unobserve,观察队列随滚动自然清空,长网格零残余开销 - 动画只操作
opacity与transform(含perspective翻转),均在合成器线程完成,不触发布局重排 - IntersectionObserver 异步调度,滚动过程不产生密集计算;延迟用
transition-delay实现而非 JS 定时器,更省资源 - 全浏览器兼容(Chrome / Safari / Firefox / Edge / iOS / Android 现代版本),无需任何 polyfill
常见问题
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(缓动曲线)等属性即可,代码中有注释说明。