Jump to content

Search In
  • More options...
Find results that contain...
Find results in...


  • Posts

  • Joined

  • Last visited

ddi-web-team's Achievements

  1. While I do really like the @PointC solution (and your website. Thank you so much for the content) I feel like .wrap() was made for this! Thank you so much! 🙂
  2. Hi all I decided to have some fun with the codepen challenge and utilize my favorite library 😁 One thing I decided to do was create an array of colors that I could loop through and set the color of each character in the caption of the photo. I got this working properly using the following: const captions = gsap.utils.toArray('figure > figcaption'); const colors = ['#ffadad', '#ffd6a5', '#fdffb6', '#caffbf', '#9bf6ff', '#a0c4ff', '#ffc6ff'] captions.forEach(caption => { mySplit = new SplitText(caption); let counter = 0; for(const char in mySplit.chars){ if(counter > 6){ counter = 0; } gsap.set(mySplit.chars[char], {'color': colors[counter]}); counter++; } }); My only question is this. Is there a more elegant way? I've read through the gsap utilities and I'm failing to come up with a way to do this in a more concise way. Thank you!
  3. I realized that my issue was because of conflicting tweens. In the closing function, I was changing the opacity of the card being flipped before it had a chance to finish it's animation. I've updated the function like this. function closeHeadshot(){ document.removeEventListener('click', closeHeadshot); //Record current state const state = Flip.getState(expandedContainer); //Scale details down so that it's image fits exactly on top of the active headshot Flip.fit(expandedContainer, activeHeadshot.querySelector('img'), {scale: true, fitChild: expandedImage}); //Put the bio container back and then fade in the other headshots const tl = gsap.timeline(); tl.to(expandedBioContainer, {xPercent: 15, opacity: 0}) //.to(expandedContainer, {visibility: 'hidden'}) .to(headshots, {opacity:1, stagger: {amount: 0.7, from: headshots.indexOf(activeHeadshot), grid: 'auto'}}, 0); Flip.from(state, { scale: true, duration: .5, delay: 0.2, ease: "power2.inOut", absolute: true }).to(expandedContainer, {visibility: 'hidden'}) activeHeadshot = null; }
  4. Hello. I'm trying to make my own flip demo that is very similar to this example. https://codepen.io/GreenSock/pen/JjXqMZK The issue that I'm coming across is with the closeHeadshot() function. When closing, the expanded headshot starts to move back into the correct place, but near the end, it jumps back to place and doesn't animate nicely. I'm not sure what's causing this and why it doesn't close as smoothly as it opens.
  5. Hi Jack! 😁 Yes, you hit the nail on the head. I hadn't really considered how the z-index was causing this. Your solution is perfect. Thank you so much!
  6. Hi all I'm trying to create a 2x2 grid of divs. When a div is clicked it will fill up the entire container of divs and reveal some content. I have this working using the FLIP plugin, but I'm noticing a weird jump when downsizing every box with the last one being an exception. For some reason, the last one (the orange box) grows and shrinks as intended. I'm achieving this by using unset on the class that is being applied to the box that is full screen. .fullScreened{ position:absolute; top:0; bottom:0; right:0; left:0; z-index: 10; grid-column-start:unset !important; grid-column-end:unset !important; grid-row-start:unset !important; grid-row-end:unset !important; } Which feels kind of hacky but I'm not sure of another solution.
  7. That's a fair point @mattsrinc and I'll look over it for sure.
  8. Wow. That seems so obvious I almost feel embarrassed. Thank you @ZachSaucier Your help is very much appreciated.
  9. Hello All I'm trying to create a very large documentation page. Because I know this page can get very long, I'm using scrollTrigger to Animate a progress bar. That code is basically copy/pasta from the scrollTrigger examples. Thank you 😁 Tween an icon next to the nav item that tells the user what section they are in. This works perfectly fine with scrolling. And now I'm trying to use the ScrollToPlugin so that when the user clicks on a nav item, the window tweens to the correct position. It seems to work perfectly fine if you are at the top of the page, and click on any nav item. But if you're clicking on a nav section when you're scrolled, the plugin seems to 'jump' the window to the top of the page before tweening to the correct position. I tried googling this issue and did come across this where @OSUblake helpfully suggests removing smooth scrolling. I thought this would solve my issue as I did have that enabled. However, I'm still seeing the behavior after removing that. Any help would be greatly appreciated.
  10. Hello I'm working on a chart animation that uses a from tween to animate the bars from an opacity of 0 and a y coordinate of -50. Because this animation is further down the page, I'm using scrollTrigger so the user doesn't miss the animation. The issue that I'm seeing to run in to is how scrollTrigger works in relation to nested timelines. I have a master timeline called globalTL const globalTL = gsap.timeline(); I have multiple functions that each return a timeline. function animateIntro(){ let tl = gsap.timeline(); var staggersX = gsap.utils.wrap(['-200', '200']); tl.set('.section', {autoAlpha:1}) .from('#intro-logo', {opacity:0, y:-100}) .from('#intro-tagline', {opacity:0, y:100}, '<') .from('.yellow-card', {opacity:0, x:staggersX, stagger:.3}) .from('.keep-scrolling-container', {opacity:0, delay:.5}) .fromTo('.container-outter', {background:'#236192'},{background:'#eee', scrollTrigger:{ trigger: '.finding1', start: 'top center', end: 'center center', scrub: 1, //markers: true }}) return tl; } function animateFinding1(){ const bars = document.querySelectorAll('#chart-container > div'); console.log(bars) let tl = gsap.timeline({scrollTrigger:{ trigger:'#chart-container', start:'center center', markers:true }}); tl.from(bars, {opacity:0, duration:1, stagger:.25, y:-50}) return tl; //THIS CAUSES ME TO BREAK } Finally, I add these to the master timeline. globalTL.add(animateIntro()) .add(animateFinding1(), '<') The problem with this approach is that it causes my chart to animate inconsistently. Sometimes the animation doesn't completely finish. Sometimes it never even starts. When it does finish, it goes to the complete state immediately. There's no actual tweening of the values. The solution seems to be to remove the return statement from animateFinding1() function animateFinding1(){ const bars = document.querySelectorAll('#chart-container > div'); console.log(bars) let tl = gsap.timeline({scrollTrigger:{ trigger:'#chart-container', start:'center center', markers:true }}); tl.from(bars, {opacity:0, duration:1, stagger:.25, y:-50}) //return tl; //I'm commented out. Everything is fine now. } I don't really understand why this is the case. I've tried adding the scrollTrigger to the from tween rather than the timeline. My normal workflow is to create a master timeline, create functions that create and return timelines, and finally to nest those timelines in the master using those functions. Is there something I need to consider when using this workflow with scrollTrigger? Is there some obvious fluke I'm missing? Thank you for reading.
  11. Amazing. Thank you @ZachSaucier 😁 One quick question. You mention that transforms are more performant than height. Do you have a resource where I can learn more about why this is?
  12. Hi all! I've been experimenting with combining D3 and GSAP to animate some nice looking charts. I created a vertical bar chart that GSAP has no problem animating as D3 returns plain SVG. The issue is coming from how these rects are being 'drawn' in. It's from the top. I tried changing the transformOrigin but it doesn't seem to be affecting anything.
  13. You won't regret it. Yeah I kind of figured as much. Doing it in a small container was more about trying to wrap my head around the logic before going to canvas as I'm not super familiar with it. Thank you so much. This is awesome. I'm going to really dig into this because it's such a neat effect. Finally, oof, rookie mistake. I'm so used to using jquery that when I don't use it I make silly mistakes. Thanks for looking out!