专业网站建设_企业品牌营销 · 北京汇仁智杰科技有限公司

Web前端知識

首頁 > 免費 > Web前端知識 >

前端性能——高性能滾動 scroll 及頁面渲染優化(一)

來源:北京匯仁智杰科技有限公司   時間:2016-05-18   點擊:

  最近在研究頁面渲染及web動畫的性能問題,以及拜讀《CSS SECRET》(CSS揭秘)這本大作。
  本文主要想談談頁面優化之滾動優化。
  主要內容包括了為何需要優化滾動事件,滾動與頁面渲染的關系,節流與防抖,pointer-events:none 優化滾動。因為本文涉及了很多很多基礎,是我自己學習記錄的一個過程,如果上面列出的知識點都了然于胸了,就可以不必往下看了。
  滾動優化的由來
  滾動優化其實也不僅僅指滾動(scroll 事件),還包括了例如 resize 這類會頻繁觸發的事件。簡單的看看:
var i = 0;
window.addEventListener('scroll',function(){
 console.log(i++);
},false);
  在綁定 scroll 、resize這類事件時,當它發生時,它被觸發的頻次非常高,間隔很近。如果事件中涉及到大量的位置計算、DOM 操作、元素重繪等工作且這些工作無法在下一個 scroll 事件觸發前完成,就會造成瀏覽器掉幀。加之用戶鼠標滾動往往是連續的,就會持續觸發 scroll 事件導致掉幀擴大、瀏覽器CPU使用率增加、用戶體驗受到影響。
  在滾動事件中綁定回調應用場景也非常多,在圖片的懶加載、下滑自動加載數據、側邊浮動導航欄等中有著廣泛的應用。
  當用戶瀏覽網頁時,擁有平滑滾動經常是被忽視但卻是用戶體驗中至關重要的部分。當滾動表現正常時,用戶就會感覺應用十分流暢,令人愉悅,反之,笨重不自然卡頓的滾動,則會給用戶帶來極大不舒爽的感覺。
  滾動與頁面渲染的關系
  為什么滾動事件需要去優化?因為它影響了性能。那它影響了什么性能呢?這個就要從頁面性能問題由什么決定說起。
  我覺得搞技術一定要追本溯源,不要看到別人一篇文章說滾動事件會導致卡頓并說了一堆解決方案優化技巧就如獲至寶奉為圭臬,我們需要的不是拿來主義而是批判主義,多去源頭看看。
  從問題出發,一步一步尋找到最后,就很容易找到問題的癥結所在,只有這樣得出的解決方法才容易記住。
  說教了一堆廢話,不喜歡的直接忽略哈,回到正題,要找到優化的入口就要知道問題出在哪里,對于頁面優化而言,那么我們就要知道頁面的渲染原理:
  瀏覽器渲染原理我在我上一篇文章里也要詳細的講到,不過更多的是從動畫渲染的角度去講的:【Web動畫】CSS3 3D 行星運轉  瀏覽器渲染原理 。
  想了想,還是再簡單的描述下,我發現每次 review 這些知識點都有新的收獲,這次換一張圖,以chrome為例子,一個Web頁面的展示,簡單來說可以認為經歷了以下下幾個步驟:
  JavaScript:一般來說,我們會使用JavaScript來實現一些視覺變化的效果。比如做一個動畫或者往頁面里添加一些DOM元素等。
  Style:計算樣式,這個過程是根據CSS選擇器,對每個DOM元素匹配對應的CSS樣式。這一步結束之后,就確定了每個DOM元素上該應用什么CSS樣式規則。
  Layout:布局,上一步確定了每個DOM元素的樣式規則,這一步就是具體計算每個DOM元素最終在屏幕上顯示的大小和位置。web 頁面中元素的布局是相對的,因此一個元素的布局發生變化,會聯動地引發其他元素的布局發生變化。比如,元素的寬度的變化會影響其子元素的寬度,其子元素寬度的變化也會繼續對其孫子元素產生影響。因此對于瀏覽器來說,布局過程是經常發生的。
  Paint:繪制,本質上就是填充像素的過程。包括繪制文字、顏色、圖像、邊框和陰影等,也就是一個DOM元素所有的可視效果。一般來說,這個繪制過程是在多個層上完成的。
  Composite:渲染層合并,由上一步可知,對頁面中DOM元素的繪制是在多個層上進行的。在每個層上完成繪制過程之后,瀏覽器會將所有層按照合理的順序合并成一個圖層,然后顯示在屏幕上。對于有位置重疊的元素的頁面,這個過程尤其重要,因為一旦圖層的合并順序出錯,將會導致元素顯示異常。
  這里又涉及了層(GraphicsLayer)的概念,GraphicsLayer 層是作為紋理(texture)上傳給GPU的,現在經常能看到說GPU硬件加速,就和所謂的層的概念密切相關。但是和本文的滾動優化相關性不大,有興趣深入了解的可以自行 google 更多。
  簡單來說,網頁生成的時候,至少會渲染(Layout+Paint)一次。用戶訪問的過程中,還會不斷重新的重排(reflow)和重繪(repaint)。
  其中,用戶 scroll 和 resize 行為(即是滑動頁面和改變窗口大?。е马撁娌粩嗟闹匦落秩?。
  當你滾動頁面時,瀏覽器可能會需要繪制這些層(有時也被稱為合成層)里的一些像素。通過元素分組,當某個層的內容改變時,我們只需要更新該層的結構,并僅僅重繪和柵格化渲染層結構里變化的那一部分,而無需完全重繪。顯然,如果當你滾動時,像視差網站(戳我看看)這樣有東西在移動時,有可能在多層導致大面積的內容調整,這會導致大量的繪制工作。
  防抖(Debouncing)和節流(Throttling)
  scroll事件本身會觸發頁面的重新渲染,同時scroll事件的handler又會被高頻度的觸發, 因此事件的handler內部不應該有復雜操作,例如DOM操作就不應該放在事件處理中。
  針對此類高頻度觸發事件問題(例如頁面scroll,屏幕resize,監聽用戶輸入等),下面介紹兩種常用的解決方法,防抖和節流。
  防抖(Debouncing)
  防抖技術即是可以把多個順序地調用合并成一次,也就是在一定時間內,規定事件被觸發的次數。
  通俗一點來說,看看下面這個簡化的例子:
// 簡單的防抖動函數
function debounce(func, wait, immediate) {
// 定時器變量
 var timeout;
 return function() {
// 每次觸發 scroll handler 時先清除定時器
  clearTimeout(timeout);
// 指定 xx ms 后觸發真正想進行的操作 handler<br/  timeout = setTimeout(func, wait);
  };
};
// 實際想綁定在 scroll 事件上的 handler
function realFunc(){
  console.log("Success");
}
// 采用了防抖動
window.addEventListener('scroll',debounce(realFunc,500));
// 沒采用防抖動
window.addEventListener('scroll',realFunc);
  上面簡單的防抖的例子可以拿到瀏覽器下試一下,大概功能就是如果 500ms 內沒有連續觸發兩次 scroll 事件,那么才會觸發我們真正想在 scroll 事件中觸發的函數。
  上面的示例可以更好的封裝一下:
// 防抖動函數
function debounce(func, wait, immediate) {
  return function() {
  var context = this, args = arguments;
  var later = function() {
  timeout = null;
  if (!immediate) func.apply(context, args);
  };
  var callNow = immediate !timeout;
  clearTimeout(timeout);
  timeout = setTimeout(later, wait);
  if (callNow) func.apply(context, args);
  };
};
 
var myEfficientFn = debounce(function() {
// 滾動中的真正的操作
}, 250);
// 綁定監聽
window.addEventListener('resize', myEfficientFn);
  節流(Throttling)
  防抖函數確實不錯,但是也存在問題,譬如圖片的懶加載,我希望在下滑過程中圖片不斷的被加載出來,而不是只有當我停止下滑時候,圖片才被加載出來。又或者下滑時候的數據的 ajax 請求加載也是同理。
  這個時候,我們希望即使頁面在不斷被滾動,但是滾動 handler 也可以以一定的頻率被觸發(譬如 250ms 觸發一次),這類場景,就要用到另一種技巧,稱為節流函數(throttling)。
  節流函數,只允許一個函數在 X 毫秒內執行一次,只有當上一次函數執行后過了你規定的時間間隔,才能進行下一次該函數的調用。
  與防抖相比,節流函數最主要的不同在于它保證在 X 毫秒內至少執行一次我們希望觸發的事件 handler。
  與防抖相比,節流函數多了一個 mustRun 屬性,代表 mustRun 毫秒內,必然會觸發一次 handler ,同樣是利用定時器,看看  簡單的示例:
// 簡單的節流函數
function throttle(func, wait, mustRun) {
 var timeout,
  startTime = new Date();
  return function() {
  var context = this,
  args = arguments,
  curTime = new Date();
  clearTimeout(timeout);
 // 如果達到了規定的觸發時間間隔,觸發 handler
  if(curTime - startTime >= mustRun){
 func.apply(context,args);
 startTime = curTime;
// 沒達到觸發間隔,重新設定定時器
}else{
timeout = setTimeout(func, wait);
}
};
};
// 實際想綁定在 scroll 事件上的 handler
function realFunc(){
console.log("Success");
}
// 采用了節流函數
window.addEventListener('scroll',throttle(realFunc,500,1000));
  上面簡單的節流函數的例子可以拿到瀏覽器下試一下,大概功能就是如果在一段時間內scroll觸發的間隔一直短于500ms,那么能保證事件我們希望調用的handler至少在1000ms內會觸發一次。

網絡營銷推廣?。”本﹨R仁智杰科技有限公司!

地址:北京市昌平區回龍觀龍冠大廈5層
咨詢:13370157521
業務QQ:373002979
E - mail:sales @ huirenzhijie.com
企業網站備案:京ICP備15021091號-1

匯仁智杰與眾不同

  • 有網絡推廣經驗
  • 有網站建站隊伍
  • 有大型網站建設經驗
  • 致力于營銷型網站建設
  • 始終堅持技術和服務同樣重要
查看PC版網站
備案號:京ICP備15021091號-1 版權所有:匯仁智杰

主站蜘蛛池模板: 全自动滤水器_射水抽气器_气液两相流疏水器-连云港神美电力辅机有限公司 | 泰安led显示屏-泰安户外裸眼3D显示屏-扩声系统-舞台灯光机械-电子屏-肥城宁阳新泰东平-泰安市奇美特电子有限公司 | 览众房车,房车, 房车厂家, 房车价格, 房车图片,, 四驱房车, 皮卡房车, 越野房车, 依维柯房车, 国产房车, 自动挡房车, | 激光焊接不锈钢翅片管,不锈钢翅片管,激光焊接复合翅片管,南通拓帆换热设备有限公司 | 三相干式变压器|三相隔离变压器|上海盖能电气有限公司官方网站|上海干式变压器生产厂家 | 联动机-钻井转盘-滑动游车-河南思达瑞石油机械制造有限公司 | 四川超声波清洗机厂家-旋转喷淋清洗机设备-成都鑫荣诚超声波科技有限公司 | 智慧环保大数据云平台_车载走航式扬尘/恶臭/噪声污染源在线监测管控信息系统平台_环保土壤/环境监测系统云平台-奥斯恩智能科技 | 网站主页 - 河北天成药业股份有限公司| 西安鸿仁汇智软件公司是高新技术企业,专业为企业及高校提供智慧化管理一站式解决方案 | 摩托车-摩托车配件-摩托车与配件_摩托车与配件行业权威的门户网站! | 铝合金热处理设备_天然气铝棒加热炉_QPQ热处理设备-浙江长兴天源炉业科技有限公司 | 数控钢筋弯箍机_数控钢筋弯曲中心_数控钢筋笼滚焊机厂家_山东佳信 | 晶圆盒垫纸|铝线棒精益管|防静电接地系统工程-上海德拉电子科技有限公司 | 新能源洗扫车、新能源压缩垃圾车_新能源路面养护车_电动树叶收集车_电动扫地机_电动洗地机_高尔夫球车 | 金属剪切机,金属打包机,废钢剪切机,废铁压块机,金属压块机,废纸打包机,重废龙门剪,废钢龙门剪,箱式剪,液压剪切机-瑞顿机械装备制造江阴有限公司 | 石牌坊价格_石雕农村门楼图片_石牌楼雕刻制作 _ 长城石雕 | 太阳能路灯生产厂家-郑州太阳能高杆灯价格-道路照明智能路灯-河南坤德照明 | 威海赶海网、乳山特产、威海专营海产品、威海旅游产品 - 威海赶海电子商务 | 云南亿华工贸有限公司-云南护栏网-云南锌钢护栏-昆明市政护栏-工地护栏-昆明护栏网厂家 | 手持电能质量测量仪-TD-1168多功能高空接线钳-上海妙定电气有限公司 | 四川教师资格网-四川教师资格考试网| 滤布_PP滤芯_过滤芯_线绕滤芯_碳纤维滤芯 - 东莞市三比过滤器材有限公司 | 偏光显微镜-金相抛光机|预磨机|磨抛机|镶嵌机|切割机-上海蔡康光学仪器厂 | 景德镇薪如陶瓷有限公司| 纸袋胶-糊盒胶-礼盒胶-裱纸胶-水性喷胶-东莞市美好化工有限公司 纸袋机|多层纸袋机|高速纸袋机|无锡市天天友情机械有限公司 | 输送机电动滚筒_山东电动滚筒_输送机滚筒_皮带输送机-山东中输输送机械有限公司 | 全国重点实验室--人民网 | 宿迁市华泰交通设施有限公司,上海第四代路名牌,天津仿罗马柱路名牌,标准路名牌,路名牌灯箱,公交站台,户外广告灯箱, 交通标志牌,社区阅报栏 | 无轴螺旋输送机_双无轴螺旋输送机_垃圾,污泥无轴螺旋输送机-新乡市大汉振动机械有限公司 | 智慧社区_【功能更全、价格更低、案例更多】 - | 太阳能光伏发电_太阳能热水器_空气能热水器_直饮净水器_深圳市大兴节能环保科技有限公司 | 泥浆振动筛|卧式泥浆搅拌器|泥浆离心机|泥浆处理固控设备_沧州宏宇石油机械有限公司 | 三菱plc_触摸屏_变频器_欧姆龙plc_普洛菲斯_安川伺服电机-广州凌控 | 首页 - 郑州市宏美彩印包装有限公司| 金酱酒_金酱酒代理加盟招商_OEM贴牌企业定制! – 金酱酒代理加盟!茅台镇较早的酿酒烧坊,年产优质酱香白酒5000余吨,仁怀市十强白酒企业,主营主品:金酱酒、金酱陈香酒、酱香老酒等系列品牌产品 | 上海联锐精密机械有限公司-【官网】 | 聚达|聚达物联|聚达物联科技|杭州聚达物联科技有限公司|www.judawulian.com|智慧社区|数字驾驶舱|智慧清运|智慧工地|邻家小达 | 直流电源|Chroma直流电源|可程控直流电源-卓定电子Chroma代理 | 趣看科技-视频新媒体技术一体化专业服务商 | 假肢价格-大腿假肢小腿假肢假手指-河南舒捷假肢厂家 |