GreenSock (TweenMax) 動畫案例(二)

實現效果

clipboard.png

動畫分解

1.燈光閃爍
2.文字出現
3.水流
4.心電圖web

知識點

1.AI(可盡情騷擾UI歐巴)
2.SVG(瞭解基本的知識點)
3.TweenMax(GreenSock)
4.CSS animationsegmentfault

寫在前面

寫過第一篇文章後GreenSock (TweenMax) 動畫案例(一)再回頭看發現代碼太多,根本沒耐心去看完。因此每個動畫效果此次都儘可能分開詳細的寫出來,看的時候不會太亂。涉及到的知識點和本身遇到的坑也儘可能提出來,可以讓你們不走彎路。AI操做這裏就再也不贅述了,在GreenSock (TweenMax) 動畫案例(一)中有說到AI轉svg文件。這裏先拋出一個問題,關於SVG animation運動,也就是路徑動畫如何實現,以及如何兼容IE,能夠看一下解決SVG animation 在IE中不起做用瀏覽器

1.燈光閃爍

設置初始透明度爲0svg

<style>
#lightning{
    opacity:0;
}
</style>
var light = $("#lightning");
    function sceneOne() {
       var tl = new TimelineMax();
       //實現閃爍
        tl.to(light, 0.5, {
            opacity: 1,
            //閃電閃三次,這裏repeat:2我的認爲var master = new TimelineMax({repeat: -1});
            //重複第一次的時候,tl.to(light, 0.5, { opacity: 1,repeat: 2,});裏重複兩遍,共三遍 
            repeat: 2, //閃電閃三次
        });
        tl.to(light, 0.25, {opacity: 0});//閃爍消失
    
        
    }
    var master = new TimelineMax({repeat: -1});//重複整個場景動畫
    master.add(sceneOne(), "scene1");

2.文字出現

文字顯示在閃爍以後,因此直接添加到上文的tl.to(light, 0.25, {opacity: 0});//閃爍消失以後就能夠了。初始狀態透明度爲0動畫

<style>
#text{
    opacity:0;
}
</style>
tl.to(text, 2, {opacity: 1});//閃爍完成後顯示
   tl.to(text, 1, {opacity: 0});//隨即消失

這裏有個問題研究了好久,就是透明度0->1->0的過程,使用tl.fromTo()(text, 2, {opacity: 1},{opacity: 0});畫面一進入text就顯示,沒有在三秒後才顯示即便CSS設置了opacity:0。只能使用兩個to方法實現,但願能獲得高手的幫助。spa

3.水流

水流動畫涉及到了CSS animation,水流動的時候涉及到了四條路徑,咱們先研究一條路徑,路徑包括兩個屬性,stroke-dasharray的值:223表示穿過水管的水的長度,1000表示儘可能長的一段空白,stroke-dashoffset: 223;在這裏表示水一開始的偏移量,animation就不在講解了, to{stroke-dashoffset: -1000; }動畫移動到的終點位置,就是讓整個水流向前進了1000,這裏的負號涉及到了水流的方向。四段水流都是這種方式來移動。畫個圖就好設置參數了,畫了個慘不忍睹的圖來理一下思路。code

clipboard.png對象

#path {
  stroke-dasharray: 223,1000;//路徑虛實顯示方式
  stroke-dashoffset: 223;  //初始偏移位置
  animation: dash 10s linear  5s  infinite; //執行動畫,後面的5s是延遲執行,由於是右側水管,因此要延遲5s 
} 

@keyframes dash {
  to{
    stroke-dashoffset: -1000; 
  }
}

兼容其餘瀏覽器代碼blog

svg #path {
    stroke-dasharray: 223, 1000;
    stroke-dashoffset: 223;
    animation: dash 10s linear 5s infinite;
    -moz-animation: dash 10s linear 5s infinite;
    -webkit-animation: dash 10s linear 5s infinite;
}

@keyframes dash {
    to {
        stroke-dashoffset: -1000;
    }
}

@-moz-keyframes dash {
    to {
        stroke-dashoffset: -1000;
    }
}

@-webkit-keyframes dash {
    to {
        stroke-dashoffset: -1000;
    }
}

@-o-keyframes dash {
    to {
        stroke-dashoffset: -1000;
    }
}

其餘三個水管也是相同的方法進行設置,都設置完畢效果以下,路徑長度可使用snap.svg-min.js的getTotalLength()方法獲取長度,完整代碼js部分有詳細的獲取方式。
完整效果
水流效果基本完成,這個效果沒辦法在IE裏好好運動,是整個代碼的雞肋。接下來就是兼容IE全部版本了。
animateRoute(path, 457, -766, -1);
這裏的參數457和-766是開始,結束位置的偏移量。這裏爲了讓他有延遲的效果,起始位置加了234,這個長度是左側水管流過來的距離,相應的終點位置-1000+234=-766,-1的絕對值越大速度越快,負號表明方向。其餘幾個水流也是相同的方法,這裏涉及到不一樣水管的流動起始位置,數值須要算一下。
IE效果
這裏對svg代碼作了小的改動。stroke-width="10"的值改爲了6,讓動畫能流暢顯示出來,到此水流的效果基本實現ip

var path = document.querySelector('#path');
 animateRoute(path, 457, -766, -1);

/*
* ele  //路徑對象
* offset //初始偏移位置
* end    //結束位置
* speed  //速度(正負表示方向)
*/
function animateRoute(ele, offset, end, speed) {
    if (!isIE())return;
    var _offset = offset;
    var offsetMe = function () {
        if (speed < 0) {
            if (offset < end) offset = _offset;
        } else {
            if (offset > end) offset = _offset;
        }
        ele.style.strokeDashoffset = offset;
        offset = offset + speed;
        requestAnimationFrame(offsetMe);
    }
    offsetMe();
}

function isIE() { //ie?
    if (!!window.ActiveXObject || "ActiveXObject" in window)
        return true;
    else
        return false;
}
var path = document.querySelector('#path');
    var path1 = document.querySelector('#path1');
    var path2 = document.querySelector('#path2');
    var path3 = document.querySelector('#path3');

    animateRoute(path, 457, -766, -1);
    animateRoute(path1, 457, -766, -1);
    animateRoute(path2, -234, 1000, 1);
    animateRoute(path3, -234, 1000, 1);

2017.09.07更新~未編輯完~

相關文章
相關標籤/搜索