Bird
Raised Fist0
SASSmarkup~8 mins

Extend limitations and gotchas in SASS - Performance & Optimization

Choose your learning style10 modes available
Performance: Extend limitations and gotchas
MEDIUM IMPACT
Using @extend in Sass affects CSS generation size and browser rendering performance by increasing selector complexity and causing style recalculations.
Reusing styles across multiple selectors
SASS
@mixin button-styles { padding: 1rem; background: blue; }
.button { @include button-styles; }
.card { @include button-styles; color: white; }
Uses mixins to copy styles without creating complex selectors, keeping CSS simpler and smaller.
📈 Performance GainSaves 5-10kb in CSS size; faster style matching and rendering
Reusing styles across multiple selectors
SASS
.button { padding: 1rem; background: blue; }
.card { @extend .button; color: white; }
Generates long combined selectors that increase CSS file size and cause slower style matching in browsers.
📉 Performance CostAdds 5-10kb to CSS bundle; triggers slower style recalculation during page load
Performance Comparison
PatternDOM OperationsReflowsPaint CostVerdict
@extend with many selectorsNo extra DOM nodesTriggers multiple reflows if styles changeHigh paint cost due to complex styles[X] Bad
Mixin for style reuseNo extra DOM nodesSingle reflow on style changeLower paint cost with simpler styles[OK] Good
Rendering Pipeline
When @extend creates combined selectors, the browser must match more complex selectors during Style Calculation, increasing CPU work and delaying rendering.
→Style Calculation
→Layout
→Paint
⚠️ BottleneckStyle Calculation due to complex selector matching
Core Web Vital Affected
LCP
Using @extend in Sass affects CSS generation size and browser rendering performance by increasing selector complexity and causing style recalculations.
Optimization Tips
1Avoid overusing @extend to prevent large, complex CSS selectors.
2Prefer mixins or utility classes for style reuse to keep CSS simpler.
3Monitor CSS file size and style calculation time to catch performance issues.
Performance Quiz - 3 Questions
Test your performance knowledge
What is a main performance drawback of using @extend in Sass?
AIt blocks JavaScript execution during rendering.
BIt increases the number of DOM elements on the page.
CIt creates complex CSS selectors that slow down browser style matching.
DIt reduces CSS file size too much.
DevTools: Performance
How to check: Record a performance profile while loading the page; look for long Style Calculation times and large CSS files in the Network panel.
What to look for: High Style Calculation duration and large CSS file size indicate heavy @extend usage causing performance issues.

Practice

(1/5)
1. What is the main limitation of using @extend in Sass?
easy
A. It merges selectors which can cause unexpected CSS output
B. It duplicates all styles instead of reusing them
C. It only works with ID selectors
D. It cannot be used inside nested rules

Solution

  1. Step 1: Understand what @extend does

    @extend reuses styles by merging selectors in the final CSS output.
  2. Step 2: Identify the limitation

    Merging selectors can cause unexpected combined selectors, leading to unwanted CSS rules.
  3. Final Answer:

    It merges selectors which can cause unexpected CSS output -> Option A
  4. Quick Check:

    @extend merges selectors = A [OK]
Hint: Remember: @extend merges selectors, not duplicates styles [OK]
Common Mistakes:
  • Thinking @extend duplicates styles
  • Believing @extend only works with IDs
  • Assuming @extend cannot be nested
2. Which of the following is the correct syntax to extend a placeholder selector %button-base inside a class .primary-button?
easy
A. .primary-button { @extend button-base; }
B. .primary-button { @extend %button-base; }
C. .primary-button { extend %button-base; }
D. .primary-button { @extend #button-base; }

Solution

  1. Step 1: Recall placeholder selector syntax

    Placeholder selectors start with % and must be referenced exactly with @extend %name.
  2. Step 2: Check each option

    Only .primary-button { @extend %button-base; } uses @extend %button-base correctly.
  3. Final Answer:

    .primary-button { @extend %button-base; } -> Option B
  4. Quick Check:

    Use @extend %placeholder syntax = C [OK]
Hint: Always prefix placeholder selectors with % when extending [OK]
Common Mistakes:
  • Omitting the % in the extend statement
  • Using wrong keywords like 'extend' without @
  • Confusing ID (#) with placeholder (%) selectors
3. Given the Sass code:
.alert { color: red; }
.error { @extend .alert; font-weight: bold; }

What will be the compiled CSS output?
medium
A. .alert, .error { color: red; } .error { font-weight: bold; }
B. .alert { color: red; } .error { font-weight: bold; }
C. .error { color: red; font-weight: bold; }
D. .alert { color: red; font-weight: bold; } .error { }

Solution

  1. Step 1: Understand @extend merges selectors

    The .error selector extends .alert, so both selectors share the color: red; style.
  2. Step 2: Check the output structure

    The merged selector .alert, .error has color: red;, and .error has its own font-weight: bold;.
  3. Final Answer:

    .alert, .error { color: red; } .error { font-weight: bold; } -> Option A
  4. Quick Check:

    Selectors merged, styles combined = D [OK]
Hint: Extended selectors share styles in a combined selector list [OK]
Common Mistakes:
  • Expecting duplicated styles instead of merged selectors
  • Thinking extended styles appear only inside the extending selector
  • Ignoring that @extend merges selectors
4. Consider this Sass code:
.btn { color: blue; }
.special-btn { @extend .btn; background: yellow; }
.btn-primary { @extend .btn; }

Why might the compiled CSS include unexpected selectors combined with .btn-primary?
medium
A. Because @extend duplicates styles instead of merging
B. Because @extend only works with placeholder selectors
C. Because @extend merges all selectors that extend .btn into one group
D. Because @extend cannot be used with classes

Solution

  1. Step 1: Understand how @extend merges selectors

    All selectors extending .btn are merged into one combined selector group in the output CSS.
  2. Step 2: Identify why unexpected combinations happen

    Since both .special-btn and .btn-primary extend .btn, their selectors get merged, causing combined selectors.
  3. Final Answer:

    Because @extend merges all selectors that extend .btn into one group -> Option C
  4. Quick Check:

    @extend merges selectors = B [OK]
Hint: Multiple extends on one selector merge all selectors together [OK]
Common Mistakes:
  • Thinking @extend duplicates styles
  • Believing @extend only works with placeholders
  • Assuming @extend cannot be used with classes
5. You want to reuse styles but avoid unwanted CSS output from @extend. Which approach is best?
hard
A. Use @extend inside media queries only
B. Use @extend on regular classes only
C. Duplicate styles manually instead of using @extend
D. Use placeholder selectors (e.g., %base-style) and extend them

Solution

  1. Step 1: Understand placeholder selectors

    Placeholder selectors start with % and do not output CSS unless extended.
  2. Step 2: Why use placeholders with @extend

    Extending placeholders avoids unwanted CSS output because placeholders themselves don't generate CSS.
  3. Step 3: Evaluate other options

    Extending regular classes merges selectors and outputs all styles, duplicating styles is inefficient, and limiting @extend to media queries doesn't solve unwanted output.
  4. Final Answer:

    Use placeholder selectors (e.g., %base-style) and extend them -> Option D
  5. Quick Check:

    Placeholders prevent unwanted CSS output = A [OK]
Hint: Use %placeholders with @extend to avoid extra CSS [OK]
Common Mistakes:
  • Extending regular classes causing large CSS output
  • Copy-pasting styles instead of reusing
  • Misusing @extend inside media queries
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard