Forum Discussion
Storyline360, Animation and GSAP ( Greensock )
Hi,
Trying to figure something out in SL360 i stumbled upon  the ds-bootstrap.min.js file thats added to the lib/scripts folder when publishing a Storyline360 file. In that file are GSAP(Greensock) references... some samples../*! * VERSION: 1.11.8 * DATE: 2014-05-13 * UPDATES AND DOCS AT: http://www.greensock.com * * @license Copyright (c) 2008-2014, GreenSock. All rights reserved. * This work is subject to the terms at http://www.greensock.com/terms_of_use.html or for * Club GreenSock members, the software agreement that was issued with your membership. *  * @author: Jack Doyle, jack@greensock.com */
What i can find in that file that both GSAP CSS-plugin, easing and basic GSAP tweens are somehow used in Storyline.
Bad news however is that its a really old version they have implemented... from 2014... version 1.11.8, whereas the current GSAP version is version 3.5.1 !!!
Big advantages of the newer GSAP are mobile performance, speed and perfect control over SVG. So Storyline would certainly benefit from updating their internal used Storyline to the latest version.
As Storyline probably uses GSAP for all its animation features, the transitions and everything, i personally would really like it to have the control of GSAP in the hands of the frontend-user. I do use GSAP constantly in my elearning projects, but always have to add the newest version..
Is there an option to get the latest version of GSAP implemented in Storyline?
And can we have some better scripted control over Storyline elements...as you do use it already anyway?
Kind regards,
Math Notermans
63 Replies
- larryvanwave-ffCommunity MemberI purchased Club Greensock, and I have not been able to successfully get SplitText plugin to work. Any idea what I am missing here: 
 ================ code ==============
 //name the vars of elements on the slide
 var txt1 = document.querySelectorAll("[data-acc-text='text1']");
 //load in the plugins
 dynamicallyLoadScripts([
 "https://(our server site is here)/greensock/minified/SplitText.min.js",
 ], onLoadScripts);
 function onLoadScripts() {
 split = new SplitText(txt1, {type:"chars"})
 animation.from(split.chars, {opacity:0, y:50, ease:"back(4)", stagger:{
 from:"end", //try "center" and "edges"
 each:0.05
 }})
 }
 
 //the function that look for and loads the urls
 function dynamicallyLoadScripts(urls, onComplete) {
 if (typeof urls === "string") {
 urls = [urls];
 }
 let toLoad = urls.length;
 urls.forEach(function(url) {
 let script = document.createElement("script");
 script.src = url;
 document.head.appendChild(script);
 script.addEventListener("load", function() {
 if (!--toLoad) {
 onComplete && onComplete();
 }
 })
 });
 }- Jürgen_Schoene_Community MemberSplitText only works for normal DOM text, not for SVG text <tspan> (which is used by storyline for text) https://greensock.com/forums/topic/12165-splittext-with-svg-text-element-problems/ (Posted August 6, 2015 - I do not believe that anything has changed) - PhilMayorSuper HeroJurgen would it work with the accessible text which is not meant to be SVG based Sent from my iPhone 
 
- MathNotermans-9Community MemberAs a reply on how to use DOM related plugins like GSAP's SplitText and ScrambleText on SVG text in Storyline i made a sample. 
 https://360.articulate.com/review/content/670bb432-b866-436b-8c1b-1b37d824dd0c/review
 I use the lines of code as shown to Phil to grab the texts from all textfields in Storyline ( including buttons )...Determine which one i want to use ( in this case that is i1 ) Then i add a pure HTML text field to Storyline by appending it to a shape onscreen. And that textfield i can then target with GSAPs SplitText or ScrambleText.
 Some weirdness with the missing i in textfield. Not sure where that comes from... but this is basically the setup you need to get this working.- PhilMayorSuper HeroThanks Math for the help, I am sure this will work Sent from my iPhone 
 
 
- larryvanwave-ffCommunity MemberI am wondering why I can get ScrambleTextPlugin to work, does it use a normal DOM text or a SVG text <tspan>? - Jürgen_Schoene_Community Membermy assumption - SplitText tries to read the text from the DOM -> nothing found, all text is in <tspan>
 - ScrampleText creates with Javascript the text as DOM text and then animated it
 
 
- larryvanwave-ffCommunity MemberI really like this feature and was hoping that it would work. Thank you for sharing your knowledge and expertise! 
- MathNotermans-9Community MemberAll Storyline text adds extra <spans> and is SVG, thus its hard to get pure HTML related things to work. 
 Do try add a textelement with code and you will see it works on those.
- larryvanwave-ffCommunity MemberThank you Math for the information and example, it looks like the SplitText is working when you use this method. You highlighted the steps, and I am going to see if I can get it to work for me. Your amazing! - MathNotermans-9Community MemberTo help you get started.... 
 This is my function that does the work.function docLoaded_inSL(){const collection = document.getElementsByClassName("vector-text-item");const textsArray = [];let baseStr;for(var i = 0; i < collection.length;i++){var sStr = player.GetVar("debugStr");var someStr = gsap.getProperty(collection[i], "textContent");var someNewStr = sStr+"<BR>"+"i "+i+": "+someStr;player.SetVar("debugStr",someNewStr);textsArray.push(gsap.getProperty(collection[i], "textContent"));}const h1 = document.createElement("H1");const textNode = document.createTextNode(gsap.getProperty(collection[1], "textContent"));h1.appendChild(textNode);document.querySelector("[data-acc-text='canvasShape']").appendChild(h1);var tl = gsap.timeline(),mySplitText = new SplitText("H1", { type: "words,chars" }),chars = mySplitText.chars; //an array of all the divs that wrap each charactergsap.set("H1", { perspective: 400 });tl.from(chars, {duration: 0.8,opacity: 0,scale: 0,y: 80,rotationX: 180,transformOrigin: "0% 50% -50",ease: "back",stagger: 0.01});}
 Basically it gets all texts from Storyline, and then i use one of them to create a HTML textfield to be targeted by SplitText.
 Offcourse you can simplify it.
 For example by creating a function to create HTML Text elements.function createHTMLText(_string,_targetAccName,_elName){const h1 = document.createElement(_elName);const textNode = document.createTextNode(_string);h1.appendChild(textNode);document.querySelector("[data-acc-text='"+_targetAccName+"']").appendChild(h1);}
 You can then call that like this...createHTMLText(gsap.getProperty(collection[1], "textContent"),"canvasShape","H1");or if you donot want to use an existing Storyline textfield, just like this...createHTMLText("Text to be animated by SplitText","myShape","H1");
 And the SplitText functionality you also can put in a function.function createSplitTextAni(_elName){var tl = gsap.timeline(),mySplitText = new SplitText(_elName, { type: "words,chars" }),chars = mySplitText.chars; //an array of all the divs that wrap each charactergsap.set(_elName, { perspective: 400 });tl.from(chars, {duration: 0.8,opacity: 0,scale: 0,y: 80,rotationX: 180,transformOrigin: "0% 50% -50",ease: "back",stagger: 0.01});}
 So now this cleaned up code will work.let mySplitString = "Bladibla vanillevla and some more text to test this";createHTMLText(mySplitString,"accNameOfSomeShape","H1");createSplitTextAni("H1");function createHTMLText(_string,_targetAccName,_elName){const newElement = document.createElement(_elName);const textNode = document.createTextNode(_string);newElement.appendChild(textNode);document.querySelector("[data-acc-text='"+_targetAccName+"']").appendChild(newElement);}function createSplitTextAni(_elName){var tl = gsap.timeline(),mySplitText = new SplitText(_elName, { type: "words, chars" }),chars = mySplitText.chars; //an array of all the divs that wrap each charactergsap.set(_elName, { perspective: 400 });tl.from(chars, {duration: 0.8,opacity: 0,scale: 0,y: 80,rotationX: 180,transformOrigin: "0% 50% -50",ease: "back",stagger: 0.01});}
 A few things to watch though. As i use H1 for texts... that is deliberately. You do need to format your HTML text somewhat, if you donot, you probably will not see a SplitText animation. Ofcourse you can format it any way you want, but it has to have some formatting before running SplitText on it.
 Hope this helps.
 
- larryvanwave-ffCommunity MemberThis is great! thank you for going through the steps and showing the code breakdown for this. I am not sure how you figure all this out, but you are amazing. I am going to add this code in my file, and will test it out. 
- PhilMayor-b4ca0Community MemberHey Math Got lost on this var player = GetPlayer(); 
 const collection = document.getElementsByClassName("vector-text-item");
 const textsArray = [];
 let baseStr;
 for(var i = 0; i < collection.length;i++){
 var sStr = player.GetVar("debugStr");
 var someStr = gsap.getProperty(collection[i], "textContent");
 var someNewStr = sStr+"<BR>"+"i "+i+": "+someStr;
 player.SetVar("debugStr",someNewStr);
 textsArray.push(gsap.getProperty(collection[i], "textContent"));
 }
 console.log("someText: "+ someNewStr);That gives me all of the text in the course in the console, how do I get the text in just one shape? I am missing something big I am sure. 
- MathNotermans-9Community Member2 Phil Mayors here? Which one is the real one ;-) Or is one Phil Minor ;-) 
 Basically its all in the code as is.
 Here i set a variable.player.SetVar("debugStr",someNewStr);
 So if you add an inline variable anywhere in your project...it will show the text.
 But if you want a single value from a given element in your project...
 Use this...var player = GetPlayer();// collection will be a collection of ALL elements with textconst collection = document.getElementsByClassName("vector-text-item");/*Depending of the amount of your texts you need a specific one.Storyline will count up from 0 till the top layer on top.So depending on your Storyline this number will differ.0 is the lowest layer.
 collection[0] or collection[7] or whatever layer you need.*/var someStr = gsap.getProperty(collection[0], "textContent");player.SetVar("debugStr",someStr);console.log("someText: "+ someStr);- PhilMayor-b4ca0Community MemberThanks Math there are two of me, the other one is the real one this is my other account for a specific company. I was definitely missing something. I need lots of these slides that are copies of one another with different text in, do the layers stay the same in each slide or do I need to find the correct layer on a slide by slide basis? Sent from Outlook for iOS 
 This is a confidential email. Tesco may monitor and record all emails. The views expressed in this email are those of the sender and not Tesco. Tesco Stores Limited Company Number: 519500 Registered in England Registered Office: Tesco House, Shire Park, Kestrel Way, Welwyn Garden City, AL7 1GA VAT Registration Number: GB 220 4302 31
 
- MathNotermans-9Community MemberSo this is the solution you want ;-) 
 https://360.articulate.com/review/content/07c6804a-d8cd-4d8a-add0-a8535d3bcd24/review
 If you can add a acc-name to the textfields you want the text from... then this is the code to use.var player = GetPlayer();var myElement = document.querySelector("[data-acc-text='selectMe']");var someStr = gsap.getProperty(myElement, "textContent");player.SetVar("debugStr",someStr);console.log("correct textfield is: "+someStr);
 If however you cannot add an acc-name to that particular textfield... go for the solution on the last slide...'eightSlide'. I add a textfield with the text 'dummy' in it ( you can make it invisible ) and in the code check for that. Like this...var player = GetPlayer();const collection = document.getElementsByClassName("vector-text-item");for(var i = 0; i < collection.length;i++){var someStr = gsap.getProperty(collection[i], "textContent");if(someStr=="dummy"){console.log("textfield above the one we need is: "+i+" and text is "+someStr);var layerNum = i-1;var correctStr = gsap.getProperty(collection[layerNum], "textContent");console.log("text is: "+correctStr);} else{}}
 For your ease added the .story
- Jürgen_Schoene_Community Memberone small addition - the storyline char encoding for the vector text is sometimes a bit strange "f" -> \uE000 correctStr = correctStr.replaceAll("\uE000", "f")- MathNotermans-9Community MemberThanks Jurgen for this addition as it puzzled me ;-) 
- MathNotermans-9Community Member@Jurgen How you find those codes for encoding? Run into the fact that 'fi' , for example in 'textfield' also gives errors and cannot find the proper code for this ? - PhilMayorSuper HeroLigature Unicode for fi are here https://www.fileformat.info/info/unicode/char/fb01/index.htm Sent from my iPhone 
 
 
Related Content
- 9 months ago
- 11 months ago
- 8 months ago