Loading video...

Video Failed to Load

Go Home

Future CSS Tip! ๐Ÿ”ฎ Use scroll-driven animations to create those cool Apple-style text reveals ๐Ÿ”ฅ No JavaScript required ๐Ÿ‘€ Responsive too! ๐Ÿ™Œ .sentence { animation: highlight; animation-timeline: view(); animation-range: cover 40% cover 75%; } CodePen.IO link below! ๐Ÿ‘‡

347,926 views โ€ข 3 years ago โ€ขvia X (Twitter)

10 Comments

jhey โ–ฒ๐Ÿป๐ŸŽˆ's profile picture
jhey โ–ฒ๐Ÿป๐ŸŽˆ3 years ago

Here's that @CodePen link! ๐Ÿš€ Remember, you'll need to be in Chrome Canary to see this in action. But, how exciting?! ๐Ÿคฏ

Shaun Levett's profile picture
Shaun Levett3 years ago

@CodePen This is highly erotic

jhey โ–ฒ๐Ÿป๐ŸŽˆ's profile picture
jhey โ–ฒ๐Ÿป๐ŸŽˆ3 years ago

@CodePen Hahaha ๐Ÿ‘๐Ÿ˜…

altino's profile picture
altino3 years ago

@CodePen that means it uses main thread or not ? Im confused ...

Ali's profile picture
Ali3 years ago

@CodePen @maryam_davoudi

Julien Van Beveren's profile picture
Julien Van Beveren3 years ago

@CodePen crazy that this works with css only! maybe scroll highjacking might be considered ok now

jhey โ–ฒ๐Ÿป๐ŸŽˆ's profile picture
jhey โ–ฒ๐Ÿป๐ŸŽˆ3 years ago

@CodePen Yeah, it's gonna make things pretty interesting ๐Ÿค“

Lucas Walder's profile picture
Lucas Walder3 years ago

@CodePen Olha isso @evvvrado

Santiago's profile picture
Santiago3 years ago

@CodePen @SaveToNotion #thread #css

Fradviam's profile picture
Fradviam3 years ago

@CodePen ๐Ÿ˜ณ๐Ÿ˜ณ

Related Videos

CSS Tip! ๐Ÿšฅ You can create these trending expanding scroll indicators with scroll-driven animations and flex ๐Ÿค™ .indicator { animation: grow; animation-range: contain calc(50% - var(--size)...; animation-timeline: var(--card); } @โ€‹keyframes grow { 50% { flex: 3; }} What's the trick? Put the indicators in a container using flex layout and set a width larger than the number of indicators ๐Ÿ˜‰ .indicators { aspect-ratio: 7 / 1; display: flex; } Importantly, set no gap ๐Ÿค To mimic the gap set a transparent border on each indicator and set the background using padding-box .indicator { background: linear-gradient(#โ€‹fff, #โ€‹fff) padding-box; border-radius: 50px; border: 4px solid transparent; } Now for the animation. You want to create a view-timeline for each card that moves across ๐Ÿค™ li:nth-of-type(1) { view-timeline: --one inline; } li:nth-of-type(2) { view-timeline: --two inline; } Make sure they use the inline axis too! The trick is hoisting these view-timeline so the indicators can use them with timeline-scope ๐Ÿ‘€ .track { timeline-scope: --one, --two, ...; } All that's left is for you to create the animation piece using some calc with the card size โšก๏ธ .indicator { --size: calc(var(--card-width) * 0.9); animation: grow both linear; animation-range: contain calc(50% - var(--size)) contain calc(50% + var(--size)); } .indicator:nth-of-type(1) { animation-timeline: --one; } .indicator:nth-of-type(2) { animation-timeline: --two; } @โ€‹keyframes grow { 50% { flex: 3; }} And there you have it, responsive scroll indicators using CSS scroll-driven animations ๐Ÿ˜Ž Sprinkle a little JavaScript to make them clickable and scroll the the right card โœจ const shift = (event) => { if (eventโ€‹.target.tagName === "BUTTON") { const index = [...event.target.parentNode.children].indexOf(eventโ€‹.target); const item = document.querySelector(`li:nth-of-type(${index + 1})`); item.scrollIntoView({ behavior: "smooth", inline: "center" }); } }; As always, any questions or suggestions, let me know. I've put a JavaScript fallback in to use GSAP in browsers that don't have scroll-driven animations ๐Ÿซถ CodePen.IO link below! ๐Ÿ‘‡

jhey ส•โ€ขแดฅโ€ขส”

575,538 views โ€ข 2 years ago

CSS Tip! ๐Ÿณ You can add little details like this scale down on scroll effect with scroll-driven animations and some sticky positioning ๐Ÿค™ section { animation: scale-down; animation-timeline: view(); animation-range: exit; } @โ€‹keyframes scale-down { to { scale 0.8; } ] In this smaller example, you can lean into using the position to drive an animation that scales itself down as it leaves the viewport (Seen on the Apple Vision Pro site ๐Ÿ) The nice thing here is that if you don't have scroll-driven animations, the user still gets a good experience โœจ So how do you do it? There isn't much to it header { transform-origin: 50% 0%; animation: scale-down both ease-in; animation-timeline: view(); animation-range: exit; view-timeline: --header; } @โ€‹keyframes scale-down { to { scale: 0.8 0.8; } } That's it. The layout makes use of position: sticky so that the element stays in the shot whilst you scroll the page. As it leaves the page, it scales down inside the ๐Ÿซถ The other smol animation here is fading the overlay on the video out ๐Ÿ˜Ž Real easy. You may notice the view-timeline you defined above for the ๐Ÿ‘€ header { view-timeline: --header; } You have a pseudoelement on the text content of the header that lives inside a header > section::before { background: hsl(0 0% 0% / 0.75); opacity: 1; animation: fade both linear; animation-timeline: --header; animation-range: exit-crossing 0% exit 0%; } @โ€‹keyframes fade { to { opacity: 0; } } You use a slightly smaller range on this with exit-crossing to fade it out before you start the scale down animation ๐Ÿค That's it! Thought this smaller example would be easier to grok for people ๐Ÿ™ It's also covered with JavaScript if you really want it for your sites ๐Ÿค™ CodePen.IO link below ๐Ÿ‘‡

jhey ส•โ€ขแดฅโ€ขส”

146,270 views โ€ข 2 years ago

CSS Tip! ๐Ÿ“œ You can use scroll-driven animations to progressively enhance collapsing a floating call to action ๐Ÿค .cta { animation: shrink; animation-timeline: scroll(); animation-range: 0 100px; } @โ€‹keyframes shrink { to { width: 48px; } } That's the gist of it. Use the body scroll position with animation-timeline: scroll(). Define the animation-range as when you have scrolled 100px. There's a little more though ๐Ÿค“ That would "scrub" the width animation. Ideally, you want to trigger that animation. You could animate a custom property with steps() timing and use that to define the width โœจ @โ€‹property --scrub { syntax: ' '; inherits: true; initial-value: 0; } body { animation: scrub both steps(1, end); animation-timeline: scroll(); animation-range: 0 100px; } Then transition the --scrub property on the CTA and use it for the width ๐Ÿค™ .cta { transition: --scrub 0.2s; width: calc(48px + (120px * (1 - (var(--scrub) / 100)))); } Other animations are a matter of preference and timing. For example, you could then make the hand wave, scale down the size, and then slide a gradient across ๐Ÿ˜‰ They have the same structure and technique as the original concept. Waving the hand? ๐Ÿ‘‹ Run it twice, offset the transform-origin. .hand { animation: wave both linear 2; animation-timeline: scroll(); animation-range: 30vh 50vh; transform-origin: 65% 75%; } @โ€‹keyframes wave { 50% { rotate: 20deg; } } How's it progressively enhanced? Wrap everything in a @โ€‹supports query and a @โ€‹media query. If there isn't support, users still get a good experience. It's a floating action button that's circular and already collapsed ๐Ÿค™ @โ€‹supports(animation-timeline: scroll()) { @โ€‹media(prefers-reduced-motion: no-preference) {...} } Definitely have a play with the code. Amazing what we're going to be able to do with CSS alone! ๐Ÿ”ฅ CodePen.IO link below! ๐Ÿ‘‡

jhey ส•โ€ขแดฅโ€ขส”

177,781 views โ€ข 2 years ago