JS動畫(五)


上節(jié)課 我們講解了如何獲取到非行內(nèi)樣式,并完成了一個簡單的div寬度變化霎箍,現(xiàn)在我們繼續(xù)完善,實現(xiàn)如下效果:

animation.png
實現(xiàn)過程:

a. 設(shè)置其鼠標的移動事件:

window.onload = function () {
            //獲取到div元素
            var div1 = document.getElementById("div1");
            //設(shè)置鼠標事件
            div1.onmouseover = function () {
                startMove(this, 400);
            };
            div1.onmouseout = function () {
                startMove(this, 200);
            }
        };

b. 獲取到元素樣式函數(shù):

function getStyle(obj, attr) {
            //判斷是否支持currentStyle屬性读宙,若為IE則支持
            if (obj.currentStyle){
                //返回該樣式
                return obj.currentStyle[attr];
            }
            //若不支持稚补,則使用getComputedStyle方法,使得火狐和谷歌支持
            else {
                return getComputedStyle(obj, null)[attr];
            }
        }

實現(xiàn)運動事件:

 function startMove(obj,iTarget) {
            //取消其他time事件慎菲,防止鼠標多次的移入移出產(chǎn)生異常的效果
            clearInterval(obj.timer);
            //設(shè)置time事件嫁蛇,每30ms執(zhí)行一次
            obj.timer = setInterval(function (){
                //獲取到當前元素的寬度,并轉(zhuǎn)換為int類型
                var iCurrent = parseInt(getStyle(obj, 'width'));
                //計算其速度
                var speed = (iTarget - iCurrent) / 8;
                //對速度進行取整露该,因為上面的除法可能會產(chǎn)生小數(shù)點
                speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
                //與目標值進行比較棠众,達到目標值,則取消時間函數(shù)
                if(iCurrent == iTarget){
                    clearInterval(obj.timer);
                }
                //未到達目標值有决,則進行改變樣式
                else {
                    obj.style['width'] = iCurrent + speed + 'px';
                }
            },30);
        }

關(guān)于ceil()函數(shù)floor()函數(shù)
Math.ceil(x) : 返回大于等于x,并且與它最接近的整數(shù)空盼。
Math.floor(x):小于等于x书幕,并且與x最接近的整數(shù)。

實現(xiàn)動畫:一個改變div的寬度揽趾,一個改變div的高度台汇,效果如下:

animation.png

實際上,我們改變寬度的div動畫已經(jīng)實現(xiàn)了篱瞎,而對于改變div的高度也就是將要改變的樣式修改為高度即可:增加了startMove1函數(shù)

 window.onload = function () {
            //獲取到div元素
            var div1 = document.getElementById("div1");
            var div2 = document.getElementById("div2");

            //設(shè)置鼠標事件
            div1.onmouseover = function () {
                startMove(this, 400);
            };
            div1.onmouseout = function () {
                startMove(this, 200);
            };

            div2.onmouseover = function () {
                startMove1(this,400);
            };
            div2.onmouseout = function () {
                startMove1(this, 200);
            }
        };

 function startMove1(obj,iTarget) {
            //取消其他time事件苟呐,防止鼠標多次的移入移出產(chǎn)生異常的效果
            clearInterval(obj.timer);
            //設(shè)置time事件,每30ms執(zhí)行一次
            obj.timer = setInterval(function (){
                //獲取到當前元素的寬度俐筋,并轉(zhuǎn)換為int類型
                var iCurrent = parseInt(getStyle(obj, 'height'));
                //計算其速度
                var speed = (iTarget - iCurrent) / 8;
                //對速度進行取整牵素,因為上面的除法可能會產(chǎn)生小數(shù)點
                speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
                //與目標值進行比較,達到目標值澄者,則取消時間函數(shù)
                if(iCurrent == iTarget){
                    clearInterval(obj.timer);
                }
                //未到達目標值笆呆,則進行改變樣式
                else {
                    obj.style['height'] = iCurrent + speed + 'px';
                }
            },30);
        }

我們對比一下startMove函數(shù)和startMove1函數(shù),實際上就是改變的樣式不同粱挡,一個改變寬度赠幕,一個改變高度。因此询筏,我們可以修改榕堰,將兩個函數(shù)合并起來。

        window.onload = function () {
            //獲取到div元素
            var div1 = document.getElementById("div1");
            var div2 = document.getElementById("div2");

            //傳入寬度樣式
            div1.onmouseover = function () {
                startMove(this, 400,'width');
            };
            div1.onmouseout = function () {
                startMove(this, 200,'width');
            };
            //傳入高度樣式
            div2.onmouseover = function () {
                startMove(this,400,'height');
            };
            div2.onmouseout = function () {
                startMove(this, 200,'height');
            }
        };
        //增加了attr參數(shù)嫌套,表示要改變的樣式
        function startMove(obj,iTarget,attr) {
            clearInterval(obj.timer);
            obj.timer = setInterval(function (){
                //傳入樣式參數(shù)
                var iCurrent = parseInt(getStyle(obj, attr));
                var speed = (iTarget - iCurrent) / 8;
                speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
                if(iCurrent == iTarget){
                    clearInterval(obj.timer);
                }
                else {
                    //對傳入的樣式進行改變
                    obj.style[attr] = iCurrent + speed + 'px';
                }
            },30);
        }

實際上逆屡,修改的部分即含有注釋部分圾旨。

完整代碼如下:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Get Style</title>
    <style>
        ul{
            list-style: none;
        }
        #div1{
            width: 200px;
            height: 200px;
            background: #ff0;
            border: 2px solid #000;
        }
        #div2{
            width: 200px;
            height: 200px;
            background: #ff0;
            border: 2px solid #000;
        }
    </style>
    <script>
        window.onload = function () {
            //獲取到div元素
            var div1 = document.getElementById("div1");
            var div2 = document.getElementById("div2");

            //設(shè)置鼠標事件
            div1.onmouseover = function () {
                startMove(this, 400,'width');
            };
            div1.onmouseout = function () {
                startMove(this, 200,'width');
            };

            div2.onmouseover = function () {
                startMove1(this,400,'height');
            };
            div2.onmouseout = function () {
                startMove1(this, 200,'height');
            }
        };
        //增加了attr參數(shù),表示要改變的樣式
        function startMove(obj,iTarget,attr) {
            clearInterval(obj.timer);
            obj.timer = setInterval(function (){
                //傳入樣式參數(shù)
                var iCurrent = parseInt(getStyle(obj, attr));
                var speed = (iTarget - iCurrent) / 8;
                speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
                if(iCurrent == iTarget){
                    clearInterval(obj.timer);
                }
                else {
                    //對傳入的樣式進行改變
                    obj.style[attr] = iCurrent + speed + 'px';
                }
            },30);
        }

        /**
         * 封裝一個函數(shù)用來獲取樣式
         * @param obj 傳入的元素對象
         * @param attr 傳入要獲取的樣式
         * @returns {*}
         */
        function getStyle(obj, attr) {
            //判斷是否支持currentStyle屬性康二,若為IE則支持
            if (obj.currentStyle){
                //返回該樣式
                return obj.currentStyle[attr];
            }
            //若不支持碳胳,則使用getComputedStyle方法,使得火狐和谷歌支持
            else {
                return getComputedStyle(obj, null)[attr];
            }
        }
    </script>

</head>
<body>
<ul>
    <li>
        <div id="div1"></div>
    </li>

    <li>
        <div id="div2"></div>
    </li>
</ul>
</body>
</html>
總結(jié):

這一節(jié)主要學習了修改不同樣式的動畫沫勿,并做了一定的封裝挨约。注意:對于重復的代碼,我們一定要將其合并产雹,使代碼顯得更加整潔诫惭。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蔓挖,隨后出現(xiàn)的幾起案子夕土,更是在濱河造成了極大的恐慌,老刑警劉巖瘟判,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件怨绣,死亡現(xiàn)場離奇詭異,居然都是意外死亡拷获,警方通過查閱死者的電腦和手機篮撑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來匆瓜,“玉大人赢笨,你說我怎么就攤上這事⊥灾ǎ” “怎么了茧妒?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵,是天一觀的道長左冬。 經(jīng)常有香客問我桐筏,道長,這世上最難降的妖魔是什么拇砰? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任九昧,我火速辦了婚禮,結(jié)果婚禮上毕匀,老公的妹妹穿的比我還像新娘铸鹰。我一直安慰自己,他們只是感情好皂岔,可當我...
    茶點故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布蹋笼。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪剖毯。 梳的紋絲不亂的頭發(fā)上圾笨,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天,我揣著相機與錄音逊谋,去河邊找鬼擂达。 笑死,一個胖子當著我的面吹牛胶滋,可吹牛的內(nèi)容都是我干的板鬓。 我是一名探鬼主播,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼究恤,長吁一口氣:“原來是場噩夢啊……” “哼俭令!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起部宿,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤抄腔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后理张,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赫蛇,經(jīng)...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年雾叭,在試婚紗的時候發(fā)現(xiàn)自己被綠了悟耘。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,912評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡拷况,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出掘殴,到底是詐尸還是另有隱情赚瘦,我是刑警寧澤,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布奏寨,位于F島的核電站起意,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏病瞳。R本人自食惡果不足惜揽咕,卻給世界環(huán)境...
    茶點故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望套菜。 院中可真熱鬧亲善,春花似錦、人聲如沸逗柴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至渣蜗,卻和暖如春屠尊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背耕拷。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工讼昆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人骚烧。 一個月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓浸赫,卻偏偏與公主長得像,于是被迫代替她去往敵國和親止潘。 傳聞我的和親對象是個殘疾皇子掺炭,可洞房花燭夜當晚...
    茶點故事閱讀 45,922評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標簽?zāi)J的外補...
    _Yfling閱讀 13,762評論 1 92
  • 一凭戴、JS前言 (1)認識JS 也許你已經(jīng)了解HTML標記(也稱為結(jié)構(gòu))涧狮,知道了CSS樣式(也稱為表示),會使用HT...
    凜0_0閱讀 2,777評論 0 8
  • 第1章 認識JS JavaScript能做什么么夫?1.增強頁面動態(tài)效果(如:下拉菜單者冤、圖片輪播、信息滾動等)2.實現(xiàn)...
    mo默22閱讀 1,306評論 0 5
  • 痛側(cè)心扉档痪,卻連尖叫都不敢涉枫,原來真正的痛苦是如此的寂靜……你沒法發(fā)泄,更無從擺脫腐螟!
    小雪要吃豆沙包閱讀 202評論 0 0
  • 01 科和我們慧慧的長跑 一個晚上足以賺取我們這些90后空巢老人的淚點 sexy and warmhearted ...
    先生說閱讀 395評論 0 1