פונקציות SASS
מאמר זה מסביר את פונקציות SASS.
נסביר לעומק את פונקציות SASS מהבסיס ועד נושאים מתקדמים, כולל דוגמאות שימושיות לעבודה בעולם האמיתי.
YouTube Video
פונקציות SASS
פונקציות SASS הן כלים חזקים המאפשרים לארוז לוגיקה חוזרת בגליונות סגנון, כגון חישובים, עיצוב והתפלגות תנאים.
מבנה בסיסי ושימוש בפונקציות
פונקציות SASS מוגדרות עם @function ומחזירות ערך עם @return. קוראים לפונקציות בדיוק כמו לפונקציות המובנות.
1// Example: Define a simple function that doubles a value
2@function double($n) {
3 @return $n * 2;
4}
5
6// Use the function
7.example {
8 width: double(10px); // -> 20px
9}- הקוד הזה מגדיר פונקציה שמכפילה מספר ומיישמת אותו על הרוחב. כתוצאה מכך, ייווצר .example { width: 20px; }.
ארגומנטים, ערכי ברירת מחדל וטיפול בסוג הנתונים
פונקציות יכולות לקבל מספר ארגומנטים ולקבוע ערכי ברירת מחדל. SASS לא מחייב טיפוס נתונים סטטי, אך תשומת לב לסוגי ארגומנטים תחזק את הפונקציות שלך.
1// Example: Function with default parameters
2@function responsive-font($base-size, $scale: 1.2, $unit: px) {
3 @return $base-size * $scale + $unit;
4}
5
6.title {
7 font-size: responsive-font(16, 1.25); // -> 20px
8}- ל־responsive-font יש ערכי ברירת מחדל עבור scale ו־unit, וניתן להשמיט חלק מהארגומנטים בקריאה. בדוגמה הזו, ערך כמו
font-size: 20px;יודפס.
שימוש בארגומנטים משתנים (Variadic - ...)
השתמש בארגומנטים משתנים אם יש צורך להעביר מספר ערכים. זה שימושי לעבודה עם רשימות או מספר צבעים.
1// Example: Sum any number of numbers passed in
2@function sum-all($numbers...) {
3 $total: 0;
4 @each $n in $numbers {
5 $total: $total + $n;
6 }
7 @return $total;
8}
9
10.box {
11 padding: sum-all(4px, 6px, 10px); // -> 20px
12}- ארגומנט משתנה כמו $numbers... נחשב כרשימה וניתן לעבור עליו באמצעות @each. בדוגמה הזו, יודפס
padding: 20px;.
החזרה וטיפול ברשימות או מפות (maps)
פונקציות יכולות להחזיר גם רשימות (מופרדות בפסיק או רווח) ומפות. זה שימושי להחזרת ערכים מורכבים.
1@use "sass:map";
2
3// Example: Return a map of spacing scale
4@function spacing-scale($base) {
5 @return (
6 'small': $base * 0.5,
7 'medium': $base,
8 'large': $base * 2
9 );
10}
11
12$scale: spacing-scale(8px);
13
14.card {
15 margin-bottom: map.get($scale, 'medium');
16}- הפונקציה מחזירה מפה, ואז הערכים נשאבים באמצעות
map.get. באופן זה אפשר לשמור על מערכת ריווח עקבית.
פונקציות עם תנאים ולולאות
@if, @else if, @else, @for, @each ו־@while כולם ניתנים לשימוש בתוך פונקציות. אפשר ליצור לוגיקת חישוב בעזרת תנאים ולולאות.
1// Example: Generate modular scale value using loop
2@function modular-scale($step, $base: 1rem, $ratio: 1.25) {
3 $result: $base;
4 @if $step == 0 {
5 @return $result;
6 }
7 @if $step > 0 {
8 @for $i from 1 through $step {
9 $result: $result * $ratio;
10 }
11 } @else {
12 @for $i from 1 through abs($step) {
13 $result: $result / $ratio;
14 }
15 }
16 @return $result;
17}
18
19.h1 {
20 font-size: modular-scale(3, 1rem, 1.333);
21}- פונקציה זו מחשבת סולם מודולרי ומכפילה או מחלקת לפי שלבים חיוביים או שליליים.
modular-scale(3, 1rem, 1.333)מחזירה גודל פונטים שלוש דרגות מעל הבסיס.
טיפול בשגיאות ואזהרות (@error, @warn)
אפשר לעצור עם @error במקרה של ארגומנטים שגויים או פעולות לא צפויות, או להוציא אזהרות עם @warn. המטרה היא להתריע בפני המשתמשים על בעיות בשלב מוקדם.
1@use "sass:math";
2@use "sass:meta";
3
4// Example: Validate input and throw an error for invalid units
5@function ensure-length($value) {
6 @if meta.type-of($value) != 'number' or math.is-unitless($value) {
7 @error "Expected a length with units, got #{$value}.";
8 }
9 @return $value;
10}
11
12// Valid input (should pass)
13.test-valid {
14 width: ensure-length(10px); // expect: 10px
15}
16
17// Invalid input (should throw error during compilation)
18// Uncomment the following to test error handling:
19//
20// .test-invalid {
21// // expect error: "Expected a length with units, got 10."
22// width: ensure-length(10);
23// }- אם תעביר ערכים לא תקינים, תצא שגיאה בזמן הבנייה וכך קל לאתר את הסיבה. בדיקות בתוך הפונקציה עוזרות בזיהוי תקלות מוקדם.
יצירת פונקציות לצבעים
ב־SASS, ניתן לשלב פונקציות שונות שמטפלות בצבעים כדי ליצור פלטת צבעים מותאמת אישית. זה שימושי לניהול ערכת צבעים עקבית לאורך כל הפרויקט שלך.
1@use "sass:color";
2@use "sass:list";
3
4// Example: Generate a color palette (tints and shades) from a base color
5@function palette($color, $steps: 5, $strength: 10%) {
6 $colors: ();
7 @for $i from 0 through $steps {
8 $amount: $i * $strength;
9 $shade: if($i == 0, $color, color.mix(black, $color, $amount));
10 $tint: color.mix(white, $color, $amount);
11 $colors: list.append($colors, $shade);
12 $colors: list.append($colors, $tint);
13 }
14 @return $colors;
15}
16
17$palette: palette(#3498db, 3, 15%);
18
19.btn {
20 background-color: list.nth($palette, 1);
21}- בדוגמה הזו, נעשה שימוש ב־
color.mixכדי ליצור כהות על ידי ערבוב עם שחור וגוונים על ידי ערבוב עם לבן. הערכים מוחזרים ברשימה, וניתן לגשת אליהם באמצעותlist.nth.
הערות על ביצועים וזמן הידור
פונקציות SASS עובדות בזמן הידור. לולאות רבות, רקורסיה עמוקה או פעולות רבות על מפות יאריכו את זמן ההידור. יש לשמור שהפונקציות יהיו קצרות ופשוטות, ומומלץ לבצע עיבודים מורכבים בכלי בנייה חיצוניים ולא בתוך SASS.
אוסף פונקציות שימושיות
להלן פונקציות עזר נפוצות. הקוד מותאם לשימוש מיידי בפרויקטים אמיתיים.
1@use "sass:math";
2
3// Example: Clamp a value between min and max
4@function clamp-value($value, $min, $max) {
5 @if $value < $min {
6 @return $min;
7 } @else if $value > $max {
8 @return $max;
9 }
10 @return $value;
11}
12
13// Example: Convert px to rem (with optional root size)
14@function px-to-rem($px, $root: 16px) {
15 @if math.unit($px) != "px" {
16 @error "px-to-rem requires a px value.";
17 }
18 @return ($px / $root) * 1rem;
19}-
clamp-valueמגביל ערך למקסימום ולמינימום, ו־px-to-remממיר ערכי פיקסלים ל־rem. שניהם מפשטים תהליכים נפוצים בעיצוב רספונסיבי.
בחירה בין @function למיקסינים (@mixin)
פונקציות מחזירות ערכים, בעוד שמיקסינים מוסיפים בלוקים של CSS. אם התוצאה היא ערך אחד, השתמש בפונקציה; אם זו קבוצה של כללים, השתמש במיקסין.
1// Example: Function returns a value
2@function border-radius-value($size) {
3 @return $size * 1px;
4}
5
6// Example: Mixin outputs properties
7@mixin rounded($size) {
8 border-radius: border-radius-value($size);
9 -webkit-border-radius: border-radius-value($size);
10}
11.card {
12 @include rounded(8);
13}- פונקציות מחזירות ערכים כמו מספרים או צבעים, ומיקסינים מוסיפים סט מאפיינים שלם. הפרדה ברורה בעיצוב מגבירה את התחזוקתיות.
מניפולציה של מחרוזות ושיקולי פורמט תוצאה
יש להיזהר בטיפול במספרים עם יחידות ובמחרוזות ב־SASS. חיבור מחרוזת למספר עם יחידה עלול לגרום לפלט לא צפוי. השתמש ב־unquote() או באינטרפולציה (#{}) לפי הצורך.
1@use "sass:math";
2
3// Example: Safely create a CSS value string
4@function px-percentage($px, $total) {
5 $percent: math.div($px, $total) * 100;
6 @return "#{$percent}%";
7}
8
9// Safer with interpolation and math module
10@function px-percentage-safe($px, $total) {
11 $percent: math.div($px, $total) * 100;
12 // Round to 2 decimal places safely
13 $rounded: math.div(math.round($percent * 100), 100);
14 @return "#{$rounded}%";
15}- בעת החזרת אחוזים כמחרוזת, יש לשלוט בדיוק (precision) באמצעות אינטרפולציה או round לצורך בהירות. כדי להימנע מבאגים, יש להקפיד על טיפול נכון בסוגי נתונים בעת שילוב תוצאות עם מחרוזות.
שיטות עבודה מומלצות לבדיקות ותיעוד
לאחר כתיבת פונקציה, צור קבצי SCSS קטנים עם דוגמאות שימוש לבדיקה, מה שמקל על תחזוקה. אפשר לתעד לכל פונקציה את סוג/יחידת הקלט, סוג ההחזרה, תרחישי כשל, ודוגמאות שימוש.
1@use "sass:math";
2
3// Example: Inline "tests" (partial usage examples)
4// These can be compiled separately during development
5
6@function double($n) {
7 @return $n * 2;
8}
9
10@function px-to-rem($px, $root: 16px) {
11 @if math.unit($px) != "px" {
12 @error "px-to-rem requires a px value.";
13 }
14 @return math.div($px, $root) * 1rem;
15}
16
17// Test double()
18.test-double {
19 width: double(12px); // expect 24px
20}
21
22// Test px-to-rem()
23.test-rem {
24 font-size: px-to-rem(18px, 18px); // expect 1rem
25}
26
27// --- Inline debug tests ---
28@debug "double(12px) => #{double(12px)} (expect 24px)";
29@debug "px-to-rem(18px, 18px) => #{px-to-rem(18px, 18px)} (expect 1rem)";- כתיבת הערות עם דוגמאות פלט צפוי מסייעת בזיהוי רגרסיות בעריכה עתידית. הידור אוטומטי בסביבת CI ובדיקת פלט באופן חזותי הוא מהלך יעיל.
סיכום
פונקציות SASS הן כלי עוצמתי לשיפור שימוש חוזר ועקביות בעיצובים. עצב פונקציות שיישארו קטנות ופשוטות, ודאג לאבטחה עם @error ו־@warn. פונקציות עזר לצבע, ריווח והמרת יחידות נוח לרכז בספריה משותפת. כדי להימנע מעומס הידור, שקול להעביר עיבודים מורכבים לשלבים אחרים בתהליך הבנייה לפי הצורך.
תוכלו לעקוב אחר המאמר שלמעלה באמצעות Visual Studio Code בערוץ היוטיוב שלנו. נא לבדוק גם את ערוץ היוטיוב.