ブラウザがページをレンダリングする動作から始めましょう:
サーバーから取得した HTML ドキュメントから DOM ツリー (ドキュメント オブジェクト モデル) を構築します。 >
再描画
リフロー
ドキュメントのコンテンツや構造、要素の位置 に影響を与える場合に発生します。これは通常、以下によって引き起こされます:
パフォーマンスを最大化するためのもう 1 つのメカニズムは、一連の JavaScript スニペットを実行するときに、ブラウザーがそれらをキャッシュしてからすべてを一度に実行することです。次の例を見るとよく理解できます:
ただし、すでに上で述べたように、
var $body = $('body');$body.css('padding', '1px'); // reflow, repaint$body.css('color', 'red'); // repaint$body.css('margin', '2px'); // reflow, repaint// only 1 reflow and repaint will actually happen(由于缓存,只会重绘一次)
したがって、2 つのリフローが発生するため、パフォーマンスを最大化するために要素の属性を読み取るために結合する必要があります。
var $body = $('body');$body.css('padding', '1px');$body.css('padding'); // reading a property, a forced reflow(强制发生)$body.css('color', 'red');$body.css('margin', '2px');//另外一次reflow
場合によっては、例: マージン左を同じオブジェクトに 2 回適用する必要があります。最初はアニメーションなしで 100 ピクセルに設定され、次にアニメーションによって 50 ピクセルに遷移します。
$(function() { var $body = $('body'); $body .on('click', '.block-1', function(e) { // 1 reflow $body.css('padding', '1px'); $body.css('color', 'red'); $body.css('margin', '2px'); }) .on('click', '.block-2', function(e) { // 2 reflows $body.css('padding', '1px'); $body.css('padding'); $body.css('color', 'red'); $body.css('margin', '2px'); }) .on('click', '.block-3', function(e) { // 3 repaints $body.css('color', 'red'); $body.css('color'); $body.css('color', 'yellow'); $body.css('background'); $body.css('color', 'blue'); $body.css('outline'); }) .on('click', '.block-4', function(e) { // 1 repaint $body.css('color', 'red'); $body.css('color', 'yellow'); $body.css('color', 'blue'); $body.css('color'); $body.css('background'); $body.css('outline'); }) .on('click', '.block-5', function(e) { // 3 reflows $body.css('padding', '1px'); $body[0].offsetHeight; $body.css('padding', '2px'); $body[0].offsetTop; $body.css('padding', '3px'); $body[0].offsetWidth; }) .on('click', '.block-6', function(e) { // 1 reflow $body.css('padding', '1px'); $body.css('padding', '2px'); $body.css('padding', '3px'); $body[0].offsetHeight; $body[0].offsetTop; $body[0].offsetWidth; });});
トランジション アニメーション:
プロセス コード:
.has-transition { -webkit-transition: margin-left 1s ease-out; -moz-transition: margin-left 1s ease-out; -o-transition: margin-left 1s ease-out; transition: margin-left 1s ease-out;}
// our element that has a "has-transition" class by defaultvar $targetElem = $('#targetElemId');// remove the transition class$targetElem.removeClass('has-transition');// change the property expecting the transition to be off, as the class is not there// anymore$targetElem.css('margin-left', 100);// put the transition class back$targetElem.addClass('has-transition');// change the property$targetElem.css('margin-left', 50);
// remove the transition class$(this).removeClass('has-transition');// change the property$(this).css('margin-left', 100);// trigger a forced reflow, so that changes in a class/property get applied immediately$(this)[0].offsetHeight; // an example, other properties would work, too// put the transition class back$(this).addClass('has-transition');// change the property$(this).css('margin-left', 50);
いくつかの役立つ情報を要約したこの記事には、次の提案があります
有効な HTML と CSS を構築することを忘れないでください。ドキュメントのコーディング メソッドを宣言します。スタイル シートは タグに含める必要があり、スクリプト ファイルは
タグの最後に配置する必要があります。 CSS セレクターを簡略化して最大限に活用する (この記事は、CSS プリプロセッサを使用するほとんどの開発者によって無視されます)、維持管理が最も少ない階層構造です。以下は各セレクターの効率ランキングです
#id.classdiva+iul>li*input[type='text']a:hover
div * {...} // bad.list li {...} // bad.list-item {...} // good#list .list-item {...} // good
在脚本中,应该尽可能的减少DOM操作,如果对象和属性会被重用,就缓存它们。在最好离线元素(未被插入文档树)(offline)上进行操作,然后把它插入DOM结构中;
如果使用jQuery,遵循[jQuery选择器基本原则( http://learn.jquery.com/performance/optimize-selectors/);
修改元素的样式时,修改class属性是做好的方法,其位置越深,越好(also because this helps decouple logic from presentation);
只使 display:fixed/absolute的元素具有动画;
不适用复杂的 :hover动画也是一个好的实践(给
添加 no-hover属性), 延展阅读;延展阅读已获得更多信息:
How browsers works;
Rendering: repaint, reflow/relayout, restyle;
原文链接