Scroll experience skill
Expert in building immersive scroll-driven experiences - parallax storytelling, scroll animations, interactive narratives, and cinematic web experiences.
by davila7·MIT license·★ 32,299 Stars on the repo·GitHub ↗
Use now
npx degit davila7/claude-code-templates/cli-tool/components/skills/creative-design/scroll-experience#main ~/.claude/skills/scroll-experienceChecked ·commit main
Files of Scroll experience
SKILL.md
Show the full text264 lines
Scroll Experience
Role: Scroll Experience Architect
You see scrolling as a narrative device, not just navigation. You create moments of delight as users scroll. You know when to use subtle animations and when to go cinematic. You balance performance with visual impact. You make websites feel like movies you control with your thumb.
Capabilities
- Scroll-driven animations
- Parallax storytelling
- Interactive narratives
- Cinematic web experiences
- Scroll-triggered reveals
- Progress indicators
- Sticky sections
- Scroll snapping
Patterns
Scroll Animation Stack
Tools and techniques for scroll animations
When to use: When planning scroll-driven experiences
## Scroll Animation Stack
### Library Options
| Library | Best For | Learning Curve |
|---------|----------|----------------|
| GSAP ScrollTrigger | Complex animations | Medium |
| Framer Motion | React projects | Low |
| Locomotive Scroll | Smooth scroll + parallax | Medium |
| Lenis | Smooth scroll only | Low |
| CSS scroll-timeline | Simple, native | Low |
### GSAP ScrollTrigger Setup
```javascript
import { gsap } from 'gsap';
import { ScrollTrigger } from 'gsap/ScrollTrigger';
gsap.registerPlugin(ScrollTrigger);
// Basic scroll animation
gsap.to('.element', {
scrollTrigger: {
trigger: '.element',
start: 'top center',
end: 'bottom center',
scrub: true, // Links animation to scroll position
},
y: -100,
opacity: 1,
});
Framer Motion Scroll
import { motion, useScroll, useTransform } from 'framer-motion';
function ParallaxSection() {
const { scrollYProgress } = useScroll();
const y = useTransform(scrollYProgress, [0, 1], [0, -200]);
return (
<motion.div style={{ y }}>
Content moves with scroll
</motion.div>
);
}
CSS Native (2024+)
@keyframes reveal {
from { opacity: 0; transform: translateY(50px); }
to { opacity: 1; transform: translateY(0); }
}
.animate-on-scroll {
animation: reveal linear;
animation-timeline: view();
animation-range: entry 0% cover 40%;
}
### Parallax Storytelling
Tell stories through scroll depth
**When to use**: When creating narrative experiences
```javascript
## Parallax Storytelling
### Layer Speeds
| Layer | Speed | Effect |
|-------|-------|--------|
| Background | 0.2x | Far away, slow |
| Midground | 0.5x | Middle depth |
| Foreground | 1.0x | Normal scroll |
| Content | 1.0x | Readable |
| Floating elements | 1.2x | Pop forward |
### Creating Depth
```javascript
// GSAP parallax layers
gsap.to('.background', {
scrollTrigger: {
scrub: true
},
y: '-20%', // Moves slower
});
gsap.to('.foreground', {
scrollTrigger: {
scrub: true
},
y: '-50%', // Moves faster
});
Story Beats
Section 1: Hook (full viewport, striking visual)
↓ scroll
Section 2: Context (text + supporting visuals)
↓ scroll
Section 3: Journey (parallax storytelling)
↓ scroll
Section 4: Climax (dramatic reveal)
↓ scroll
Section 5: Resolution (CTA or conclusion)
Text Reveals
- Fade in on scroll
- Typewriter effect on trigger
- Word-by-word highlight
- Sticky text with changing visuals
### Sticky Sections
Pin elements while scrolling through content
**When to use**: When content should stay visible during scroll
```javascript
## Sticky Sections
### CSS Sticky
```css
.sticky-container {
height: 300vh; /* Space for scrolling */
}
.sticky-element {
position: sticky;
top: 0;
height: 100vh;
}
GSAP Pin
gsap.to('.content', {
scrollTrigger: {
trigger: '.section',
pin: true, // Pins the section
start: 'top top',
end: '+=1000', // Pin for 1000px of scroll
scrub: true,
},
// Animate while pinned
x: '-100vw',
});
Horizontal Scroll Section
const sections = gsap.utils.toArray('.panel');
gsap.to(sections, {
xPercent: -100 * (sections.length - 1),
ease: 'none',
scrollTrigger: {
trigger: '.horizontal-container',
pin: true,
scrub: 1,
end: () => '+=' + document.querySelector('.horizontal-container').offsetWidth,
},
});
Use Cases
- Product feature walkthrough
- Before/after comparisons
- Step-by-step processes
- Image galleries
## Anti-Patterns
### ❌ Scroll Hijacking
**Why bad**: Users hate losing scroll control.
Accessibility nightmare.
Breaks back button expectations.
Frustrating on mobile.
**Instead**: Enhance scroll, don't replace it.
Keep natural scroll speed.
Use scrub animations.
Allow users to scroll normally.
### ❌ Animation Overload
**Why bad**: Distracting, not delightful.
Performance tanks.
Content becomes secondary.
User fatigue.
**Instead**: Less is more.
Animate key moments.
Static content is okay.
Guide attention, don't overwhelm.
### ❌ Desktop-Only Experience
**Why bad**: Mobile is majority of traffic.
Touch scroll is different.
Performance issues on phones.
Unusable experience.
**Instead**: Mobile-first scroll design.
Simpler effects on mobile.
Test on real devices.
Graceful degradation.
## ⚠️ Sharp Edges
| Issue | Severity | Solution |
|-------|----------|----------|
| Animations stutter during scroll | high | ## Fixing Scroll Jank |
| Parallax breaks on mobile devices | high | ## Mobile-Safe Parallax |
| Scroll experience is inaccessible | medium | ## Accessible Scroll Experiences |
| Critical content hidden below animations | medium | ## Content-First Scroll Design |
## Related Skills
Works well with: `3d-web-experience`, `frontend`, `ui-design`, `landing-page-design`
| 1 | |
| 2 | name scroll-experience |
| 3 | description "Expert in building immersive scroll-driven experiences - parallax storytelling, scroll animations, interactive narratives, and cinematic web experiences. Like NY Times interactives, Apple product pages, and award-winning web experiences. Makes websites feel like experiences, not just pages. Use when: scroll animation, parallax, scroll storytelling, interactive story, cinematic website." |
| 4 | source vibeship-spawner-skills (Apache 2.0) |
| 5 | |
| 6 | |
| 7 | # Scroll Experience |
| 8 | |
| 9 | **Role**: Scroll Experience Architect |
| 10 | |
| 11 | You see scrolling as a narrative device, not just navigation. You create |
| 12 | moments of delight as users scroll. You know when to use subtle animations |
| 13 | and when to go cinematic. You balance performance with visual impact. You |
| 14 | make websites feel like movies you control with your thumb. |
| 15 | |
| 16 | ## Capabilities |
| 17 | |
| 18 | Scroll-driven animations |
| 19 | Parallax storytelling |
| 20 | Interactive narratives |
| 21 | Cinematic web experiences |
| 22 | Scroll-triggered reveals |
| 23 | Progress indicators |
| 24 | Sticky sections |
| 25 | Scroll snapping |
| 26 | |
| 27 | ## Patterns |
| 28 | |
| 29 | ### Scroll Animation Stack |
| 30 | |
| 31 | Tools and techniques for scroll animations |
| 32 | |
| 33 | **When to use**: When planning scroll-driven experiences |
| 34 | |
| 35 | |
| 36 | ## Scroll Animation Stack |
| 37 | |
| 38 | ### Library Options |
| 39 | | Library | Best For | Learning Curve | |
| 40 | |---------|----------|----------------| |
| 41 | | GSAP ScrollTrigger | Complex animations | Medium | |
| 42 | | Framer Motion | React projects | Low | |
| 43 | | Locomotive Scroll | Smooth scroll + parallax | Medium | |
| 44 | | Lenis | Smooth scroll only | Low | |
| 45 | | CSS scroll-timeline | Simple, native | Low | |
| 46 | |
| 47 | ### GSAP ScrollTrigger Setup |
| 48 | |
| 49 | import { gsap } from 'gsap'; |
| 50 | import { ScrollTrigger } from 'gsap/ScrollTrigger'; |
| 51 | |
| 52 | gsap.registerPlugin(ScrollTrigger); |
| 53 | |
| 54 | // Basic scroll animation |
| 55 | gsap.to('.element', { |
| 56 | scrollTrigger: { |
| 57 | trigger: '.element', |
| 58 | start: 'top center', |
| 59 | end: 'bottom center', |
| 60 | scrub: true, // Links animation to scroll position |
| 61 | }, |
| 62 | y: -100, |
| 63 | opacity: 1, |
| 64 | }); |
| 65 | |
| 66 | |
| 67 | ### Framer Motion Scroll |
| 68 | |
| 69 | import { motion, useScroll, useTransform } from 'framer-motion'; |
| 70 | |
| 71 | function ParallaxSection() { |
| 72 | const { scrollYProgress } = useScroll(); |
| 73 | const y = useTransform(scrollYProgress, [0, 1], [0, -200]); |
| 74 | |
| 75 | return ( |
| 76 | <motion.div style={{ y }}> |
| 77 | Content moves with scroll |
| 78 | </motion.div> |
| 79 | ); |
| 80 | } |
| 81 | |
| 82 | |
| 83 | ### CSS Native (2024+) |
| 84 | |
| 85 | @keyframes reveal { |
| 86 | from { opacity: 0; transform: translateY(50px); } |
| 87 | to { opacity: 1; transform: translateY(0); } |
| 88 | } |
| 89 | |
| 90 | .animate-on-scroll { |
| 91 | animation: reveal linear; |
| 92 | animation-timeline: view(); |
| 93 | animation-range: entry 0% cover 40%; |
| 94 | } |
| 95 | |
| 96 | |
| 97 | |
| 98 | ### Parallax Storytelling |
| 99 | |
| 100 | Tell stories through scroll depth |
| 101 | |
| 102 | **When to use**: When creating narrative experiences |
| 103 | |
| 104 | |
| 105 | ## Parallax Storytelling |
| 106 | |
| 107 | ### Layer Speeds |
| 108 | | Layer | Speed | Effect | |
| 109 | |-------|-------|--------| |
| 110 | | Background | 0.2x | Far away, slow | |
| 111 | | Midground | 0.5x | Middle depth | |
| 112 | | Foreground | 1.0x | Normal scroll | |
| 113 | | Content | 1.0x | Readable | |
| 114 | | Floating elements | 1.2x | Pop forward | |
| 115 | |
| 116 | ### Creating Depth |
| 117 | |
| 118 | // GSAP parallax layers |
| 119 | gsap.to('.background', { |
| 120 | scrollTrigger: { |
| 121 | scrub: true |
| 122 | }, |
| 123 | y: '-20%', // Moves slower |
| 124 | }); |
| 125 | |
| 126 | gsap.to('.foreground', { |
| 127 | scrollTrigger: { |
| 128 | scrub: true |
| 129 | }, |
| 130 | y: '-50%', // Moves faster |
| 131 | }); |
| 132 | |
| 133 | |
| 134 | ### Story Beats |
| 135 | |
| 136 | Section 1: Hook (full viewport, striking visual) |
| 137 | ↓ scroll |
| 138 | Section 2: Context (text + supporting visuals) |
| 139 | ↓ scroll |
| 140 | Section 3: Journey (parallax storytelling) |
| 141 | ↓ scroll |
| 142 | Section 4: Climax (dramatic reveal) |
| 143 | ↓ scroll |
| 144 | Section 5: Resolution (CTA or conclusion) |
| 145 | |
| 146 | |
| 147 | ### Text Reveals |
| 148 | - Fade in on scroll |
| 149 | - Typewriter effect on trigger |
| 150 | - Word-by-word highlight |
| 151 | - Sticky text with changing visuals |
| 152 | |
| 153 | |
| 154 | ### Sticky Sections |
| 155 | |
| 156 | Pin elements while scrolling through content |
| 157 | |
| 158 | **When to use**: When content should stay visible during scroll |
| 159 | |
| 160 | |
| 161 | ## Sticky Sections |
| 162 | |
| 163 | ### CSS Sticky |
| 164 | |
| 165 | .sticky-container { |
| 166 | height: 300vh; /* Space for scrolling */ |
| 167 | } |
| 168 | |
| 169 | .sticky-element { |
| 170 | position: sticky; |
| 171 | top: 0; |
| 172 | height: 100vh; |
| 173 | } |
| 174 | |
| 175 | |
| 176 | ### GSAP Pin |
| 177 | |
| 178 | gsap.to('.content', { |
| 179 | scrollTrigger: { |
| 180 | trigger: '.section', |
| 181 | pin: true, // Pins the section |
| 182 | start: 'top top', |
| 183 | end: '+=1000', // Pin for 1000px of scroll |
| 184 | scrub: true, |
| 185 | }, |
| 186 | // Animate while pinned |
| 187 | x: '-100vw', |
| 188 | }); |
| 189 | |
| 190 | |
| 191 | ### Horizontal Scroll Section |
| 192 | |
| 193 | const sections = gsap.utils.toArray('.panel'); |
| 194 | |
| 195 | gsap.to(sections, { |
| 196 | xPercent: -100 * (sections.length - 1), |
| 197 | ease: 'none', |
| 198 | scrollTrigger: { |
| 199 | trigger: '.horizontal-container', |
| 200 | pin: true, |
| 201 | scrub: 1, |
| 202 | end: () => '+=' + document.querySelector('.horizontal-container').offsetWidth, |
| 203 | }, |
| 204 | }); |
| 205 | |
| 206 | |
| 207 | ### Use Cases |
| 208 | - Product feature walkthrough |
| 209 | - Before/after comparisons |
| 210 | - Step-by-step processes |
| 211 | - Image galleries |
| 212 | |
| 213 | |
| 214 | ## Anti-Patterns |
| 215 | |
| 216 | ### ❌ Scroll Hijacking |
| 217 | |
| 218 | **Why bad**: Users hate losing scroll control. |
| 219 | Accessibility nightmare. |
| 220 | Breaks back button expectations. |
| 221 | Frustrating on mobile. |
| 222 | |
| 223 | **Instead**: Enhance scroll, don't replace it. |
| 224 | Keep natural scroll speed. |
| 225 | Use scrub animations. |
| 226 | Allow users to scroll normally. |
| 227 | |
| 228 | ### ❌ Animation Overload |
| 229 | |
| 230 | **Why bad**: Distracting, not delightful. |
| 231 | Performance tanks. |
| 232 | Content becomes secondary. |
| 233 | User fatigue. |
| 234 | |
| 235 | **Instead**: Less is more. |
| 236 | Animate key moments. |
| 237 | Static content is okay. |
| 238 | Guide attention, don't overwhelm. |
| 239 | |
| 240 | ### ❌ Desktop-Only Experience |
| 241 | |
| 242 | **Why bad**: Mobile is majority of traffic. |
| 243 | Touch scroll is different. |
| 244 | Performance issues on phones. |
| 245 | Unusable experience. |
| 246 | |
| 247 | **Instead**: Mobile-first scroll design. |
| 248 | Simpler effects on mobile. |
| 249 | Test on real devices. |
| 250 | Graceful degradation. |
| 251 | |
| 252 | ## ⚠️ Sharp Edges |
| 253 | |
| 254 | | Issue | Severity | Solution | |
| 255 | |-------|----------|----------| |
| 256 | | Animations stutter during scroll | high | ## Fixing Scroll Jank | |
| 257 | | Parallax breaks on mobile devices | high | ## Mobile-Safe Parallax | |
| 258 | | Scroll experience is inaccessible | medium | ## Accessible Scroll Experiences | |
| 259 | | Critical content hidden below animations | medium | ## Content-First Scroll Design | |
| 260 | |
| 261 | ## Related Skills |
| 262 | |
| 263 | Works well with: `3d-web-experience`, `frontend`, `ui-design`, `landing-page-design` |
| 264 |
Discussion
Alternatives
2026 Size Neler getirecekYüklenen ve Doğum bilgileri girilen görselin Astrolojik 2026 yılıA moment shared with the wildA candid, photorealistic iPhone-style selfie capturing a relaxed moment between a human and a wild {WILD_ANIMAL} in its natural habitat. Natural light, subtle motion, and authentic details create the feeling of a real, spontaneous encounter in the wild.Alpine golden hour granola portraitGenerates a photorealistic, vertical 3:4 medium shot of a young woman with a relaxed "granola girl" aesthetic by a tranquil mountain lake. She wears a patterned sherpa fleece jacket and messy bun, looking over her shoulder with a warm smile. Bathed in golden hour sunlight, the image features crisp deep focus on both the subject and the dramatic alpine cliffs, rendered in sharp 8K iPhone 16 Pro Max quality.Celebratory student exam result reveal"composition": ["medium front-facing shot of student seated at desk, holding up smartphone toward camera with green screen display…
Browse more free Claude skills or everything in Content creator.