Recursive mixins help you repeat a style or calculation many times without writing it over and over. They save time and keep your code clean.
Recursive mixins in SASS
Start learning this pattern below
Jump into concepts and practice - no test required
@mixin mixin-name($count) { @if $count > 0 { // Your styles here @include mixin-name($count - 1); } }
The mixin calls itself with a smaller number until it reaches zero.
Use @if to stop the recursion and avoid infinite loops.
box-shadow with decreasing blur radius ($count * 2px) each time. However, only the final declaration (smallest blur when $count=1) applies, as later ones override earlier ones.@mixin box-shadow-recursive($count) { @if $count > 0 { box-shadow: 0 0 #{ $count * 2 }px rgba(0, 0, 0, 0.1); @include box-shadow-recursive($count - 1); } }
padding values ($count rem). However, only the final (smallest) padding applies due to overriding.@mixin padding-recursive($count) { @if $count > 0 { padding: #{ $count }rem; @include padding-recursive($count - 1); } }
@mixin empty-recursive($count) { @if $count > 0 { // No styles here @include empty-recursive($count - 1); } }
This code applies a recursive mixin to create multiple border and padding declarations with lightness scaled by $count (higher count = lighter). Due to CSS overriding, only the deepest recursion's styles apply: 1px solid border at ~10% lightness (dark gray) and 0.5rem padding.
@use "sass:color"; @mixin recursive-border($count) { @if $count > 0 { border: 1px solid color.scale(black, $lightness: $count * 10%); padding: 0.5rem; @include recursive-border($count - 1); } } .box { @include recursive-border(3); background-color: #eee; width: 10rem; height: 10rem; }
Recursive mixins run until the stop condition is met, so always include a condition like @if $count > 0.
Too many recursive calls can slow down your CSS compilation.
Use recursion when you want to generate repeated styles that depend on a number, but for simple repeats, loops might be easier.
Recursive mixins call themselves to repeat styles multiple times.
Always include a stop condition to avoid infinite loops.
Useful for creating layered or repeated styles that change step by step.
Practice
sass?Solution
Step 1: Understand what recursion means in programming
Recursion means a function or mixin calls itself to repeat an action.Step 2: Apply this to sass mixins
A recursive mixin calls itself to repeat styles multiple times, often with changes each time.Final Answer:
To call itself repeatedly to apply styles multiple times -> Option AQuick Check:
Recursive mixin = repeated self-call [OK]
- Confusing recursion with importing files
- Thinking mixins only define variables
- Mixing up animations with recursion
sass?Solution
Step 1: Check for stop condition in mixin
@mixin repeat($n) { @if $n > 0 { color: red; @include repeat($n - 1); } } uses@if $n > 0to stop recursion when $n reaches 0.Step 2: Verify recursive call decreases $n
@mixin repeat($n) { @if $n > 0 { color: red; @include repeat($n - 1); } } calls itself with$n - 1, moving towards stop condition.Final Answer:
@mixin repeat($n) { @if $n > 0 { color: red; @include repeat($n - 1); } } -> Option BQuick Check:
Stop condition + decrement = correct recursion [OK]
- Missing stop condition causing infinite loop
- Incrementing instead of decrementing parameter
- Calling mixin without parameters
.box after compilation?@mixin colorLayers($n) {
@if $n > 0 {
color: lighten(blue, $n * 10%);
@include colorLayers($n - 1);
}
}
.box {
@include colorLayers(2);
}Solution
Step 1: Understand the recursion steps
The mixin calls itself twice: first with $n=2, then $n=1, then stops at 0.Step 2: Analyze color changes
Each call appliescolor: lighten(blue, $n * 10%). So first lighten by 20%, then by 10%.Final Answer:
The text color will be a light blue shade (lightened twice) -> Option DQuick Check:
Recursive lighten steps = light blue [OK]
- Assuming only one color applied
- Ignoring recursive layering of styles
- Thinking recursion causes error here
@mixin borderLayers($count) {
border: 1px solid black;
@include borderLayers($count - 1);
}Solution
Step 1: Check for stop condition
The mixin calls itself without any condition, causing infinite recursion.Step 2: Fix by adding stop condition
Adding@if $count > 0before recursive call stops recursion when count reaches 0.Final Answer:
Missing stop condition; add@if $count > 0before recursive call -> Option AQuick Check:
Stop condition prevents infinite recursion [OK]
- Forgetting stop condition
- Confusing @include with @extend
- Changing parameter names unnecessarily
Solution
Step 1: Check for stop condition and parameter updates
@mixin shadowLayers($n, $blur: 2) { @if $n > 0 { box-shadow: 0 0 #{$blur}px rgba(0,0,0,0.3); @include shadowLayers($n - 1, $blur + 2); } } has@if $n > 0to stop recursion and increments blur by 2 each call.Step 2: Verify recursive call and shadow layering
@mixin shadowLayers($n, $blur: 2) { @if $n > 0 { box-shadow: 0 0 #{$blur}px rgba(0,0,0,0.3); @include shadowLayers($n - 1, $blur + 2); } } calls itself with$n - 1and increasing blur, layering shadows correctly 3 times.Final Answer:
@mixin shadowLayers($n, $blur: 2) { @if $n > 0 { box-shadow: 0 0 #{$blur}px rgba(0,0,0,0.3); @include shadowLayers($n - 1, $blur + 2); } } -> Option CQuick Check:
Stop condition + parameter increment = correct recursive layering [OK]
- No stop condition causing infinite recursion
- Wrong comparison operator in stop condition
- Not incrementing blur value each recursion
