《JavaScript網(wǎng)頁(yè)動(dòng)畫設(shè)計(jì)》讀書筆記

這兩天開始看《Javascript網(wǎng)頁(yè)動(dòng)畫設(shè)計(jì)》,這里總結(jié)一下僵控。這個(gè)庫(kù)我之前用過香到,很方便也很流暢。但是里面除了第四章介紹了動(dòng)畫工作流和第七章介紹了動(dòng)畫性能外报破,都是介紹 Velocity 這個(gè)庫(kù)的悠就,或許叫『Velocity動(dòng)畫設(shè)計(jì)』更為妥當(dāng)。

這里姑且記錄一下充易,過一陣開始總結(jié)『web動(dòng)畫』這個(gè)主題梗脾。

JavaScript網(wǎng)頁(yè)動(dòng)畫設(shè)計(jì).jpg

第一章 JavaScript動(dòng)畫與CSS動(dòng)畫

JS動(dòng)畫性能不是問題

  • CSS 適合懸停狀態(tài)的動(dòng)畫
  • JS動(dòng)畫和CSS動(dòng)畫一樣快
  • 不要將JS與jQuery混為一談
  • Velocity.js

JS動(dòng)畫獨(dú)有的功能

  • 頁(yè)面滾動(dòng):頁(yè)面滾動(dòng)到某個(gè)元素上
  • 動(dòng)畫反轉(zhuǎn):元素以動(dòng)畫形式變動(dòng)回上一個(gè)動(dòng)畫開始之前的值
  • 物理動(dòng)效:摩擦力

第二章 使用Velocity.js實(shí)現(xiàn)動(dòng)畫

動(dòng)畫的種類:

  • CSS動(dòng)畫:transition / animation
  • JS動(dòng)畫:GSAP、Velocity.js
  • canvas動(dòng)畫:Fabric.js
  • SVG動(dòng)畫:Snap.js 盹靴、SVG.js
  • WebGL動(dòng)畫:Three.js

詳情可以看這里

緩動(dòng)方程

第三章 動(dòng)效設(shè)計(jì)理論

這一章全是在講理論的東西炸茧,難道買錯(cuò)書了?

第四章 動(dòng)畫工作流

CSS動(dòng)畫工作流

為了更好地管理UI動(dòng)畫工作流稿静,開發(fā)人員有時(shí)會(huì)放棄JS而使用CSS梭冠。但是,一旦動(dòng)畫的復(fù)雜度達(dá)到了中等或更高水平改备,那么使用CSS動(dòng)畫通常會(huì)使工作流變得明顯比用JS更加糟糕控漠。

CSS的問題

CSS利用關(guān)鍵幀來(lái)實(shí)現(xiàn)復(fù)雜動(dòng)畫序列:

@keyframes myAnimation{
    0%{opacity:0;transform:scale(0,0)}
    25%{opacity:1;transform:scale(1,1)}
    50%{transform:translate(100px,0)}
    100%{transform:translate(100px,100px)}
}
#box{animation:myAnimation 2.75s}

如果要把 opacity 動(dòng)畫時(shí)長(zhǎng)增加1秒,其他屬性動(dòng)畫時(shí)長(zhǎng)不變悬钳,就必須要重新計(jì)算盐捷,才能使百分比各處的屬性值與增加1秒后的時(shí)長(zhǎng)匹配起來(lái)。

什么時(shí)候用CSS

當(dāng)用戶鼠標(biāo)懸停在元素上時(shí)觸發(fā)的簡(jiǎn)單樣式變化默勾,使用 transition

代碼技巧:將樣式與邏輯分離

一般做法

在jQuery中碉渡,主要由兩種動(dòng)畫方式:

  • 利用 addClass()removeClass() 切換樣式
  • 使用 animate()$ele.animate({opacity:1,top:50},1000)

第一種方法更值得推薦,因?yàn)樗拇a組織得清楚母剥,改樣式就改CSS滞诺,改邏輯就改JS。


優(yōu)化做法

定義一個(gè)JS對(duì)象媳搪,該對(duì)象的內(nèi)容是要設(shè)置的CSS屬性铭段。然后將其傳入Velocity或jQuery中骤宣。

//style.js
var fadeIn = {
    p: {
        opacity: 1,
        top: "50px" 
    },
    o: {
        duration: 1000,
        easing: "linear"    
    }
}

//main.js
$element.velocity(fadeIn.p,fadeIn.o);

這樣使用 style.js 有一個(gè)獨(dú)有的能力——定義動(dòng)畫選項(xiàng)秦爆。

代碼技巧:組織排序動(dòng)畫

Velocity 有一個(gè)名為 UI pack 的插件,能夠優(yōu)化UI動(dòng)畫工作流憔披。

$element
    .velocity({translateX:100})
    .velocity({translateY;100})

代碼技巧:打包效果

$.Velocity.RegisterEffect("growIn",{
    defaultDuration: duration,
    calls: [
        [ {opacity:1,scale:1},0.4 ],
        [ {boxShadowBlur:50},0.6 ]
    ]
})

$element.velocity("growIn")

第五章 文本動(dòng)畫

網(wǎng)頁(yè)上很少使用文本動(dòng)畫等限,這里介紹幾種工具幫你免于文本動(dòng)畫枯燥乏味的一面爸吮,提供高效的工作流。

Blast.js

Blast 能夠?qū)㈨?yè)面上的文本進(jìn)行拆分

結(jié)合 velocity.jsvelocity-ui

第六章 SVG入門

Snap.svg

SVG 動(dòng)畫望门,在原本應(yīng)該使用圖片的位置使用它:

  • 具有復(fù)雜動(dòng)畫序列的按鈕形娇,用戶懸停鼠標(biāo)或點(diǎn)擊鼠標(biāo)時(shí)會(huì)觸發(fā)這些動(dòng)畫序列
  • 獨(dú)特的加載狀態(tài)圖形,可以用來(lái)替代老掉牙的gif圖
  • 公司logo筹误,頁(yè)面加載時(shí)桐早,logo的各個(gè)部分可以一起以動(dòng)畫形式呈現(xiàn)

第七章 動(dòng)畫性能

布局顛簸

設(shè)置(set)、查詢(get)一個(gè)元素的CSS屬性是引發(fā)性能開銷的兩個(gè)核心瀏覽器進(jìn)程(另外還有圖形渲染)厨剪。

在為元素設(shè)置新屬性后哄酝,瀏覽器必須計(jì)算你這次更改所產(chǎn)生的后續(xù)影響。例如祷膳,改變一個(gè)元素的寬度會(huì)導(dǎo)致一系列連鎖反應(yīng)陶衅;它的父級(jí)元素、兄弟元素和子元素的寬度根據(jù)自己的CSS屬性也要調(diào)整直晨。

由設(shè)置和獲取樣式的交替而導(dǎo)致的UI性能降低稱為布局顛簸搀军。

瀏覽器已經(jīng)為頁(yè)面布局的重新計(jì)算進(jìn)行了高度優(yōu)化,但由于布局顛簸勇皇,優(yōu)化效果大打折扣罩句。

例如,瀏覽器已經(jīng)可以將同一時(shí)間的獲取操作優(yōu)化成一個(gè)單一敛摘、流暢的操作的止,因?yàn)闉g覽器在第一次獲取之后可以緩存頁(yè)面的狀態(tài),然后在后續(xù)每次獲取操作時(shí)着撩,參考那個(gè)狀態(tài)诅福。但是,如果反復(fù)執(zhí)行獲取后又設(shè)置拖叙,就讓瀏覽器去做了很多繁重的工作氓润,因?yàn)樵O(shè)置所做的更改會(huì)不斷地使其緩存失效。

布局顛簸在動(dòng)畫循環(huán)中出現(xiàn)的話薯鳍,對(duì)性能更是雪上加霜咖气,最后就是讓動(dòng)畫變得卡頓。


解決辦法

把DOM的設(shè)置和獲取的操作分別集合在一起批量操作

//糟糕的做法
var currentTop = $('element').css('top'); //get
$('element').style.top = currentTop + 1; //set
var currentLeft = $('element').css('left'); //get
$('element').style.left = currentLeft + 1; //set

如果把查詢放在一起挖滤,把設(shè)置放在一起崩溪,那么瀏覽器就可以打包相應(yīng)操作,減少代碼造成的布局顛簸的影響:

var currentTop = $('element').css('top'); //get
var currentLeft = $('element').css('left'); //get
$('element').style.top = currentTop + 1; //set
$('element').style.left = currentLeft + 1; //set

比如斩松,點(diǎn)擊按鈕切換 noneblock伶唯,可能會(huì)先要檢查側(cè)邊菜單的display屬性是設(shè)置成 none 還是 block,然后再相應(yīng)地進(jìn)行值得替換惧盹。檢查是一次『獲取』乳幸,之后無(wú)論設(shè)置成什么是一次『設(shè)置』瞪讼。

想要優(yōu)化的話,可以在設(shè)置一個(gè)變量粹断,每當(dāng)按鈕點(diǎn)擊的時(shí)候符欠,這個(gè)變量跟著更新,然后在切換可見性之前瓶埋,查詢這個(gè)變量就可以得知菜單的當(dāng)前狀態(tài)了希柿。『獲取』的過程就可以省掉了养筒。

避免影響臨近的元素

有很多CSS屬性狡汉,一經(jīng)改變,就會(huì)造成臨近元素尺寸或位置的調(diào)整闽颇,其中包括 top盾戴、right、bottom兵多、left尖啡,margin、padding剩膘,border衅斩,以及width、height


解決辦法

盡可能設(shè)置CSS的transform屬性(translate怠褐、scale畏梆、rotate)的動(dòng)畫。transform屬性的特殊之處在于它們將目標(biāo)元素提升至一個(gè)單獨(dú)的層奈懒,這個(gè)層可以獨(dú)立于頁(yè)面其他內(nèi)容單獨(dú)渲染(通過GPU加速提升性能)奠涌,因此相鄰的元素不會(huì)受到影響。


優(yōu)先考慮 opacity勝于 color

opacity是另一個(gè)可以讓GPU渲染加速的CSS屬性磷杏,因?yàn)樗挥绊懺氐奈恢谩?/p>

比如溜畅,當(dāng)用戶鼠標(biāo)懸停在元素上時(shí)color屬性會(huì)改變,那么請(qǐng)考慮使用opacity動(dòng)畫來(lái)替代极祸。如果最終效果和設(shè)置顏色的動(dòng)畫效果差不多慈格,那么留用設(shè)置opacity動(dòng)畫吧。


請(qǐng)查看 CSSTrigger.com 上的內(nèi)容遥金,了解每個(gè)CSS屬性如何影響瀏覽器性能浴捆。

不用持續(xù)響應(yīng)scroll和resize事件

瀏覽器的scroll和resize是兩個(gè)觸發(fā)頻率非常頻繁的事件類型:每當(dāng)用戶調(diào)整或滾動(dòng)瀏覽器窗口時(shí),瀏覽器都會(huì)在每秒內(nèi)觸發(fā)多次與這些事件相關(guān)的回調(diào)函數(shù)稿械。窗口scroll或resize的時(shí)候會(huì)多次觸發(fā)事件选泻,如果其中有布局顛簸,那么會(huì)給瀏覽器帶來(lái)巨大負(fù)擔(dān)溜哮。


解決辦法

定義一個(gè)時(shí)間間隔滔金,在此事件間隔期間色解,事件回調(diào)僅會(huì)被調(diào)用一次茂嗓。這就是所謂的『反跳』餐茵。

例如定義了一個(gè)250毫秒的反跳間隔,而用戶滾動(dòng)頁(yè)面時(shí)間為1000毫秒述吸,這時(shí)候忿族,事件回調(diào)僅僅會(huì)觸發(fā)四次。

  • undersocre的debounce函數(shù)就是這個(gè)作用

  • flexible中是用的定時(shí)器:

    win.addEventListener('resize', function() {
        clearTimeout(tid);
        tid = setTimeout(refreshRem, 300);
    }, false);
    

減少圖片渲染

圖片的形式:

  1. img
  2. gradient
  3. box-shadow / text-shadow

視頻蝌矛、圖片是多媒體元素類型道批,瀏覽器必須要加倍渲染才行。多媒體元素中包含上千萬(wàn)的像素?cái)?shù)據(jù)入撒,要改變它們的大小隆豹、尺寸或重新合成對(duì)瀏覽器計(jì)算開銷很大。

另外茅逮,滾動(dòng)頁(yè)面幾乎可以視為設(shè)置整個(gè)頁(yè)面的動(dòng)畫(可以把滾動(dòng)頁(yè)面視為設(shè)置頁(yè)面的top屬性的動(dòng)畫)璃赡,在移動(dòng)設(shè)備中,多媒體元素會(huì)造成滾動(dòng)性能的巨幅下降献雅。


解決辦法

盡可能少地加載圖片

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末碉考,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子挺身,更是在濱河造成了極大的恐慌侯谁,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件章钾,死亡現(xiàn)場(chǎng)離奇詭異墙贱,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)贱傀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門嫩痰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人窍箍,你說(shuō)我怎么就攤上這事串纺。” “怎么了椰棘?”我有些...
    開封第一講書人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵纺棺,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我邪狞,道長(zhǎng)祷蝌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任帆卓,我火速辦了婚禮巨朦,結(jié)果婚禮上米丘,老公的妹妹穿的比我還像新娘。我一直安慰自己糊啡,他們只是感情好拄查,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著棚蓄,像睡著了一般堕扶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上梭依,一...
    開封第一講書人閱讀 51,727評(píng)論 1 305
  • 那天稍算,我揣著相機(jī)與錄音,去河邊找鬼役拴。 笑死糊探,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的河闰。 我是一名探鬼主播科平,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼淤击!你這毒婦竟也來(lái)了匠抗?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤污抬,失蹤者是張志新(化名)和其女友劉穎汞贸,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體印机,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡矢腻,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了射赛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片多柑。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖楣责,靈堂內(nèi)的尸體忽然破棺而出竣灌,到底是詐尸還是另有隱情,我是刑警寧澤秆麸,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布初嘹,位于F島的核電站,受9級(jí)特大地震影響沮趣,放射性物質(zhì)發(fā)生泄漏屯烦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望驻龟。 院中可真熱鬧温眉,春花似錦、人聲如沸翁狐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)谴蔑。三九已至豌骏,卻和暖如春龟梦,著一層夾襖步出監(jiān)牢的瞬間隐锭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工计贰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留钦睡,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓躁倒,卻偏偏與公主長(zhǎng)得像荞怒,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子秧秉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355

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

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案褐桌? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,754評(píng)論 1 92
  • 選擇qi:是表達(dá)式 標(biāo)簽選擇器 類選擇器 屬性選擇器 繼承屬性: color,font象迎,text-align荧嵌,li...
    love2013閱讀 2,315評(píng)論 0 11
  • 選擇qi:是表達(dá)式 標(biāo)簽選擇器 類選擇器 屬性選擇器 繼承屬性: color,font砾淌,text-align啦撮,li...
    wzhiq896閱讀 1,756評(píng)論 0 2
  • 讀《年輕人,你憑什么不加班》 第一次接觸自媒體是去年來(lái)自同事的啟蒙汪厨,說(shuō)來(lái)慚愧赃春,作為一名90后,與時(shí)俱進(jìn)的思維真的有...
    楊梓珊閱讀 220評(píng)論 0 1
  • 從小就不是一個(gè)好學(xué)生,學(xué)霸貓半個(gè)多月前出的作業(yè)衷戈,今天才完成吧狭吼,哈哈!脱惰! 學(xué)霸貓有一天在群里問到:失敗搏嗡,真正的價(jià)值是...
    李智閱讀 864評(píng)論 2 10