دوال 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;۔
استخدام المعطيات المتغيرة (...)
استخدم المعطيات المتغيرة إذا كنت تريد تمرير عدة قيم۔ وهذا مفيد للتعامل مع القوائم أو الألوان المتعددة۔
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;۔
إرجاع ومعالجة القوائم أو الخرائط
يمكن للدوال أيضًا إرجاع قوائم (مفصولة بمسافة أو فاصلة) وخرائط۔ وهذا مفيد لإرجاع القيم المعقدة۔
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)، ثم يتم استرجاع القيم باستخدام
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}- عند إرجاع النسب المئوية كسلاسل نصية، قم بضبط الدقة باستخدام الإدراج أو
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)";- ترك تعليقات مع أمثلة صغيرة عن 'المخرجات المتوقعة' يسهل اكتشاف التراجع عند إعادة هيكلة الكود لاحقًا۔ الترجمة التلقائية في بيئة تكامل مستمر وفحص المخرجات بصريًا فعال۔
الملخص
تعتبر دوال SASS طريقة قوية لزيادة قابلية إعادة الاستخدام والاتساق في الأنماط۔ صممها لتكون صغيرة وبسيطة، وتأكد من الأمان باستخدام @error و@warn۔ تعتبر دوال المساعدة للألوان، التباعد، وتحويل الوحدات ملائمة لجمعها في مكتبة مشتركة۔ لتجنب عبء الترجمة الزائد، فكر في فصل العمليات المعقدة لخطوات بناء أخرى عند الضرورة۔
يمكنك متابعة المقالة أعلاه باستخدام Visual Studio Code على قناتنا على YouTube.۔ يرجى التحقق من القناة على YouTube أيضًا.۔