Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
reflow/repaint
Search
Yuta Hiroto
November 10, 2016
Technology
200
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
reflow/repaint
11/11の社内勉強会資料
Yuta Hiroto
November 10, 2016
More Decks by Yuta Hiroto
See All by Yuta Hiroto
Node8.3.0について
abouthiroppy
1
3.2k
ECMAScript
abouthiroppy
0
700
my tools
abouthiroppy
0
160
OSSを楽しむ話
abouthiroppy
0
190
React Nativeを触ってみた話
abouthiroppy
0
180
Other Decks in Technology
See All in Technology
インフラ寄りSREでも 開発に踏み出せる〜境界を越えてユーザー体験に向き合いたい〜
sansantech
PRO
1
2.8k
生成AI活用によるODC欠陥分析の分類高速化の実践と導入効果 / 20260703 Suguru Ishii
shift_evolve
PRO
2
110
オブザーバビリティ、本当に活用できてる? 〜API連携×生成AIで成熟度を自動評価〜
dmmsre
1
2.3k
AIペネトレーションテスト・ セキュリティ検証「AgenticSec」紹介資料
laysakura
2
8.1k
人を動かすのは時間ではなく、納得感 〜新任EMが入社3ヶ月、組織を2回変えた話〜
kakehashi
PRO
3
190
認証認可だけじゃない! ID管理の構成要素と ライフサイクルを意識しよう
ritou
1
530
End-to-Endで考える信頼性 —LINEアプリにおけるクライアント開発×SRE連携の実践
maruloop
4
3.3k
グローバルチームと挑むプロダクト開発
sansantech
PRO
1
160
次世代ランサムウェア対策の考察 / 20260704 Mitsutoshi Matsuo
shift_evolve
PRO
5
1.7k
Empower GenAI with Agile - あなたのアジャイルが生成AIのバフになる仕組み
hageyahhoo
1
140
CSに"SLO"は要らない、経営層に"99.9%"は伝わらない - SREを全社に"翻訳"する3原則
cscengineer
PRO
1
3.8k
SRE歴2ヶ月でも開発6年の知見を活かして、チームで止まっていた環境改善を前に進めた話
a_ono
1
220
Featured
See All Featured
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
210
How GitHub (no longer) Works
holman
316
150k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
460
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
370
Discover your Explorer Soul
emna__ayadi
2
1.2k
GraphQLとの向き合い方2022年版
quramy
50
15k
Designing for Performance
lara
611
70k
Leo the Paperboy
mayatellez
8
1.9k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.6k
Prompt Engineering for Job Search
mfonobong
0
370
How to Think Like a Performance Engineer
csswizardry
28
2.7k
Transcript
Reflow / Repaint Yuta Hiroto @about_hiroppy #frontier-js-2
Reflow / Repaint ؾʹ͔͚ͯ·͔͢ʁ
ͳͥؾʹ͢Δඞཁ͋Δͷʁ ෛՙ͕େ͖͘ɺύϑΥʔϚϯεʹ Өڹ͕͋Δ͔Β UXͷԼ
ϒϥβͷඳըϓϩηε DOM Tree Style Rules HTML CSS Render Tree Layout
Paint Display Webkitͷ؆ུϑϩʔ
ϒϥβͷඳըϓϩηε DOM Tree Style Rules HTML CSS Render Tree Display
Layout ࠓ͢ͷ͜͜ Paint
Layout(Reflow) • GekkoͰReflow, WebkitͰLayoutͱݺΕ·͢ • ϨϯμʔπϦʔ͕࠶ධՁ͞Ε࠶ܭࢉ͢ΔॴͰ͢ • ཁૉʹḪͬͯ࠶ܭࢉ͢ΔͨΊɺύϑΥʔϚϯεʹ Өڹ͕ग़͍͢ ࠓճReflowͱݺͼਐΊ·͢
Paint • LayoutΑΓ͍͕ɺΓෛՙ͕ߴ͍ • Repaintͱ࠶ܭࢉ͞ΕͨϨϯμʔπϦʔͷ݁ՌΛݩʹ εΫϦʔϯΛߋ৽͢Δ͜ͱΛݴ͍·͢ • GPUϨϯμϦϯάΛ͏͜ͱʹΑΓɺൃੜΛ͑Δ͜ͱ͕Մೳ ΞχϝʔγϣϯͰtransform, opacityͳͲΛ༻͢Δ
• ҎԼͷϓϩύςΟ͕ओʹෛՙ͕ߴ͍ྫͰ͢ - box-shadow - border-radius - background - filter: blur - gradient - position:fixed
Reflow / Repaint Reflow Repaint ϨϯμʔπϦʔ͕࣋ͭ DOMཁૉΛ࠶ܭࢉ͢Δ εΫϦʔϯͷ ࠶ඳըॲཧΛ͢Δ
ൃੜτϦΨʔ ReFlow + RePaint RePaintͷΈ DOM NodeͷՃɾߋ৽ɾআ windowͷαΠζมߋɾεΫϩʔϧ ϑΥϯταΠζͷมߋ Ξχϝʔγϣϯ
ελΠϧଐੑͷՃɾมߋɾআ ίϯςΩετͷมߋ offsetWidth, offsetHeightͷ࠶ܭࢉ cssٖࣅΫϥεͷૢ࡞ css#color css#outline css#visibility: hidden css#backgroundColor
const style = document.body.style; // reflow + repaint style.border =
'1px solid #333'; style.padding = '10px'; style.fontSize = '1px'; document.body.appendChild(document.createTextNode('hoge!')); // repaint style.color = 'blue'; style.backgroundColor = '#0ff';
ൃੜΛ࠷খݶʹ͑Δ • styleͰͷมߋΛආ͚Δ • documentFragmentΛ͏
styleͰͷมߋΛආ͚Δ • DOMͷมߋճΛ1ճʹ ·ͱΊΔ • display: noneͰӅ͠มߋ(n ճ)ͤ͞displayΛ͢ (nճ ͷreflow/repaintʹର͠ɺ
͜ͷํ๏ͩͱ2ճͰࡁΉ) // js const el = document.body; const style = el.style; // bad style.left = '10px'; // reflow, repaint style.top = '20px'; // reflow, repaint // good el.classList.add("anotherclass"); // reflow, repaint // .css .anotherclass { left: 10px; top: 20px; }
ϒϥβͷΈ • ReFlow/RePaintෛՙ͕ߴ͍ͨΊɺ ϒϥβࣗମ͕࠷దԽΛߦ͍·͢ • ϒϥβJavaScript͔ΒͷstyleมߋΛΩϡʔʹ٧Ίɺ·ͱΊͯ ࠷ޙʹॲཧΛߦ͏͜ͱʹΑΓReflow/RepaintΛ࠷খݶʹ͑·͢ function updateBodyStyle() {
const style = document.body.style; style.top = '50px'; style.left = '30px'; style.right = '40px'; style.bottom = '20px'; } 4ճมߋΛߦ͍ͬͯΔ͕ Reflow/Repaint1ճ͔͠ൃੜ͠ͳ͍
ReFlowͷ࠷దԽΛյ͢ • ϒϥβstyleΛΩϡʔʹ٧ΊɺҰఆ࣌ؒܦ͔ͭมߋճͰΩϡʔΛ ϑϥογϡ͠·͢ • ҎԼͷελΠϧΛಡΈࠐΉͱڧ੍తʹϑϥογϡ͢Δ͜ͱ͕ՄೳͰ͢ - offsetTop/Left/Width/Height - scrollTop/Left/Width/Height
- clientTop/Left/Width/Height - getComputedStyle() - getClientRect() - scrollBy(), scrollTo() - scrollX, scrollY - height, width const div = document.querySelector('div'); for (let i = 0; i < 100; i++) { div.style.left = div.offsetLeft + 50 + 'px'; } ѱ͍ྫ ϧʔϓ֎ͰΩϟογϡ͢Δ͖
documentFragmentΛ͏ • documentFragmentΛ͍ɺෳͷมߋΛ ·ͱΊϨϯμʔπϦʔʹՃ͢Δ͜ͱʹΑΓ ReflowΛҰճʹ͑·͢ https://developer.mozilla.org/en-US/docs/Web/API/DocumentFragment
chromeͰ֬ೝ͢Δํ๏ Rendering Timeline/Paint Profiler
·ͱΊ • ReFlowͱRePaintͷଟൃΛؾʹ͢ΔΑ͏ʹ͠Α͏ • ൃੜτϦΨʔʹͳΔJavaScriptʹؾΛ͚ͭΑ͏ • ΞχϝʔγϣϯCSS transformΛ͓͏
ࢀߟจݙ • https://www.html5rocks.com/ja/tutorials/ internals/howbrowserswork/ • http://rochas.cc/blog/2013/12/09/ frontrend.html • https://gist.github.com/paulirish/ 5d52fb081b3570c81e3a