<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://gsap.com/blog</id>
    <title>GSAP | Docs &amp; Learning Blog</title>
    <updated>2024-10-15T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://gsap.com/blog"/>
    <subtitle>GSAP | Docs &amp; Learning Blog</subtitle>
    <icon>https://gsap.com/favicon-32x32.png</icon>
    <rights>Copyright © 2024 Greensock</rights>
    <entry>
        <title type="html"><![CDATA[GSAP is Joining Webflow]]></title>
        <id>https://gsap.com/blog/webflow-GSAP</id>
        <link href="https://gsap.com/blog/webflow-GSAP"/>
        <updated>2024-10-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[GSAP joins Webflow to take their animation capabilities to the next level!]]></summary>
        <content type="html"><![CDATA[<div class="alert alert--info"><h3 class="anchor anchorWithStickyNavbar_LWe7" id="we-have-a-big-announcement-to-make-drum-roll-please">We have a big announcement to make! (Drum roll please...)<a href="#we-have-a-big-announcement-to-make-drum-roll-please" class="hash-link" aria-label="Direct link to We have a big announcement to make! (Drum roll please...)" title="Direct link to We have a big announcement to make! (Drum roll please...)">​</a></h3><iframe class="video" src="https://www.youtube.com/embed/fHnszKG6X3A?si=_lZK2AOzE7bA0vav" frameborder="0" allow="autoplay; fullscreen; picture-in-picture" allowfullscreen="" title="Introducing GSAP Installation"></iframe></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="-gsap-has-been-acquired-by-webflow-to-take-their-animation-capabilities-to-the-next-level">🤘 GSAP has been acquired by Webflow to take their animation capabilities to the next level!<a href="#-gsap-has-been-acquired-by-webflow-to-take-their-animation-capabilities-to-the-next-level" class="hash-link" aria-label="Direct link to 🤘 GSAP has been acquired by Webflow to take their animation capabilities to the next level!" title="Direct link to 🤘 GSAP has been acquired by Webflow to take their animation capabilities to the next level!">​</a></h2><p>This is exciting news for the future of GSAP — <strong>for everyone</strong>, but we know that the Webflow folks in particular will be over the moon! It's been a joy to watch our communities grow closer over the last few years — hyping each other up, learning together and producing some of our <a href="https://gsap.com/showcase/?page=1&amp;tags=Webflow" target="_blank" rel="noopener noreferrer">all-time favourite showcase sites.</a></p><p>Of course our animation community extends far beyond Webflow. GSAP's flexibility and rich feature set make it extremely popular across all kinds of ecosystems, tools and frameworks. It powers over 12 million websites (including most award-winning ones). This acquisition puts GSAP in an even stronger position to serve the broader web community because Webflow is investing development resources into GSAP's continued product innovation.</p><div class="alert alert--info"><p><strong>GSAP will continue to be publicly available for everyone to use on the wider web.</strong> Both Webflow and the GSAP team are committed to maintaining and evolving the library, including for use outside of Webflow. We love this community and it’s important to us that GSAP continues to be the go-to toolset for web animators everywhere.</p><p>If you pay for GSAP, we are honoring your current pricing plan and licensing – so just business as usual!</p></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-is-webflow-why-the-acquisition">What is Webflow? Why the acquisition?<a href="#what-is-webflow-why-the-acquisition" class="hash-link" aria-label="Direct link to What is Webflow? Why the acquisition?" title="Direct link to What is Webflow? Why the acquisition?">​</a></h2><p>Webflow is a Website Experience Platform (WXP) with a mission to bring development superpowers to everyone - whether a designer, marketer, developer, or agency. Webflow empowers marketing and engineering teams to visually build, manage, and optimize stunning websites. Go on, <a href="https://webflow.com/" target="_blank" rel="noopener noreferrer">take a look</a>. Their homepage is even animated with GSAP. 💚</p><img loading="lazy" src="/img/logos/old-logo.gif" style="float:left;width:150px;max-width:20vw;padding:1rem" class="img_ev3q"> Anyone that's been using GSAP for a while will know that bringing 'superpowers' to everyone is precisely what we aim to do. Webflow and GSAP have the same heart, taking the complicated and making it simple, helping everyone bring their ideas to life, even people who are just starting with code.<br><br><p>Until now, creating a GSAP GUI was an <em>impossible pipe dream</em> for our small team (despite all the requests for it) but with Webflow's expertise and resources - we're in good hands. The Webflow team has a knack for creating clean easy-to-use interfaces, and we're incredibly excited about combining our expertise to bring something beautiful to life. In short, we're better together.</p><p>We don't know exactly what this will look like yet... but we know it's going to be special.</p><span style="display:inline-block;background-color:#0ae448;width:100%;height:2px;border-radius:5px"></span><br><br><p>We'd love to hear from you about what your hopes are as GSAP joins the Webflow family. What are your ideas? Help us shape the future. <a href="https://gsap.com/community/forums/topic/42693-gsap-is-joining-webflow/" target="_blank" rel="noopener noreferrer">We're listening.</a></p><p>You can read Webflow's post <a href="https://webflow.com/blog/webflow-acquires-gsap" target="_blank" rel="noopener noreferrer">here</a></p><br><br>]]></content>
        <author>
            <name>Cassie Evans</name>
            <uri>https://twitter.com/cassiecodes</uri>
        </author>
        <author>
            <name>Jack Doyle</name>
            <uri>https://twitter.com/greensock</uri>
        </author>
        <category label="blog" term="blog"/>
        <category label="announcement" term="announcement"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[3.12 release]]></title>
        <id>https://gsap.com/blog/3-12</id>
        <link href="https://gsap.com/blog/3-12"/>
        <updated>2023-05-19T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[* Clamp your triggers! - Ever had ScrollTriggered animations at the very top of your page start out partially-scrubbed? Now you can clamp()) them! This handy feature ensures that the start and end positions stay within the bounds of the page and ensures that all your "above the fold" elements start off in their native positions.]]></summary>
        <content type="html"><![CDATA[<div class="table-of-contents"><ul><li><a href="#clamp">Clamp your triggers!</a> - Ever had ScrollTriggered animations at the very top of your page start out partially-scrubbed? Now you can <a href="/docs/v3/GSAP/UtilityMethods/clamp()">clamp()</a> them! This handy feature ensures that the start and end positions stay within the bounds of the page and ensures that all your "above the fold" elements start off in their native positions.</li><li><a href="#clampdata">Clamp data-speed</a> - More clamping! This time for ScrollSmoother, you can now wrap your data-speed value in <a href="/docs/v3/GSAP/UtilityMethods/clamp()">clamp()</a> to make the associated element start out in its natural position if it 's within the viewport at the top of the page.</li><li><a href="#speed">ScrollSmoother speed</a> - Hold onto your hats (or scroll wheels?) We 've added a speed option to ScrollSmoother which you can use to make the page scroll faster or slower.</li></ul></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="clamp-your-triggers">Clamp Your Triggers<a href="#clamp-your-triggers" class="hash-link" aria-label="Direct link to Clamp Your Triggers" title="Direct link to Clamp Your Triggers">​</a></h2><p><img loading="lazy" alt="clamp-img.svg" src="/assets/images/clamp-img-80f39e02f19a51a86bcc618c931c9fff.svg" width="830" height="335" class="img_ev3q"></p><p>It can be frustrating when your "above the fold" scrubbed animations start off part-way through. With <a href="/docs/v3/GSAP/UtilityMethods/clamp()">clamp()</a> you can ensure that they always start out in their native positions, no matter where your triggers are placed.</p><div class="language-js codeBlockContainer_APcc theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#28292b"><div class="codeBlockContent_m3Ux"><pre tabindex="0" class="prism-code language-js codeBlock_qGQc thin-scrollbar"><code class="codeBlockLines_p187"><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token maybe-class-name">ScrollTrigger</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">create</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token literal-property property">trigger</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> elem</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token literal-property property">start</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:#63d55a">"clamp(top bottom)"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// clamped value - will always fall between 0 and the max scroll</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token literal-property property">end</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:#63d55a">"bottom top"</span><span class="token plain"> </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// the parsed pixel value could be negative or more than the max scroll,</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span></span><br></span></code></pre><div class="buttonGroup_6DOT"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_FhaS" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_phi_"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_FfTR"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="so-what-s-going-on-under-the-hood">So what 's going on under the hood?<a href="#so-what-s-going-on-under-the-hood" class="hash-link" aria-label="Direct link to So what 's going on under the hood?" title="Direct link to So what 's going on under the hood?">​</a></h3><p>All scroll triggered animations have trigger points that determine where the animation <a href="/docs/v3/Plugins/ScrollTrigger/start">starts</a> and <a href="/docs/v3/Plugins/ScrollTrigger/end">ends</a>. These values are nice and flexible, you can write them out as a number, as string shorthand or return one of those options from a function.</p><div class="language-js codeBlockContainer_APcc theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#28292b"><div class="codeBlockContent_m3Ux"><pre tabindex="0" class="prism-code language-js codeBlock_qGQc thin-scrollbar"><code class="codeBlockLines_p187"><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token literal-property property">start</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:#63d55a">"bottom 50%+=100px"</span><span class="token plain"> </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// flexible string shorthand</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token literal-property property">start</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">200</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// pixel value</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token function-variable function" style="color:rgb(130, 170, 255)">start</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(137, 221, 255)">=&gt;</span><span class="token plain"> </span><span class="token dom variable" style="color:rgb(191, 199, 213)">window</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token property-access">innerHeight</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">/</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">2</span><span class="token plain"> </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// function that returns a number or string</span></span><br></span></code></pre><div class="buttonGroup_6DOT"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_FhaS" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_phi_"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_FfTR"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>However you write it out, <strong>ScrollTrigger converts these values into a numeric scroll positions.</strong></p><p>If you set up your start marker above the fold, the start position will be <strong><em>negative</em></strong> and the animation will start off partway through. Sometimes this is desired behaviour but it can also be a bit awkward and unexpected.</p><p>The new clamp feature allows us to prevent these trigger  'leaks '. We can tell ScrollTrigger to always keep the trigger value between 0 (the top of the page) and the maximum scroll position.<br>
<!-- -->Check out this demo and pop open the console to see the differing values. <!-- -->👀</p><div class="codepen--loading"><h4>loading...</h4><iframe height="400" style="width:100%" title="GSAP Basic Tween" src="https://codepen.io/GreenSock/embed/wvYQJBE?default-tab=result&amp;theme-id=41164" frameborder="no" allowtransparency="true" allowfullscreen=""></iframe></div><p>On load you can see that the un-clamped animation starts part-way through. If you scroll down to the bottom you 'll notice that it also doesn 't complete as the <strong>end marker is further down than the maximum possible scroll distance.</strong></p><p>If you want to know what 's happening under the hood check out the docs on <a href="/docs/v3/GSAP/UtilityMethods/clamp()">clamp</a>. Wrapping the trigger in "<a href="/docs/v3/GSAP/UtilityMethods/clamp()">clamp()</a>" is just like telling ScrollTrigger to run the parsed trigger position through the following util -</p><div class="language-js codeBlockContainer_APcc theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#28292b"><div class="codeBlockContent_m3Ux"><pre tabindex="0" class="prism-code language-js codeBlock_qGQc thin-scrollbar"><code class="codeBlockLines_p187"><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">gsap</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token property-access">utils</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">clamp</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token number" style="color:rgb(247, 140, 108)">0</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> maxScroll</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> triggerPosition</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span></span><br></span></code></pre><div class="buttonGroup_6DOT"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_FhaS" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_phi_"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_FfTR"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="clamp-data-speed">Clamp data-speed<a href="#clamp-data-speed" class="hash-link" aria-label="Direct link to Clamp data-speed" title="Direct link to Clamp data-speed">​</a></h2><p>You can also use the new clamp feature over in ScrollSmoother-land. Now, when you apply data-speed to "above-the-fold" elements, they 'll start <strong><em>exactly</em></strong> where you placed them in your design, unaffected by their speed value. No more unexpected offsets! Check it out...  </p><div class="codepen--loading"><h4>loading...</h4><iframe height="400" style="width:100%" title="GSAP Basic Tween" src="https://codepen.io/GreenSock/embed/gOBedNX?default-tab=result&amp;theme-id=41164" frameborder="no" allowtransparency="true" allowfullscreen=""></iframe></div><div class="theme-admonition theme-admonition-info alert alert--info admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>Video Walkthrough</div><div class="admonitionContent_S0QG"><p>Still a bit confused about when and why this is useful? We 've got you - Cassie breaks it down in this new feature video</p><iframe allow="autoplay; fullscreen" frameborder="0" src="https://player.vimeo.com/video/828003354?h=d064c7b934&amp;badge=0&amp;autopause=0&amp;player_id=0&amp;app_id=58479" class="fr-draggable video"></iframe></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="new-speed-option-for-scrollsmoother">New speed option for ScrollSmoother<a href="#new-speed-option-for-scrollsmoother" class="hash-link" aria-label="Direct link to New speed option for ScrollSmoother" title="Direct link to New speed option for ScrollSmoother">​</a></h2><div class="language-js codeBlockContainer_APcc theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#28292b"><div class="codeBlockContent_m3Ux"><pre tabindex="0" class="prism-code language-js codeBlock_qGQc thin-scrollbar"><code class="codeBlockLines_p187"><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token maybe-class-name">ScrollSmoother</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">create</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token literal-property property">smooth</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">2</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token literal-property property">effects</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">true</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token literal-property property">speed</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">1.5</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// 1.5x the normal speed</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span></span><br></span></code></pre><div class="buttonGroup_6DOT"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_FhaS" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_phi_"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_FfTR"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Now you have the power to control your scroll speed with a simple multiplier. Want things to move faster? Set it to 2 and watch your content zoom past twice as fast! Prefer a leisurely pace? Set it to 0.5 for a leisurely scroll at half the speed.</p><div class="codepen--loading"><h4>loading...</h4><iframe height="500" style="width:100%" title="GSAP Basic Tween" src="https://codepen.io/GreenSock/embed/BaqMgoy?default-tab=result&amp;theme-id=41164" frameborder="no" allowtransparency="true" allowfullscreen=""></iframe></div><div class="theme-admonition theme-admonition-tip alert alert--success admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_S0QG"><p>GSAP 3.12 delivers various bug fixes, so we 'd highly recommend <a href="/docs/v3/Installation">installing the latest version today</a>. There are many ways to get GSAP - see the <a href="/docs/v3/Installation">Installation page</a> for all the options (download, NPM, zip, Github, etc.).</p></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="resources">Resources<a href="#resources" class="hash-link" aria-label="Direct link to Resources" title="Direct link to Resources">​</a></h2><div class="list"><ul><li><a href="https://github.com/greensock/GSAP/releases/tag/3.12.0" target="_blank" rel="noopener noreferrer">Full release notes on Github</a></li><li><a href="/docs/v3/">Full documentation</a></li><li><a href="/resources/get-started">Getting started with GSAP</a></li><li><a href="/resources">Learning resources</a></li><li><a href="https://gsap.com/community/" target="_blank" rel="noopener noreferrer">Community forums</a></li></ul></div><h4 class="anchor anchorWithStickyNavbar_LWe7" id="happy-tweening">Happy tweening!<a href="#happy-tweening" class="hash-link" aria-label="Direct link to Happy tweening!" title="Direct link to Happy tweening!">​</a></h4>]]></content>
        <author>
            <name>Cassie Evans</name>
            <uri>https://twitter.com/cassiecodes</uri>
        </author>
        <author>
            <name>Jack Doyle</name>
            <uri>https://twitter.com/greensock</uri>
        </author>
        <category label="release" term="release"/>
        <category label="ScrollTrigger" term="ScrollTrigger"/>
        <category label="ScrollSmoother" term="ScrollSmoother"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[3.11 release]]></title>
        <id>https://gsap.com/blog/3-11</id>
        <link href="https://gsap.com/blog/3-11"/>
        <updated>2022-08-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[gsap.matchMedia() is a game-changer* for responsive, accessible-friendly animations.]]></summary>
        <content type="html"><![CDATA[<div class="table-of-contents"><ul><li><a href="#matchmedia">gsap.matchMedia()</a> is a <strong>game-changer</strong> for responsive, accessible-friendly animations.</li><li><a href="#context">gsap.context()</a> that greatly simplifies setup and reverting of a bunch of animations/ScrollTriggers, especially for React developers!</li><li>You can now <a href="#revert">revert()</a> any animation to return the targets to their original state.</li><li>Set <a href="#lockAxis">lockAxis: true</a> on an Observer to make it lock into whichever direction the user first drags</li></ul></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="responsive-accessibility-friendly-animations-with-gsapmatchmedia">Responsive, accessibility-friendly animations with gsap.matchMedia()<a href="#responsive-accessibility-friendly-animations-with-gsapmatchmedia" class="hash-link" aria-label="Direct link to Responsive, accessibility-friendly animations with gsap.matchMedia()" title="Direct link to Responsive, accessibility-friendly animations with gsap.matchMedia()">​</a></h2><p>One of the hardest challenges for web-animators is crafting animations that work seamlessly on all screen sizes <strong><em>and  </em></strong>respect users  <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-reduced-motion" target="_blank" rel="noopener noreferrer">motion preferences</a>. Well, not anymore!</p><p><a href="/docs/v3/GSAP/gsap.matchMedia()">gsap.matchMedia()</a> lets you easily tuck setup code into a function that <strong><em>only</em></strong> executes when a particular <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Media_Queries/Using_media_queries" target="_blank" rel="noopener noreferrer">media query</a> matches and then when it no longer matches, all the GSAP animations and <a href="/docs/v3/Plugins/ScrollTrigger">ScrollTriggers</a> created during that function 's execution get <strong>reverted automatically</strong>! Customizing for mobile/desktop or <code>prefers-reduced-motion</code>  is remarkably simple and incredibly flexible.</p><div class="theme-admonition theme-admonition-info alert alert--info admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>Video Walkthrough</div><div class="admonitionContent_S0QG"><iframe allow="autoplay; fullscreen" frameborder="0" src="https://player.vimeo.com/video/739773785?h=defaf9b377" class="fr-draggable video"></iframe></div></div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="basic-syntax">Basic syntax<a href="#basic-syntax" class="hash-link" aria-label="Direct link to Basic syntax" title="Direct link to Basic syntax">​</a></h3><div class="language-js codeBlockContainer_APcc theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#28292b"><div class="codeBlockContent_m3Ux"><pre tabindex="0" class="prism-code language-js codeBlock_qGQc thin-scrollbar"><code class="codeBlockLines_p187"><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token comment" style="color:#9c9c9c;font-style:italic">// create</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="font-style:italic">let</span><span class="token plain"> mm </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> gsap</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">matchMedia</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#9c9c9c;font-style:italic">// add a media query. When it matches, the associated function will run</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">mm</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">add</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:#63d55a">"(min-width: 800px)"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(137, 221, 255)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// this setup code only runs when viewport is at least 800px wide</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  gsap</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">to</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token spread operator" style="color:rgb(137, 221, 255)">...</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  gsap</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token keyword module" style="font-style:italic">from</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token spread operator" style="color:rgb(137, 221, 255)">...</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token maybe-class-name">ScrollTrigger</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">create</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token spread operator" style="color:rgb(137, 221, 255)">...</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"> </span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword control-flow" style="font-style:italic">return</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(137, 221, 255)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"> </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// optional</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// custom cleanup code here (runs when it STOPS matching)</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#9c9c9c;font-style:italic">// later, if we need to revert all the animations/ScrollTriggers...</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">mm</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">revert</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span></span><br></span></code></pre><div class="buttonGroup_6DOT"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_FhaS" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_phi_"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_FfTR"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="conditions-syntax-----powerful-">Conditions syntax - <!-- -->💪<!-- -->  POWERFUL <!-- -->💪<a href="#conditions-syntax-----powerful-" class="hash-link" aria-label="Direct link to conditions-syntax-----powerful-" title="Direct link to conditions-syntax-----powerful-">​</a></h2><p>What if your setup code for various media queries is mostly identical but a few key values are different? If you <code>add()</code> each media query individually, you may end up with a lot of <strong>redundant code</strong>. Just use the conditions syntax! Instead of a string for the first parameter, use an <strong>object with arbitrarily-named conditions</strong> and then the function will get called when <strong>any</strong> of those conditions match and you can check each condition as a boolean (matching or not). The conditions object could look like this:</p><div class="language-js codeBlockContainer_APcc theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#28292b"><div class="codeBlockContent_m3Ux"><pre tabindex="0" class="prism-code language-js codeBlock_qGQc thin-scrollbar"><code class="codeBlockLines_p187"><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token literal-property property">isDesktop</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:#63d55a">"(min-width: 800px)"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token literal-property property">isMobile</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:#63d55a">"(max-width: 799px)"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token literal-property property">reduceMotion</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:#63d55a">"(prefers-reduced-motion: reduce)"</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span></span><br></span></code></pre><div class="buttonGroup_6DOT"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_FhaS" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_phi_"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_FfTR"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Name your conditions whatever you want.</p><p>Below we 'll set the breakpoint at 800px wide and honor the user 's <code>prefers-reduced-motion</code> preference, leveraging the same setup code and using conditional logic where necessary:</p><div class="language-js codeBlockContainer_APcc theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#28292b"><div class="codeBlockContent_m3Ux"><pre tabindex="0" class="prism-code language-js codeBlock_qGQc thin-scrollbar"><code class="codeBlockLines_p187"><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token keyword" style="font-style:italic">let</span><span class="token plain"> mm </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> gsap</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">matchMedia</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">    breakPoint </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">800</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">mm</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">add</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// set up any number of arbitrarily-named conditions. The function below will be called when ANY of them match.</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token literal-property property">isDesktop</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:#63d55a">`</span><span class="token template-string string" style="color:#63d55a">(min-width: </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(199, 146, 234)">${</span><span class="token template-string interpolation">breakPoint</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token template-string string" style="color:#63d55a">px)</span><span class="token template-string template-punctuation string" style="color:#63d55a">`</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token literal-property property">isMobile</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:#63d55a">`</span><span class="token template-string string" style="color:#63d55a">(max-width: </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(199, 146, 234)">${</span><span class="token template-string interpolation">breakPoint </span><span class="token template-string interpolation operator" style="color:rgb(137, 221, 255)">-</span><span class="token template-string interpolation"> </span><span class="token template-string interpolation number" style="color:rgb(247, 140, 108)">1</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token template-string string" style="color:#63d55a">px)</span><span class="token template-string template-punctuation string" style="color:#63d55a">`</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token literal-property property">reduceMotion</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:#63d55a">"(prefers-reduced-motion: reduce)"</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token parameter">context</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(137, 221, 255)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// context.conditions has a boolean property for each condition defined above indicating if it 's matched or not.</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="font-style:italic">let</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"> isDesktop</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> isMobile</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> reduceMotion </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> context</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token property-access">conditions</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  gsap</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">to</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:#63d55a">".box"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token literal-property property">rotation</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> isDesktop </span><span class="token operator" style="color:rgb(137, 221, 255)">?</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">360</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">180</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// spin further if desktop</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token literal-property property">duration</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> reduceMotion </span><span class="token operator" style="color:rgb(137, 221, 255)">?</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">0</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">2</span><span class="token plain"> </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// skip to the end if prefers-reduced-motion</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword control-flow" style="font-style:italic">return</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(137, 221, 255)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"> </span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// optionally return a cleanup function that will be called when none of the conditions match anymore (after having matched)</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"> </span></span><br></span></code></pre><div class="buttonGroup_6DOT"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_FhaS" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_phi_"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_FfTR"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Nice and concise!</p><div class="codepen--loading"><h4>loading...</h4><iframe height="500" style="width:100%" title="GSAP Basic Tween" src="https://codepen.io/GreenSock/embed/KKoMpMv?default-tab=result&amp;theme-id=41164" frameborder="no" allowtransparency="true" allowfullscreen=""></iframe></div><p>You can set a scope so that all selector text inside the function maps only to descendants of a particular element or React Ref or Angular ElementRef. This can greatly simplify your code. See the <a href="/docs/v3/GSAP/gsap.matchMedia()">full documentation</a> for all the details.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="gsapcontext">gsap.context()<a href="#gsapcontext" class="hash-link" aria-label="Direct link to gsap.context()" title="Direct link to gsap.context()">​</a></h2><div class="theme-admonition theme-admonition-info alert alert--info admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>Video Walkthrough</div><div class="admonitionContent_S0QG"><iframe allow="autoplay; fullscreen" frameborder="0" src="https://player.vimeo.com/video/745111156?h=775e3579a1&amp;badge=0&amp;autopause=0&amp;player_id=0&amp;app_id=58479" class="fr-draggable video"></iframe></div></div><p>A <a href="/docs/v3/GSAP/gsap.context()">gsap.context()</a> offers two key benefits:</p><ul><li><strong>Collects all GSAP animations and <a href="/docs/v3/Plugins/ScrollTrigger">ScrollTriggers</a></strong> that are created within the supplied function so that you can easily <code>revert()</code> or <code>kill()</code><strong>ALL</strong> of them at once. No need to keep track of a bunch of variables, Arrays, etc. This is particularly useful in React modules or anywhere you need to be able to "clean up" by reverting elements to their original state.</li><li>[<!-- -->optionally<!-- -->]<!-- --> <strong>Scopes all selector text to a particular Element or Ref</strong>. This can help simplify your code quite a bit and avoid needing to create lots of <a href="https://reactjs.org/docs/refs-and-the-dom.html" target="_blank" rel="noopener noreferrer">Refs</a> in React/Angular. Any GSAP-related selector text inside the supplied function will only apply to descendants of the Element/Ref.</li></ul><p>Let 's say you 've got a <strong>big</strong> block of GSAP code that 's creating a bunch of different animations and you need to be able to <code>revert()</code> them all...</p><div class="language-js codeBlockContainer_APcc theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#28292b"><div class="codeBlockContent_m3Ux"><pre tabindex="0" class="prism-code language-js codeBlock_qGQc thin-scrollbar"><code class="codeBlockLines_p187"><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token keyword" style="font-style:italic">let</span><span class="token plain"> ctx </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> gsap</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">context</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(137, 221, 255)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"> gsap</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">to</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token spread operator" style="color:rgb(137, 221, 255)">...</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"> gsap</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token keyword module" style="font-style:italic">from</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token spread operator" style="color:rgb(137, 221, 255)">...</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"> gsap</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">timeline</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">to</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token spread operator" style="color:rgb(137, 221, 255)">...</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">to</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token spread operator" style="color:rgb(137, 221, 255)">...</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"> </span><span class="token spread operator" style="color:rgb(137, 221, 255)">...</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#9c9c9c;font-style:italic">// then later...</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">ctx</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">revert</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"> </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// BOOM! Every GSAP animation created in that function gets reverted!</span></span><br></span></code></pre><div class="buttonGroup_6DOT"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_FhaS" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_phi_"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_FfTR"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>This is effectively a silver bullet for the React 18 <a href="https://gsap.com/community/topic/31712-simple-opacity-fade-doesnt-work-in-react" target="_blank" rel="noopener noreferrer">"double-call of useEffect() in Strict Mode"</a> issue that normally breaks <code>from()</code> logic - just call <code>revert()</code> on the Context in your <code>useEffect()</code> cleanup function:</p><div class="codepen--loading"><h4>loading...</h4><iframe height="500" style="width:100%" title="GSAP Basic Tween" src="https://codepen.io/GreenSock/embed/xxWRjyq?default-tab=result&amp;theme-id=41164" frameborder="no" allowtransparency="true" allowfullscreen=""></iframe></div><p>See the <a href="/docs/v3/GSAP/gsap.context()">full documentation</a> for all the details.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="revert-any-animation">revert() any animation<a href="#revert-any-animation" class="hash-link" aria-label="Direct link to revert() any animation" title="Direct link to revert() any animation">​</a></h2><p>What if you want to revert an element back to its state <strong>BEFORE</strong> it was animated? You could just <code>animation.progress(0)</code>, right? <em>Sort of</em>. Consider this element:</p><div class="language-js codeBlockContainer_APcc theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#28292b"><div class="codeBlockContent_m3Ux"><pre tabindex="0" class="prism-code language-js codeBlock_qGQc thin-scrollbar"><code class="codeBlockLines_p187"><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token operator" style="color:rgb(137, 221, 255)">&lt;</span><span class="token plain">div </span><span class="token keyword" style="font-style:italic">class</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token string" style="color:#63d55a">"box"</span><span class="token operator" style="color:rgb(137, 221, 255)">&gt;</span><span class="token operator" style="color:rgb(137, 221, 255)">&lt;</span><span class="token operator" style="color:rgb(137, 221, 255)">/</span><span class="token plain">div</span><span class="token operator" style="color:rgb(137, 221, 255)">&gt;</span></span><br></span></code></pre><div class="buttonGroup_6DOT"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_FhaS" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_phi_"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_FfTR"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p><strong>No inline styles at all</strong>. The opacity is 1 (the default) and then you do this:  </p><div class="language-js codeBlockContainer_APcc theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#28292b"><div class="codeBlockContent_m3Ux"><pre tabindex="0" class="prism-code language-js codeBlock_qGQc thin-scrollbar"><code class="codeBlockLines_p187"><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token comment" style="color:#9c9c9c;font-style:italic">// fade out</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="font-style:italic">let</span><span class="token plain"> tween </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> gsap</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">to</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:#63d55a">".box"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token literal-property property">opacity</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">0</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span></span><br></span></code></pre><div class="buttonGroup_6DOT"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_FhaS" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_phi_"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_FfTR"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Now let 's try getting back to the original state:</p><div class="language-js codeBlockContainer_APcc theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#28292b"><div class="codeBlockContent_m3Ux"><pre tabindex="0" class="prism-code language-js codeBlock_qGQc thin-scrollbar"><code class="codeBlockLines_p187"><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">tween</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">progress</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token number" style="color:rgb(247, 140, 108)">0</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">pause</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span></span><br></span></code></pre><div class="buttonGroup_6DOT"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_FhaS" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_phi_"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_FfTR"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>That does indeed set it back to the starting values that GSAP parsed from the computed style:</p><div class="language-js codeBlockContainer_APcc theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#28292b"><div class="codeBlockContent_m3Ux"><pre tabindex="0" class="prism-code language-js codeBlock_qGQc thin-scrollbar"><code class="codeBlockLines_p187"><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token operator" style="color:rgb(137, 221, 255)">&lt;</span><span class="token operator" style="color:rgb(137, 221, 255)">!</span><span class="token operator" style="color:rgb(137, 221, 255)">--</span><span class="token plain"> inline style is still present </span><span class="token operator" style="color:rgb(137, 221, 255)">--</span><span class="token operator" style="color:rgb(137, 221, 255)">&gt;</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token operator" style="color:rgb(137, 221, 255)">&lt;</span><span class="token plain">div </span><span class="token keyword" style="font-style:italic">class</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token string" style="color:#63d55a">"box"</span><span class="token plain"> style</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token string" style="color:#63d55a">"opacity: 1"</span><span class="token operator" style="color:rgb(137, 221, 255)">&gt;</span><span class="token operator" style="color:rgb(137, 221, 255)">&lt;</span><span class="token operator" style="color:rgb(137, 221, 255)">/</span><span class="token plain">div</span><span class="token operator" style="color:rgb(137, 221, 255)">&gt;</span><span class="token plain"> </span></span><br></span></code></pre><div class="buttonGroup_6DOT"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_FhaS" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_phi_"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_FfTR"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>But that means <strong>it</strong> <strong>still has inline styles</strong>. Usually that doesn 't matter, but perhaps a media query  CSS rule sets opacity to 0.5 on that element. Doh! The inline style will overrule the class rule. So we need a way to have a tween/timeline keep track of the original inline styles and <strong>REMOVE</strong> the ones that it added. That requires a new method because <code>progress(0)</code> <em>SHOULD</em> set inline styles to ensure the state is what it 's supposed to be at that point in the animation.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="solution-animationrevert">Solution: animation.revert()<a href="#solution-animationrevert" class="hash-link" aria-label="Direct link to Solution: animation.revert()" title="Direct link to Solution: animation.revert()">​</a></h3><p>GSAP 3.11 adds a new <code>.revert()</code> method to all Tweens and Timelines, so it 's as simple as:  </p><div class="language-js codeBlockContainer_APcc theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#28292b"><div class="codeBlockContent_m3Ux"><pre tabindex="0" class="prism-code language-js codeBlock_qGQc thin-scrollbar"><code class="codeBlockLines_p187"><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">animation</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">revert</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"> </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// removes inline styles that were added by the animation</span></span><br></span></code></pre><div class="buttonGroup_6DOT"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_FhaS" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_phi_"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_FfTR"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="observer-gets-lockaxis-feature">Observer gets lockAxis feature<a href="#observer-gets-lockaxis-feature" class="hash-link" aria-label="Direct link to Observer gets lockAxis feature" title="Direct link to Observer gets lockAxis feature">​</a></h2><p>Set <code>lockAxis: true</code> on an Observer and it 'll watch the direction of the very first drag move (with type: "pointer" and/or "touch") and lock into that direction until the user releases the pointer/touch. There 's even an <code>onLockAxis()</code> callback that you can tie into.</p><div class="codepen--loading"><h4>loading...</h4><iframe height="500" style="width:100%" title="GSAP Basic Tween" src="https://codepen.io/GreenSock/embed/BarGQgw?default-tab=result&amp;theme-id=41164" frameborder="no" allowtransparency="true" allowfullscreen=""></iframe></div><h4 class="anchor anchorWithStickyNavbar_LWe7" id="and-more">And more...<a href="#and-more" class="hash-link" aria-label="Direct link to And more..." title="Direct link to And more...">​</a></h4><div class="theme-admonition theme-admonition-tip alert alert--success admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_S0QG"><p>GSAP 3.11 also delivers various bug fixes, so we 'd highly recommend  <a href="/docs/v3/Installation">installing the latest version today</a>. There are many ways to get GSAP - see the  <a href="/docs/v3/Installation">Installation page</a>  for all the options (download, NPM, zip, Github, etc.).</p></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="resources">Resources<a href="#resources" class="hash-link" aria-label="Direct link to Resources" title="Direct link to Resources">​</a></h2><div class="list"><ul><li><a href="https://github.com/greensock/GSAP/releases/tag/3.11.0" target="_blank" rel="noopener noreferrer">Full release notes on Github</a></li><li><a href="/docs/v3/">Full documentation</a></li><li><a href="/resources/get-started">Getting started with GSAP</a></li><li><a href="/resources">Learning resources</a></li><li><a href="https://gsap.com/community/" target="_blank" rel="noopener noreferrer">Community forums</a></li></ul></div><h4 class="anchor anchorWithStickyNavbar_LWe7" id="happy-tweening">Happy tweening!<a href="#happy-tweening" class="hash-link" aria-label="Direct link to Happy tweening!" title="Direct link to Happy tweening!">​</a></h4>]]></content>
        <author>
            <name>Cassie Evans</name>
            <uri>https://twitter.com/cassiecodes</uri>
        </author>
        <author>
            <name>Jack Doyle</name>
            <uri>https://twitter.com/greensock</uri>
        </author>
        <category label="release" term="release"/>
        <category label="matchMedia" term="matchMedia"/>
        <category label="context" term="context"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[3.10 release]]></title>
        <id>https://gsap.com/blog/3-10</id>
        <link href="https://gsap.com/blog/3-10"/>
        <updated>2022-03-31T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[* ScrollSmoother plugin for delicious, buttery-smooth scrolling that leverages native scroll. &#x1F49A;]]></summary>
        <content type="html"><![CDATA[<div class="table-of-contents"><ul><li><a href="#ScrollSmoother">ScrollSmoother plugin</a> for delicious, buttery-smooth scrolling that leverages native scroll. <!-- -->💚</li><li><a href="#observer">Observer plugin</a> that greatly simplifies setup for reacting to various events across devices.</li><li><a href="#quickTo">gsap.quickTo()</a> for frequent redirection to new values like mouse followers</li><li><a href="#normalizeScroll">ScrollTrigger.normalizeScroll()</a> solves a bunch of scroll-related annoyances across devices and browsers.</li><li><a href="#relative">"<!-- -->*<!-- -->=" and "/=" relative prefixes</a> - multiply or divide the current value.</li></ul></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="introducing-scrollsmoother">Introducing ScrollSmoother.<!-- -->🥳<a href="#introducing-scrollsmoother" class="hash-link" aria-label="Direct link to introducing-scrollsmoother" title="Direct link to introducing-scrollsmoother">​</a></h2><p>A shiny new plugin,<strong><em> exclusively</em></strong> for <a href="https://gsap.com/pricing/" target="_blank" rel="noopener noreferrer">Club GSAP</a> members!</p><p><a href="/docs/v3/Plugins/ScrollSmoother">ScrollSmoother</a> makes it simple to add a buttery smooth vertical scrolling effect to your ScrollTrigger pages. Under the hood, ScrollSmoother leverages <strong>native </strong>scrolling which allows it to sidestep many of the accessibility annoyances that plague smooth-scrolling sites. No fake scrollbars, and no messing with pointer or touch functionality. </p><div class="codepen--loading"><h4>loading...</h4><iframe height="600" style="width:100%" title="GSAP Basic Tween" src="https://codepen.io/GreenSock/embed/bGaWjpw?default-tab=result&amp;theme-id=41164" frameborder="no" allowtransparency="true" allowfullscreen=""></iframe></div><div class="language-js codeBlockContainer_APcc theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#28292b"><div class="codeBlockContent_m3Ux"><pre tabindex="0" class="prism-code language-js codeBlock_qGQc thin-scrollbar"><code class="codeBlockLines_p187"><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token maybe-class-name">ScrollSmoother</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">create</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token literal-property property">content</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:#63d55a">"#smooth-content"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token literal-property property">wrapper</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:#63d55a">"#smooth-wrapper"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token literal-property property">smooth</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// how long (in seconds) it takes to "catch up" to the native scroll position</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token literal-property property">effects</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">true</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// looks for data-speed and data-lag attributes on elements</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token literal-property property">normalizeScroll</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">true</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// prevents address bar from showing/hiding on most devices, solves various other browser inconsistencies</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token literal-property property">ignoreMobileResize</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">true</span><span class="token plain"> </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// skips ScrollTrigger.refresh() on mobile resizes from address bar showing/hiding</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span></span><br></span></code></pre><div class="buttonGroup_6DOT"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_FhaS" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_phi_"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_FfTR"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="effects">Effects...<a href="#effects" class="hash-link" aria-label="Direct link to Effects..." title="Direct link to Effects...">​</a></h2><p>ScrollSmoother will integrate seamlessly with <strong>all</strong> your scroll-triggered animations. but we've also added some bonus ScrollSmoother effects.  <!-- -->✨</p><ul><li><strong>speed -</strong>Great for <strong>parallax</strong> effects! It adjusts the speed at which an element moves vertically while scrolling through the viewport. A speed of 1 is normal speed, 2 is double speed, etc.</li><li><strong>lag -</strong>Add some lag<!-- -->*<!-- --> to gently flow elements behind the scroll before they ease back to their natural scroll position. </li></ul><p>*<!-- --> no seriously, trust us. It's the <strong><em>good</em></strong> kind of lag.</p><div class="language-js codeBlockContainer_APcc theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#28292b"><div class="codeBlockContent_m3Ux"><pre tabindex="0" class="prism-code language-js codeBlock_qGQc thin-scrollbar"><code class="codeBlockLines_p187"><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token operator" style="color:rgb(137, 221, 255)">&lt;</span><span class="token plain">div data</span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token plain">speed</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token string" style="color:#63d55a">"0.5"</span><span class="token operator" style="color:rgb(137, 221, 255)">&gt;</span><span class="token operator" style="color:rgb(137, 221, 255)">&lt;</span><span class="token operator" style="color:rgb(137, 221, 255)">/</span><span class="token plain">div</span><span class="token operator" style="color:rgb(137, 221, 255)">&gt;</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">&lt;</span><span class="token operator" style="color:rgb(137, 221, 255)">!</span><span class="token operator" style="color:rgb(137, 221, 255)">--</span><span class="token plain"> half</span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token plain">speed </span><span class="token keyword" style="font-style:italic">of</span><span class="token plain"> scroll </span><span class="token operator" style="color:rgb(137, 221, 255)">--</span><span class="token operator" style="color:rgb(137, 221, 255)">&gt;</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token operator" style="color:rgb(137, 221, 255)">&lt;</span><span class="token plain">div data</span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token plain">speed</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token string" style="color:#63d55a">"2"</span><span class="token operator" style="color:rgb(137, 221, 255)">&gt;</span><span class="token operator" style="color:rgb(137, 221, 255)">&lt;</span><span class="token operator" style="color:rgb(137, 221, 255)">/</span><span class="token plain">div</span><span class="token operator" style="color:rgb(137, 221, 255)">&gt;</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">&lt;</span><span class="token operator" style="color:rgb(137, 221, 255)">!</span><span class="token operator" style="color:rgb(137, 221, 255)">--</span><span class="token plain"> double</span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token plain">speed </span><span class="token keyword" style="font-style:italic">of</span><span class="token plain"> scroll </span><span class="token operator" style="color:rgb(137, 221, 255)">--</span><span class="token operator" style="color:rgb(137, 221, 255)">&gt;</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token operator" style="color:rgb(137, 221, 255)">&lt;</span><span class="token plain">div data</span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token plain">speed</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token string" style="color:#63d55a">"1"</span><span class="token operator" style="color:rgb(137, 221, 255)">&gt;</span><span class="token operator" style="color:rgb(137, 221, 255)">&lt;</span><span class="token operator" style="color:rgb(137, 221, 255)">/</span><span class="token plain">div</span><span class="token operator" style="color:rgb(137, 221, 255)">&gt;</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">&lt;</span><span class="token operator" style="color:rgb(137, 221, 255)">!</span><span class="token operator" style="color:rgb(137, 221, 255)">--</span><span class="token plain"> normal speed </span><span class="token keyword" style="font-style:italic">of</span><span class="token plain"> scroll </span><span class="token operator" style="color:rgb(137, 221, 255)">--</span><span class="token operator" style="color:rgb(137, 221, 255)">&gt;</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token operator" style="color:rgb(137, 221, 255)">&lt;</span><span class="token plain">div data</span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token plain">lag</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token string" style="color:#63d55a">"0.5"</span><span class="token operator" style="color:rgb(137, 221, 255)">&gt;</span><span class="token operator" style="color:rgb(137, 221, 255)">&lt;</span><span class="token operator" style="color:rgb(137, 221, 255)">/</span><span class="token plain">div</span><span class="token operator" style="color:rgb(137, 221, 255)">&gt;</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">&lt;</span><span class="token operator" style="color:rgb(137, 221, 255)">!</span><span class="token operator" style="color:rgb(137, 221, 255)">--</span><span class="token plain"> takes </span><span class="token number" style="color:rgb(247, 140, 108)">0.5</span><span class="token plain"> seconds to </span><span class="token string" style="color:#63d55a">"catch up"</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">--</span><span class="token operator" style="color:rgb(137, 221, 255)">&gt;</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token operator" style="color:rgb(137, 221, 255)">&lt;</span><span class="token plain">div data</span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token plain">lag</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token string" style="color:#63d55a">"0.8"</span><span class="token operator" style="color:rgb(137, 221, 255)">&gt;</span><span class="token operator" style="color:rgb(137, 221, 255)">&lt;</span><span class="token operator" style="color:rgb(137, 221, 255)">/</span><span class="token plain">div</span><span class="token operator" style="color:rgb(137, 221, 255)">&gt;</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">&lt;</span><span class="token operator" style="color:rgb(137, 221, 255)">!</span><span class="token operator" style="color:rgb(137, 221, 255)">--</span><span class="token plain"> takes </span><span class="token number" style="color:rgb(247, 140, 108)">0.8</span><span class="token plain"> seconds to </span><span class="token string" style="color:#63d55a">"catch up"</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">--</span><span class="token operator" style="color:rgb(137, 221, 255)">&gt;</span></span><br></span></code></pre><div class="buttonGroup_6DOT"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_FhaS" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_phi_"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_FfTR"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><div class="theme-admonition theme-admonition-info alert alert--info admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>Video Explainer</div><div class="admonitionContent_S0QG"><p><a href="/docs/v3/Plugins/ScrollSmoother">Read the docs</a> for all the juicy details, or pull up a seat and watch this short explainer video.</p><iframe allow="autoplay; fullscreen" frameborder="0" src="https://player.vimeo.com/video/692867683?h=cfb2217bf1" class="fr-draggable video"></iframe></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="observer">Observer<a href="#observer" class="hash-link" aria-label="Direct link to Observer" title="Direct link to Observer">​</a></h2><p>The brand new 3.5kb <a href="/docs/v3/Plugins/Observer">Observer plugin</a> offers a super-flexible, unified way to sense meaningful events across all (touch/mouse/pointer) devices without wrestling with all the implementation details. Perhaps you want to respond to "scroll-like" user behavior which could be a mouse wheel spin, finger swipe on a touch device, a scrollbar drag, or a pointer press &amp; drag...and of course you need directional data and velocity. No problem! Tell Observer which event types to watch (wheel, touch, pointer, and/or scroll) and it will collect delta values over the course of each requestAnimationFrame tick (debounced for performance by default) and automatically determine the biggest delta and then trigger the appropriate callback(s) like <code>onUp</code>, <code>onDown</code>, <code>onDrag</code>, etc. </p><p>Look how easy it is to trigger next()/previous() functions based on when the user swipes up/down or uses their mouse wheel:</p><div class="language-js codeBlockContainer_APcc theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#28292b"><div class="codeBlockContent_m3Ux"><pre tabindex="0" class="prism-code language-js codeBlock_qGQc thin-scrollbar"><code class="codeBlockLines_p187"><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token maybe-class-name">Observer</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">create</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token literal-property property">target</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token dom variable" style="color:rgb(191, 199, 213)">window</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain">         </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// can be any element (selector text is fine)</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token literal-property property">type</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:#63d55a">"wheel,touch"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain">    </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// comma-delimited list of what to listen for ("wheel,touch,scroll,pointer")</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token function-variable function" style="color:rgb(130, 170, 255)">onUp</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(137, 221, 255)">=&gt;</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">previous</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token function-variable function" style="color:rgb(130, 170, 255)">onDown</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(137, 221, 255)">=&gt;</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">next</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span></span><br></span></code></pre><div class="buttonGroup_6DOT"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_FhaS" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_phi_"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_FfTR"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="demo">Demo<a href="#demo" class="hash-link" aria-label="Direct link to Demo" title="Direct link to Demo">​</a></h2><p>Notice there's no actual scrolling in the demo below but you can use your mouse wheel (or swipe on touch devices) to initiate movement so it "feels" like a scroll:</p><div class="codepen--loading"><h4>loading...</h4><iframe height="400" style="width:100%" title="GSAP Basic Tween" src="https://codepen.io/GreenSock/embed/875422646f9f12b202cb5037f5cf4b19?default-tab=result&amp;theme-id=41164" frameborder="no" allowtransparency="true" allowfullscreen=""></iframe></div><p>Since ScrollTrigger leverages Observer internally for normalizeScroll(), we exposed it via <a href="/docs/v3/Plugins/ScrollTrigger/static.observe()/">ScrollTrigger.observe()</a> so you don't have to load an extra file if you're already using ScrollTrigger. </p><div class="theme-admonition theme-admonition-info alert alert--info admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>Video Walkthorugh</div><div class="admonitionContent_S0QG"><p>Excited? Why don't you <strong><em>observe</em></strong> this video or check out the <a href="/docs/v3/Plugins/Observer">docs</a> (see what we did there?).</p><iframe allow="autoplay; fullscreen" frameborder="0" src="https://player.vimeo.com/video/693501852?h=56b80bc15d" class="fr-draggable video"></iframe></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="gsapquickto">gsap.quickTo()<a href="#gsapquickto" class="hash-link" aria-label="Direct link to gsap.quickTo()" title="Direct link to gsap.quickTo()">​</a></h2><p>If you find yourself calling gsap.to() many times on the same numeric property of the same target, like in a "mousemove" event, you can boost performance by creating a quickTo() function instead. Think of a quickTo() like an optimized function tied to one particular numeric property, where it directly pipes a new number to it.</p><p><strong>Example</strong></p><div class="language-js codeBlockContainer_APcc theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#28292b"><div class="codeBlockContent_m3Ux"><pre tabindex="0" class="prism-code language-js codeBlock_qGQc thin-scrollbar"><code class="codeBlockLines_p187"><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token keyword" style="font-style:italic">let</span><span class="token plain"> xTo </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> gsap</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">quickTo</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:#63d55a">"#id"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token string" style="color:#63d55a">"x"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token literal-property property">duration</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">0.4</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token literal-property property">ease</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:#63d55a">"power3"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">    yTo </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> gsap</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">quickTo</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:#63d55a">"#id"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token string" style="color:#63d55a">"y"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token literal-property property">duration</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">0.4</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token literal-property property">ease</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:#63d55a">"power3"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token dom variable" style="color:rgb(191, 199, 213)">document</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">querySelector</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:#63d55a">"#container"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">addEventListener</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:#63d55a">"mousemove"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token parameter">e</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(137, 221, 255)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token function" style="color:rgb(130, 170, 255)">xTo</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">e</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token property-access">pageX</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token function" style="color:rgb(130, 170, 255)">yTo</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">e</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token property-access">pageY</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span></span><br></span></code></pre><div class="buttonGroup_6DOT"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_FhaS" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_phi_"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_FfTR"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="mouse-follower-demo">Mouse Follower Demo<a href="#mouse-follower-demo" class="hash-link" aria-label="Direct link to Mouse Follower Demo" title="Direct link to Mouse Follower Demo">​</a></h2><div class="codepen--loading"><h4>loading...</h4><iframe height="400" style="width:100%" title="GSAP Basic Tween" src="https://codepen.io/GreenSock/embed/xxpbORN?default-tab=result&amp;theme-id=41164" frameborder="no" allowtransparency="true" allowfullscreen=""></iframe></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="scrolltriggernormalizescroll-and-ignoremobileresize">ScrollTrigger.normalizeScroll() and ignoreMobileResize<a href="#scrolltriggernormalizescroll-and-ignoremobileresize" class="hash-link" aria-label="Direct link to ScrollTrigger.normalizeScroll() and ignoreMobileResize" title="Direct link to ScrollTrigger.normalizeScroll() and ignoreMobileResize">​</a></h2><p>Have you ever run into these problems?:</p><ul><li>Address bar on mobile browsers shows/hides and resizes the viewport, causing jumps</li><li>When scrolling fast, a pinned element seems to shoot past for a brief moment and then jump to the correct pinned position (multi-thread synchronization issues)</li><li>iOS jitter</li><li>Overscroll behavior that seems impossible to prevent on iOS</li><li>Inconsistent momentum scrolling across devices</li></ul><p>The powerful new <a href="/docs/v3/Plugins/ScrollTrigger/static.normalizeScroll()">normalizeScroll()</a> functionality intercepts native browser scroll behavior and handles it on the JavaScript thread instead which solves the problems mentioned above on most devices (iOS Phones in portrait orientation still show/hide the address bar). To enable it, simply:</p><div class="language-js codeBlockContainer_APcc theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#28292b"><div class="codeBlockContent_m3Ux"><pre tabindex="0" class="prism-code language-js codeBlock_qGQc thin-scrollbar"><code class="codeBlockLines_p187"><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token maybe-class-name">ScrollTrigger</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">normalizeScroll</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token boolean" style="color:rgb(255, 88, 116)">true</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span></span><br></span></code></pre><div class="buttonGroup_6DOT"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_FhaS" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_phi_"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_FfTR"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>To prevent <a href="/docs/v3/Plugins/ScrollTrigger/static.refresh()">ScrollTrigger.refresh()</a> from running (and recalculating start/end positions) when a mobile browser shows/hides its address bar, you can now do:</p><div class="language-js codeBlockContainer_APcc theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#28292b"><div class="codeBlockContent_m3Ux"><pre tabindex="0" class="prism-code language-js codeBlock_qGQc thin-scrollbar"><code class="codeBlockLines_p187"><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token maybe-class-name">ScrollTrigger</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">config</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"> </span><span class="token literal-property property">ignoreMobileResize</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">true</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span></span><br></span></code></pre><div class="buttonGroup_6DOT"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_FhaS" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_phi_"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_FfTR"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>So easy!</p><p>Read more in <a href="/docs/v3/Plugins/ScrollTrigger/static.normalizeScroll()">the docs</a>.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="new--and--relative-prefixes">New "<!-- -->*<!-- -->=" and "/=" relative prefixes<a href="#new--and--relative-prefixes" class="hash-link" aria-label="Direct link to new--and--relative-prefixes" title="Direct link to new--and--relative-prefixes">​</a></h2><p>You've always been able to add or subtract from the current value, like:</p><div class="language-js codeBlockContainer_APcc theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#28292b"><div class="codeBlockContent_m3Ux"><pre tabindex="0" class="prism-code language-js codeBlock_qGQc thin-scrollbar"><code class="codeBlockLines_p187"><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">gsap</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">to</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:#63d55a">".box"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token literal-property property">x</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:#63d55a">"+=100"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// 100 more than the current value</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token literal-property property">y</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:#63d55a">"-=100"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// 100 less than the current value</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span></span><br></span></code></pre><div class="buttonGroup_6DOT"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_FhaS" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_phi_"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_FfTR"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>...and now you can multiply or divide accordingly:</p><div class="language-js codeBlockContainer_APcc theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#28292b"><div class="codeBlockContent_m3Ux"><pre tabindex="0" class="prism-code language-js codeBlock_qGQc thin-scrollbar"><code class="codeBlockLines_p187"><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">gsap</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">to</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:#63d55a">".box"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token literal-property property">x</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:#63d55a">"*=2"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// double the current value</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token literal-property property">y</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:#63d55a">"/=2"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// halve the current value</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span></span><br></span></code></pre><div class="buttonGroup_6DOT"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_FhaS" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_phi_"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_FfTR"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="-"><a href="#"> </a><a href="#-" class="hash-link" aria-label="Direct link to -" title="Direct link to -">​</a></h2><h2 class="anchor anchorWithStickyNavbar_LWe7" id="and-more">And more...<a href="#and-more" class="hash-link" aria-label="Direct link to And more..." title="Direct link to And more...">​</a></h2><div class="theme-admonition theme-admonition-tip alert alert--success admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_S0QG"><p>GSAP 3.10 also delivers various bug fixes, so we'd highly recommend <a href="/docs/v3/Installation">installing the latest version today</a>. There are many ways to get GSAP - see the <a href="/docs/v3/Installation">Installation page</a> for all the options (download, NPM, zip, Github, etc.).</p></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="resources">Resources<a href="#resources" class="hash-link" aria-label="Direct link to Resources" title="Direct link to Resources">​</a></h2><div class="list"><ul><li><a href="https://github.com/greensock/GSAP/releases/tag/3.10.0" target="_blank" rel="noopener noreferrer">Full release notes on Github</a></li><li><a href="/docs/v3/">Full documentation</a></li><li><a href="/resources/get-started">Getting started with GSAP</a></li><li><a href="/resources">Learning resources</a></li><li><a href="https://gsap.com/community/" target="_blank" rel="noopener noreferrer">Community forums</a></li></ul></div><p>Happy tweening!</p>]]></content>
        <author>
            <name>Cassie Evans</name>
            <uri>https://twitter.com/cassiecodes</uri>
        </author>
        <author>
            <name>Jack Doyle</name>
            <uri>https://twitter.com/greensock</uri>
        </author>
        <category label="release" term="release"/>
        <category label="ScrollSmoother" term="ScrollSmoother"/>
        <category label="normalizeScroll" term="normalizeScroll"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[3.9 release]]></title>
        <id>https://gsap.com/blog/3-9</id>
        <link href="https://gsap.com/blog/3-9"/>
        <updated>2021-12-16T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[- Flip Plugin is no longer for members-only! - consider it an early Christmas present from us to you.]]></summary>
        <content type="html"><![CDATA[<div class="table-of-contents"><ul><li><a href="#flip">Flip Plugin is no longer for members-only!</a> - consider it an early Christmas present from us to you.</li><li><a href="/docs/v3/Eases/CustomEase">CustomEase</a> is now in the public downloads as well (and on the CDN)! 'Tis the season to be jolly.</li><li><a href="#keyframes">Brand new Keyframe options</a> that can drastically reduce the amount of code you must write. If you're used to CSS keyframes, you'll love this.</li><li><a href="/docs/v3/Plugins/Flip">Flip Plugin</a> got a major overhaul and new features including <a href="/docs/v3/Plugins/Flip/static.batch()">batch()</a> for complex scenarios.</li></ul></div><div class="codepen--loading"><h4>loading...</h4><iframe height="600" style="width:100%" title="GSAP Basic Tween" src="https://codepen.io/GreenSock/embed/6a4b91ccb470013ce293a6c8cbd7eba4?default-tab=result&amp;theme-id=41164" frameborder="no" allowtransparency="true" allowfullscreen=""></iframe></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="flip-animations-for-everyone">FLIP animations for everyone!<a href="#flip-animations-for-everyone" class="hash-link" aria-label="Direct link to FLIP animations for everyone!" title="Direct link to FLIP animations for everyone!">​</a></h2><p>Flip plugin can give you some <em>serious</em> animation superpowers once you learn to think in terms of "FLIP" ("<strong>F</strong>irst", "<strong>L</strong>ast", "<strong>I</strong>nvert", "<strong>P</strong>lay"). Here's a demo that explains the technique:</p><div class="codepen--loading"><h4>loading...</h4><iframe height="400" style="width:100%" title="GSAP Basic Tween" src="https://codepen.io/GreenSock/embed/ad75564d0ac3e9c6dcaf26e85838ee2a?default-tab=result&amp;theme-id=41164" frameborder="no" allowtransparency="true" allowfullscreen=""></iframe></div><p>Sometimes you'll need to deal with state changes that you can't control, or reparenting of elements. Maybe a thumbnail image needs to transition to fill the viewport with <code>position: fixed</code>, or a grid of elements must get smoothly re-ordered within a <code>flexbox</code> container. This is where <a href="/docs/v3/Plugins/Flip">Flip Plugin</a> shines!</p><p>And now it's included in the public downloads and CDN! That's right, Flip Plugin isn't just for <a href="https://gsap.com/pricing/" target="_blank" rel="noopener noreferrer">Club GSAP</a> members anymore (but seriously, if you haven't joined yet, what are you waiting for?). And for those who are members, don't worry - we've got something fun coming just for you in the future.</p><p>Here's an example where a video that's in the flow of text seamlessly transitions into <code>position: fixed</code> in the corner when you scroll far enough:</p><div class="codepen--loading"><h4>loading...</h4><iframe height="400" style="width:100%" title="GSAP Basic Tween" src="https://codepen.io/GreenSock/embed/9d0c782c4861fe6f35c90107ee72927a?default-tab=result&amp;theme-id=41164" frameborder="no" allowtransparency="true" allowfullscreen=""></iframe></div><p>Even when the original position of elements could change - like in this spinning container, <strong>FLIP</strong> will handle the transition with ease.</p><div class="codepen--loading"><h4>loading...</h4><iframe height="400" style="width:100%" title="GSAP Basic Tween" src="https://codepen.io/GreenSock/embed/eYEXmJm?default-tab=result&amp;theme-id=41164" frameborder="no" allowtransparency="true" allowfullscreen=""></iframe></div><p>And here's a fan-favorite showing a grid of tiles you can filter by color and Flip smooths everything out:</p><div class="codepen--loading"><h4>loading...</h4><iframe height="400" style="width:100%" title="GSAP Basic Tween" src="https://codepen.io/GreenSock/embed/NWRxarv?default-tab=result&amp;theme-id=41164" frameborder="no" allowtransparency="true" allowfullscreen=""></iframe></div><div class="theme-admonition theme-admonition-info alert alert--info admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>Video Walkthrough Wanna learn about all the nitty-gritty details? Watch this video:</div><div class="admonitionContent_S0QG"><iframe allow="autoplay; fullscreen" frameborder="0" src="https://player.vimeo.com/video/499352774?h=e290b05455&amp;badge=0&amp;autopause=0&amp;player_id=0&amp;app_id=58479" class="fr-draggable video"></iframe></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="new-additions-to-the-keyframe-syntax">New additions to the keyframe syntax<a href="#new-additions-to-the-keyframe-syntax" class="hash-link" aria-label="Direct link to New additions to the keyframe syntax" title="Direct link to New additions to the keyframe syntax">​</a></h2><div class="theme-admonition theme-admonition-info alert alert--info admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>Video Walkthrough</div><div class="admonitionContent_S0QG"><iframe allow="autoplay; fullscreen" frameborder="0" src="https://player.vimeo.com/video/657143720?h=e290b05455&amp;badge=0&amp;autopause=0&amp;player_id=0&amp;app_id=58479" class="fr-draggable video"></iframe></div></div><p>Keyframes are a great way to animate a target through multiple steps while keeping your code nice and concise. You can think of them as a sub-timeline nested <em>inside</em> a tween</p><p>Here's a reminder of the existing syntax.</p><div class="language-js codeBlockContainer_APcc theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#28292b"><div class="codeBlockContent_m3Ux"><pre tabindex="0" class="prism-code language-js codeBlock_qGQc thin-scrollbar"><code class="codeBlockLines_p187"><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">gsap</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">to</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:#63d55a">'.elem'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token literal-property property">keyframes</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"> </span><span class="token literal-property property">x</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">100</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token literal-property property">duration</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"> </span><span class="token literal-property property">y</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">200</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token literal-property property">duration</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token literal-property property">delay</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">0.5</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// create a 0.5 second gap</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"> </span><span class="token literal-property property">rotation</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">360</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token literal-property property">duration</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">2</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token literal-property property">delay</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token number" style="color:rgb(247, 140, 108)">0.25</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"> </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// overlap by 0.25 seconds</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span></span><br></span></code></pre><div class="buttonGroup_6DOT"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_FhaS" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_phi_"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_FfTR"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="new-keyframe-options">New Keyframe options<a href="#new-keyframe-options" class="hash-link" aria-label="Direct link to New Keyframe options" title="Direct link to New Keyframe options">​</a></h2><h3 class="anchor anchorWithStickyNavbar_LWe7" id="percent-based-keyframes">Percent-based keyframes<a href="#percent-based-keyframes" class="hash-link" aria-label="Direct link to Percent-based keyframes" title="Direct link to Percent-based keyframes">​</a></h3><p>This familiar syntax will make porting animations over from CSS a breeze!<br>
<!-- -->Instead of using delays and duration in the keyframes themselves, you specify the styles you want at certain waypoints during the animation, and just like CSS, if you omit a property from one of the keyframes the value will interpolate across that gap.</p><div class="language-js codeBlockContainer_APcc theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#28292b"><div class="codeBlockContent_m3Ux"><pre tabindex="0" class="prism-code language-js codeBlock_qGQc thin-scrollbar"><code class="codeBlockLines_p187"><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">gsap</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">to</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:#63d55a">'.elem'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token literal-property property">keyframes</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token string-property property">'0%'</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"> </span><span class="token literal-property property">x</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">100</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token literal-property property">y</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">100</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token string-property property">'75%'</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"> </span><span class="token literal-property property">x</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">0</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token string-property property">'100%'</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"> </span><span class="token literal-property property">x</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">50</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token literal-property property">y</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">50</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token literal-property property">duration</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">2</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span></span><br></span></code></pre><div class="buttonGroup_6DOT"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_FhaS" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_phi_"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_FfTR"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="array-of-values">Array-of-values<a href="#array-of-values" class="hash-link" aria-label="Direct link to Array-of-values" title="Direct link to Array-of-values">​</a></h3><p>Just define an Array of values and they'll get equally distributed. So simple! And you don't need to make sure the Arrays are equal in length. Plenty of flexibility.</p><div class="language-js codeBlockContainer_APcc theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#28292b"><div class="codeBlockContent_m3Ux"><pre tabindex="0" class="prism-code language-js codeBlock_qGQc thin-scrollbar"><code class="codeBlockLines_p187"><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">gsap</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">to</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:#63d55a">'.elem'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token literal-property property">keyframes</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token literal-property property">x</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token number" style="color:rgb(247, 140, 108)">100</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">0</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">50</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token literal-property property">y</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token number" style="color:rgb(247, 140, 108)">100</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">0</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">50</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token literal-property property">duration</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">2</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span></span><br></span></code></pre><div class="buttonGroup_6DOT"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_FhaS" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_phi_"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_FfTR"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="demos">Demos<a href="#demos" class="hash-link" aria-label="Direct link to Demos" title="Direct link to Demos">​</a></h3><p>With <strong>Object keyframes</strong> and <strong>Percentage keyframes</strong> you can drill down and add different eases into individual keyframes.</p><div class="codepen--loading"><h4>loading...</h4><iframe height="400" style="width:100%" title="GSAP Basic Tween" src="https://codepen.io/GreenSock/embed/1c38f65c7536803a59f19a899ac0fbb9?default-tab=result&amp;theme-id=41164" frameborder="no" allowtransparency="true" allowfullscreen=""></iframe></div><p>You can even combine multiple easing properties, keyframes and normal tween values. <!-- -->🤯</p><div class="language-js codeBlockContainer_APcc theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#28292b"><div class="codeBlockContent_m3Ux"><pre tabindex="0" class="prism-code language-js codeBlock_qGQc thin-scrollbar"><code class="codeBlockLines_p187"><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">gsap</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">to</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:#63d55a">'.box'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token literal-property property">keyframes</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token literal-property property">y</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token number" style="color:rgb(247, 140, 108)">0</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">80</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token number" style="color:rgb(247, 140, 108)">10</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">30</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">0</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token literal-property property">ease</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:#63d55a">'none'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// ease across the entire set of keyframes (defaults to the one defined in the tween, or "none" if one isn't defined there)</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token literal-property property">easeEach</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:#63d55a">'power2.inOut'</span><span class="token plain"> </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// ease between each keyframe (defaults to "power1.inOut")</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token literal-property property">rotate</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">180</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token literal-property property">ease</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:#63d55a">'elastic'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// the "normal" part of the tween. In this case, it affects "rotate" because it's outside the keyframes</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token literal-property property">duration</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">5</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token literal-property property">stagger</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">0.2</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span></span><br></span></code></pre><div class="buttonGroup_6DOT"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_FhaS" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_phi_"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_FfTR"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><div class="codepen--loading"><h4>loading...</h4><iframe height="400" style="width:100%" title="GSAP Basic Tween" src="https://codepen.io/GreenSock/embed/92533379938b4afb117727d84b47651b?default-tab=result&amp;theme-id=41164" frameborder="no" allowtransparency="true" allowfullscreen=""></iframe></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="and-more">And more...<a href="#and-more" class="hash-link" aria-label="Direct link to And more..." title="Direct link to And more...">​</a></h2><div class="theme-admonition theme-admonition-tip alert alert--success admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_S0QG"><p>GSAP 3.9 also delivers various bug fixes, so we'd highly recommend <a href="/docs/v3/Installation">installing the latest version today</a>. There are many ways to get GSAP - see the <a href="/docs/v3/Installation">Installation page</a> for all the options (download, NPM, zip, Github, etc.).</p></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="resources">Resources<a href="#resources" class="hash-link" aria-label="Direct link to Resources" title="Direct link to Resources">​</a></h2><div class="list"><ul><li><a href="https://github.com/greensock/GSAP/releases/tag/3.9.0" target="_blank" rel="noopener noreferrer">Full release notes on Github</a></li><li><a href="/docs/v3/">Full documentation</a></li><li><a href="/resources/get-started">Getting started with GSAP</a></li><li><a href="/resources">Learning resources</a></li><li><a href="https://gsap.com/community/" target="_blank" rel="noopener noreferrer">Community forums</a></li><li><a href="/docs/v3/Plugins/Flip">FLIP Plugin docs</a></li><li><a href="/resources/keyframes">More information about keyframes</a></li></ul></div><p>Happy tweening!</p>]]></content>
        <author>
            <name>Cassie Evans</name>
            <uri>https://twitter.com/cassiecodes</uri>
        </author>
        <author>
            <name>Jack Doyle</name>
            <uri>https://twitter.com/greensock</uri>
        </author>
        <category label="release" term="release"/>
        <category label="flip" term="flip"/>
        <category label="customEase" term="customEase"/>
        <category label="keyframes" term="keyframes"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[3.8 release]]></title>
        <id>https://gsap.com/blog/3-8</id>
        <link href="https://gsap.com/blog/3-8"/>
        <updated>2021-09-27T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[- containerAnimation - vertical scrolling can animate a container horizontally; now you can set up ScrollTriggers on that horizontal movement. It's like having nested ScrollTriggers!]]></summary>
        <content type="html"><![CDATA[<div class="table-of-contents"><ul><li><a href="#containerAnimation">containerAnimation</a> - vertical scrolling can animate a container horizontally; now you can set up ScrollTriggers on that horizontal movement. It's like having nested ScrollTriggers!</li><li><a href="#preventOverlapsAndFastScrollEnd">preventOverlaps &amp; fastScrollEnd</a> - when you jump to a section, do you have lingering animations that overlap? These features can save the day.</li><li><a href="#isInViewport">isInViewport()</a> - a simple way to check if an element is in the viewport</li><li><a href="#positionInViewport">positionInViewport()</a> - find out exactly where an element is in relation to the viewport</li><li><a href="#snapDirectional">Directional snapping</a> - by default, snapping will now always go in the direction that the user last scrolled. Much more intuitive! There's even a <code>.snapDirectional()</code> utility method.</li></ul></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="containeranimation">containerAnimation<a href="#containeranimation" class="hash-link" aria-label="Direct link to containerAnimation" title="Direct link to containerAnimation">​</a></h2><div class="theme-admonition theme-admonition-info alert alert--info admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_S0QG"><iframe allow="autoplay; fullscreen" frameborder="0" src="https://player.vimeo.com/video/618147701?h=172487e9d8&amp;badge=0&amp;autopause=0&amp;player_id=0&amp;app_id=58479" class="fr-draggable video"></iframe></div></div><p>We try to keep an eye on common challenges that the GSAP community faces. A popular effect is to create <strong>horizontally-moving</strong> sections that are tied to <strong>vertical scrolling</strong>.</p><p>That's simple enough with the <a href="https://codepen.io/GreenSock/pen/YzygYvM" target="_blank" rel="noopener noreferrer">animated horizontal "scroll"</a> technique where a pinned container is animated along the x-axis to emulate horizontal scrolling.</p><p>However, since the effect is an <strong>animation</strong> as opposed to <strong>native scroll</strong>, it's very tricky to trigger animations <strong><em>within</em></strong> this horizontally "scrolling" container.</p><p>Enter <code>containerAnimation</code>. <!-- -->🥳</p><p>With <code>containerAnimation</code>, you can actually create ScrollTriggers on that fake-scrolling container to detect when an element is 'scrolled' into view horizontally and then trigger an animation. Think of it like a ScrollTrigger <em>inside</em> a ScrollTrigger. <!-- -->🤯</p><ul><li>First, we create a linear tween to handle the horizontal 'scroll'</li><li>Then we can pass <strong>that animation</strong> (as the <code>containerAnimation</code>) to the ScrollTriggers of tweens or timelines  </li></ul><div class="language-js codeBlockContainer_APcc theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#28292b"><div class="codeBlockContent_m3Ux"><pre tabindex="0" class="prism-code language-js codeBlock_qGQc thin-scrollbar"><code class="codeBlockLines_p187"><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token comment" style="color:#9c9c9c;font-style:italic">// keep a reference of the horizontal 'fake scrolling' animation so we can pass it around</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="font-style:italic">let</span><span class="token plain"> scrollTween </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> gsap</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">to</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:#63d55a">'.container'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token literal-property property">xPercent</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token number" style="color:rgb(247, 140, 108)">100</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">*</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">sections</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token property-access">length</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token literal-property property">ease</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:#63d55a">'none'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// &lt;-- IMPORTANT!</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token literal-property property">scrollTrigger</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token literal-property property">trigger</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:#63d55a">'.container'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token literal-property property">start</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:#63d55a">'top top'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token literal-property property">end</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:#63d55a">'+=3000'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token literal-property property">pin</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">true</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token literal-property property">scrub</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">0.5</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#9c9c9c;font-style:italic">// now let's create an animation that triggers based on the horizontal fake-scroll:</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">gsap</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">to</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:#63d55a">'.box'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token literal-property property">y</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token number" style="color:rgb(247, 140, 108)">100</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token literal-property property">scrollTrigger</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token literal-property property">trigger</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:#63d55a">'.box'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token literal-property property">start</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:#63d55a">'left center'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token literal-property property">containerAnimation</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> scrollTween </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// &lt;-- NEW!!</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span></span><br></span></code></pre><div class="buttonGroup_6DOT"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_FhaS" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_phi_"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_FfTR"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Check out this demo to see it in action!</p><div class="codepen--loading"><h4>loading...</h4><iframe height="500" style="width:100%" title="GSAP Basic Tween" src="https://codepen.io/GreenSock/embed/9be5d371346765a8c9a426e8f65f1cea?default-tab=result&amp;theme-id=41164" frameborder="no" allowtransparency="true" allowfullscreen=""></iframe></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="preventoverlaps-and-fastscrollend">preventOverlaps and fastScrollEnd<a href="#preventoverlaps-and-fastscrollend" class="hash-link" aria-label="Direct link to preventOverlaps and fastScrollEnd" title="Direct link to preventOverlaps and fastScrollEnd">​</a></h2><div class="theme-admonition theme-admonition-info alert alert--info admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>Creative Coding Club Walkthrough</div><div class="admonitionContent_S0QG"><iframe allow="autoplay; fullscreen" frameborder="0" src="https://player.vimeo.com/video/617582040?byline=0&amp;title=0&amp;portrait=0" class="fr-draggable video"></iframe><br><p>Special thanks to Creative Coding Club for providing this video. We highly recommend their courses at <a href="https://www.creativecodingclub.com/bundles/creative-coding-club?ref=44f484" target="_blank" rel="noopener noreferrer">CreativeCodingClub.com</a>. Take your animation skills to the next level.</p></div></div><p>Scroll-triggered animations pose unique challenges. Unlike animations that play on load, you're putting control in the users' hands. They decide how fast to scroll, which direction to scroll <!-- -->–<!-- --> and by association <!-- -->–<!-- --> when the animations get triggered. With this in mind, we added two new features to ScrollTrigger to help avoid overlaps between successive non-scrubbed animations:</p><ul><li><code>preventOverlaps</code> kicks in as a ScrollTrigger is about to trigger an animation; it finds preceding scrollTrigger-based animations and forces those previous animations to their end state <!-- -->–<!-- --> avoiding unsightly overlaps.</li><li><code>fastScrollEnd</code> will force the current ScrollTrigger's animation to completion if you <strong>leave</strong> its trigger area above a certain velocity (default 2500px/s). This property can help to avoid overlapping animations when the user scrolls quickly.</li></ul><p>We're especially excited about the UX benefits this brings. When users are in a hurry to access information, slow animation can be a <a href="https://www.nngroup.com/articles/scroll-animations/" target="_blank" rel="noopener noreferrer">frustrating hindrance to their goal</a>. With <code>fastScrollEnd</code>, we can avoid wearing down the patience of task-focused users by quickly forcing animations to their end state when scrolling quickly.</p><div class="language-js codeBlockContainer_APcc theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#28292b"><div class="codeBlockContent_m3Ux"><pre tabindex="0" class="prism-code language-js codeBlock_qGQc thin-scrollbar"><code class="codeBlockLines_p187"><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token literal-property property">scrollTrigger</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token literal-property property">trigger</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:#63d55a">".container"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token literal-property property">fastScrollEnd</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">true</span><span class="token plain"> </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// (default 2500px/s)</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// or</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token literal-property property">fastScrollEnd</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">3000</span><span class="token plain"> </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// (custom 3000px/s velocity)</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token literal-property property">preventOverlaps</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">true</span><span class="token plain"> </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// prevent overlaps in preceding scrollTrigger animations</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// or</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token literal-property property">preventOverlaps</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:#63d55a">"group1"</span><span class="token plain"> </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// prevent overlaps in specific group of scrollTrigger animations</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span></span><br></span></code></pre><div class="buttonGroup_6DOT"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_FhaS" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_phi_"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_FfTR"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>You can take a look at how these new properties work, independently and in unison, by scrolling down in this demo at different speeds and toggling the options:</p><div class="codepen--loading"><h4>loading...</h4><iframe height="500" style="width:100%" title="GSAP Basic Tween" src="https://codepen.io/GreenSock/embed/7d22c763b9edd0c0c48150ecd1c921c9?default-tab=result&amp;theme-id=41164" frameborder="no" allowtransparency="true" allowfullscreen=""></iframe></div><p>In addition to these new features we've added some handy methods to help you detect when an element is in view, and where.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="isinviewport">isInViewport()<a href="#isinviewport" class="hash-link" aria-label="Direct link to isInViewport()" title="Direct link to isInViewport()">​</a></h2><p><code>ScrollTrigger.isInViewport()</code> lets you find out if a particular element is in the viewport.</p><div class="language-js codeBlockContainer_APcc theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#28292b"><div class="codeBlockContent_m3Ux"><pre tabindex="0" class="prism-code language-js codeBlock_qGQc thin-scrollbar"><code class="codeBlockLines_p187"><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token keyword control-flow" style="font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token maybe-class-name">ScrollTrigger</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">isInViewport</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:#63d55a">'#selector'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// in the viewport vertically</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span></span><br></span></code></pre><div class="buttonGroup_6DOT"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_FhaS" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_phi_"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_FfTR"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>You can also find out if a certain proportion is in view. The following will return true if at least 20% of the element is in the viewport:</p><div class="language-js codeBlockContainer_APcc theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#28292b"><div class="codeBlockContent_m3Ux"><pre tabindex="0" class="prism-code language-js codeBlock_qGQc thin-scrollbar"><code class="codeBlockLines_p187"><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token keyword control-flow" style="font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token maybe-class-name">ScrollTrigger</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">isInViewport</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">element</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">0.2</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// at least 20% of the element is in the viewport vertically</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span></span><br></span></code></pre><div class="buttonGroup_6DOT"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_FhaS" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_phi_"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_FfTR"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>To check horizontally instead of vertically, just use the 3rd parameter (boolean):</p><div class="language-js codeBlockContainer_APcc theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#28292b"><div class="codeBlockContent_m3Ux"><pre tabindex="0" class="prism-code language-js codeBlock_qGQc thin-scrollbar"><code class="codeBlockLines_p187"><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token keyword control-flow" style="font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token maybe-class-name">ScrollTrigger</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">isInViewport</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">element</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">0.2</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">true</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// at least 20% of the element is in the viewport horizontally</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span></span><br></span></code></pre><div class="buttonGroup_6DOT"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_FhaS" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_phi_"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_FfTR"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="positioninviewport">positionInViewport()<a href="#positioninviewport" class="hash-link" aria-label="Direct link to positionInViewport()" title="Direct link to positionInViewport()">​</a></h2><p>The <code>ScrollTrigger.positionInViewPort()</code> method lets you get a normalized value representing an element's position in relation to the viewport where 0 is at the top of the viewport, 0.5 is in the center, and 1 is at the bottom. So, for example, if the center of the element is 80% down from the top of the viewport, the following code would return <code>0.8</code>:</p><div class="language-js codeBlockContainer_APcc theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#28292b"><div class="codeBlockContent_m3Ux"><pre tabindex="0" class="prism-code language-js codeBlock_qGQc thin-scrollbar"><code class="codeBlockLines_p187"><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token maybe-class-name">ScrollTrigger</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">positionInViewport</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">element</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token string" style="color:#63d55a">'center'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span></span><br></span></code></pre><div class="buttonGroup_6DOT"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_FhaS" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_phi_"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_FfTR"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>For the reference point (2nd parameter), you can use keywords like <code>"center"</code> (the default), <code>"top"</code>, or <code>"bottom"</code>. Or you can use a number of pixels from the element's top, so <code>20</code> would make the reference point 20 pixels down from the top of the element.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="demo">Demo<a href="#demo" class="hash-link" aria-label="Direct link to Demo" title="Direct link to Demo">​</a></h2><div class="codepen--loading"><h4>loading...</h4><iframe height="400" style="width:100%" title="GSAP Basic Tween" src="https://codepen.io/GreenSock/embed/WNOzrqg?default-tab=result&amp;theme-id=41164" frameborder="no" allowtransparency="true" allowfullscreen=""></iframe></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="directional-snapping">Directional snapping<a href="#directional-snapping" class="hash-link" aria-label="Direct link to Directional snapping" title="Direct link to Directional snapping">​</a></h2><p>By default, snapping will now always go in the direction that the user last scrolled. Much more intuitive! Previously, it would snap to the closest value regardless of direction which could lead to annoying snap-back behavior.</p><p>There's even a <code>ScrollTrigger.snapDirectional()</code> utility method that lets you do your own directional snapping for any numeric values. It returns a snapping function that you can feed a value to snap, and a direction where <code>1</code> is forward (greater than) and <code>-1</code> is backward (less than). For example:</p><div class="language-js codeBlockContainer_APcc theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#28292b"><div class="codeBlockContent_m3Ux"><pre tabindex="0" class="prism-code language-js codeBlock_qGQc thin-scrollbar"><code class="codeBlockLines_p187"><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token comment" style="color:#9c9c9c;font-style:italic">// returns a function that snaps to the closest increment of 5</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="font-style:italic">let</span><span class="token plain"> snap </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> </span><span class="token maybe-class-name">ScrollTrigger</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">snapDirectional</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token number" style="color:rgb(247, 140, 108)">5</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token function" style="color:rgb(130, 170, 255)">snap</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token number" style="color:rgb(247, 140, 108)">11</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"> </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// 10 (closest, not directional)</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token function" style="color:rgb(130, 170, 255)">snap</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token number" style="color:rgb(247, 140, 108)">11</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"> </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// 15 (closest greater than)</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token function" style="color:rgb(130, 170, 255)">snap</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token number" style="color:rgb(247, 140, 108)">11</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"> </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// 10 (closest less than)</span></span><br></span></code></pre><div class="buttonGroup_6DOT"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_FhaS" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_phi_"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_FfTR"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>You can even use an Array of values!</p><div class="language-js codeBlockContainer_APcc theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#28292b"><div class="codeBlockContent_m3Ux"><pre tabindex="0" class="prism-code language-js codeBlock_qGQc thin-scrollbar"><code class="codeBlockLines_p187"><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token keyword" style="font-style:italic">let</span><span class="token plain"> values </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token number" style="color:rgb(247, 140, 108)">0</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">5</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">20</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">100</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#9c9c9c;font-style:italic">// returns a function that'll snap to the closest value in the Array</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="font-style:italic">let</span><span class="token plain"> snap </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> </span><span class="token maybe-class-name">ScrollTrigger</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">snapDirectional</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">values</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token function" style="color:rgb(130, 170, 255)">snap</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token number" style="color:rgb(247, 140, 108)">8</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"> </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// 5  (closest, non-directional)</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token function" style="color:rgb(130, 170, 255)">snap</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token number" style="color:rgb(247, 140, 108)">8</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"> </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// 20 (closest greater than)</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token function" style="color:rgb(130, 170, 255)">snap</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token number" style="color:rgb(247, 140, 108)">99</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"> </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// 20 (closest less than)</span></span><br></span></code></pre><div class="buttonGroup_6DOT"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_FhaS" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_phi_"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_FfTR"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><hr><h2 class="anchor anchorWithStickyNavbar_LWe7" id="and-more">And more...<a href="#and-more" class="hash-link" aria-label="Direct link to And more..." title="Direct link to And more...">​</a></h2><div class="theme-admonition theme-admonition-tip alert alert--success admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_S0QG"><p>Make sure to check out the <a href="/docs/v3/Plugins/ScrollTrigger">ScrollTrigger docs</a> for more information.</p><p>GSAP 3.8 also delivers various bug fixes, so we'd highly recommend <a href="/docs/v3/Installation">installing the latest version today</a>. There are many ways to get GSAP - see the <a href="/docs/v3/Installation">Installation page</a> for all the options (download, NPM, zip, Github, etc.). :::</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="resources">Resources<a href="#resources" class="hash-link" aria-label="Direct link to Resources" title="Direct link to Resources">​</a></h2><div class="list"><ul><li><a href="https://github.com/greensock/GSAP/releases/tag/3.8.0" target="_blank" rel="noopener noreferrer">Full release notes on Github</a></li><li><a href="/docs/v3/">Full documentation</a></li><li><a href="/resources/get-started">Getting started with GSAP</a></li><li><a href="/resources">Learning resources</a></li><li><a href="https://gsap.com/community/" target="_blank" rel="noopener noreferrer">Community forums</a></li><li><a href="/docs/v3/Plugins/ScrollTrigger">ScrollTrigger docs</a></li></ul></div><p>Happy tweening!</p></div></div>]]></content>
        <author>
            <name>Cassie Evans</name>
            <uri>https://twitter.com/cassiecodes</uri>
        </author>
        <author>
            <name>Jack Doyle</name>
            <uri>https://twitter.com/greensock</uri>
        </author>
        <category label="release" term="release"/>
        <category label="matchMedia" term="matchMedia"/>
        <category label="context" term="context"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[3.7 release]]></title>
        <id>https://gsap.com/blog/3-7</id>
        <link href="https://gsap.com/blog/3-7"/>
        <updated>2021-06-09T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[* Percentage based position parameter options for timelines]]></summary>
        <content type="html"><![CDATA[<div class="table-of-contents"><ul><li>Percentage based <a href="/resources/position-parameter">position parameter</a> options for timelines</li><li>Better support for SVG elements with <a href="/docs/v3/Plugins/Flip/">Flip plugin</a>.</li><li>Easily scope animations to your components!<ul><li>New scoped selector - <a href="/docs/v3/GSAP/UtilityMethods/selector()">gsap.utils.selector()</a></li><li>Optional scope parameter added to <a href="/docs/v3/GSAP/UtilityMethods/toArray()">gsap.utils.toArray()</a></li></ul></li></ul></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="percentage-based-position-parameter">Percentage based <a href="/resources/position-parameter">position parameter</a>.<a href="#percentage-based-position-parameter" class="hash-link" aria-label="Direct link to percentage-based-position-parameter" title="Direct link to percentage-based-position-parameter">​</a></h2><p>The <a href="/resources/position-parameter/">position parameter</a> is small but <strong><em>mighty</em></strong>. It's the key to building sequenced animations with precise control over timings, and now it's even more powerful!</p><p>This update gives us the ability to position animations using <strong>percentage</strong> values - either relative to the previous tween or animation, or relative to the duration of the animation being inserted. The percent is based on the <a href="/docs/v3/GSAP/Tween/totalDuration()">totalDuration()</a>, so repeats, yoyos and staggers will be factored in.</p><p>This is <em>such</em> an exciting one because it allows us to tweak durations without affecting positioning!</p><p>Say we wanted to overlap a tween by half of it's own duration. Until now we would do a little mental math, divide the duration in half and add it to the <a href="/resources/position-parameter">position parameter</a> as a relative position.</p><div class="language-js codeBlockContainer_APcc theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#28292b"><div class="codeBlockContent_m3Ux"><pre tabindex="0" class="prism-code language-js codeBlock_qGQc thin-scrollbar"><code class="codeBlockLines_p187"><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">tl</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">to</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token spread operator" style="color:rgb(137, 221, 255)">...</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token literal-property property">duration</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">2</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token string" style="color:#63d55a">"-=1"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span></span><br></span></code></pre><div class="buttonGroup_6DOT"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_FhaS" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_phi_"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_FfTR"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>But if we were to change the duration, we would also have to update the <a href="/resources/position-parameter">position parameter</a></p><p>Now, with the addition of percentages, we can do this instead:</p><div class="language-js codeBlockContainer_APcc theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#28292b"><div class="codeBlockContent_m3Ux"><pre tabindex="0" class="prism-code language-js codeBlock_qGQc thin-scrollbar"><code class="codeBlockLines_p187"><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token comment" style="color:#9c9c9c;font-style:italic">// overlap by half of the inserted tweens duration, -1s:</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">tl</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">to</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token spread operator" style="color:rgb(137, 221, 255)">...</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token literal-property property">duration</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">2</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token string" style="color:#63d55a">"-=50%"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span></span><br></span></code></pre><div class="buttonGroup_6DOT"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_FhaS" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_phi_"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_FfTR"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Alternately, we can position a tween or timeline in relation to the most <strong>recently-added animation.</strong></p><div class="language-js codeBlockContainer_APcc theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#28292b"><div class="codeBlockContent_m3Ux"><pre tabindex="0" class="prism-code language-js codeBlock_qGQc thin-scrollbar"><code class="codeBlockLines_p187"><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">tl</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">to</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:#63d55a">".other"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token literal-property property">x</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">100</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token literal-property property">duration</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">2</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#9c9c9c;font-style:italic">// insert 25% of the way through the most recently added animation. </span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#9c9c9c;font-style:italic">// In this case - 0.5s into the 2s duration.</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">tl</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">to</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:#63d55a">".class"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token literal-property property">x</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">100</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token string" style="color:#63d55a">"&lt;25%"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span></span><br></span></code></pre><div class="buttonGroup_6DOT"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_FhaS" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_phi_"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_FfTR"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Or at a percentage from the <strong>end</strong> of the most <strong>recently-added animation</strong>, like <code>"&gt;-25%"</code>.</p><p><code>&gt;-25%</code> is equivalent to <code>&lt;75%</code></p><div class="language-js codeBlockContainer_APcc theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#28292b"><div class="codeBlockContent_m3Ux"><pre tabindex="0" class="prism-code language-js codeBlock_qGQc thin-scrollbar"><code class="codeBlockLines_p187"><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">tl</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">to</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:#63d55a">".other"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token literal-property property">x</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">100</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token literal-property property">duration</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">2</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#9c9c9c;font-style:italic">// insert 25% of the way from the end of the most recently added animation. </span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#9c9c9c;font-style:italic">// In this case - 0.5s from the end of the 2s duration.</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">tl</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">to</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:#63d55a">".class"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token literal-property property">x</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">100</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token string" style="color:#63d55a">"&gt;-25%"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span></span><br></span></code></pre><div class="buttonGroup_6DOT"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_FhaS" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_phi_"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_FfTR"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>As '+=' and '-=' are always based on the <strong>inserting animations total duration</strong>, we can even use a pointer to reference the starting point of the previous tween, whilst using the inserting tweens duration as the percentage offset.</p><div class="language-js codeBlockContainer_APcc theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#28292b"><div class="codeBlockContent_m3Ux"><pre tabindex="0" class="prism-code language-js codeBlock_qGQc thin-scrollbar"><code class="codeBlockLines_p187"><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">tl</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">to</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:#63d55a">".other"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token literal-property property">x</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">100</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token literal-property property">duration</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">2</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#9c9c9c;font-style:italic">// insert 50% of the inserting tweens duration from the beginning of the most recently added animation. </span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#9c9c9c;font-style:italic">// In this case - 0.5s from the start of the previous tween.</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">tl</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">to</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:#63d55a">".class"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token literal-property property">x</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">100</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token literal-property property">duration</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token string" style="color:#63d55a">"&lt;+=50%"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span></span><br></span></code></pre><div class="buttonGroup_6DOT"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_FhaS" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_phi_"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_FfTR"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Powerful stuff! If you want to dig in a bit more, here's a video explainer and some demos to play around with. You'll be a positioning pro in no time!</p><div class="theme-admonition theme-admonition-info alert alert--info admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>Video Walkthrough</div><div class="admonitionContent_S0QG"><iframe allow="autoplay; fullscreen" frameborder="0" src="https://player.vimeo.com/video/563826099?byline=0&amp;title=0&amp;portrait=0" class="fr-draggable video"></iframe></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="check-it-out-in-action-in-these-demos">Check it out in action in these demos.<a href="#check-it-out-in-action-in-these-demos" class="hash-link" aria-label="Direct link to Check it out in action in these demos." title="Direct link to Check it out in action in these demos.">​</a></h2><div class="codepen--loading"><h4>loading...</h4><iframe height="400" style="width:100%" title="GSAP Basic Tween" src="https://codepen.io/GreenSock/embed/RwpBOvR?default-tab=result&amp;theme-id=41164" frameborder="no" allowtransparency="true" allowfullscreen=""></iframe></div><div class="codepen--loading"><h4>loading...</h4><iframe height="400" style="width:100%" title="GSAP Basic Tween" src="https://codepen.io/GreenSock/embed/OJpwYXO?default-tab=result&amp;theme-id=41164" frameborder="no" allowtransparency="true" allowfullscreen=""></iframe></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="interactive-position-parameter-demo">Interactive <a href="/resources/position-parameter">Position Parameter</a> Demo<a href="#interactive-position-parameter-demo" class="hash-link" aria-label="Direct link to interactive-position-parameter-demo" title="Direct link to interactive-position-parameter-demo">​</a></h2><div class="codepen--loading"><h4>loading...</h4><iframe height="600" style="width:100%" title="GSAP Basic Tween" src="https://codepen.io/GreenSock/embed/46cc11b9e4319e0562c580669b14c330?default-tab=result&amp;theme-id=41164" frameborder="no" allowtransparency="true" allowfullscreen=""></iframe></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="better-support-for-svg-elements-with-flip-plugin">Better support for SVG elements with Flip plugin.<a href="#better-support-for-svg-elements-with-flip-plugin" class="hash-link" aria-label="Direct link to Better support for SVG elements with Flip plugin." title="Direct link to Better support for SVG elements with Flip plugin.">​</a></h2><p><a href="/docs/v3/Plugins/Flip/">Flip plugin</a> has been extended with better support for SVG elements. SVG already has a great coordinate system to work within - but we think this could assist transitions in live data-vis or when animating between states in generative SVG.</p><p>We'd love to see what you do with this so don't forget to share your demos with us!</p><p>In the meantime, here's a simple example</p><div class="codepen--loading"><h4>loading...</h4><iframe height="450" style="width:100%" title="GSAP Basic Tween" src="https://codepen.io/GreenSock/embed/yLMqZVZ?default-tab=result&amp;theme-id=41164" frameborder="no" allowtransparency="true" allowfullscreen=""></iframe></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="easily-scope-your-animations">Easily scope your animations<a href="#easily-scope-your-animations" class="hash-link" aria-label="Direct link to Easily scope your animations" title="Direct link to Easily scope your animations">​</a></h2><p>Modern front end dev is <em>all about</em> encapsulated components, but scoping animations to each individual component can be tricky. React devs, for example, often find themselves in <em>"ref Hell"</em> creating a ref for each and every element they want to animate. Wouldn't it be nice to just use classes and selector text that's limited to your component instance?</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="gsaputilsselector">gsap.utils.selector()<a href="#gsaputilsselector" class="hash-link" aria-label="Direct link to gsap.utils.selector()" title="Direct link to gsap.utils.selector()">​</a></h2><p>With <a href="/docs/v3/GSAP/UtilityMethods/selector()">gsap.utils.selector()</a> you can grab descendant elements from <strong>the selected element</strong>.</p><p>This is great for components because you can create a scoped selector for that component's main container element and then use that to select descendants. It's similar to calling <code>.querySelectorAll()</code> on that element <!-- -->–<!-- --> rather than on the document <!-- -->–<!-- --> except with a few added benefits:</p><ul><li>It returns an <strong><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array" target="_blank" rel="noopener noreferrer">Array</a></strong> rather than a <a href="https://developer.mozilla.org/en-US/docs/Web/API/NodeList" target="_blank" rel="noopener noreferrer">NodeList</a>, so you get access to convenient array methods like <code>.filter()</code> and <code>.map()</code>.</li><li>You can pass a React ref or Angular ElementRef to <a href="/docs/v3/GSAP/UtilityMethods/selector()">gsap.utils.selector()</a>. Then when you use the resulting function, it will automatically check for the <code>.current</code>/<code>.nativeElement</code> in case it was re-rendered since creation.</li></ul><div class="language-js codeBlockContainer_APcc theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#28292b"><div class="codeBlockContent_m3Ux"><pre tabindex="0" class="prism-code language-js codeBlock_qGQc thin-scrollbar"><code class="codeBlockLines_p187"><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token comment" style="color:#9c9c9c;font-style:italic">// Vanilla</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="font-style:italic">let</span><span class="token plain"> q </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> gsap</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token property-access">utils</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">selector</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">myElement</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"> </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// or use selector text like ".class"</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="font-style:italic">let</span><span class="token plain"> boxes </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">q</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:#63d55a">".box"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"> </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// finds only elements with the class "box" that are INSIDE myElement</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#9c9c9c;font-style:italic">// or plug directly into animations</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">gsap</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">to</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token function" style="color:rgb(130, 170, 255)">q</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:#63d55a">".circle"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token literal-property property">x</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">100</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span></span><br></span></code></pre><div class="buttonGroup_6DOT"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_FhaS" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_phi_"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_FfTR"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><div class="language-js codeBlockContainer_APcc theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#28292b"><div class="codeBlockContent_m3Ux"><pre tabindex="0" class="prism-code language-js codeBlock_qGQc thin-scrollbar"><code class="codeBlockLines_p187"><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token comment" style="color:#9c9c9c;font-style:italic">// React</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="font-style:italic">let</span><span class="token plain"> el </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">useRef</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="font-style:italic">let</span><span class="token plain"> q </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> gsap</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token property-access">utils</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">selector</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">el</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">      </span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token function" style="color:rgb(130, 170, 255)">useEffect</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(137, 221, 255)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// uses el.current.querySelectorAll() internally</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  gsap</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">to</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token function" style="color:rgb(130, 170, 255)">q</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:#63d55a">".box"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token literal-property property">x</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">100</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span></span><br></span></code></pre><div class="buttonGroup_6DOT"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_FhaS" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_phi_"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_FfTR"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><div class="language-js codeBlockContainer_APcc theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#28292b"><div class="codeBlockContent_m3Ux"><pre tabindex="0" class="prism-code language-js codeBlock_qGQc thin-scrollbar"><code class="codeBlockLines_p187"><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token comment" style="color:#9c9c9c;font-style:italic">// Angular</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">@</span><span class="token function maybe-class-name" style="color:rgb(130, 170, 255)">Component</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"> </span><span class="token spread operator" style="color:rgb(137, 221, 255)">...</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="font-style:italic">class</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(255, 203, 107)">MyComponent</span><span class="token plain"> </span><span class="token keyword" style="font-style:italic">implements</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(255, 203, 107)">OnInit</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token function" style="color:rgb(130, 170, 255)">constructor</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token parameter keyword" style="font-style:italic">public</span><span class="token parameter"> </span><span class="token parameter literal-property property">el</span><span class="token parameter operator" style="color:rgb(137, 221, 255)">:</span><span class="token parameter"> </span><span class="token parameter maybe-class-name">ElementRef</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="font-style:italic">this</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token property-access">q</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> gsap</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token property-access">utils</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">selector</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">el</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token function" style="color:rgb(130, 170, 255)">ngOnInit</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain">    </span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// uses this.el.nativeElement.querySelectorAll() internally</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">    gsap</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">to</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token keyword" style="font-style:italic">this</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">q</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:#63d55a">".box"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"> </span><span class="token literal-property property">x</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">100</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span></span><br></span></code></pre><div class="buttonGroup_6DOT"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_FhaS" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_phi_"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_FfTR"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>A common pattern in React is to declare a ref for every element you want to animate, but that can make your code very verbose and hard to read.</p><div class="codepen--loading"><h4>loading...</h4><iframe height="400" style="width:100%" title="GSAP Basic Tween" src="https://codepen.io/GreenSock/embed/JjWaJNy?default-tab=result&amp;theme-id=41164" frameborder="no" allowtransparency="true" allowfullscreen=""></iframe></div><p>By using a scoped selector, we only need to use a single ref. Then we can simply select the descendants.</p><div class="codepen--loading"><h4>loading...</h4><iframe height="400" style="width:100%" title="GSAP Basic Tween" src="https://codepen.io/GreenSock/embed/BaWOZpM?default-tab=result&amp;theme-id=41164" frameborder="no" allowtransparency="true" allowfullscreen=""></iframe></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="gsaputilstoarray">gsap.utils.toArray()<a href="#gsaputilstoarray" class="hash-link" aria-label="Direct link to gsap.utils.toArray()" title="Direct link to gsap.utils.toArray()">​</a></h2><p>We've also added an optional, second scope parameter to <a href="/docs/v3/GSAP/UtilityMethods/toArray()">gsap.utils.toArray()</a> </p><p>This will find all the descendant elements of myElement with the class of "box":</p><div class="language-js codeBlockContainer_APcc theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#28292b"><div class="codeBlockContent_m3Ux"><pre tabindex="0" class="prism-code language-js codeBlock_qGQc thin-scrollbar"><code class="codeBlockLines_p187"><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">gsap</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token property-access">utils</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">toArray</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:#63d55a">".box"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> myElement</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span></span><br></span></code></pre><div class="buttonGroup_6DOT"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_FhaS" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_phi_"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_FfTR"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><hr><h2 class="anchor anchorWithStickyNavbar_LWe7" id="and-more">And more...<a href="#and-more" class="hash-link" aria-label="Direct link to And more..." title="Direct link to And more...">​</a></h2><div class="theme-admonition theme-admonition-tip alert alert--success admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_S0QG"><p>GSAP 3.7 also delivers various bug fixes, so we'd highly recommend <a href="/docs/v3/Installation">installing the latest version today</a>. There are many ways to get GSAP - see the <a href="/docs/v3/Installation">Installation page</a> for all the options (download, NPM, zip, Github, etc.).</p></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="resources">Resources<a href="#resources" class="hash-link" aria-label="Direct link to Resources" title="Direct link to Resources">​</a></h2><div class="list"><ul><li><a href="https://github.com/greensock/GSAP/releases/tag/3.7.0" target="_blank" rel="noopener noreferrer">Full release notes on Github</a></li><li><a href="/resources/position-parameter/">Position parameter article</a></li><li><a href="/docs/v3/">Full documentation</a></li><li><a href="/resources/get-started">Getting started with GSAP</a></li><li><a href="/resources">Learning resources</a></li><li><a href="https://gsap.com/community/" target="_blank" rel="noopener noreferrer">Community forums</a></li></ul></div><p>Happy tweening!</p>]]></content>
        <author>
            <name>Cassie Evans</name>
            <uri>https://twitter.com/cassiecodes</uri>
        </author>
        <author>
            <name>Jack Doyle</name>
            <uri>https://twitter.com/greensock</uri>
        </author>
        <category label="release" term="release"/>
        <category label="position parameter" term="position parameter"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[3.6 release]]></title>
        <id>https://gsap.com/blog/3-6</id>
        <link href="https://gsap.com/blog/3-6"/>
        <updated>2020-10-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[* Introducing FlipPlugin]]></summary>
        <content type="html"><![CDATA[<div class="table-of-contents"><ul><li>Introducing FlipPlugin</li><li>DrawSVG Values Beyond 0-100%</li><li>ScrollTrigger snap: "labelsDirectional"</li><li>Other Improvements and Bug Fixes</li></ul></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="introducing-flipplugin">Introducing FlipPlugin<a href="#introducing-flipplugin" class="hash-link" aria-label="Direct link to Introducing FlipPlugin" title="Direct link to Introducing FlipPlugin">​</a></h2><p>Flip Plugin lets you seamlessly transition between two states even if there are sweeping changes to the structure of the DOM like re-parenting of elements which would normally cause them to jump to a new position/size. UI transitions that would normally be a nightmare just got remarkably simple to code.</p><p>Watch the visual walk through video and you'll see why this is not your typical FLIP library.</p><div class="theme-admonition theme-admonition-info alert alert--info admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_S0QG"><iframe allow="autoplay; fullscreen" frameborder="0" src="https://player.vimeo.com/video/499352774?byline=0&amp;title=0&amp;portrait=0" class="fr-draggable video"></iframe></div></div><p>It's called "Flip" because it uses the FLIP (First, Last, Invert, Play) animation technique (coined by <a href="https://aerotwist.com/blog/flip-your-animations/" target="_blank" rel="noopener noreferrer">Paul Lewis</a>).</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="resources">Resources<a href="#resources" class="hash-link" aria-label="Direct link to Resources" title="Direct link to Resources">​</a></h3><ul><li><a href="/docs/v3/Plugins/Flip">Full documentation</a></li><li><a href="https://codepen.io/collection/d725bcacb2f44bbdf0f44718f7ebbf55" target="_blank" rel="noopener noreferrer">Showcase</a></li><li><a href="https://codepen.io/collection/4a605f253549434210c139fa331704cb" target="_blank" rel="noopener noreferrer">How-to demos</a></li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="drawsvg-values-beyond-0-100">DrawSVG Values Beyond 0-100%<a href="#drawsvg-values-beyond-0-100" class="hash-link" aria-label="Direct link to DrawSVG Values Beyond 0-100%" title="Direct link to DrawSVG Values Beyond 0-100%">​</a></h2><p>DrawSVG now allows you to animate to values beyond the 0-100% range. That means that creating looping/wrapping effects with DrawSVG is even easier! Check out <a href="https://codepen.io/collection/31a5b836d70fa1d87db5f82c85ad1b50" target="_blank" rel="noopener noreferrer">this collection of demos</a> by <a href="https://twitter.com/Craig_PointC" target="_blank" rel="noopener noreferrer">Craig</a>, a GreenSock moderator and the creator of <a href="https://www.motiontricks.com/" target="_blank" rel="noopener noreferrer">MotionTricks.com</a>. </p><div class="codepen--loading"><h4>loading...</h4><iframe height="400" style="width:100%" title="GSAP Basic Tween" src="https://codepen.io/GreenSock/embed/d20a67ad5b3ed36472776cebda37c007?default-tab=result&amp;theme-id=41164" frameborder="no" allowtransparency="true" allowfullscreen=""></iframe></div><div class="codepen--loading"><h4>loading...</h4><iframe height="400" style="width:100%" title="GSAP Basic Tween" src="https://codepen.io/GreenSock/embed/rNeQNgw?default-tab=result&amp;theme-id=41164" frameborder="no" allowtransparency="true" allowfullscreen=""></iframe></div><p>DrawSVG is one of many <a href="https://gsap.com/pricing/" target="_blank" rel="noopener noreferrer">Club GSAP</a> plugins (not in the public downloads or repos).</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="scrolltrigger-snap-labelsdirectional">ScrollTrigger snap: "labelsDirectional"<a href="#scrolltrigger-snap-labelsdirectional" class="hash-link" aria-label="Direct link to ScrollTrigger snap: &quot;labelsDirectional&quot;" title="Direct link to ScrollTrigger snap: &quot;labelsDirectional&quot;">​</a></h2><p>When you've got a timeline hooked up to a ScrollTrigger, you've always been able to set <code>snap: "labels"</code> to have it dynamically snap to the closest label, but the new <code>snap: "labelsDirectional"</code> option will take into consideration the direction of scrolling and force it to go to the next label in that direction. So, for example, users aren't forced to drag past the halfway point of sections to have it snap to the next one. It may sound like a small thing, but it can make things feel so much more delightfully intuitive. In the demo below, try changing <code>snap: "labels"</code> for a comparison - notice it'll only snap once you go past halfway? But "labelsDirectional" snaps based on the direction of playhead movement.</p><div class="codepen--loading"><h4>loading...</h4><iframe height="400" style="width:100%" title="GSAP Basic Tween" src="https://codepen.io/GreenSock/embed/GRjwPgx?default-tab=result&amp;theme-id=41164" frameborder="no" allowtransparency="true" allowfullscreen=""></iframe></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="other-improvements-and-bug-fixes">Other Improvements and Bug Fixes<a href="#other-improvements-and-bug-fixes" class="hash-link" aria-label="Direct link to Other Improvements and Bug Fixes" title="Direct link to Other Improvements and Bug Fixes">​</a></h2><div class="theme-admonition theme-admonition-tip alert alert--success admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_S0QG"><p>GSAP 3.6 also has a <em>slew</em> of <a href="https://github.com/greensock/GSAP/releases/tag/3.6.0" target="_blank" rel="noopener noreferrer">other improvements and bug fixes</a> so make sure to <a href="/docs/v3/Installation/">grab the latest files</a> today! </p></div></div>]]></content>
        <author>
            <name>Cassie Evans</name>
            <uri>https://twitter.com/cassiecodes</uri>
        </author>
        <author>
            <name>Jack Doyle</name>
            <uri>https://twitter.com/greensock</uri>
        </author>
        <category label="release" term="release"/>
        <category label="flip" term="flip"/>
        <category label="drawSVG" term="drawSVG"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[3.4 release]]></title>
        <id>https://gsap.com/blog/3-4</id>
        <link href="https://gsap.com/blog/3-4"/>
        <updated>2020-06-13T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[* Accommodating different setups for various screen sizes, like a mobile version and desktop version - ScrollTrigger.matchMedia())]]></summary>
        <content type="html"><![CDATA[<div class="table-of-contents"><ul><li>Accommodating different setups for various screen sizes, like a mobile version and desktop version - <a href="/docs/v3/Plugins/ScrollTrigger/static.matchMedia()">ScrollTrigger.matchMedia()</a></li><li>Batching and staggering elements that enter the viewport, similar to what's often done with IntersectionObserver - <a href="/docs/v3/Plugins/ScrollTrigger/static.batch()">ScrollTrigger.batch()</a></li><li>Integrating with smooth scrolling libraries - <a href="/docs/v3/Plugins/ScrollTrigger/static.scrollerProxy()">ScrollTrigger.scrollerProxy()</a></li></ul></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="gsap-34-has-arrived-with-some-significant-improvements-to-scrolltrigger">GSAP 3.4 has arrived with some significant improvements to <a href="https://gsap.com/docs/v3/Plugins/ScrollTrigger/" target="_blank" rel="noopener noreferrer">ScrollTrigger</a>:<a href="#gsap-34-has-arrived-with-some-significant-improvements-to-scrolltrigger" class="hash-link" aria-label="Direct link to gsap-34-has-arrived-with-some-significant-improvements-to-scrolltrigger" title="Direct link to gsap-34-has-arrived-with-some-significant-improvements-to-scrolltrigger">​</a></h2><h2 class="anchor anchorWithStickyNavbar_LWe7" id="scrolltriggermatchmedia-scrolltriggermatchmedia">ScrollTrigger.matchMedia() <a href="#matchMedia">ScrollTrigger.matchMedia()</a><a href="#scrolltriggermatchmedia-scrolltriggermatchmedia" class="hash-link" aria-label="Direct link to scrolltriggermatchmedia-scrolltriggermatchmedia" title="Direct link to scrolltriggermatchmedia-scrolltriggermatchmedia">​</a></h2><p>You can use standard <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Media_Queries/Using_media_queries" target="_blank" rel="noopener noreferrer">media queries</a> to seamlessly transition between different ScrollTriggers. It's surprisingly simple to set up and let ScrollTrigger automatically handle all of the creating, undoing, and destroying for you.</p><iframe allow="autoplay; fullscreen" frameborder="0" src="https://player.vimeo.com/video/436997261?byline=0&amp;title=0&amp;portrait=0" class="fr-draggable video"></iframe><h3 class="anchor anchorWithStickyNavbar_LWe7" id="basic-setup">Basic setup<a href="#basic-setup" class="hash-link" aria-label="Direct link to Basic setup" title="Direct link to Basic setup">​</a></h3><div class="language-js codeBlockContainer_APcc theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#28292b"><div class="codeBlockContent_m3Ux"><pre tabindex="0" class="prism-code language-js codeBlock_qGQc thin-scrollbar"><code class="codeBlockLines_p187"><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token maybe-class-name">ScrollTrigger</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">matchMedia</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">    </span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// desktop</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token string-property property">"(min-width: 800px)"</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token keyword" style="font-style:italic">function</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// setup animations and ScrollTriggers for screens 800px wide or greater (desktop) here...</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// These ScrollTriggers will be reverted/killed when the media query doesn't match anymore.</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// mobile</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token string-property property">"(max-width: 799px)"</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token keyword" style="font-style:italic">function</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// The ScrollTriggers created inside these functions are segregated and get</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// reverted/killed when the media query doesn't match anymore. </span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">    </span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// all </span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token string-property property">"all"</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token keyword" style="font-style:italic">function</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// ScrollTriggers created here aren't associated with a particular media query,</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// so they persist.</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">    </span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span></span><br></span></code></pre><div class="buttonGroup_6DOT"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_FhaS" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_phi_"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_FfTR"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><div class="codepen--loading"><h4>loading...</h4><iframe height="400" style="width:100%" title="GSAP Basic Tween" src="https://codepen.io/GreenSock/embed/GRoyWBd?default-tab=result&amp;theme-id=41164" frameborder="no" allowtransparency="true" allowfullscreen=""></iframe></div><p>There's a new <a href="/docs/v3/Plugins/ScrollTrigger/static.saveStyles()">ScrollTrigger.saveStyles()</a> method that can be useful with matchMedia(). It saves the current inline styles for any element(s) so that they're reverted properly if animations added other inline styles. It's explained in the video above.</p><p>See the <a href="/docs/v3/Plugins/ScrollTrigger/static.matchMedia()">ScrollTrigger.matchMedia() docs</a> for details.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="scrolltriggerbatch-scrolltriggerbatch">ScrollTrigger.batch() <a href="#batch">ScrollTrigger.batch()</a><a href="#scrolltriggerbatch-scrolltriggerbatch" class="hash-link" aria-label="Direct link to scrolltriggerbatch-scrolltriggerbatch" title="Direct link to scrolltriggerbatch-scrolltriggerbatch">​</a></h2><p>Normally, each ScrollTrigger fires its callbacks (onEnter, onLeave, etc.) immediately when they occur but <strong>what if you want to coordinate an animation (like with staggers) of ALL the elements that fired a similar callback around the same time?</strong> <a href="/docs/v3/Plugins/ScrollTrigger/static.batch()">ScrollTrigger.batch()</a> creates a coordinated group of ScrollTriggers (one for each target element) that batch their callbacks within a certain interval, delivering a neat Array so that you can easily do something like create a staggered animation of all the elements that enter the viewport around the same time. It's a great alternative to <a href="https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API" target="_blank" rel="noopener noreferrer">IntersectionObserver</a> because it's more widely compatible and easier to work with. Plus you're not restricted to only entering or exiting the viewport - batch() can use ANY start and end values!</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="demo">Demo<a href="#demo" class="hash-link" aria-label="Direct link to Demo" title="Direct link to Demo">​</a></h3><div class="codepen--loading"><h4>loading...</h4><iframe height="400" style="width:100%" title="GSAP Basic Tween" src="https://codepen.io/GreenSock/embed/zYrxpmb?default-tab=result&amp;theme-id=41164" frameborder="no" allowtransparency="true" allowfullscreen=""></iframe></div><iframe allow="autoplay; fullscreen" frameborder="0" src="https://player.vimeo.com/video/437883993?byline=0&amp;title=0&amp;portrait=0" class="fr-draggable video"></iframe><p>See the <a href="/docs/v3/Plugins/ScrollTrigger/static.batch()">ScrollTrigger.batch() docs</a> for details.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="scrolltriggerscrollerproxy-scrolltriggerscrollerproxy">ScrollTrigger.scrollerProxy() <a href="#scrollerProxy">ScrollTrigger.scrollerProxy()</a><a href="#scrolltriggerscrollerproxy-scrolltriggerscrollerproxy" class="hash-link" aria-label="Direct link to scrolltriggerscrollerproxy-scrolltriggerscrollerproxy" title="Direct link to scrolltriggerscrollerproxy-scrolltriggerscrollerproxy">​</a></h2><p>ScrollTrigger purposefully avoids "scrolljacking" (disabling the browser's native scrolling behavior in favor of a custom, non-standard scrolling solution). However, smooth scrolling was by far the most requested feature to pair with ScrollTrigger. There are plenty of smooth-scrolling libraries out there, so we created the <code>.scrollerProxy()</code> method to make it simple to integrate any of them with ScrollTrigger (or create your own effects).</p><iframe allow="autoplay; fullscreen" frameborder="0" src="https://player.vimeo.com/video/437223508?byline=0&amp;title=0&amp;portrait=0" class="fr-draggable video"></iframe><p>Here's a basic example using <a href="https://github.com/locomotivemtl/locomotive-scroll" target="_blank" rel="noopener noreferrer">Locomotive Scroll</a> but check out the <a href="/docs/v3/Plugins/ScrollTrigger/static.scrollerProxy()">.scrollerProxy() docs</a> for examples with other libraries.</p><div class="codepen--loading"><h4>loading...</h4><iframe height="400" style="width:100%" title="GSAP Basic Tween" src="https://codepen.io/GreenSock/embed/1dc38ca14811bc76e25c4b8c686b653d?default-tab=result&amp;theme-id=41164" frameborder="no" allowtransparency="true" allowfullscreen=""></iframe></div><hr><h2 class="anchor anchorWithStickyNavbar_LWe7" id="and-more-and-more">And more... <a href="#andMore">And more...</a><a href="#and-more-and-more" class="hash-link" aria-label="Direct link to and-more-and-more" title="Direct link to and-more-and-more">​</a></h2><p>GSAP 3.4 also delivers various bug fixes, so we'd highly recommend <a href="/docs/v3/Installation">installing the latest version today</a>. There are many ways to get GSAP - see the <a href="/docs/v3/Installation">Installation page</a> for all the options (download, NPM, zip, Github, etc.).</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="resources-resources">Resources <a href="#more-resources">Resources</a><a href="#resources-resources" class="hash-link" aria-label="Direct link to resources-resources" title="Direct link to resources-resources">​</a></h2><ul><li><a href="https://github.com/greensock/GSAP/releases/" target="_blank" rel="noopener noreferrer">Full release notes on Github</a></li><li><a href="/docs/v3/">Full documentation</a></li><li><a href="/resources/get-started">Getting started with GSAP</a></li><li><a href="/resources/">Learning resources</a></li><li><a href="https://gsap.com/community/" target="_blank" rel="noopener noreferrer">Community forums</a></li><li><a href="https://www.creativecodingclub.com/courses/scrolltrigger-express?ref=44f484" target="_blank" rel="noopener noreferrer">ScrollTrigger Express</a> video course from Snorkl.tv</li></ul><p>Happy tweening!</p>]]></content>
        <author>
            <name>Jack Doyle</name>
            <uri>https://twitter.com/greensock</uri>
        </author>
        <category label="release" term="release"/>
        <category label="scrolltrigger" term="scrolltrigger"/>
        <category label="matchmedia" term="matchmedia"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[3.2 release]]></title>
        <id>https://gsap.com/blog/3-2</id>
        <link href="https://gsap.com/blog/3-2"/>
        <updated>2020-03-24T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[* New: "alignOrigin" for motion paths]]></summary>
        <content type="html"><![CDATA[<div class="table-of-contents"><ul><li>New: "alignOrigin" for motion paths</li><li>New: getRelativeDistance() that transcends coordinate spaces</li><li>convert coordinates between elements/contexts</li></ul></div><p>GSAP 3.2 has some groundbreaking features for converting coordinates and aligning elements. Check out the video explanation below. Warning: it's a bit advanced, but hopefully you'll see how crazy-useful these capabilities can be. </p><iframe allow="autoplay; fullscreen" frameborder="0" src="https://player.vimeo.com/video/398994158?byline=0&amp;title=0&amp;portrait=0" class="fr-draggable video"></iframe><h2 class="anchor anchorWithStickyNavbar_LWe7" id="new-alignorigin-for-motion-paths">New: "alignOrigin" for motion paths<a href="#new-alignorigin-for-motion-paths" class="hash-link" aria-label="Direct link to New: &quot;alignOrigin&quot; for motion paths" title="Direct link to New: &quot;alignOrigin&quot; for motion paths">​</a></h2><p><a href="/docs/v3/Plugins/MotionPathPlugin/">MotionPathPlugin</a> recognizes a new <code>alignOrigin</code> property that pins a certain spot on the target to the path. For example, <code>alignOrigin: [0.5, 0.5]</code> pins the <strong>center</strong> of the target on the path and sets the transformOrigin accordingly so that rotations are around that point as well. To get a similar effect before 3.2, you'd need to set the transformOrigin separately as well as a -50 xPercent/yPercent.</p><p>Use the Array syntax to define progress values along the x and y axis, so <code>[1, 0.5]</code> would be the right side, centered vertically. Or use a point object like <code>{x: 20, y: 50}</code> to specify a coordinate (measured from the top left corner in pixels at its native size).</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="sample-code">Sample code<a href="#sample-code" class="hash-link" aria-label="Direct link to Sample code" title="Direct link to Sample code">​</a></h3><div class="language-js codeBlockContainer_APcc theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#28292b"><div class="codeBlockContent_m3Ux"><pre tabindex="0" class="prism-code language-js codeBlock_qGQc thin-scrollbar"><code class="codeBlockLines_p187"><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token comment" style="color:#9c9c9c;font-style:italic">// Move the element along a path, rotating it along with the line</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">gsap</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token method function property-access" style="color:rgb(130, 170, 255)">to</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:#63d55a">"#spaceship"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token literal-property property">duration</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">5</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token literal-property property">motionPath</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token literal-property property">path</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:#63d55a">"#path"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token literal-property property">autoRotate</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">true</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token literal-property property">align</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:#63d55a">"#path"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token literal-property property">alignOrigin</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token number" style="color:rgb(247, 140, 108)">0.5</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">0.5</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"> </span><span class="token comment" style="color:#9c9c9c;font-style:italic">// aligns the center of the target on the path</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span></span><br></span></code></pre><div class="buttonGroup_6DOT"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_FhaS" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_phi_"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_FfTR"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><div class="codepen--loading"><h4>loading...</h4><iframe height="400" style="width:100%" title="GSAP Basic Tween" src="https://codepen.io/GreenSock/embed/gOpdKpm?default-tab=result&amp;theme-id=41164" frameborder="no" allowtransparency="true" allowfullscreen=""></iframe></div><p>See the <a href="/docs/v3/Plugins/MotionPathPlugin">MotionPathPlugin docs</a> for details.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="new-getrelativedistance-that-transcends-coordinate-spaces">New: getRelativeDistance() that transcends coordinate spaces<a href="#new-getrelativedistance-that-transcends-coordinate-spaces" class="hash-link" aria-label="Direct link to New: getRelativeDistance() that transcends coordinate spaces" title="Direct link to New: getRelativeDistance() that transcends coordinate spaces">​</a></h2><p>Have you ever wanted to move one element to another element even if they're in different containers... which may have various transforms, warping the coordinate systems and making it super difficult to calculate? If so, you will love this magical function which is explained in the video at the top of this page.</p><div class="codepen--loading"><h4>loading...</h4><iframe height="400" style="width:100%" title="GSAP Basic Tween" src="https://codepen.io/GreenSock/embed/4c7902f691dd5e2216200e5f14f75071?default-tab=result&amp;theme-id=41164" frameborder="no" allowtransparency="true" allowfullscreen=""></iframe></div><p>See the <a href="/docs/v3/Plugins/MotionPathPlugin/static.getRelativePosition()">getRelativePosition() docs</a> for details.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="new-convert-coordinates-between-elementscontexts">New: convert coordinates between elements/contexts<a href="#new-convert-coordinates-between-elementscontexts" class="hash-link" aria-label="Direct link to New: convert coordinates between elements/contexts" title="Direct link to New: convert coordinates between elements/contexts">​</a></h2><p>GSAP can now take a local coordinate from inside one element and calculate exactly where that coordinate lines up inside of ANOTHER element's local coordinate space! So you could take a "click" pointer event from the window and map that to an element's local coordinate system <strong>even if it's deeply nested inside various containers that have transforms applied!</strong> Or, as you can see in the demo below, convert between coordinate spaces to make the blue arm stay connected with the rotating red arm:</p><div class="codepen--loading"><h4>loading...</h4><iframe height="400" style="width:100%" title="GSAP Basic Tween" src="https://codepen.io/GreenSock/embed/GRJEGzB?default-tab=result&amp;theme-id=41164" frameborder="no" allowtransparency="true" allowfullscreen=""></iframe></div><p>See the <a href="/docs/v3/Plugins/MotionPathPlugin/static.convertCoordinates()">convertCoordinates() docs</a> for details.</p><hr><h2 class="anchor anchorWithStickyNavbar_LWe7" id="and-more">And more...<a href="#and-more" class="hash-link" aria-label="Direct link to And more..." title="Direct link to And more...">​</a></h2><p>GSAP 3.2 also delivers various bug fixes, so <a href="/docs/v3/Installation/">install the latest version today</a> (3.2.6). There are many ways to get GSAP - see the <a href="/docs/v3/Installation">Installation page</a> for all the options (download, NPM, zip, etc.)</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="resources">Resources<a href="#resources" class="hash-link" aria-label="Direct link to Resources" title="Direct link to Resources">​</a></h2><ul><li><a href="https://github.com/greensock/GSAP/releases/" target="_blank" rel="noopener noreferrer">Full release notes on each release is on Github</a></li><li><a href="/docs/v3/">Full documentation</a></li><li>In case you missed it: <a href="/3-1/">GSAP 3.1 highlights</a> (previous release)</li><li><a href="/resources/get-started">Getting started with GSAP</a></li><li><a href="/resources/">Learning resources</a></li><li><a href="https://gsap.com/community/" target="_blank" rel="noopener noreferrer">Community forums</a></li></ul><p>Happy tweening!</p>]]></content>
        <author>
            <name>Jack Doyle</name>
            <uri>https://twitter.com/greensock</uri>
        </author>
        <category label="release" term="release"/>
        <category label="motionpath" term="motionpath"/>
    </entry>
</feed>