成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

CSS animations與transitions在瀏覽器方面的性能研究

系統 瀏覽器
本文將闡述瀏覽器是怎樣處理CSS animations 與 transitions。以期在編寫代碼之前,你可以通過直覺判斷某一運動能否運行良好。通過這種直覺,你將能過做出瀏覽器親和且用戶體驗流暢的設計決策。

[[171748]]

你也許早已在項目中使用上了Animations 或 Transitions(如果還沒有,可以閱讀CSS-Trick’s almanac 關于animations或transitions的相關文章)。你會發現你的一些運動表現流暢,而另一些卻不盡如人意,你想知道原因?

本文將闡述瀏覽器是怎樣處理CSS animations 與 transitions。以期在編寫代碼之前,你可以通過直覺判斷某一運動能否運行良好。通過這種直覺,你將能過做出瀏覽器親和且用戶體驗流暢的設計決策。

深入瀏覽器內部

讓我深入瀏覽器內部一探究竟。只有理解了它的工作用力,我們才能做的更好。

現代瀏覽器有兩個重要的執行線程。兩個線程共同協作來渲染web頁面。他們是:

  • 主線程(The main thread)
  • 排版線程(The compositor thread)

一般來說,主線程負責:

  • 運行JS代碼
  • 計算HTML元素的CSS樣式
  • 布局頁面
  • 將元素繪制成一副或多幅位圖
  • 將位圖傳給排版線程

排版線程則負責:

  • 通過GPU,將位圖繪制到屏幕上
  • 對可見或即將可見的區域,詢問主線程是否進行位圖更新。
  • 計算頁面的可見區域
  • 當滾動屏幕時,計算出即將可見的區域
  • 當滾動時移動頁面區域

主線程花費大量的時間忙于執行JS代碼與繪制大型元素。主線程正在處理任務時,他將無法響應用戶的輸入(注:這里是廣義的輸入,泛指交互)。

另一方面,排版線程保持著對用戶的輸入的響應。當頁面改變時,排版線程會進行每秒60次的重繪。甚至在頁面還不完整時。

例如,當用戶滾動頁面時,排版線程會詢問主線程是否為新的可見區域更新位圖。然而,當主線程的反饋不那么迅速時,排版線程并不會等待。他將對已有反饋的頁面進行繪制并使用空白代替未反饋的部分。

GPU

上文提到排版線程通過GPU將位圖繪制到屏幕上。讓我們聊一聊GPU。

GPU是現今大多數手機,平板,電腦的組成部分。它是一個相當專門化的部件,這意味著它只專注處理一些事務。

GPUs 能夠快速處理:

  1. 把圖形繪制到屏幕上
  2. 重復繪制位圖
  3. 在不同的區域繪制相同位圖或將位圖旋轉,縮放。

transition: height

現在我們對瀏覽網頁時,硬件與軟件的大致行為。讓我們來看看究竟瀏覽器的兩個線程是如何協同運作來完成一個CSS動畫的。

假設我們使用如下代碼,將一個元素從100px變為200px:

  1. div { 
  2.     height: 100px; 
  3.     transition: height 1s linear; 
  4.   
  5. div:hover { 
  6.     height: 200px; 

 兩個線程將會按照下圖示意的操作執行。橙色框中的操作會消耗大量時間,而藍色框的操作運行迅速。

 如圖,這一過程中有大量的黃色框,這意味著瀏覽器并不能流暢運行。過渡動畫將會卡頓。

在每一幀的過渡動畫,瀏覽器都將執行布局,繪制以及向GPC內存更新新的位圖的操作。如我們所知,向GPU內存加載位圖是一個相當緩慢的操作。

瀏覽器每一幀運行不流暢的原因在于元素的內容在持續變化。變化元素的高度意味著其子元素的形狀也跟著改變,因此瀏覽器要進行布局。布局后,主線程要為元素從新生成位圖。

transition: transform

因此,改變高度是一種高代價的過渡動畫。那么有什么的代價比較低廉?

假設我們將一個元素的尺寸從一半還原會正常尺寸。同時,假設使用CSS transform 屬性去縮放,采用過渡完成動畫,代碼如下:

  1. div { 
  2.     transform: scale(0.5); 
  3.     transition: transform 1s linear; 
  4.   
  5. div:hover { 
  6.     transform: scale(1.0); 

讓我們看看這個過程的示意圖:

 

 


這次橙色框明顯減少,這意味著動畫更加流暢。元素transform 變化與高度變化的動畫究竟區別在哪?

 

通過定義,CSS transform 屬性并沒有改變元素與相鄰元素的布局,僅僅只影響了作為一個整體的元素自身(縮放,旋轉整個元素或移動整個元素)。

這對于瀏覽器來說是個好消息。瀏覽器僅需要產生元素的位圖,并在動畫開始時向GPU更新位圖。之后,瀏覽器不用再做更多的布局,繪制和位圖更新操作。取而代之的是,仰仗GPU專業的能力在不同的區域繪制相同的位圖,或使之旋轉,縮放。

設計決策

如此,是否意味著不應進行元素高度的動畫?不,有時這仰賴你的設計,運動同樣能運行的足夠快。也許你的元素是獨立的,并不會造成其它部分的重排。也許你的元素只是簡單的重繪,瀏覽器可以快速地執行。也許你的元素很小,瀏覽器只要向GPU更新一個小的位圖。

當然,如果你的動畫使用像CSS transform一樣的“廉價”屬性替代像CSS height的更“昂貴”的屬性,并且這不影響你的設計理念,那就這樣做吧。例如,當你的設計需要一個按鈕在點擊時顯示菜單,你需要嘗試元素的transform屬性來顯示菜單而不是通過使用top或height屬性來實現相同或相似的效果。

下面列出一些能實現快速動畫的CSS屬性:

  • CSS transform
  • CSS opacity
  • CSS filter (取決于filter的復雜程度與瀏覽器性能)

這個列表現在看來可能很有限,但隨著瀏覽器的進步,越來越多的屬性會運動地更快。同時,只是用這個列表上的屬性,你也會驚嘆于僅僅通過使用這些屬性的組合就能創造出大量豐富的效果。

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2017-10-09 13:39:26

瀏覽器渲染服務器

2011-05-06 09:36:16

動態頁面

2022-06-20 09:00:00

Web3加密貨幣區塊鏈

2010-08-19 09:09:53

FirefoxIECSS

2013-12-06 14:57:24

瀏覽器

2010-08-19 15:47:34

CSS Reset瀏覽器

2010-09-15 15:39:03

CSS hack

2009-03-25 09:11:35

Firefox瀏覽器

2021-07-07 07:47:10

瀏覽器CSS兼容

2013-02-21 15:56:18

瀏覽器遨游

2022-07-07 08:43:05

HoudiniAPICSS

2011-01-19 15:51:41

PHPjavaweb

2012-08-06 13:37:35

瀏覽器WindowsUbuntu

2010-09-15 16:29:20

CSS hackIE8

2021-08-16 10:15:43

智慧城市物聯網IOT

2015-06-12 11:26:02

CSS瀏覽器 CSS Hac

2010-06-23 13:24:00

CSSCSS選擇器

2010-09-14 14:18:09

CSS跨瀏覽器開發

2012-06-11 10:54:44

瀏覽器全洞悉

2010-09-15 16:19:17

IECSS hack
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一级毛片视频在线 | 91影院在线观看 | 国产区精品 | 天天夜夜操 | 国产精品国产成人国产三级 | 久久网亚洲 | 黄色片网站国产 | 国产精品毛片一区二区在线看 | 99精品欧美一区二区蜜桃免费 | 91av视频 | 国产视频在线观看一区二区三区 | 高清久久久 | 日本不卡免费新一二三区 | 99久久婷婷 | 日韩在线观看网站 | 亚洲国产一区二区视频 | 亚洲福利在线观看 | 欧美成视频 | 久久久www成人免费精品张筱雨 | 成人二区| 天堂av中文在线 | 日韩视频精品在线 | 99精品国产一区二区三区 | 国产伦精品一区二区三区高清 | 一区二区三区日韩 | 美女久久 | 国产成人精品a视频一区www | 日韩在线h | 日本黄色免费片 | 久久精品国产亚洲 | 国产精品久久九九 | 男人的天堂中文字幕 | 日韩欧美精品一区 | 视频一区在线观看 | 韩日一区二区三区 | 日韩综合| 九九九久久国产免费 | 中文字字幕一区二区三区四区五区 | 国产成人综合在线 | 亚洲狠狠| 亚洲一区综合 |