码迷,mamicode.com
首页 > 其他好文 > 详细

[Preference] How to avoid Forced Synchronous Layout or FSL to improve site preference

时间:2018-04-06 20:22:49      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:width   ble   window   asc   you   cli   lan   inner   ext   

When tigger site updates the layout, it always follow this order:

 技术分享图片

Javascript trigger style changes, then layout changes then broswer do the paint and composite

All those five steps should be finished in 60fps, or 16ms. Then users will have a smooth and good user experience.

 

For "layout", "style" and "composite", please check this site: https://csstriggers.com/

From the site, you can see that, ‘transform‘ and ‘opacity‘ has good preference, because they only trigger "composite", save lot of works for the broswer.

技术分享图片

 

技术分享图片

技术分享图片

 

Also you can see that the method for "left", "right", they triggers all "layout", "paint", "composite"

技术分享图片

 

Now let see "style" and "layout".

In general, "style" should happen before "layout", otherwise, broswer need to rerender "layout"->"style"->"layout" all over again, which is a waste for the perfermence.

To see which opreation will cause "layout" recalcuation, please checkout http://gent.ilcore.com/2011/03/how-not-to-trigger-layout-in-webkit.html, basiclly, be careful with those:

clientHeight, clientLeft, clientTop, clientWidth, focus(), getBoundingClientRect(), getClientRects(), innerText, offsetHeight, offsetLeft, offsetParent, offsetTop, offsetWidth, outerText, scrollByLines(), scrollByPages(), scrollHeight, scrollIntoView(), scrollIntoViewIfNeeded(), scrollLeft, scrollTop, scrollWidth

 

Let‘s see an example how bad it can affect our site prefermence. Example site

In this bad example, you can see taht Recalculation for "style" -> "layout" -> "style" .... "layout", it repeat number of times.

 技术分享图片

 

 Let‘s see the code causes this:

        function firstRun() {
          divs.forEach(function(elem, index, arr) {
            if (window.scrollY < 200) {
              elem.style.opacity = 0.5;
            }
          })
        }

As you can see in a forEach loop, every time you call "scollY" will cause a layout update, then we call "style.opacity" to trigger style update, but after style updated, layout will be updated again because the order, remember?

技术分享图片

 

Let‘s see how to fix the problem:

        function thirdRun() {
          var newWidth = container.offsetWidth;
          divs.forEach(function(elem, index, arr) {
            elem.style.width = newWidth + "px";
          })
        }

We can simply move ‘layout‘ update code out of forEach loop. Now the timeline looks much better!

 技术分享图片

 

[Preference] How to avoid Forced Synchronous Layout or FSL to improve site preference

标签:width   ble   window   asc   you   cli   lan   inner   ext   

原文地址:https://www.cnblogs.com/Answer1215/p/8728615.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!