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
@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
Ready to prove it?
Pass the test and this pattern moves unknown
