v144 · CSS Animations
Progressive Reveal
A realistic article-list page where each card animates in as it enters the viewport. Uses animation-trigger: view() in Chrome 144; falls back to IntersectionObserver + a CSS class toggle everywhere else. Swap animation types and stagger delay live.
Feature detection: checking…
Animation:
Duration:
0.5 s
Stagger:
200 ms
↓ Scroll to reveal articles
— end —
/* CSS — declare animation, leave trigger blank initially */
.card {
animation-name: reveal-up;
animation-duration: 0.5s;
animation-fill-mode: both;
animation-play-state: paused;
/* Chrome 144: fire when element enters viewport */
animation-trigger: view();
/* Stagger each card */
&:nth-child(2) { animation-delay: 100ms; }
&:nth-child(3) { animation-delay: 200ms; }
}
@keyframes reveal-up {
from { transform: translateY(40px); opacity: 0; }
to { transform: translateY(0); opacity: 1; }
}
/* ── JS fallback (IntersectionObserver) ───────────────────── */
const io = new IntersectionObserver(entries => {
entries.forEach(e => {
if (e.isIntersecting) {
e.target.classList.add('io-visible');
io.unobserve(e.target);
}
});
}, { threshold: 0.1 });
document.querySelectorAll('.card').forEach(el => io.observe(el));
see also
- Staggered Entrance — grid with CSS nth-child stagger
- Once vs Repeat — fire control
- Parallax Sections — scroll-driven + scroll-triggered combination
- ChromeStatus entry