બ્રાઉজર CSS પરિવર્તનોને પિક્સલમાં પાઇપલાઇન દ્વારા રૂપાંતરિત કરે છે, અને વિવિધ પરિવર્તનો વિવિધ (વધુ કે ઓછો ખર્ચાળ) તબક્કાઓ ટ્રિગર કરે છે:
Style → Layout (reflow) → Paint → Composite
બ્રાઉজર CSS પરિવર્તનોને પિક્સલમાં પાઇપલાઇન દ્વારા રૂપાંતરિત કરે છે, અને વિવિધ પરિવર્તનો વિવિધ (વધુ કે ઓછો ખર્ચાળ) તબક્કાઓ ટ્રિગર કરે છે:
Style → Layout (reflow) → Paint → Composite
/* ❌ trigger LAYOUT (reflow) — costly, recalculates geometry every frame */
width, height, top, left, margin, padding, font-size
/* ⚠️ trigger PAINT — repaint pixels */
color, background, box-shadow, border-radius
/* ✅ trigger only COMPOSITE — GPU, no layout/paint */
transform, opacity
મહત્તમ પ્રવર્તમાન નિયમ : transform અને opacity ને એનિમેટ કરો, width/top/margin નહીં. લેઆઉટ પ્રોપર્ટીઝને એનિમેટ કરવું પ્રત્યેક ફ્રેમ પર લેઆઉટ ફરી ચલાવે છે (jank); transforms GPU દ્વારા કમ્પોઝ થાય છે (부드러운 60fps).
/* ❌ janky */ @keyframes a { to { left: 300px; width: 200px; } }
/* ✅ smooth */ @keyframes b { to { transform: translateX(300px) scaleX(2); } }
.animated { will-change: transform; } /* promotes to its own GPU layer ahead of time */
will-change ફક્ત તત્વો પર જે એનિમેટ થવા વિશે છે તેના પર ઉપયોગ કરો — તેનો ઓવર યુજ કરવો ખૂબ સ્તરો બનાવીને મેમોરી બગાડે છે.
// ❌ read-write-read-write forces multiple synchronous reflows
for (const el of els) { el.style.width = el.offsetWidth + 10 + "px"; }
// ✅ batch reads, then writes
const widths = els.map(el => el.offsetWidth);
els.forEach((el, i) => el.style.width = widths[i] + 10 + "px");
- contain: layout/paint — isolate a subtree so changes don't reflow the whole page
- content-visibility: auto — skip rendering offscreen content
- minimize deep selectors and huge unused stylesheets
રેન્ડરિંગ પ્રવર્તમાન મોટે ભાગે લેઆઉટને વારંવાર ટ્રિગર ન કરવા વિશે છે.
જાણવું કે transform/opacity composite-only (સસ્તા) છે જ્યારે width/top/margin reflow ફોર્સ કરે છે (મહાંગા) — વત્તા લેઆઉટ થ્રેશીંગ અટકાવવા અને contain/content-visibility ઉપયોગ કરવા — આ જ કંઈ છે જે એનિમેશનોને 60fps પર રાખે છે અને પાનાઓને ઝડપી લાગે છે.