Bird
Raised Fist0
SASSmarkup~8 mins

Conditional mixins with @if in SASS - Performance & Optimization

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Performance: Conditional mixins with @if
MEDIUM IMPACT
This affects CSS generation size and browser style recalculation during rendering.
Applying styles conditionally to reduce CSS output
SASS
@mixin button-style($type) {
  color: black;
  background: white;
  border: 1px solid gray;
  @if $type == 'primary' {
    background: blue;
    color: white;
  } @else if $type == 'secondary' {
    background: gray;
  } @else if $type == 'danger' {
    background: red;
    color: yellow;
  }
}

.button-primary {
  @include button-style('primary');
}
.button-secondary {
  @include button-style('secondary');
}
.button-danger {
  @include button-style('danger');
}
.button-default {
  @include button-style('default');
}
Uses mutually exclusive conditions to avoid generating multiple conflicting styles, reducing CSS size and improving rendering.
📈 Performance GainSaves ~1-2kb CSS and reduces style recalculations, improving LCP by a few milliseconds.
Applying styles conditionally to reduce CSS output
SASS
@mixin button-style($type) {
  color: black;
  background: white;
  border: 1px solid gray;
  @if $type == 'primary' {
    background: blue;
    color: white;
  }
  @if $type == 'secondary' {
    background: gray;
  }
  @if $type == 'danger' {
    background: red;
    color: yellow;
  }
}

.button-primary {
  @include button-style('primary');
}
.button-secondary {
  @include button-style('secondary');
}
.button-danger {
  @include button-style('danger');
}
.button-default {
  @include button-style('default');
}
Generates all styles inside the mixin, including unused conditional blocks, increasing CSS size and causing unnecessary style recalculations.
📉 Performance CostAdds extra CSS rules increasing bundle size by ~1-2kb and triggers more style recalculations on load.
Performance Comparison
PatternDOM OperationsReflowsPaint CostVerdict
Conditional mixins with multiple @if blocksNo direct DOM impactTriggers multiple style recalculationsHigher paint cost due to redundant styles[X] Bad
Conditional mixins with @if/@else if chainNo direct DOM impactSingle style recalculation per elementLower paint cost with minimal styles[OK] Good
Rendering Pipeline
Conditional mixins affect the CSS generation step before the browser parses styles. Smaller CSS means faster style calculation and layout.
Style Calculation
Layout
Paint
⚠️ BottleneckStyle Calculation
Core Web Vital Affected
LCP
This affects CSS generation size and browser style recalculation during rendering.
Optimization Tips
1Use @if/@else if chains to avoid generating redundant CSS rules.
2Minimize conditional blocks inside mixins to reduce CSS size.
3Smaller CSS leads to faster style calculation and better LCP.
Performance Quiz - 3 Questions
Test your performance knowledge
What is the main performance benefit of using @if/@else if chains in Sass mixins?
AIt delays CSS loading to improve initial paint.
BIt increases the number of DOM nodes for better layout.
CIt reduces the generated CSS size by avoiding redundant styles.
DIt automatically compresses CSS files.
DevTools: Performance
How to check: Record a page load and look at the 'Style Recalculation' events in the flame chart to see how many times styles are recalculated.
What to look for: Fewer style recalculation events and shorter duration indicate better CSS performance from conditional mixins.

Practice

(1/5)
1. What does the @if directive inside a Sass mixin do?
easy
A. It imports another Sass file.
B. It loops through a list of values.
C. It defines a new CSS class.
D. It applies styles only if a condition is true.

Solution

  1. Step 1: Understand the role of @if in Sass mixins

    The @if directive checks a condition and applies styles only when that condition is true.
  2. Step 2: Compare with other options

    Looping is done with @for or @each, importing uses @import, and defining classes is done with selectors, not @if.
  3. Final Answer:

    It applies styles only if a condition is true. -> Option D
  4. Quick Check:

    @if controls conditional style application [OK]
Hint: Remember: @if controls conditions inside mixins [OK]
Common Mistakes:
  • Confusing @if with loops like @for or @each
  • Thinking @if imports files
  • Assuming @if creates CSS selectors
2. Which of the following is the correct syntax to use @if inside a Sass mixin?
easy
A. @mixin example($flag) { @if $flag { color: red; } }
B. @mixin example($flag) { if ($flag) { color: red; } }
C. @mixin example($flag) { @if ($flag) color: red; }
D. @mixin example($flag) { @if $flag: { color: red; } }

Solution

  1. Step 1: Review correct @if syntax in Sass mixins

    The correct syntax uses @if followed by a condition without parentheses, then curly braces for the block: @if $flag { ... }.
  2. Step 2: Check each option

    @mixin example($flag) { @if $flag { color: red; } } matches correct syntax. @mixin example($flag) { if ($flag) { color: red; } } misses @ before if. @mixin example($flag) { @if ($flag) color: red; } incorrectly uses parentheses and misses braces. @mixin example($flag) { @if $flag: { color: red; } } uses colon incorrectly.
  3. Final Answer:

    @mixin example($flag) { @if $flag { color: red; } } -> Option A
  4. Quick Check:

    Correct @if syntax = @mixin example($flag) { @if $flag { color: red; } } [OK]
Hint: Use @if without parentheses, with braces for blocks [OK]
Common Mistakes:
  • Omitting @ before if
  • Using parentheses around condition
  • Using colon instead of braces
3. Given the Sass code:
@mixin color-choice($color) {
  @if $color == 'red' {
    color: red;
  } @else if $color == 'blue' {
    color: blue;
  } @else {
    color: black;
  }
}

.test {
  @include color-choice('blue');
}

What color will the .test class have?
medium
A. red
B. black
C. blue
D. no color applied

Solution

  1. Step 1: Check the mixin call parameter

    The mixin is called with 'blue' as the argument for $color.
  2. Step 2: Follow the conditional branches

    The first condition checks if $color == 'red' which is false. The second condition @else if $color == 'blue' is true, so color: blue; is applied.
  3. Final Answer:

    blue -> Option C
  4. Quick Check:

    Input 'blue' triggers blue color [OK]
Hint: Match input string exactly in @if conditions [OK]
Common Mistakes:
  • Confusing single quotes with no quotes
  • Ignoring @else if branch
  • Assuming default else applies first
4. Identify the error in this Sass mixin:
@mixin size($value) {
  @if $value > 10
    font-size: 2rem;
  @else
    font-size: 1rem;
}
medium
A. Missing curly braces after @if and @else blocks
B. Incorrect comparison operator >
C. Mixin name cannot be 'size'
D. Variables cannot be used in @if conditions

Solution

  1. Step 1: Check syntax for @if and @else blocks

    In Sass, when using @if and @else inside mixins, blocks must be wrapped in curly braces { }.
  2. Step 2: Identify missing braces

    The code lacks braces after @if $value > 10 and @else, causing syntax errors.
  3. Final Answer:

    Missing curly braces after @if and @else blocks -> Option A
  4. Quick Check:

    Always use braces for conditional blocks [OK]
Hint: Always wrap @if/@else blocks in braces { } [OK]
Common Mistakes:
  • Omitting braces for single-line blocks
  • Using wrong comparison operators
  • Thinking variable names are restricted
5. You want a mixin that sets background color based on a status: 'success' = green, 'warning' = yellow, 'error' = red, else gray. Which Sass mixin correctly uses @if to achieve this?
hard
A. @mixin status-bg($status) { @if $status = 'success' { background-color: green; } @else if $status = 'warning' { background-color: yellow; } @else if $status = 'error' { background-color: red; } @else { background-color: gray; } }
B. @mixin status-bg($status) { @if $status == 'success' { background-color: green; } @else if $status == 'warning' { background-color: yellow; } @else if $status == 'error' { background-color: red; } @else { background-color: gray; } }
C. @mixin status-bg($status) { @if $status == success { background-color: green; } @else if $status == warning { background-color: yellow; } @else if $status == error { background-color: red; } @else { background-color: gray; } }
D. @mixin status-bg($status) { @if $status === 'success' { background-color: green; } @else if $status === 'warning' { background-color: yellow; } @else if $status === 'error' { background-color: red; } @else { background-color: gray; } }

Solution

  1. Step 1: Check comparison operators and string quotes

    Sass uses == for comparison and strings must be quoted. @mixin status-bg($status) { @if $status == 'success' { background-color: green; } @else if $status == 'warning' { background-color: yellow; } @else if $status == 'error' { background-color: red; } @else { background-color: gray; } } uses == and quotes correctly.
  2. Step 2: Review other options for errors

    @mixin status-bg($status) { @if $status = 'success' { background-color: green; } @else if $status = 'warning' { background-color: yellow; } @else if $status = 'error' { background-color: red; } @else { background-color: gray; } } uses single = which is assignment, not comparison. @mixin status-bg($status) { @if $status == success { background-color: green; } @else if $status == warning { background-color: yellow; } @else if $status == error { background-color: red; } @else { background-color: gray; } } misses quotes around strings. @mixin status-bg($status) { @if $status === 'success' { background-color: green; } @else if $status === 'warning' { background-color: yellow; } @else if $status === 'error' { background-color: red; } @else { background-color: gray; } } uses === which is invalid in Sass.
  3. Final Answer:

    @mixin status-bg($status) { @if $status == 'success' { background-color: green; } @else if $status == 'warning' { background-color: yellow; } @else if $status == 'error' { background-color: red; } @else { background-color: gray; } } -> Option B
  4. Quick Check:

    Use == and quotes for string comparison in Sass [OK]
Hint: Use == and quotes for string checks in @if [OK]
Common Mistakes:
  • Using = instead of == for comparison
  • Omitting quotes around strings
  • Using === which is invalid in Sass