CSSãã©ãã¯ã«ãŒã«ã掻çšããŠæ£ç¢ºãªããã©ãŒãã³ã¹ãã©ããã³ã°ãè¡ããããã«ããã¯ãç¹å®ããWebãµã€ãã®ããã³ããšã³ãããã©ãŒãã³ã¹ãæé©åããæ¹æ³ãåŠã³ãŸããå®è£ ãåæãé«åºŠãªãã¯ããã¯ãç¶²çŸ ã
Mastering the CSS Track Rule: A Guide to Performance Tracking and Optimization
仿¥ã®ããžã¿ã«ç°å¢ã§ã¯ããŠã§ããµã€ãã®ããã©ãŒãã³ã¹ãæãéèŠã§ãããŠãŒã¶ãŒã¯ã皲劻ã®ããã«éãèªã¿èŸŒã¿æéãšã·ãŒã ã¬ã¹ãªã€ã³ã¿ã©ã¯ã·ã§ã³ãæåŸ ããŠããŸããäœéãŸãã¯å¿çæ§ã®äœããŠã§ããµã€ãã¯ããŠãŒã¶ãŒã®äžæºããšã³ã²ãŒãžã¡ã³ãã®äœäžããããŠæçµçã«ã¯åçã®æå€±ã«ã€ãªããå¯èœæ§ããããŸããããã³ããšã³ãã®æé©åã¯ãåªãããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸããäžã§éèŠãªåœ¹å²ãæãããCSSãã©ãã¯ã«ãŒã«ã¯ããŠã§ããµã€ãã®CSSããã©ãŒãã³ã¹ãç£èŠããã³æ¹åããããã®åŒ·åãªããŒã«ã§ãã
ãã®å æ¬çãªã¬ã€ãã§ã¯ãCSSãã©ãã¯ã«ãŒã«ã®è€éããæãäžããããã©ãŒãã³ã¹ã广çã«è¿œè·¡ããããã«ããã¯ãç¹å®ããæé©ãªãŠã§ããµã€ãé床ã®ããã«CSSãæé©åããããã®ç¥èãšå®è·µçãªæé ãæäŸããŸãããã©ãã¯ã«ãŒã«ã®åºç€ãããé«åºŠãªå®è£ ãã¯ããã¯ãããã©ãŒãã³ã¹åææŠç¥ãŸã§ããã¹ãŠãç¶²çŸ ããŸãã
What is the CSS Track Rule?
CSSãã©ãã¯ã«ãŒã«ã¯ãCSS Containment Module Level 2仿§ã®äžéšã§ãããç¹å®ã®ã¹ã³ãŒãå ã§ã®CSSæäœã®ããã©ãŒãã³ã¹ãç£èŠããã¡ã«ããºã ãæäŸããŸããéçºè ã¯ãããã©ãŒãã³ã¹ã¡ããªã¯ã¹ãå®çŸ©ããããããCSSã«ãŒã«ã«é¢é£ä»ããããšãã§ãããããã¬ã³ããªã³ã°æéããã®ä»ã®é¢é£ããŒã¿ãæ£ç¢ºã«è¿œè·¡ã§ããŸãã
JavaScript APIããã©ãŠã¶ã®éçºè ããŒã«ã«äŸåããåŸæ¥ã®ããã©ãŒãã³ã¹ç£èŠãã¯ããã¯ãšã¯ç°ãªããCSSãã©ãã¯ã«ãŒã«ã¯ãããã©ãŒãã³ã¹è¿œè·¡ãžã®å®£èšçãªã¢ãããŒããæäŸããŸããããã©ãŒãã³ã¹ã¡ããªã¯ã¹ãCSSã«çŽæ¥åã蟌ãããšã§ãã¹ã¿ã€ã«ã·ãŒãã®ã¬ã³ããªã³ã°åäœã«é¢ããããæ·±ãæŽå¯ãåŸãŠãæé©åã®é åãç¹å®ã§ããŸãã
Benefits of Using the CSS Track Rule
CSSãã©ãã¯ã«ãŒã«ãå®è£ ãããšããŠã§ããµã€ãã®ããã©ãŒãã³ã¹ç£èŠãšæé©åã«å€ãã®ã¡ãªããããããŸãã
- Precise Performance Measurement: ãã©ãã¯ã«ãŒã«ã䜿çšãããšãç¹å®ã®CSSã«ãŒã«ã®ããã©ãŒãã³ã¹ã枬å®ããã¬ã³ããªã³ã°æéãšãªãœãŒã¹äœ¿çšçã«é¢ããè©³çŽ°ãªæŽå¯ãåŸãããšãã§ããŸãã
- Early Bottleneck Detection: ããã©ãŒãã³ã¹ã¡ããªã¯ã¹ã远跡ããããšã§ãéçºããã»ã¹ã®åææ®µéã§ããã©ãŒãã³ã¹ã®ããã«ããã¯ãç¹å®ãããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãžã®åœ±é¿ãé²ãããšãã§ããŸãã
- Declarative Approach: ãã©ãã¯ã«ãŒã«ã¯ãããã©ãŒãã³ã¹ã¡ããªã¯ã¹ãCSSå ã§çŽæ¥å®çŸ©ããããã®å®£èšçãªæ¹æ³ãæäŸããããã©ãŒãã³ã¹ç£èŠãç°¡çŽ åããè€éãªJavaScriptã³ãŒãã®å¿ èŠæ§ã軜æžããŸãã
- Improved Collaboration: ããã©ãŒãã³ã¹ã¡ããªã¯ã¹ãCSSã«åã蟌ãããšã§ãéçºè ããã¶ã€ããŒãããã©ãŒãã³ã¹ãšã³ãžãã¢éã®ã³ãã¥ãã±ãŒã·ã§ã³ãšã³ã©ãã¬ãŒã·ã§ã³ãæ¹åã§ããŸãã
- Data-Driven Optimization: ãã©ãã¯ã«ãŒã«ã¯ãCSSã®æé©åæŠç¥ã«é¢ããæ å ±ã«åºã¥ããæææ±ºå®ãè¡ãããã«äœ¿çšã§ãã貎éãªããã©ãŒãã³ã¹ããŒã¿ãæäŸãããŠã§ããµã€ãã®é床ãšãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãå€§å¹ ã«åäžãããŸãã
Implementing the CSS Track Rule
CSSãã©ãã¯ã«ãŒã«ãå®è£ ããã«ã¯ããã©ãã¯ã³ã³ããã¹ããå®çŸ©ããããã©ãŒãã³ã¹ã¡ããªã¯ã¹ãæå®ããããããCSSã«ãŒã«ã«é¢é£ä»ããå¿ èŠããããŸãããã©ãã¯ã«ãŒã«ãå®è£ ããããã®ã¹ããããã€ã¹ãããã¬ã€ããæ¬¡ã«ç€ºããŸãã
1. Defining a Track Context
ãã©ãã¯ã³ã³ããã¹ãã¯ãããã©ãŒãã³ã¹ã¡ããªã¯ã¹ã远跡ãããã¹ã³ãŒããå®çŸ©ããŸãã@track at-ruleã䜿çšããŠãã©ãã¯ã³ã³ããã¹ããäœæã§ããŸãã
@track my-context {
// Metric definitions go here
}
my-contextèå¥åã¯ããã©ãã¯ã³ã³ããã¹ãã®äžæã®ååã§ããã³ã³ããã¹ãåãšããŠãæå¹ãªCSSèå¥åã䜿çšã§ããŸãã
2. Specifying Performance Metrics
ãã©ãã¯ã³ã³ããã¹ãå
ã§ãmetricèšè¿°åã䜿çšããŠããã©ãŒãã³ã¹ã¡ããªã¯ã¹ãå®çŸ©ã§ããŸããmetricèšè¿°åã¯ãã¡ããªã¯ã¹ã®ååãšãã®ããŒã¿åãæå®ããŸãã
@track my-context {
metric render-time <time>;
metric layout-count <number>;
}
ãã®äŸã§ã¯ã2ã€ã®ã¡ããªã¯ã¹ãå®çŸ©ããŸãããrender-timeã¯ãã¬ã³ããªã³ã°æéã<time>å€ãšããŠæž¬å®ããlayout-countã¯ãã¬ã€ã¢ãŠãæäœã®æ°ã<number>å€ãšããŠè¿œè·¡ããŸãã
3. Associating Metrics with CSS Rules
ããã©ãŒãã³ã¹ã¡ããªã¯ã¹ãCSSã«ãŒã«ã«é¢é£ä»ããã«ã¯ãtrackããããã£ã䜿çšããŸããtrackããããã£ã¯ããã©ãã¯ã³ã³ããã¹ããšãç¹å®ã®CSSã«ãŒã«ã«å¯ŸããŠè¿œè·¡ããã¡ããªã¯ã¹ãæå®ããŸãã
.my-element {
track: my-context render-time, layout-count;
/* CSS rules for .my-element */
}
ãã®äŸã§ã¯ãrender-timeã¡ããªã¯ã¹ãšlayout-countã¡ããªã¯ã¹ã.my-element CSSã«ãŒã«ã«é¢é£ä»ããŸããããã©ãŠã¶ã.my-elementèŠçŽ ãã¬ã³ããªã³ã°ãããã³ã«ãã¬ã³ããªã³ã°æéãšã¬ã€ã¢ãŠãæ°ã远跡ããæå®ããããã©ãã¯ã³ã³ããã¹ãã«ããŒã¿ãå ±åããŸãã
Practical Examples of CSS Track Rule Implementation
CSSãã©ãã¯ã«ãŒã«ãå®éã®ã·ããªãªã§å®è£ ããæ¹æ³ã®å®çšçãªäŸãããã€ãèŠãŠã¿ãŸãããã
Example 1: Tracking Rendering Time of a Complex Animation
ãŠã§ããµã€ãã®ããã©ãŒãã³ã¹ã«åœ±é¿ãäžããŠãããšæãããè€éãªCSSã¢ãã¡ãŒã·ã§ã³ããããšããŸããCSSãã©ãã¯ã«ãŒã«ã䜿çšããŠãã¢ãã¡ãŒã·ã§ã³ã®ã¬ã³ããªã³ã°æéãæž¬å®ã§ããŸãã
@track animation-performance {
metric animation-time <time>;
}
.animated-element {
animation: my-animation 2s infinite;
track: animation-performance animation-time;
}
ãã®äŸã§ã¯ãanimation-performanceãšããååã®ãã©ãã¯ã³ã³ããã¹ããäœæããã¢ãã¡ãŒã·ã§ã³ã®ã¬ã³ããªã³ã°æéã远跡ããããã«animation-timeãšããååã®ã¡ããªã¯ã¹ãå®çŸ©ããŸãããæ¬¡ã«ãanimation-timeã¡ããªã¯ã¹ã.animated-element CSSã«ãŒã«ã«é¢é£ä»ããŸããã
animation-timeã¡ããªã¯ã¹ãç£èŠããããšã§ãã¢ãã¡ãŒã·ã§ã³ãããã©ãŒãã³ã¹ã®åé¡ãåŒãèµ·ãããŠãããã©ãããç¹å®ããããã«å¿ããŠæé©åã§ããŸãã
Example 2: Measuring Layout Count in a Dynamic Layout
é »ç¹ãªãªãããŒãšåæç»ã䌎ãåçãªã¬ã€ã¢ãŠãã¯ãããã©ãŒãã³ã¹ã«è² è·ããããå¯èœæ§ããããŸããCSSãã©ãã¯ã«ãŒã«ã䜿çšããŠãåçãªã¬ã€ã¢ãŠãã®ã¬ã€ã¢ãŠãæ°ã枬å®ã§ããŸãã
@track layout-analysis {
metric layout-count <number>;
}
.dynamic-layout {
track: layout-analysis layout-count;
/* CSS rules for dynamic layout */
}
ãã®äŸã§ã¯ãlayout-analysisãšããååã®ãã©ãã¯ã³ã³ããã¹ããäœæããã¬ã€ã¢ãŠãæäœã®æ°ã远跡ããããã«layout-countãšããååã®ã¡ããªã¯ã¹ãå®çŸ©ããŸãããæ¬¡ã«ãlayout-countã¡ããªã¯ã¹ã.dynamic-layout CSSã«ãŒã«ã«é¢é£ä»ããŸããã
layout-countã¡ããªã¯ã¹ãç£èŠããããšã§ãåçãªã¬ã€ã¢ãŠããéå°ãªã¬ã€ã¢ãŠãæäœãåŒãèµ·ãããŠãããã©ãããç¹å®ãããªãããŒãšåæç»ãæžããããã«æé©åã§ããŸãã
Example 3: Tracking Style Recalculation Time
ã¹ã¿ã€ã«ã®åèšç®ã¯ãç¹ã«è€éãªCSSã»ã¬ã¯ã¿ãŒãšç¶æ¿ãæ±ãå Žåãé倧ãªããã©ãŒãã³ã¹ã®ããã«ããã¯ã«ãªãå¯èœæ§ããããŸããCSSãã©ãã¯ã«ãŒã«ã䜿çšããŠãç¹å®ã®CSSã«ãŒã«ã®ã¹ã¿ã€ã«ã®åèšç®æéãæž¬å®ã§ããŸãã
@track style-performance {
metric style-recalc-time <time>;
}
.complex-selector {
track: style-performance style-recalc-time;
/* CSS rules with complex selectors */
}
ãã®äŸã§ã¯ãstyle-performanceãšããååã®ãã©ãã¯ã³ã³ããã¹ããäœæããã¹ã¿ã€ã«ã®åèšç®æéã远跡ããããã«style-recalc-timeãšããååã®ã¡ããªã¯ã¹ãå®çŸ©ããŸãããæ¬¡ã«ãstyle-recalc-timeã¡ããªã¯ã¹ã.complex-selector CSSã«ãŒã«ã«é¢é£ä»ããŸããã
style-recalc-timeã¡ããªã¯ã¹ãç£èŠããããšã§ãè€éãªCSSã»ã¬ã¯ã¿ãŒãéå°ãªã¹ã¿ã€ã«ã®åèšç®ãåŒãèµ·ãããŠãããã©ãããç¹å®ããããã©ãŒãã³ã¹ãåäžãããããã«æé©åã§ããŸãã
Analyzing Performance Data
CSSãã©ãã¯ã«ãŒã«ãå®è£ ããããã©ãŒãã³ã¹ããŒã¿ãåéããããæ¬¡ã®ã¹ãããã¯ããŒã¿ãåæããŠããã©ãŒãã³ã¹ã®ããã«ããã¯ãç¹å®ããCSSãæé©åããããšã§ãã
JavaScriptã§PerformanceObserver APIã䜿çšããŠãCSSãã©ãã¯ã«ãŒã«ã«ãã£ãŠåéãããããã©ãŒãã³ã¹ããŒã¿ã«ã¢ã¯ã»ã¹ã§ããŸãã
const observer = new PerformanceObserver((list) => {
list.getEntries().forEach((entry) => {
console.log(entry.name, entry.duration);
});
});
observer.observe({ type: "element-timing", buffered: true });
ãã®ã³ãŒãã¹ããããã¯ãCSSãã©ãã¯ã«ãŒã«ã«ãã£ãŠçæãããelement-timingãšã³ããªããªãã¹ã³ããPerformanceObserverãäœæããŸããæ¬¡ã«ããªãã¶ãŒããŒã¯åãšã³ããªã®ååãšæéãã³ã³ãœãŒã«ã«åºåããŸãã
ããã©ãŒãã³ã¹ããŒã¿ãåæããããšã§ãããã©ãŒãã³ã¹ã®åé¡ãåŒãèµ·ãããŠããCSSã«ãŒã«ãç¹å®ããæé©åããããã®æé ãå®è¡ã§ããŸããããšãã°ãç¹å®ã®CSSã¢ãã¡ãŒã·ã§ã³ã®ã¬ã³ããªã³ã°ã«æéãããããããŠããããšããè€éãªCSSã»ã¬ã¯ã¿ãŒãéå°ãªã¹ã¿ã€ã«ã®åèšç®ãåŒãèµ·ãããŠããããšãæ€åºããå ŽåããããŸãã
Advanced Techniques for CSS Performance Optimization
ããã©ãŒãã³ã¹ç£èŠã«CSSãã©ãã¯ã«ãŒã«ã䜿çšããã ãã§ãªããCSSãæé©åããŠæé©ãªãŠã§ããµã€ãé床ãå®çŸããããã«äœ¿çšã§ããé«åºŠãªãã¯ããã¯ãä»ã«ãããã€ããããŸãã
- Minify and Compress CSS: CSSãçž®å°ãããšã空çœãã³ã¡ã³ããªã©ã®äžèŠãªæåãåé€ããããã¡ã€ã«ãµã€ãºãçž®å°ãããŸããGzipãŸãã¯Brotliã䜿çšããŠCSSãå§çž®ãããšããã¡ã€ã«ãµã€ãºãããã«çž®å°ãããããŠã³ããŒãæéãççž®ãããŸãã
- Use CSS Sprites: CSSã¹ãã©ã€ãã¯ãè€æ°ã®ç»åã1ã€ã®ç»åã«çµåããç»åãèªã¿èŸŒãããã«å¿ èŠãªHTTPãªã¯ãšã¹ãã®æ°ãæžãããŸãã
- Avoid @import:
@importãã£ã¬ã¯ãã£ãã¯ããã©ãŠã¶ã«è€æ°ã®CSSãã¡ã€ã«ãé çªã«ããŠã³ããŒãããŠè§£æããããããããŒãžã®ã¬ã³ããªã³ã°ãé ãããå¯èœæ§ããããŸãã代ããã«<link>ã¿ã°ã䜿çšããããšãæ€èšããŠãã ãããããã«ããããã©ãŠã¶ã¯CSSãã¡ã€ã«ã䞊è¡ããŠããŠã³ããŒãã§ããŸãã - Optimize CSS Selectors: è€éãªCSSã»ã¬ã¯ã¿ãŒã¯ãããã©ãŒãã³ã¹ã«è² è·ããããå¯èœæ§ããããŸããé床ã«å ·äœçãªã»ã¬ã¯ã¿ãŒã®äœ¿çšãé¿ããããå¹ççãªã»ã¬ã¯ã¿ãŒã䜿çšããããã«ããŠãã ããã
- Use CSS Containment: CSS Containment Moduleã䜿çšãããšããŠã§ããµã€ãã®äžéšãåé¢ãããµã€ãã®äžéšã§ã®å€æŽããµã€ãã®ä»ã®éšåã§ã®ãªãããŒãšåæç»ãããªã¬ãŒããã®ãé²ãããšãã§ããŸãã
- Leverage Browser Caching: CSSãã¡ã€ã«ãé©åã«ãã£ãã·ã¥ããããã«ãŠã§ããµãŒããŒãæ§æãããã©ãŠã¶ããã£ãã·ã¥ããããã¡ã€ã«ãç¹°ãè¿ãããŠã³ããŒããã代ããã«åå©çšã§ããããã«ããŸãã
- Use a CSS Preprocessor: SassãLessãªã©ã®CSSããªããã»ããµã¯ãããä¿å®ããããå¹ççãªCSSãäœæããã®ã«åœ¹ç«ã¡ãŸãã倿°ãmixinããã¹ããªã©ã®æ©èœãæäŸããCSSéçºãç°¡çŽ åããããã©ãŒãã³ã¹ãåäžãããããšãã§ããŸãã
- Consider Critical CSS: ã¯ãªãã£ã«ã«CSSã¯ããŠã§ããµã€ãã®ãã¡ãŒã¹ããã¥ãŒã³ã³ãã³ããã¬ã³ããªã³ã°ããããã«å¿ èŠãªæå°éã®CSSã§ããã¯ãªãã£ã«ã«CSSãã€ã³ã©ã€ã³åããã¯ãªãã£ã«ã«ã§ãªãCSSã®èªã¿èŸŒã¿ãå»¶æããããšã§ããŠã§ããµã€ãã®ç¥èŠãããèªã¿èŸŒã¿æéãæ¹åã§ããŸãã
Global Considerations for CSS Optimization
ã°ããŒãã«ãªãŒãã£ãšã³ã¹åãã«CSSãæé©åããå Žåã¯ã次ã®èŠçŽ ãèæ ®ããããšãéèŠã§ãã
- Font Loading: ãã¡ã€ã«ãµã€ãºãšèªã¿èŸŒã¿ããã©ãŒãã³ã¹ãèæ ®ããŠãWebãã©ã³ããæ éã«éžæããŠãã ãããFOITïŒFlash of Invisible TextïŒããã³FOUTïŒFlash of Unstyled TextïŒãé²ãããã«ãfont-displayæŠç¥ã䜿çšããŠãã ããããã¡ã€ã«ãµã€ãºãçž®å°ããããã©ãŒãã³ã¹ãåäžãããããã«ãå¯å€ãã©ã³ãã®äœ¿çšãæ€èšããŠãã ããã
- Image Optimization: ããŸããŸãªããã€ã¹ãšç»é¢è§£å床ã«åãããŠç»åãæé©åããŸããã¬ã¹ãã³ã·ãç»åãšé©åãªç»å圢åŒïŒWebPãAVIFïŒã䜿çšããŠããã¡ã€ã«ãµã€ãºãçž®å°ããèªã¿èŸŒã¿æéãççž®ããŸãã
- Content Delivery Network (CDN): CDNã䜿çšããŠãCSSãã¡ã€ã«ãäžçäžã®è€æ°ã®ãµãŒããŒã«åæ£ããã¬ã€ãã³ã·ãåæžããããŸããŸãªå°ççãªå Žæã«ãããŠãŒã¶ãŒã®ããŠã³ããŒãé床ãåäžãããŸãã
- Localization: CSSãããŸããŸãªèšèªãšæåã»ããããµããŒãããŠããããšã確èªããŸããé©åãªãã©ã³ããã¡ããªãŒãšããã¹ãã¬ã³ããªã³ã°ãã¯ããã¯ã䜿çšããŠãããŸããŸãªèšèªã§ããã¹ããæ£ãã衚瀺ãããããã«ããŸãã
- Accessibility: CSSãé害ã®ãããŠãŒã¶ãŒã«ãšã£ãŠã¢ã¯ã»ã¹å¯èœã§ããããšã確èªããŸããã»ãã³ãã£ãã¯HTMLãšARIA屿§ã䜿çšããŠãæ¯æŽæè¡ããŠã§ããµã€ããæ£ããã¬ã³ããªã³ã°ããããã«å¿ èŠãªæ å ±ãæäŸããŸãã
Conclusion
CSSãã©ãã¯ã«ãŒã«ã¯ãããã©ãŒãã³ã¹ãã©ããã³ã°ãšæé©åã®ããã®åŒ·åãªããŒã«ã§ãããã©ãã¯ã«ãŒã«ãå®è£ ããçæãããããã©ãŒãã³ã¹ããŒã¿ãåæããããšã§ãããã©ãŒãã³ã¹ã®ããã«ããã¯ãç¹å®ããæé©ãªãŠã§ããµã€ãé床ãšãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã®ããã«CSSãæé©åã§ããŸããä»ã®é«åºŠãªCSSæé©åãã¯ããã¯ãšçµã¿åãããããšã§ãCSSãã©ãã¯ã«ãŒã«ã¯ãäžçäžã®ãªãŒãã£ãšã³ã¹ã®ããŒãºãæºãããé«éã§å¿çæ§ãé«ããé åçãªãŠã§ããµã€ããæäŸããã®ã«åœ¹ç«ã¡ãŸãããã©ã³ãã®èªã¿èŸŒã¿ãç»åã®æé©åãããŒã«ãªãŒãŒã·ã§ã³ãªã©ãã°ããŒãã«ãªèŠçŽ ãèæ ®ããŠãäžçäžã®ãªãŒãã£ãšã³ã¹åãã«CSSãæé©åããããšãå¿ããªãã§ãã ãããããŒã¿ã«åºã¥ããæé©åãæ¡çšãããŠã§ããµã€ãã®ããã©ãŒãã³ã¹ãç¶ç¶çã«ç£èŠããŠãå Žæãããã€ã¹ã«é¢ä¿ãªãããã¹ãŠã®äººã«ã·ãŒã ã¬ã¹ãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãä¿èšŒããŸãã