W3C home > Mailing lists > Public > whatwg@whatwg.org > September 2009

[whatwg] Reliably Minimize Reflows

From: Joseph Pecoraro <joepeck02@gmail.com>
Date: Sat, 26 Sep 2009 12:04:38 -0400
Message-ID: <4A71B3DD-0405-49F9-9AAC-426AD530E568@gmail.com>
A task that developers are often faced with is applying many style  
updates to multiple Nodes in the DOM.  An example would be showing/ 
hiding all divs with the "foo" style class:

   // Hide multiple divs
   var foos = document.getElementsByClassName('foo');
   for (var i=0, len=foos.length; i < len; ++i)
     foos[i].style.display = 'none';

As I understand it, if there are 20 .foo elements then updating the  
style on each _could_ cause 20 individual reflows.  It would be best  
if the developer can narrow that down to a single reflow.  Minimizing  
reflows is a well known suggestion for speeding up web pages [1][2].  
The most natural and generalized API that I can think of would be  
something like:

   // Single reflow would be triggered at the end of batchUpdate
   document.batchUpdate(function() {
     ...
   });

Opera mentions a little about its reflow algorithms at [2] with raises  
some interesting points.  Here is the relevant portion:

"Browsers may choose to wait until the end of a script thread before  
reflowing to show the changes. Opera will wait until enough changes  
have been made, enough time has elapsed, or the end of the thread is  
reached. This means that if the changes happen quickly enough in the  
same thread, they may only produce one reflow. However, this cannot be  
relied on, especially considering the various different speeds of  
devices that Opera runs on."

The idea here is that "batchUpdate" would be a reliable way to  
minimize reflows.  Does this sound like a worthwhile improvement?

Cheers,
Joseph Pecoraro

[1]: http://code.google.com/speed/articles/reflow.html
[2]: http://dev.opera.com/articles/view/efficient-javascript/?page=3
Received on Saturday, 26 September 2009 09:04:38 UTC

This archive was generated by hypermail 2.3.1 : Monday, 13 April 2015 23:08:52 UTC