Video wird geladen...

Video konnte nicht geladen werden

Zur Startseite

Card stack using scroll-driven animation w/ snapping. Just a few lines of JS, zero dependencies. Code + demo via CodePen.IO

84,128 Aufrufe • vor 2 Jahren •via X (Twitter)

34 Kommentare

Profilbild von Pontus Wellgraf
Pontus Wellgrafvor 2 Jahren

@paul_uiux @CodePen Absolutely amazing! Feels so good 🔥 Just a heads up, it looks like with the touchpad interaction (Swiping wasn't supported), only the first cards gets put behind the stack whereas all other repetitions just scews the stack and hard cut to the next card

Profilbild von Paul Noble
Paul Noblevor 2 Jahren

@CodePen Gotcha! That’s sounds like it’s not updating the active index which requires scroll snap events (Chrome 129+)

Profilbild von Paul Noble
Paul Noblevor 2 Jahren

@CodePen Chrome 129’s rolling out now I think so try updating or try on Chrome Beta?

Profilbild von Pontus Wellgraf
Pontus Wellgrafvor 2 Jahren

@paul_uiux @CodePen I see! Just updated but still feels a little strange sometimes - See video for reference It feels like it's every time you don't wait until the transition has finished when the whole stack scews oddly. Maybe the ease out should be shortened and finish earlier to avoid this

Profilbild von Paul Noble
Paul Noblevor 2 Jahren

@CodePen Ah yeah, that’s not right 🤨 The scroll snap change fires only when the animation has completely finished. Not ideal but if you try moving through slowly (and waiting a fraction after the out transition) I think it should all look ok

Profilbild von Pontus Wellgraf
Pontus Wellgrafvor 2 Jahren

@paul_uiux @CodePen It does work if I wait! I just felt it was finished but the ease out is very slow in the end. I think if the transition of the cards went behind the stack faster and with less delay, this would solve this and various swipe speeds 🚀

Profilbild von Umxr K
Umxr Kvor 2 Jahren

@paul_uiux @CodePen Just brilliant art

Profilbild von Dennis Landi
Dennis Landivor 2 Jahren

@paul_uiux @CodePen Hi Paul, the codepen isn't working for me. The mouse swipe isn't working and the whole thing is stationary. Head's up.

Profilbild von Paul Noble
Paul Noblevor 2 Jahren

@CodePen Hey! Can you try touch pad swipe?

Profilbild von Dennis Landi
Dennis Landivor 2 Jahren

@paul_uiux @CodePen Hi. Yeah, it does work with the touchpad and the middle button pressed on my PC laptop. And it works on my phone. But...Can you getting working with a normal mouse?

Profilbild von Paul Noble
Paul Noblevor 2 Jahren

@CodePen We can bind mouse drag *but* when the mouse is released it’ll snap immediately (no smoothing animation to the closest snap point)

Profilbild von David K 🎹
David K 🎹vor 2 Jahren

@paul_uiux @CodePen This is incredible!

Profilbild von Robera Geleta
Robera Geletavor 2 Jahren

@paul_uiux @CodePen Glad to see this memed

Profilbild von mirko_ddd ⁝
mirko_ddd ⁝vor 2 Jahren

@paul_uiux @CodePen The tilt on Y axes makes the difference, feels so real. Congratulations 👏

Profilbild von James Vreeken
James Vreekenvor 2 Jahren

@paul_uiux @CodePen not as cool as yours but works with without scroll snap. you are an inspiration!

Profilbild von Gustav Ekerot
Gustav Ekerotvor 2 Jahren

@paul_uiux @CodePen Impressive! I've tried doing something similar before so I know how much effort it takes, good job!

Profilbild von _Tush_
_Tush_vor 2 Jahren

@paul_uiux @CodePen Cool !

Profilbild von Hussain Khan
Hussain Khanvor 2 Jahren

@paul_uiux @CodePen Very nice 👏

Profilbild von Valerio Leo @ Raycash ☀️
Valerio Leo @ Raycash ☀️vor 2 Jahren

@paul_uiux @CodePen This is brilliant. Are you planning to make it a npm package?

Profilbild von Paul Noble
Paul Noblevor 2 Jahren

@CodePen Thanks! It’s using features that aren’t available in most browsers (Safari doesn’t support scroll driven animation at all, yet) so it probably wouldn’t work as a package. Maybe in a few years?

Profilbild von Tanvir
Tanvirvor 2 Jahren

@paul_uiux @CodePen Bird love your cards 😁

Profilbild von Artur Minin
Artur Mininvor 2 Jahren

@paul_uiux @argyleink @CodePen Look so cool! Works like this really insipire me to dive deep into CSS

Profilbild von Oleg | webstudio.is
Oleg | webstudio.isvor 2 Jahren

@paul_uiux @CodePen Amazing! Reaction to swipe is slightly too fast, would expect more distance before it changes to the next one

Profilbild von Lars Ejaas 👨‍💻
Lars Ejaas 👨‍💻vor 2 Jahren

@paul_uiux @CodePen Love it! Scroll-driven animations using the new scroll-timeline is mind-blowing 🤯 Most frontend devs do not realize how much you will be able to do using only HTML and CSS with this! Love what you accomplished here with this new API ✨️ 🙌

Profilbild von Ricky Raihan Azhari
Ricky Raihan Azharivor 2 Jahren

@paul_uiux @CodePen i can't use it in mobile, 😮‍💨 i think it needs a few lines again

Profilbild von Paul Noble
Paul Noblevor 2 Jahren

@CodePen Sorry, Safari doesn’t support scroll based animations

Profilbild von Ricky Raihan Azhari
Ricky Raihan Azharivor 2 Jahren

@paul_uiux @CodePen

Profilbild von Michal Malewicz
Michal Malewiczvor 2 Jahren

@paul_uiux @CodePen Wow this is cool! ❤️❤️

Profilbild von ST
STvor 2 Jahren

@paul_uiux @CodePen beautiful.

Profilbild von Slo
Slovor 2 Jahren

@paul_uiux @CodePen Lord this is so good!!!

Profilbild von Abdullah Khalid Omi
Abdullah Khalid Omivor 2 Jahren

@paul_uiux @CodePen with drag enabled for the desktop, it would be cool!

Profilbild von Paul Noble
Paul Noblevor 2 Jahren

@CodePen Yeah, agree! Unfortunately we can bind mouse drag events to scroll but on mouse up the scroll snaps immediately at the next snap point (no animation)

Profilbild von Madhu
Madhuvor 2 Jahren

@paul_uiux @CodePen @pavan_1827

Profilbild von HoverHacks
HoverHacksvor 2 Jahren

@paul_uiux @CodePen wow that's awesome!

Ähnliche 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,728 Aufrufe • vor 2 Jahren