الفرق بين المراجعتين لصفحة: «Sass/SassScript»
إضافة الصفحة |
ط استبدال النص - '\[\[تصنيف:(.*)\]\]' ب'{{SUBPAGENAME}}' |
||
(5 مراجعات متوسطة بواسطة مستخدمين اثنين آخرين غير معروضة) | |||
سطر 1: | سطر 1: | ||
بالإضافة إلى الصياغة العادية للغة [[CSS]]، | تدعم Sass، بالإضافة إلى الصياغة العادية للغة [[CSS]]، مجموعةً صغيرةً من المُلحقات تُدعى SassScript. تُتيح SassScript للخاصيّات استخدام المتغيرات والعمليات الحسابيّة ودوالَّ أخرى إذ يمكن استخدام SassScript في قيمة أيِّ خاصيّة. | ||
يمكن أيضًا استخدامها لتوليد المُحددّات (selectors) وأسماء الخاصِّيَّات، وهو أمرٌ مفيد عند كتابة [[Sass/mixins|المخاليط]] (mixins) إذ يكون ذلك باستخدام الاستيفاء (interpolation). | |||
==الصّدَفة التفاعلية (Interactive Shell)== | |||
== الصّدَفة التفاعلية (Interactive Shell) == | يمكنك تجريب SassScript بسهولةٍ باستخدام الصّدفة التفاعلية. لتشغيل تلك الصّدفة، اكتب الأمر <code>sass</code> في سطر الأوامر متبوعًا بالخيار <code>-i</code> ثمَّ أدخل في المِحث (prompt) أيَّ تعبير صالح في SassScript لأجل تقييمه وطباعة النتائج.<syntaxhighlight lang="sass"> | ||
يمكنك تجريب SassScript بسهولةٍ باستخدام الصّدفة التفاعلية. لتشغيل | |||
$ sass -i | $ sass -i | ||
>> "Hello, Sassy World!" | >> "Hello, Sassy World!" | ||
سطر 16: | سطر 15: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
==المتغيرات: <code>$</code>== | |||
== المتغيرات: <code>$</code> == | الطريقة البدهيّة لاستخدام SassScript هي باستخدام المتغيرات. تبدأ المتغيرات بعلامة الدولار (<code>$</code>)، وتُضبط كما تُضبط خاصيّات [[CSS]].<syntaxhighlight lang="sass"> | ||
الطريقة البدهيّة لاستخدام SassScript هي باستخدام المتغيرات. تبدأ المتغيرات بعلامة الدولار (<code>$</code>)، وتُضبط كما تُضبط خاصيّات [[CSS]] | |||
$width: 5em; | $width: 5em; | ||
</syntaxhighlight>يمكنك بعد ذلك الإشارة إليها في الخاصيّات، | </syntaxhighlight>يمكنك بعد ذلك الإشارة إليها في الخاصيّات، مثل:<syntaxhighlight lang="sass"> | ||
#main { | #main { | ||
width: $width; | width: $width; | ||
} | } | ||
</syntaxhighlight>المتغيرات | </syntaxhighlight>ستكون المتغيرات مرئيةً فقط في مستوى المُحدّدات المُتشعّبة حيث عُرِّفت أو دُونه. وإن عُرِّفت خارج كل المُحدّدات المتشعّبة، فستكون مُتاحةً في كل مكان. يمكن أيضًا جعلها متاحةً في كل مكانٍ يدويًا باستعمال بالرّاية <code>!global</code>. انظر على سبيل المثال:<syntaxhighlight lang="sass"> | ||
#main { | #main { | ||
$width: 5em !global; | $width: 5em !global; | ||
سطر 43: | سطر 41: | ||
} | } | ||
</syntaxhighlight>لأسباب تاريخية، لا فرق بين الشّرْطات (hyphens) والشرطات السُّفلية (underscores) في أسماء | </syntaxhighlight>لأسباب تاريخية، لا فرق بين الشّرْطات العاديَّة (hyphens) والشرطات السُّفلية (underscores) في أسماء المتغيّرات (وجميع مُعرِّفات Sass الأخرى). إن عَرّفت مثلًا متغيّرًا باسم <code>$main-width</code>، فيمكنك الوصول إليه بالاسم <code>$main_width</code> أيضًا، والعكس بالعكس. | ||
==أنواع البيانات== | |||
== أنواع البيانات == | تدعم SassScript ثمانيةً من أنواع البيانات وهي: | ||
تدعم SassScript ثمانيةً من أنواع البيانات: | *الأعداد (مثل <code>1.2</code> و <code>13</code> و <code>10px</code>). | ||
* الأعداد ( | *السلاسل النصيّة، مع علامة الاقتباس وبدونها (مثل <code>"foo"</code> و <code>'bar'</code> و <code>baz</code>). | ||
* السلاسل | *الألوان (مثل <code>blue</code> و <code>#04a3f9</code> و <code>rgba(255, 0, 0, 0.5)</code>). | ||
* الألوان (مثل <code>blue</code> و <code>#04a3f9</code> و <code>rgba(255, 0, 0, 0.5)</code>) | *القيم المنطقيَّة (مثل <code>true</code> و <code>false</code>). | ||
* القيم | *القيمة المعدومة (مثل <code>null</code>). | ||
* القيمة المعدومة ( | *القوائم التي تحتوي على قيم مفصولةً بمسافات أو فواصل (مثل <code>1.5em 1em 0 2em</code> أو <code>Helvetica, Arial, sans-serif</code>). | ||
* | *الخرائط (maps) التي تربط قيمةً بأخرى (مثل <code>(key1: value1, key2: value2)</code>). | ||
* | *مؤشّرات الدوال (function references). | ||
* مؤشّرات الدوال (function references) | كما تدعم SassScript أيضًا جميع الأنواع الأخرى لقيم خاصيّات [[CSS]]، مثل مجالات الترميز Unicode والتصريحات <code>!important</code>. على أي حال، لا تُعامَل تلك الأنواعَ معاملة خاصّة، ولكن تعامَل كأنّها سلاسل نصيّة غير مقتبسة. | ||
كما تدعم SassScript أيضًا جميع الأنواع الأخرى لقيم خاصيّات [[CSS]]، مثل مجالات | ===السلاسل النصيّة=== | ||
يوجد في لغة CSS نوعان من السّلاسل النصّية هي: السلاسل النصيَّة المقتبسة، مثل <code>"Lucida Grande"</code> أو <code>'<nowiki>http://sass-lang.com'</nowiki></code>، والسلاسل النصيَّة غير المُقتبسة، مثل <code>sans-serif</code> أو <code>bold</code>. تتعرّف SassScript على كلا النّوعين وسيكون النّوع المُستخدم ذاته في ملف sass وملف [[CSS]] الناتج. | |||
=== السلاسل النصيّة === | |||
يوجد في لغة CSS نوعان من السّلاسل النصّية: السلاسل | |||
هناك استثناءٌ واحدٌ | هناك استثناءٌ واحدٌ لتلك القاعدة وهو: عند استخدام الاستيفاء <code>{}#</code> (interpolation)، فإنّ السلاسل النصيّة المقتبسة تصبح غير مقتبسة. هذا يُسهّل استخدام أسماء المُحدّدات في [[Sass/mixins|المخاليط]] (mixins). انظر على سبيل المثال:<syntaxhighlight lang="sass"> | ||
@mixin firefox-message($selector) { | @mixin firefox-message($selector) { | ||
body.firefox #{$selector}:before { | body.firefox #{$selector}:before { | ||
سطر 73: | سطر 69: | ||
content: "Hi, Firefox users!"; } | content: "Hi, Firefox users!"; } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
===القوائم=== | |||
تستخدم Sass القوائم لتمثيل قيم تصريحات لغة [[CSS]] مثل <code>[[CSS/margin|margin]]: 10px 15px 0 0</code> أو <code>[[CSS/font-face|font-face]]: Helvetica, Arial, sans-serif</code>. ليست القوائم إلا سلسلةً من قيم أخرى مفصولةً إما بمسافاتٍ أو فواصل. في الواقع، القيم المُفردة تعدّ قوائم أيضًا إذ هي قوائم أحادية. | |||
لا تكون القوائم ذات فائدة دون دوال قوائم SassScript. مثلًا، [[Sass/nth|الدالة النونية (nth function)]] يمكنها الوصول إلى العناصر الموجودة في القائمة، [[Sass/join|ودالة الضّم (join function)]] تضمّ عدة قوائم معًا، ودالّة [[Sass/append|الإلحاق]] (append function) تضيف عناصر إلى القوائم؛ وأمّا التعليمة <code>[[Sass/@ rules|@each]]</code> فيمكنها إضافة أنماط لكل عنصرٍ في القائمة. | |||
يمكن | يمكن أن تحتوي القوائمُ، بالإضافة إلى القيم البسيطة، قوائمَ أخرى. مثلًا، القائمة <code>1px 2px, 5px 6px</code> هي قائمة ثنائيّة تحتوي على القائمة <code>1px 2px</code> والقائمة <code>6px 5px</code>. إن كانت القوائم الداخليَّّة تستخدم نفس الفاصلة التي تستخدمها القائمة الخارجية، فيجب استخدام الأقواس لتوضيح بداية القائمة الداخلية ونهايتها. على سبيل المثال، القائمة <code>(1px 2px) (5px 6px)</code> هي قائمة ثنائية تحتوي على القائمة <code>1px 2px</code> والقائمة <code>5px 6px</code>. الفرق هو أنّ القائمة الخارجية والداخلية مفصولتان بالمسافات البيضاء خلافًا للمثال السابق حيث فُصلت الخارجية بفاصلة والداخلية بمسافة بيضاء. | ||
عند تحويل القوائم إلى لغة [[CSS]]، فلا تضيف sass الأقواس إذ لا تتعرف CSS على الأقواس. هذا يعني أنَّ القائمة <code>(1px 2px) (5px 6px)</code> والقائمة <code>1px 2px 5px 6px</code> ستبدوان متشابهتين عند تصريفهما إلى لغة CSS. مع ذلك، لن تكونا متشابهتين عندما كتابتهما بلغة sass إذ أنَّ الأولى هي قائمةٌ تحتوي قائمَتين، في حين أنّ الثانية هي قائمة تحتوي أربعة أعداد. | |||
يمكن للقوائم أن تكون خاليةً من أيّ عنصر وتُمثّل بقوسين <code>()</code> فقط (والذي يمكن أن يعني أيضًا خريطة [map] فارغة). هذا النوع من القوائم لا يمكن أن يظهر في مخرجات CSS مباشرة. إن جربت ذلك باستعمال <code>font-family: ()</code> مثلًا، فستطلق sass حينئذ خطأً. إذا احتوت قائمةٌ على قائمةٍ فارغة أو قيمة عدمية (null) مثل <code>2px 1px () 3px</code> أو <code>1px 2px null 3px</code>، فستُزال القوائم الفارغة والقيم العدمية قبل تحويلها إلى لغة CSS. | |||
يمكن أيضًا | |||
=== | قد تحتوي القوائم المفصولة بفواصل على فاصلةٍ زائدةٍ وهذا مفيدٌ إذ تسمح لك بتمثيل قائمةٍ أحادية (single-element list). على سبيل المثال، <code>(,1)</code> هي قائمة تحتوي على 1 أمّا (1 2 3,) فهي قائمةٌ مفصولةٌ بفواصل تحتوي على قائمةٍ مفصولةٍ بمسافاتٍ بيضاء تحتوي على 1 و 2 و 3. | ||
تمثل | ====القوائم ذات الأقواس المربعة==== | ||
يمكن أيضًا كتابة القوائم باستعمال الأقواس المربعة. تُستخدم القوائم ذات الأقواس المربعة أسماءً للأسطر في [[:تصنيف:CSS Grid|مخطّطات شبكات CSS]]، ولكن يمكن أن تُستخدم أيضًا في الكود البرمجي للغة sass مَثَلُها كمَثَلِ أيِّ قائمةٍ أخرى. يمكن للقوائم ذات الأقواس المربعة أن تُفصَل بالمسافات البيضاء أو الفواصل. | |||
===الخرائط (Maps)=== | |||
تمثل الخرائط ارتباطًا بين قيم تدعى مفاتيح (keys) مع قيم أخرى. تُستخدم المفاتيح لإيجاد القيم وتُسهّل تجميعها في مجموعات مُسمّاةٍ والوصول إلى تلك المجموعات بشكل ديناميكيّ. ليس للخرائط مقابلٌ مباشر في لغة CSS، على الرغم من أنّ صياغتها مشابهةٌ لتعبيرات [[CSS/@media|استعلامات الوسائط]] (media query expressions).<syntaxhighlight lang="sass"> | |||
$map: (key1: value1, key2: value2, key3: value3); | $map: (key1: value1, key2: value2, key3: value3); | ||
</syntaxhighlight>خلافًا للقوائم، يجب أن تٌحاط | </syntaxhighlight>خلافًا للقوائم، يجب أن تٌحاط الخرائط دائمًا بالأقواس، ويجب أن تُفصل بالفواصل. يمكن أن تكون المفاتيح وقيمها أي كائن من كائنات SassScript. لا يمكن ربط أكثر من قيمةٍ واحدةٍ في الخريطة مع نفس المفتاح (ولكنّ تلك القيمة يمكن أن تكون قائمةً)، بينما يمكن أن ترتبط قيمة معيَّنة مع أكثر من مفتاح واحد. | ||
تُعالج الخرائط، بشكل مشابه للقوائم، باستخدام دوال SassScript. الدالة <code>[[Sass/map get|map-get]]</code> مثلًا تبحث عن قيم محدَّدة في الخريطة والدالّة <code>[[Sass/map merge|map-merge]]</code> تضيف قيمًا إلى الخريطة. أمّا التعليمة <code>[[Sass/@ rules|@each]]</code> فيمكن استخدامها لإضافة أنماط لكل زوج مفتاح/قيمة (key/value) في الخريطة. لا يتغير ترتيب الأزواج في الخريطة منذ إنشائه. | |||
يمكن استخدام | يمكن استخدام الخرائط في أيّ مكان تُستخدم فيه القوائم. عند استخدامها من قبل دالةٍ خاصَّة بالقوائم، فستُعامل على أنّها قائمةٌ مكونة من أزواج. ستُعامل دوال القوائم مثل الخريطة <code>(key1: value1, key2: value2)</code> على أنَّه القائمة المتشعّبة <code>key1 value1, key2 value2</code>. لا يمكن أن تُعامَل القوائم على أنّها خرائط باستثناء القائمة الفارغة. تمثّل <code>()</code> خريطة لا تحوي أيّ أزواج (مفتاح/قيمة) وقائمة لا تحوي أيّ عناصر في آنٍ واحدٍ. | ||
الجدير بالذكر أنّ مفاتيح الخريطة يمكن أن تكون أيّ نوع من أنواع بيانات Sass كما تتيح الصياغة المستعملة لتعريف الخريطة استخدام أي تعبير من تعبيرات تقنية SassScript التي ستُقيَّم وتُحدَّد قيمتها للتعرف على قيمة المفتاح. | |||
لا يمكن ترجمة | لا يمكن ترجمة الخرائط إلى لغة CSS إذ سيُسبِّب استخدامها كمتغيراتٍ أو معطياتٍ لدوال CSS خطأ. استخدم الدالة <code>inspect($value)</code> لإنتاج سلسلة نصّية عند إخراج الخرائط في ملف CSS الناتج. | ||
===الألوان (Colors)=== | |||
تُرجع كلُّ تعابير الألوان في CSS قيمة لونيّة في SassScript. وهذا يشمل عددًا كبيرًا من الألوان المُسمّاة، والتي لا يمكن تمييزها عن السلاسل النصيَّة غير المُقتبسة. | |||
ستُخرج sass في [[Sass/output style#.D8.A7.D9.84.D9.86.D9.85.D8.B7 .D8.A7.D9.84.D9.85.D8.B6.D8.BA.D9.88.D8.B7 .E2.80.8E:compressed|الوضع المضغوط]] (compressed mode) أوجز تمثيل ممكن للألوان في CSS. سيُترجم حينئذ <code>#FF0000</code> مثلًا إلى <code>red</code>، بينما سيُترجم <code>blanchedalmond</code> إلى <code>#FFEBCD</code>. | |||
من المشاكل الشائعة في استخدام الألوان المسماة هو أنّه لمّا كانت sass تُفضّل نفس تنسيق المُخرجات كما كُتبت في أوضاع الإخراج الأخرى، فستصبح الألوان المستوفاة (interpolated) في محدِّد معيّن غير صالحة عند ضغطها حينئذ. يمكن تجنب هذه المشكلة بوضع الألوان المسماة دائمًا بين علامتي تنصيص إن كنت ترغب في استخدامها في إنشاء محدّد. | |||
===الدوالّ من الدرجة الأولى (First Class Functions)=== | |||
من المشاكل الشائعة في استخدام الألوان المسماة هو | يمكن الحصول على مؤشِّر (reference) دالة معيّنة باستعمال التعبير <code>get-function($function-name)</code>. عند تمرير مؤشّر دالة إلى الدالة <code>call($function, $args...)</code> فستُستدعى حينئذ الدالة التي يشير إليها. لا تُترجم لغة [[CSS]] دوال الدرجة الأولى مباشرةً، وأيّ محاولةٍ لفعل ذلك ستؤدي إلى إطلاق خطأ. | ||
==العمليات (Operations)== | |||
=== الدوالّ من الدرجة الأولى (First Class Functions) === | تدعم جميع الأنواع معاملات التساوي (<code>==</code> و <code>=!</code>). بالإضافة إلى ذلك، يدعم كلُّ نوعٍ معاملاتٍ خاصةٍ به. | ||
يمكن الحصول على | ===العمليات على الأعداد=== | ||
تدعم SassScript العمليات الحسابيَّة الاعتيادية على الأعداد (الجمع <code>+</code>، والطرح <code>-</code>، والضرب <code>*</code>، والقسمة <code>/</code>، وباقي القسمة <code>%</code>). تحفظ دوال sass الرياضية الواحدات خلال العمليات الحسابيَّة. هذا يعني أنَّه، كما هو الحال في الواقع، لا يمكنك أن تعمل على أرقام ذات واحدات غير متوافقة (مثل إضافة قيمة واحدتها <code>px</code> إلى قيمة واحدتها <code>em</code>)، وستكون واحدة ناتج ضرب عددين لهما الواحدة ذاتها واحدةً مربّعةً (<code>10px * 10px == 100px * px</code>). تذكّر أنّ الواحدة المربّعة <code>px * px</code> غير صالحة في لغة CSS، وستُطلق Sass خطأً إن حاولت استخدام واحدات غير صالحة في CSS. | |||
== العمليات (Operations) == | |||
جميع الأنواع | |||
=== العمليات على الأعداد === | |||
تدعم SassScript العمليات | |||
معاملات المقارنة (<code><</code> و <code>></code> و <code>=<</code> و <code>=></code>) مدعومةٌ أيضًا على الأعداد، أمّا معاملات التساوي (<code>==</code> و <code>=!</code>) فتدعمها جميع الأنواع. | معاملات المقارنة (<code><</code> و <code>></code> و <code>=<</code> و <code>=></code>) مدعومةٌ أيضًا على الأعداد، أمّا معاملات التساوي (<code>==</code> و <code>=!</code>) فتدعمها جميع الأنواع. | ||
===القسمة والمعامل <code>/</code>=== | |||
تسمح CSS بأن يظهر المعامل <code>/</code> في قيم الخاصِّيَّات كوسيلة لفصل الأعداد. ولمّا كانت SassScript امتدادًا لصياغة الخاصيّات في لغة CSS، فلابُد من أن تدعمَ هذا النوع من الصياغة، وتسمحَ أيضًا باستخدام المعامل <code>/</code> لأجل القسمة في الوقت عينه. وهذا يعني افتراضيًا، أنّه إذا فُصل عددان بالمعامل <code>/</code> في SassScript، فسيظهران على نفس النحو في ملف CSS الناتج. | |||
هناك ثلاث حالات سيُفسَّر فيها الرمز <code>/</code> على أنّه عمليّة قسمة. هذه الحالات تشمل غالبية استعمالات عمليّة القسمة وهي: | |||
#إن خُزّنت القيمة، أو جزءٌ منها، في متغير أو أُعيدت من قبل دالة. | |||
#إن أُحيطت القيمة بقوسين، ما لم يكن هذان القوسان خارج قائمةٍ والقيمة داخلها. | |||
هناك ثلاث حالات سيُفسَّر فيها الرمز <code>/</code> على أنّه عمليّة قسمة. هذه الحالات تشمل غالبية استعمالات عمليّة القسمة | #إن كانت القيمة جزءًا من تعبيرٍ حسابيّ آخر. | ||
# إن خُزّنت القيمة، أو جزءٌ منها، في متغير أو أُعيدت من قبل دالة. | انظر على سبيل المثال الشيفرة التالية:<syntaxhighlight lang="sass"> | ||
# إن أُحيطت القيمة بقوسين، ما لم يكن هذان القوسان خارج قائمةٍ والقيمة داخلها. | |||
# إن كانت القيمة جزءًا من تعبيرٍ حسابيّ آخر. | |||
على سبيل المثال:<syntaxhighlight lang="sass"> | |||
p { | p { | ||
font: 10px/8px; // العادية، ليست قسمةً CSS | font: 10px/8px; // العادية، ليست قسمةً CSS | ||
سطر 145: | سطر 133: | ||
height: 250px; | height: 250px; | ||
margin-left: 9px; } | margin-left: 9px; } | ||
</syntaxhighlight>إن أردت استخدام المتغيرات مع الإبقاء على الصياغة | </syntaxhighlight>إن أردت استخدام المتغيرات مع الإبقاء على الصياغة العاديَّة للمعامل <code>/</code> في لغة CSS، فيمكنك استخدام الاستيفاء <code>{}#</code> لإدراجها مباشرةً. انظر مثلًا الشيفرة:<syntaxhighlight lang="sass"> | ||
p { | p { | ||
$font-size: 12px; | $font-size: 12px; | ||
سطر 156: | سطر 144: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
===الطرح والأعداد السالبة والمعامل <code>-</code>=== | |||
=== الطرح | يمكن أن يمثل المعامل <code>-</code> عدَّة أشياء مختلفة في لغة CSS و Sass. يمكن أن يكون عامل طرح (كما هو الحال في <code>5px - 3px</code>)، أو بداية عددٍ سالبٍ (كما هو الحال في <code>-3px</code>)، أو قد يكون عامل نفيٍ أحادي للمتغير (مثل <code>-$var</code>)، ويمكن أن يكون جزءًا من مُعرّفٍ (مثل <code>[[CSS/font-weight|font-weight]]</code>). يمكن في أكثر الحالات معرفة وظيفة الرمز <code>-</code> من السياق، وقد تلتبس بعض الحالات الأخرى. إليك هذه التوصيات بوصفها قاعدة عامةٍ: | ||
*دائمًا ضع مسافةً بيضاء قبل المعامل <code>-</code> وبعده عند استخدامه للطرح. | |||
* دائمًا ضع مسافةً بيضاء قبل | *ضع مسافة قبل <code>-</code> ولكن ليس بعده في حالة الأعداد السالبة أو النفي الأحادي. | ||
* ضع مسافة قبل <code>-</code> ولكن ليس | *ضع النفي الأحادي بين قوسين إن كان في قائمة مفصولة بالمسافات، مثل <code>10px (-$var)</code>. | ||
* ضع النفي الأحادي بين قوسين إن كان في قائمة مفصولة بالمسافات، | أسبقية المعاني المختلفة للمعامل <code>-</code> هي حسب الترتيب التالي: | ||
أسبقية المعاني المختلفة | #كونه جزءًا من مُعرّف. أي أنّ <code>a-1</code> هي سلسلة نصيّة غير مُقتبسة قيمتها <code>"a-1"</code> وتستثنى الواحدات فقط من ذلك؛ تسمح Sass عادةً لأي مُعرّف صالح بأن يًستخدم كمعرّف، ولكن قد لا يصحّ أن تحتوي المُعرّفات على شرْطة يليها عدد. أي أنّ <code>5px-3px</code> هو مثل <code>5px - 3px</code>. | ||
# | #وجوده بين عددين وبدون مسافة بيضاء يشير إلى عمليّة طرح، لذا يعدُّ التعبير <code>1-2</code> مماثلًا تمامًا للتعبير <code>1 - 2</code>. | ||
# بين عددين وبدون مسافة بيضاء | #وجوده قبل عددٍ ولكن غيرَ مسبوق بعددٍ يشير إلى أن ذلك العدد هو عدد سالب، لذلك فالتعبير <code>1 -2</code> هو قائمة تحتوي على <code>1</code> و <code>-2</code>. | ||
# قبل عددٍ ولكن غيرَ | #وجوده بين عددين بغض النظر عن وجود المسافات يدلّ على عمليّة الطرح، لذلك يعدُّ التعبير <code>1 -$var</code> مماثلًا للتعبير <code>1 - $var</code>. | ||
# بين عددين بغض النظر عن وجود المسافات | #وجوده قبل قيمة معيّنة يعني أنَّه عامل نفي أحادي. بعبارة أخرى، تعاد القيمة السالبة للعدد عند وجوده قبله. | ||
# قبل قيمة معيّنة | ===عمليات الألوان (Color Operations)=== | ||
تدعم القيم اللّونية كل العمليات الحسابيَّة، إذ تنفذ تلك العمليات على مركّبات الألوان مثنى مثنى. أي تُنفّذ العمليّة على مركبة الأحمر والأخضر والأزرق. انظر المثال التالي:<syntaxhighlight lang="sass"> | |||
=== عمليات الألوان (Color Operations) === | |||
كل العمليات | |||
p { | p { | ||
color: #010203 + #040506; | color: #010203 + #040506; | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight>ستُحسب 01 + 04 = 05 و 02 + 05 = 07 و 03 + 06 = 09، وستُصرّف إلى:<syntaxhighlight lang="css"> | ||
p { | p { | ||
color: #050709; } | color: #050709; } | ||
</syntaxhighlight> | </syntaxhighlight>يُفضّل غالبًا استخدام دوال الألوان على استخدام العمليات الحسابيَّة لإنجاز العملية عليها والحصول على النتيجة ذاتها. | ||
تطبَّق العمليات الحسابيَّة أيضًا على الأعداد والألوان، وأيضًا مثنى مثنى. انظر مثلًا:<syntaxhighlight lang="sass"> | |||
p { | p { | ||
color: #010203 * 2; | color: #010203 * 2; | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight>ستُحسب 01 * 2 = 02 و 02 * 2 = 04 و 03 * 2 = 06، وستُصرّف إلى:<syntaxhighlight lang="css"> | ||
p { | p { | ||
color: #020406; } | color: #020406; } | ||
</syntaxhighlight> | </syntaxhighlight>يجب أن يكون للألوان ذات قناة الشفافيَّة alpha (أي تلك التي أُنشئت بواسطة إحدى الدالّتين <code>[[Sass/rgba|rgba]]</code> و <code>[[Sass/hsla|hsla]]</code>) نفس قيمة الشفافيَّة لتتمكن من إجراء العمليّات الحسابيَّة عليها. تلك العمليّات لا تؤثّر على قيمة الشفافيَّة. انظر على سبيل المثال:<syntaxhighlight lang="sass"> | ||
p { | p { | ||
color: rgba(255, 0, 0, 0.75) + rgba(0, 255, 0, 0.75); | color: rgba(255, 0, 0, 0.75) + rgba(0, 255, 0, 0.75); | ||
سطر 199: | سطر 185: | ||
color: rgba(255, 255, 0, 0.75); } | color: rgba(255, 255, 0, 0.75); } | ||
</syntaxhighlight>يمكن تعديل قناة | </syntaxhighlight>يمكن تعديل قناة الشفافيَّة للونٍ معيّن باستخدام الدالّتين <code>[[Sass/opacify|opacify]]</code> و <code>[[Sass/transparentize|transparentize]]</code>. انظر المثال التالي:<syntaxhighlight lang="sass"> | ||
$translucent-red: rgba(255, 0, 0, 0.5); | $translucent-red: rgba(255, 0, 0, 0.5); | ||
p { | p { | ||
سطر 206: | سطر 192: | ||
} | } | ||
</syntaxhighlight>ستُصرّف إلى:<syntaxhighlight lang="css"> | </syntaxhighlight>ستُصرّف الشيفرة إلى:<syntaxhighlight lang="css"> | ||
p { | p { | ||
color: rgba(255, 0, 0, 0.8); | color: rgba(255, 0, 0, 0.8); | ||
background-color: rgba(255, 0, 0, 0.25); } | background-color: rgba(255, 0, 0, 0.25); } | ||
</syntaxhighlight> | </syntaxhighlight>تحتاج الخاصِّيَّة <code>filters</code> في متصفح IE أن تشتمل كلُّ الألوان على قناة الشفافيَّة، وأن تكون في الشكل <code>#AABBCCDD</code> تحديدًا. يمكنك بسهولة تحويل اللون باستخدام الدالة <code>[[Sass/ie hex str|ie_hex_str]]</code>. انظر المثال التالي:<syntaxhighlight lang="sass"> | ||
$translucent-red: rgba(255, 0, 0, 0.5); | $translucent-red: rgba(255, 0, 0, 0.5); | ||
$green: #00ff00; | $green: #00ff00; | ||
سطر 218: | سطر 204: | ||
} | } | ||
</syntaxhighlight>ستُصرّف إلى:<syntaxhighlight lang="css"> | </syntaxhighlight>ستُصرّف الشيفرة إلى:<syntaxhighlight lang="css"> | ||
div { | div { | ||
filter: progid:DXImageTransform.Microsoft.gradient(enabled='false', startColorstr=#FF00FF00, endColorstr=#80FF0000); | filter: progid:DXImageTransform.Microsoft.gradient(enabled='false', startColorstr=#FF00FF00, endColorstr=#80FF0000); | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
===العمليات على السلاسل النصيّة (String Operations)=== | |||
=== العمليات على السلاسل النصيّة (String Operations) === | يمكن استخدام عمليَّة الجمع <code>+</code> لضمّ السلاسل النصّية.<syntaxhighlight lang="sass"> | ||
يمكن استخدام | |||
p { | p { | ||
cursor: e + -resize; | cursor: e + -resize; | ||
} | } | ||
</syntaxhighlight>ستُصرّف إلى:<syntaxhighlight lang="css"> | </syntaxhighlight>ستُصرّف الشيفرة السابقة إلى:<syntaxhighlight lang="css"> | ||
p { | p { | ||
cursor: e-resize; } | cursor: e-resize; } | ||
</syntaxhighlight>لاحظ أنّه إذا أُضيفت سلسلة نصّية مُقتبسة إلى أخرى غير مقتبسة (أي أنّ السلسلة النصية المقتبسة موجودة على يسار إشارة <code>+</code>) فالنتيجة هي سلسلة نصيّة مقتبسة. وبالمثل، إذا أُضيفت سلسلة نصّية غير مُقتبسة إلى أخرى مقتبسة (السلسلة النصية غير المقتبسة على يسار إشارة <code>+</code>) فالنتيجة هي سلسلة نصيّة غير مقتبسة. | </syntaxhighlight>لاحظ أنّه إذا أُضيفت سلسلة نصّية مُقتبسة إلى أخرى غير مقتبسة (أي أنّ السلسلة النصية المقتبسة موجودة على يسار إشارة <code>+</code>)، فالنتيجة هي سلسلة نصيّة مقتبسة. وبالمثل، إذا أُضيفت سلسلة نصّية غير مُقتبسة إلى أخرى مقتبسة (السلسلة النصية غير المقتبسة على يسار إشارة <code>+</code>)، فالنتيجة هي سلسلة نصيّة غير مقتبسة. انظر مثلًا الشيفرة التالية:<syntaxhighlight lang="sass"> | ||
p:before { | p:before { | ||
content: "Foo " + Bar; | content: "Foo " + Bar; | ||
سطر 243: | سطر 228: | ||
content: "Foo Bar"; | content: "Foo Bar"; | ||
font-family: sans-serif; } | font-family: sans-serif; } | ||
</syntaxhighlight>افتراضيّا، إذا وضَعت قيمتين بجانب بعضها البعض، فستُضمّان إلى بعضهما بفراغ واحد، مثلًا:<syntaxhighlight lang="sass"> | </syntaxhighlight>افتراضيّا، إذا وضَعت قيمتين بجانب بعضها البعض، فستُضمّان إلى بعضهما بفراغ واحد، انظر مثلًا الشيفرة:<syntaxhighlight lang="sass"> | ||
p { | p { | ||
margin: 3px + 4px auto; | margin: 3px + 4px auto; | ||
سطر 251: | سطر 236: | ||
margin: 7px auto; } | margin: 7px auto; } | ||
</syntaxhighlight>يمكن استخدام الاستيفاء (<code>{}#</code>) داخل سلسلة | </syntaxhighlight>يمكن استخدام الاستيفاء (<code>{}#</code>) داخل سلسلة نصيَّة لحشو قيمة ديناميكيّة داخل السلسلة، انظر مثلًا الشيفرة التالية:<syntaxhighlight lang="sass"> | ||
p:before { | p:before { | ||
content: "I ate #{5 + 10} pies!"; | content: "I ate #{5 + 10} pies!"; | ||
سطر 260: | سطر 245: | ||
content: "I ate 15 pies!"; } | content: "I ate 15 pies!"; } | ||
</syntaxhighlight>تُعامَل القيمة المعدومة (Null) على أنّها سلسلة فارغة عند استيفاء السلاسل | </syntaxhighlight>تُعامَل القيمة المعدومة (Null) على أنّها سلسلة فارغة عند استيفاء السلاسل النصّية.<syntaxhighlight lang="sass"> | ||
$value: null; | $value: null; | ||
p:before { | p:before { | ||
سطر 271: | سطر 256: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
===العمليات المنطقية (Boolean Operations)=== | |||
=== العمليات المنطقية (Boolean Operations) === | تدعم SassScript استعمال المعامل <code>and</code> والمعامل <code>or</code> والمعامل <code>not</code> مع القيم المنطقيَّة. | ||
تدعم SassScript | ===عمليات القوائم (List Operations)=== | ||
لا تدعم القوائم أيّ معاملات خاصَّة، بل تُعالج باستخدام دوال القوائم. | |||
=== عمليات القوائم (List Operations) === | ==الأقواس== | ||
لا تدعم القوائم أيّ معاملات | يمكن استخدام الأقواس لترتيب العمليات. انظر مثلًا الشيفرة التالية:<syntaxhighlight lang="sass"> | ||
== الأقواس == | |||
يمكن استخدام الأقواس | |||
p { | p { | ||
width: 1em + (2em * 3); | width: 1em + (2em * 3); | ||
سطر 288: | سطر 270: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
==الدّوال== | |||
== الدّوال == | هنالك الكثير من الدّوال المفيدة المعرَّفة في SassScript التي يمكن استدعاؤها باستخدام الصياغة العادية للدّوال في لغة CSS.<syntaxhighlight lang="sass"> | ||
p { | p { | ||
color: hsl(0, 100%, 50%); | color: hsl(0, 100%, 50%); | ||
} | } | ||
</syntaxhighlight>ستُصرّف إلى:<syntaxhighlight lang="css"> | </syntaxhighlight>ستُصرّف الشيفرة السابقة إلى:<syntaxhighlight lang="css"> | ||
p { | p { | ||
color: #ff0000; } | color: #ff0000; } | ||
</syntaxhighlight>راجع صفحة الدوال في Sass للحصول على قائمة كاملة بالدوال المتاحة. | </syntaxhighlight>راجع صفحة [[Sass/functions|الدوال في Sass]] للحصول على قائمة كاملة بالدوال المتاحة. | ||
===الوسائط المسمّاة (Keyword Arguments)=== | |||
=== الوسائط المسمّاة (Keyword Arguments) === | يمكنُ استدعاء دوالّ Sass باستخدام وسائط (arguments) مسماةٍ بشكل صريح. المثال أعلاه يُمكن أن يُكتب على النحو التالي:<syntaxhighlight lang="sass"> | ||
يمكنُ استدعاء دوالّ Sass باستخدام وسائط (arguments) مسماةٍ | |||
p { | p { | ||
color: hsl($hue: 0, $saturation: 100%, $lightness: 50%); | color: hsl($hue: 0, $saturation: 100%, $lightness: 50%); | ||
} | } | ||
</syntaxhighlight>قد تكون هذه الصياغة أقلّ إيجازًا، ولكنّها يمكن أن تجعل | </syntaxhighlight>قد تكون هذه الصياغة أقلّ إيجازًا، ولكنّها يمكن أن تجعل مقروئيَّة ملف الأنماط أيْسر. كما ستسمح للدوالّ بتقديم واجهات أكثر مرونة، وتمرير العديد من الوسائط دون أن تكون هناك صعوبة في استدعائها. | ||
يمكن تمرير الوسائط المسمّاة حسب أيّ ترتيب، | يمكن تمرير الوسائط المسمّاة حسب أيّ ترتيب، ويمكن حذف المعطياتُ ذات القيم الافتراضيَّة. لمَّا كانت الوسائط المُسمّاة أسماءُ متغيراتِ، فلا فرق بين استخدام الشرطات السفلية <code>_</code> واستخدام الشرطات العادية <code>-</code>. | ||
انظر صفحة [[Sass/functions|الدوال في Sass]] للحصول على قائمة كاملة من دوالّ sass وأسماء مُعطياتها، وكذلك إرشادات تعريفها في لغة [[Ruby]]. | انظر صفحة [[Sass/functions|الدوال في Sass]] للحصول على قائمة كاملة من دوالّ sass وأسماء مُعطياتها، وكذلك إرشادات تعريفها في لغة [[Ruby]]. | ||
===الاستيفاء (Interpolation): <code>#{}</code>=== | |||
=== الاستيفاء (Interpolation): <code>#{}</code> === | يمكنك أيضًا استخدام المتغيرات في لغة SassScript في المُحدّدات (selectors) وأسماء الخاصيّات باستخدام صياغة الاستيفاء <code>{}#</code>.<syntaxhighlight lang="sass"> | ||
يمكنك أيضًا استخدام المتغيرات في لغة SassScript في المُحدّدات (selectors) وأسماء الخاصيّات باستخدام صياغة الاستيفاء <code>{}#</code> | |||
$name: foo; | $name: foo; | ||
$attr: border; | $attr: border; | ||
سطر 319: | سطر 298: | ||
} | } | ||
</syntaxhighlight>ستُصرّف إلى:<syntaxhighlight lang="css"> | </syntaxhighlight>ستُصرّف الشيفرة إلى:<syntaxhighlight lang="css"> | ||
p.foo { | p.foo { | ||
border-color: blue; } | border-color: blue; } | ||
</syntaxhighlight>من الممكن أيضًا استخدام <code>{}#</code> في قيم الخاصيات. في معظم الحالات، هذا ليس أفضل من استخدام المتغيرات، ولكن باستخدام الصيغة <code>{}#</code> فكلّ العمليات المجاورة لها ستُعامل على أنّها صياغة عادية للغة CSS. على سبيل المثال:<syntaxhighlight lang="sass"> | </syntaxhighlight>من الممكن أيضًا استخدام الاستيفاء <code>{}#</code> في قيم الخاصيات. في معظم الحالات، هذا ليس أفضل من استخدام المتغيرات، ولكن باستخدام الصيغة <code>{}#</code> فكلّ العمليات المجاورة لها ستُعامل على أنّها صياغة عادية للغة CSS. على سبيل المثال:<syntaxhighlight lang="sass"> | ||
p { | p { | ||
$font-size: 12px; | $font-size: 12px; | ||
سطر 333: | سطر 312: | ||
font: 12px/30px; } | font: 12px/30px; } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
==الرمز <code>&</code> في SassScript== | |||
== الرمز <code>&</code> في SassScript == | يشير الرمز <code>&</code> في SassScript إلى المُحدّد الأب الحالي، تمامًا كما هو الحال عندما يُستخدم في المحدّدات. وهو قائمةٌ مفصولة بالفواصل لقوائم مفصولة بالمسافات. انظر على سبيل المثال:<syntaxhighlight lang="sass"> | ||
يشير الرمز <code>&</code> في SassScript إلى المُحدّد الأب الحالي، تمامًا كما هو الحال عندما يُستخدم في المحدّدات. وهو قائمةٌ مفصولة بالفواصل لقوائم مفصولة بالمسافات. على سبيل المثال:<syntaxhighlight lang="sass"> | |||
.foo.bar .baz.bang, .bip.qux { | .foo.bar .baz.bang, .bip.qux { | ||
$selector: &; | $selector: &; | ||
} | } | ||
</syntaxhighlight>قيمة <code>$selector</code> في المثال هي <code>((".foo.bar" ".baz.bang"), ".bip.qux")</code>. وُضعت | </syntaxhighlight>قيمة <code>$selector</code> في المثال هي <code>((".foo.bar" ".baz.bang"), ".bip.qux")</code>. وُضعت المحدِّدات المُركّبة بين علامتي اقتباس للإشارة إلى أنها سلاسلٌ نصّيةٌ، ولكن يمكن أن تكون غير مُقتبسة. | ||
حتى | حتى إن لم يحتوِ المحدِّد الأب على فاصلةً أو مسافةً، فسيكون لقيمة الرمز <code>&</code> دائمًا مستويان من التشعّب، بحيث يمكن الوصول إليها بطريقة موحدة. | ||
إن لم يكن هناك محددٌ أب، فإنّ قيمة <code>&</code> ستكون معدومةً (null). هذا يعني | إن لم يكن هناك محددٌ أب، فإنّ قيمة <code>&</code> ستكون معدومةً (null). هذا يعني أنَّه يمكنك استخدامها في [[Sass/mixins|مخلوط]] (mixin) للتحقَّق من وجود المحدِّد الأب.<syntaxhighlight lang="sass"> | ||
@mixin does-parent-exist { | @mixin does-parent-exist { | ||
@if & { | @if & { | ||
سطر 357: | سطر 335: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
==القيمة الافتراضية للمتغيرات: <code>!default</code>== | |||
== القيمة الافتراضية للمتغيرات: <code>!default</code> == | يمكنك ضبط قيمة افتراضيَّة للمتغيرٍ إن لم يكن قد ضُبِط سلفًا بإضافة الراية <code>!default</code> عقِب تلك القيمة. هذا يعني أنه متى أسندت قيمة إلى المتغير، فلن تسند تلك القيمة (الافتراضية) إليه مجدّدًا. أمَّا إن لم تسند قيمة إلى المتغير، فستكون قيمته هي القيمة الافتراضيَّة المحدَّدة. انظر الشيفرة التالية على سبيل المثال:<syntaxhighlight lang="sass"> | ||
يمكنك ضبط قيمة | |||
$content: "First content"; | $content: "First content"; | ||
$content: "Second content?" !default; | $content: "Second content?" !default; | ||
سطر 374: | سطر 351: | ||
new-content: "First time reference"; } | new-content: "First time reference"; } | ||
</syntaxhighlight> | </syntaxhighlight>تعامَل القيمة المعدومة (null) المسندة إلى المتغير على أنَّها قيمة غير مسندة، لذا ستسند القيمة الإفتراضيَّة إليه آنذاك.<syntaxhighlight lang="sass"> | ||
$content: null; | $content: null; | ||
$content: "Non-null content" !default; | $content: "Non-null content" !default; | ||
سطر 387: | سطر 364: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
==مصادر== | |||
== مصادر == | * <span> </span>[https://sass-lang.com/documentation/file.SASS_REFERENCE.html#sassscript قسم SassScript من توثيق Sass الرسمي]. | ||
* [https://sass-lang.com/documentation/file.SASS_REFERENCE.html#sassscript قسم SassScript من توثيق Sass الرسمي]. | <noinclude>{{DISPLAYTITLE:صياغة SassScript}}</noinclude> | ||
[[تصنيف:Sass|{{SUBPAGENAME}}]] |
المراجعة الحالية بتاريخ 07:01، 20 مايو 2018
تدعم Sass، بالإضافة إلى الصياغة العادية للغة CSS، مجموعةً صغيرةً من المُلحقات تُدعى SassScript. تُتيح SassScript للخاصيّات استخدام المتغيرات والعمليات الحسابيّة ودوالَّ أخرى إذ يمكن استخدام SassScript في قيمة أيِّ خاصيّة.
يمكن أيضًا استخدامها لتوليد المُحددّات (selectors) وأسماء الخاصِّيَّات، وهو أمرٌ مفيد عند كتابة المخاليط (mixins) إذ يكون ذلك باستخدام الاستيفاء (interpolation).
الصّدَفة التفاعلية (Interactive Shell)
يمكنك تجريب SassScript بسهولةٍ باستخدام الصّدفة التفاعلية. لتشغيل تلك الصّدفة، اكتب الأمر sass
في سطر الأوامر متبوعًا بالخيار -i
ثمَّ أدخل في المِحث (prompt) أيَّ تعبير صالح في SassScript لأجل تقييمه وطباعة النتائج.
$ sass -i
>> "Hello, Sassy World!"
"Hello, Sassy World!"
>> 1px + 1px + 1px
3px
>> #777 + #777
#eeeeee
>> #777 + #888
white
المتغيرات: $
الطريقة البدهيّة لاستخدام SassScript هي باستخدام المتغيرات. تبدأ المتغيرات بعلامة الدولار ($
)، وتُضبط كما تُضبط خاصيّات CSS.
$width: 5em;
يمكنك بعد ذلك الإشارة إليها في الخاصيّات، مثل:
#main {
width: $width;
}
ستكون المتغيرات مرئيةً فقط في مستوى المُحدّدات المُتشعّبة حيث عُرِّفت أو دُونه. وإن عُرِّفت خارج كل المُحدّدات المتشعّبة، فستكون مُتاحةً في كل مكان. يمكن أيضًا جعلها متاحةً في كل مكانٍ يدويًا باستعمال بالرّاية !global
. انظر على سبيل المثال:
#main {
$width: 5em !global;
width: $width;
}
#sidebar {
width: $width;
}
ستُصرّف إلى:
#main {
width: 5em;
}
#sidebar {
width: 5em;
}
لأسباب تاريخية، لا فرق بين الشّرْطات العاديَّة (hyphens) والشرطات السُّفلية (underscores) في أسماء المتغيّرات (وجميع مُعرِّفات Sass الأخرى). إن عَرّفت مثلًا متغيّرًا باسم $main-width
، فيمكنك الوصول إليه بالاسم $main_width
أيضًا، والعكس بالعكس.
أنواع البيانات
تدعم SassScript ثمانيةً من أنواع البيانات وهي:
- الأعداد (مثل
1.2
و13
و10px
). - السلاسل النصيّة، مع علامة الاقتباس وبدونها (مثل
"foo"
و'bar'
وbaz
). - الألوان (مثل
blue
و#04a3f9
وrgba(255, 0, 0, 0.5)
). - القيم المنطقيَّة (مثل
true
وfalse
). - القيمة المعدومة (مثل
null
). - القوائم التي تحتوي على قيم مفصولةً بمسافات أو فواصل (مثل
1.5em 1em 0 2em
أوHelvetica, Arial, sans-serif
). - الخرائط (maps) التي تربط قيمةً بأخرى (مثل
(key1: value1, key2: value2)
). - مؤشّرات الدوال (function references).
كما تدعم SassScript أيضًا جميع الأنواع الأخرى لقيم خاصيّات CSS، مثل مجالات الترميز Unicode والتصريحات !important
. على أي حال، لا تُعامَل تلك الأنواعَ معاملة خاصّة، ولكن تعامَل كأنّها سلاسل نصيّة غير مقتبسة.
السلاسل النصيّة
يوجد في لغة CSS نوعان من السّلاسل النصّية هي: السلاسل النصيَّة المقتبسة، مثل "Lucida Grande"
أو 'http://sass-lang.com'
، والسلاسل النصيَّة غير المُقتبسة، مثل sans-serif
أو bold
. تتعرّف SassScript على كلا النّوعين وسيكون النّوع المُستخدم ذاته في ملف sass وملف CSS الناتج.
هناك استثناءٌ واحدٌ لتلك القاعدة وهو: عند استخدام الاستيفاء {}#
(interpolation)، فإنّ السلاسل النصيّة المقتبسة تصبح غير مقتبسة. هذا يُسهّل استخدام أسماء المُحدّدات في المخاليط (mixins). انظر على سبيل المثال:
@mixin firefox-message($selector) {
body.firefox #{$selector}:before {
content: "Hi, Firefox users!";
}
}
@include firefox-message(".header");
ستُصرّف إلى:
body.firefox .header:before {
content: "Hi, Firefox users!"; }
القوائم
تستخدم Sass القوائم لتمثيل قيم تصريحات لغة CSS مثل margin: 10px 15px 0 0
أو font-face: Helvetica, Arial, sans-serif
. ليست القوائم إلا سلسلةً من قيم أخرى مفصولةً إما بمسافاتٍ أو فواصل. في الواقع، القيم المُفردة تعدّ قوائم أيضًا إذ هي قوائم أحادية.
لا تكون القوائم ذات فائدة دون دوال قوائم SassScript. مثلًا، الدالة النونية (nth function) يمكنها الوصول إلى العناصر الموجودة في القائمة، ودالة الضّم (join function) تضمّ عدة قوائم معًا، ودالّة الإلحاق (append function) تضيف عناصر إلى القوائم؛ وأمّا التعليمة @each
فيمكنها إضافة أنماط لكل عنصرٍ في القائمة.
يمكن أن تحتوي القوائمُ، بالإضافة إلى القيم البسيطة، قوائمَ أخرى. مثلًا، القائمة 1px 2px, 5px 6px
هي قائمة ثنائيّة تحتوي على القائمة 1px 2px
والقائمة 6px 5px
. إن كانت القوائم الداخليَّّة تستخدم نفس الفاصلة التي تستخدمها القائمة الخارجية، فيجب استخدام الأقواس لتوضيح بداية القائمة الداخلية ونهايتها. على سبيل المثال، القائمة (1px 2px) (5px 6px)
هي قائمة ثنائية تحتوي على القائمة 1px 2px
والقائمة 5px 6px
. الفرق هو أنّ القائمة الخارجية والداخلية مفصولتان بالمسافات البيضاء خلافًا للمثال السابق حيث فُصلت الخارجية بفاصلة والداخلية بمسافة بيضاء.
عند تحويل القوائم إلى لغة CSS، فلا تضيف sass الأقواس إذ لا تتعرف CSS على الأقواس. هذا يعني أنَّ القائمة (1px 2px) (5px 6px)
والقائمة 1px 2px 5px 6px
ستبدوان متشابهتين عند تصريفهما إلى لغة CSS. مع ذلك، لن تكونا متشابهتين عندما كتابتهما بلغة sass إذ أنَّ الأولى هي قائمةٌ تحتوي قائمَتين، في حين أنّ الثانية هي قائمة تحتوي أربعة أعداد.
يمكن للقوائم أن تكون خاليةً من أيّ عنصر وتُمثّل بقوسين ()
فقط (والذي يمكن أن يعني أيضًا خريطة [map] فارغة). هذا النوع من القوائم لا يمكن أن يظهر في مخرجات CSS مباشرة. إن جربت ذلك باستعمال font-family: ()
مثلًا، فستطلق sass حينئذ خطأً. إذا احتوت قائمةٌ على قائمةٍ فارغة أو قيمة عدمية (null) مثل 2px 1px () 3px
أو 1px 2px null 3px
، فستُزال القوائم الفارغة والقيم العدمية قبل تحويلها إلى لغة CSS.
قد تحتوي القوائم المفصولة بفواصل على فاصلةٍ زائدةٍ وهذا مفيدٌ إذ تسمح لك بتمثيل قائمةٍ أحادية (single-element list). على سبيل المثال، (,1)
هي قائمة تحتوي على 1 أمّا (1 2 3,) فهي قائمةٌ مفصولةٌ بفواصل تحتوي على قائمةٍ مفصولةٍ بمسافاتٍ بيضاء تحتوي على 1 و 2 و 3.
القوائم ذات الأقواس المربعة
يمكن أيضًا كتابة القوائم باستعمال الأقواس المربعة. تُستخدم القوائم ذات الأقواس المربعة أسماءً للأسطر في مخطّطات شبكات CSS، ولكن يمكن أن تُستخدم أيضًا في الكود البرمجي للغة sass مَثَلُها كمَثَلِ أيِّ قائمةٍ أخرى. يمكن للقوائم ذات الأقواس المربعة أن تُفصَل بالمسافات البيضاء أو الفواصل.
الخرائط (Maps)
تمثل الخرائط ارتباطًا بين قيم تدعى مفاتيح (keys) مع قيم أخرى. تُستخدم المفاتيح لإيجاد القيم وتُسهّل تجميعها في مجموعات مُسمّاةٍ والوصول إلى تلك المجموعات بشكل ديناميكيّ. ليس للخرائط مقابلٌ مباشر في لغة CSS، على الرغم من أنّ صياغتها مشابهةٌ لتعبيرات استعلامات الوسائط (media query expressions).
$map: (key1: value1, key2: value2, key3: value3);
خلافًا للقوائم، يجب أن تٌحاط الخرائط دائمًا بالأقواس، ويجب أن تُفصل بالفواصل. يمكن أن تكون المفاتيح وقيمها أي كائن من كائنات SassScript. لا يمكن ربط أكثر من قيمةٍ واحدةٍ في الخريطة مع نفس المفتاح (ولكنّ تلك القيمة يمكن أن تكون قائمةً)، بينما يمكن أن ترتبط قيمة معيَّنة مع أكثر من مفتاح واحد.
تُعالج الخرائط، بشكل مشابه للقوائم، باستخدام دوال SassScript. الدالة map-get
مثلًا تبحث عن قيم محدَّدة في الخريطة والدالّة map-merge
تضيف قيمًا إلى الخريطة. أمّا التعليمة @each
فيمكن استخدامها لإضافة أنماط لكل زوج مفتاح/قيمة (key/value) في الخريطة. لا يتغير ترتيب الأزواج في الخريطة منذ إنشائه.
يمكن استخدام الخرائط في أيّ مكان تُستخدم فيه القوائم. عند استخدامها من قبل دالةٍ خاصَّة بالقوائم، فستُعامل على أنّها قائمةٌ مكونة من أزواج. ستُعامل دوال القوائم مثل الخريطة (key1: value1, key2: value2)
على أنَّه القائمة المتشعّبة key1 value1, key2 value2
. لا يمكن أن تُعامَل القوائم على أنّها خرائط باستثناء القائمة الفارغة. تمثّل ()
خريطة لا تحوي أيّ أزواج (مفتاح/قيمة) وقائمة لا تحوي أيّ عناصر في آنٍ واحدٍ.
الجدير بالذكر أنّ مفاتيح الخريطة يمكن أن تكون أيّ نوع من أنواع بيانات Sass كما تتيح الصياغة المستعملة لتعريف الخريطة استخدام أي تعبير من تعبيرات تقنية SassScript التي ستُقيَّم وتُحدَّد قيمتها للتعرف على قيمة المفتاح.
لا يمكن ترجمة الخرائط إلى لغة CSS إذ سيُسبِّب استخدامها كمتغيراتٍ أو معطياتٍ لدوال CSS خطأ. استخدم الدالة inspect($value)
لإنتاج سلسلة نصّية عند إخراج الخرائط في ملف CSS الناتج.
الألوان (Colors)
تُرجع كلُّ تعابير الألوان في CSS قيمة لونيّة في SassScript. وهذا يشمل عددًا كبيرًا من الألوان المُسمّاة، والتي لا يمكن تمييزها عن السلاسل النصيَّة غير المُقتبسة.
ستُخرج sass في الوضع المضغوط (compressed mode) أوجز تمثيل ممكن للألوان في CSS. سيُترجم حينئذ #FF0000
مثلًا إلى red
، بينما سيُترجم blanchedalmond
إلى #FFEBCD
.
من المشاكل الشائعة في استخدام الألوان المسماة هو أنّه لمّا كانت sass تُفضّل نفس تنسيق المُخرجات كما كُتبت في أوضاع الإخراج الأخرى، فستصبح الألوان المستوفاة (interpolated) في محدِّد معيّن غير صالحة عند ضغطها حينئذ. يمكن تجنب هذه المشكلة بوضع الألوان المسماة دائمًا بين علامتي تنصيص إن كنت ترغب في استخدامها في إنشاء محدّد.
الدوالّ من الدرجة الأولى (First Class Functions)
يمكن الحصول على مؤشِّر (reference) دالة معيّنة باستعمال التعبير get-function($function-name)
. عند تمرير مؤشّر دالة إلى الدالة call($function, $args...)
فستُستدعى حينئذ الدالة التي يشير إليها. لا تُترجم لغة CSS دوال الدرجة الأولى مباشرةً، وأيّ محاولةٍ لفعل ذلك ستؤدي إلى إطلاق خطأ.
العمليات (Operations)
تدعم جميع الأنواع معاملات التساوي (==
و =!
). بالإضافة إلى ذلك، يدعم كلُّ نوعٍ معاملاتٍ خاصةٍ به.
العمليات على الأعداد
تدعم SassScript العمليات الحسابيَّة الاعتيادية على الأعداد (الجمع +
، والطرح -
، والضرب *
، والقسمة /
، وباقي القسمة %
). تحفظ دوال sass الرياضية الواحدات خلال العمليات الحسابيَّة. هذا يعني أنَّه، كما هو الحال في الواقع، لا يمكنك أن تعمل على أرقام ذات واحدات غير متوافقة (مثل إضافة قيمة واحدتها px
إلى قيمة واحدتها em
)، وستكون واحدة ناتج ضرب عددين لهما الواحدة ذاتها واحدةً مربّعةً (10px * 10px == 100px * px
). تذكّر أنّ الواحدة المربّعة px * px
غير صالحة في لغة CSS، وستُطلق Sass خطأً إن حاولت استخدام واحدات غير صالحة في CSS.
معاملات المقارنة (<
و >
و =<
و =>
) مدعومةٌ أيضًا على الأعداد، أمّا معاملات التساوي (==
و =!
) فتدعمها جميع الأنواع.
القسمة والمعامل /
تسمح CSS بأن يظهر المعامل /
في قيم الخاصِّيَّات كوسيلة لفصل الأعداد. ولمّا كانت SassScript امتدادًا لصياغة الخاصيّات في لغة CSS، فلابُد من أن تدعمَ هذا النوع من الصياغة، وتسمحَ أيضًا باستخدام المعامل /
لأجل القسمة في الوقت عينه. وهذا يعني افتراضيًا، أنّه إذا فُصل عددان بالمعامل /
في SassScript، فسيظهران على نفس النحو في ملف CSS الناتج.
هناك ثلاث حالات سيُفسَّر فيها الرمز /
على أنّه عمليّة قسمة. هذه الحالات تشمل غالبية استعمالات عمليّة القسمة وهي:
- إن خُزّنت القيمة، أو جزءٌ منها، في متغير أو أُعيدت من قبل دالة.
- إن أُحيطت القيمة بقوسين، ما لم يكن هذان القوسان خارج قائمةٍ والقيمة داخلها.
- إن كانت القيمة جزءًا من تعبيرٍ حسابيّ آخر.
انظر على سبيل المثال الشيفرة التالية:
p {
font: 10px/8px; // العادية، ليست قسمةً CSS
$width: 1000px;
width: $width/2; // استخدام متغير، تحدث القسمة
width: round(1.5)/2; // استخدام دالة، تحدث القسمة
height: (500px/2); // استخدام الأقواس، تحدث القسمة
margin-left: 5px + 8px/2px; // استخدام +، تحدث القسمة
font: (italic bold 10px/8px); // داخل قائمة، لا تُحتسب الأقواس
}
ستُصرّف إلى:
p {
font: 10px/8px;
width: 500px;
height: 250px;
margin-left: 9px; }
إن أردت استخدام المتغيرات مع الإبقاء على الصياغة العاديَّة للمعامل /
في لغة CSS، فيمكنك استخدام الاستيفاء {}#
لإدراجها مباشرةً. انظر مثلًا الشيفرة:
p {
$font-size: 12px;
$line-height: 30px;
font: #{$font-size}/#{$line-height};
}
ستُصرّف إلى:
p {
font: 12px/30px; }
الطرح والأعداد السالبة والمعامل -
يمكن أن يمثل المعامل -
عدَّة أشياء مختلفة في لغة CSS و Sass. يمكن أن يكون عامل طرح (كما هو الحال في 5px - 3px
)، أو بداية عددٍ سالبٍ (كما هو الحال في -3px
)، أو قد يكون عامل نفيٍ أحادي للمتغير (مثل -$var
)، ويمكن أن يكون جزءًا من مُعرّفٍ (مثل font-weight
). يمكن في أكثر الحالات معرفة وظيفة الرمز -
من السياق، وقد تلتبس بعض الحالات الأخرى. إليك هذه التوصيات بوصفها قاعدة عامةٍ:
- دائمًا ضع مسافةً بيضاء قبل المعامل
-
وبعده عند استخدامه للطرح. - ضع مسافة قبل
-
ولكن ليس بعده في حالة الأعداد السالبة أو النفي الأحادي. - ضع النفي الأحادي بين قوسين إن كان في قائمة مفصولة بالمسافات، مثل
10px (-$var)
.
أسبقية المعاني المختلفة للمعامل -
هي حسب الترتيب التالي:
- كونه جزءًا من مُعرّف. أي أنّ
a-1
هي سلسلة نصيّة غير مُقتبسة قيمتها"a-1"
وتستثنى الواحدات فقط من ذلك؛ تسمح Sass عادةً لأي مُعرّف صالح بأن يًستخدم كمعرّف، ولكن قد لا يصحّ أن تحتوي المُعرّفات على شرْطة يليها عدد. أي أنّ5px-3px
هو مثل5px - 3px
. - وجوده بين عددين وبدون مسافة بيضاء يشير إلى عمليّة طرح، لذا يعدُّ التعبير
1-2
مماثلًا تمامًا للتعبير1 - 2
. - وجوده قبل عددٍ ولكن غيرَ مسبوق بعددٍ يشير إلى أن ذلك العدد هو عدد سالب، لذلك فالتعبير
1 -2
هو قائمة تحتوي على1
و -2
. - وجوده بين عددين بغض النظر عن وجود المسافات يدلّ على عمليّة الطرح، لذلك يعدُّ التعبير
1 -$var
مماثلًا للتعبير1 - $var
. - وجوده قبل قيمة معيّنة يعني أنَّه عامل نفي أحادي. بعبارة أخرى، تعاد القيمة السالبة للعدد عند وجوده قبله.
عمليات الألوان (Color Operations)
تدعم القيم اللّونية كل العمليات الحسابيَّة، إذ تنفذ تلك العمليات على مركّبات الألوان مثنى مثنى. أي تُنفّذ العمليّة على مركبة الأحمر والأخضر والأزرق. انظر المثال التالي:
p {
color: #010203 + #040506;
}
ستُحسب 01 + 04 = 05 و 02 + 05 = 07 و 03 + 06 = 09، وستُصرّف إلى:
p {
color: #050709; }
يُفضّل غالبًا استخدام دوال الألوان على استخدام العمليات الحسابيَّة لإنجاز العملية عليها والحصول على النتيجة ذاتها. تطبَّق العمليات الحسابيَّة أيضًا على الأعداد والألوان، وأيضًا مثنى مثنى. انظر مثلًا:
p {
color: #010203 * 2;
}
ستُحسب 01 * 2 = 02 و 02 * 2 = 04 و 03 * 2 = 06، وستُصرّف إلى:
p {
color: #020406; }
يجب أن يكون للألوان ذات قناة الشفافيَّة alpha (أي تلك التي أُنشئت بواسطة إحدى الدالّتين rgba
و hsla
) نفس قيمة الشفافيَّة لتتمكن من إجراء العمليّات الحسابيَّة عليها. تلك العمليّات لا تؤثّر على قيمة الشفافيَّة. انظر على سبيل المثال:
p {
color: rgba(255, 0, 0, 0.75) + rgba(0, 255, 0, 0.75);
}
ستُصرّف إلى:
p {
color: rgba(255, 255, 0, 0.75); }
يمكن تعديل قناة الشفافيَّة للونٍ معيّن باستخدام الدالّتين opacify
و transparentize
. انظر المثال التالي:
$translucent-red: rgba(255, 0, 0, 0.5);
p {
color: opacify($translucent-red, 0.3);
background-color: transparentize($translucent-red, 0.25);
}
ستُصرّف الشيفرة إلى:
p {
color: rgba(255, 0, 0, 0.8);
background-color: rgba(255, 0, 0, 0.25); }
تحتاج الخاصِّيَّة filters
في متصفح IE أن تشتمل كلُّ الألوان على قناة الشفافيَّة، وأن تكون في الشكل #AABBCCDD
تحديدًا. يمكنك بسهولة تحويل اللون باستخدام الدالة ie_hex_str
. انظر المثال التالي:
$translucent-red: rgba(255, 0, 0, 0.5);
$green: #00ff00;
div {
filter: progid:DXImageTransform.Microsoft.gradient(enabled='false', startColorstr='#{ie-hex-str($green)}', endColorstr='#{ie-hex-str($translucent-red)}');
}
ستُصرّف الشيفرة إلى:
div {
filter: progid:DXImageTransform.Microsoft.gradient(enabled='false', startColorstr=#FF00FF00, endColorstr=#80FF0000);
}
العمليات على السلاسل النصيّة (String Operations)
يمكن استخدام عمليَّة الجمع +
لضمّ السلاسل النصّية.
p {
cursor: e + -resize;
}
ستُصرّف الشيفرة السابقة إلى:
p {
cursor: e-resize; }
لاحظ أنّه إذا أُضيفت سلسلة نصّية مُقتبسة إلى أخرى غير مقتبسة (أي أنّ السلسلة النصية المقتبسة موجودة على يسار إشارة +
)، فالنتيجة هي سلسلة نصيّة مقتبسة. وبالمثل، إذا أُضيفت سلسلة نصّية غير مُقتبسة إلى أخرى مقتبسة (السلسلة النصية غير المقتبسة على يسار إشارة +
)، فالنتيجة هي سلسلة نصيّة غير مقتبسة. انظر مثلًا الشيفرة التالية:
p:before {
content: "Foo " + Bar;
font-family: sans- + "serif";
}
ستُصرّف إلى:
p:before {
content: "Foo Bar";
font-family: sans-serif; }
افتراضيّا، إذا وضَعت قيمتين بجانب بعضها البعض، فستُضمّان إلى بعضهما بفراغ واحد، انظر مثلًا الشيفرة:
p {
margin: 3px + 4px auto;
}
ستُصرّف إلى:
p {
margin: 7px auto; }
يمكن استخدام الاستيفاء ({}#
) داخل سلسلة نصيَّة لحشو قيمة ديناميكيّة داخل السلسلة، انظر مثلًا الشيفرة التالية:
p:before {
content: "I ate #{5 + 10} pies!";
}
ستُصرّف إلى:
p:before {
content: "I ate 15 pies!"; }
تُعامَل القيمة المعدومة (Null) على أنّها سلسلة فارغة عند استيفاء السلاسل النصّية.
$value: null;
p:before {
content: "I ate #{$value} pies!";
}
ستُصرّف إلى:
p:before {
content: "I ate pies!"; }
العمليات المنطقية (Boolean Operations)
تدعم SassScript استعمال المعامل and
والمعامل or
والمعامل not
مع القيم المنطقيَّة.
عمليات القوائم (List Operations)
لا تدعم القوائم أيّ معاملات خاصَّة، بل تُعالج باستخدام دوال القوائم.
الأقواس
يمكن استخدام الأقواس لترتيب العمليات. انظر مثلًا الشيفرة التالية:
p {
width: 1em + (2em * 3);
}
ستُصرّف إلى:
p {
width: 7em; }
الدّوال
هنالك الكثير من الدّوال المفيدة المعرَّفة في SassScript التي يمكن استدعاؤها باستخدام الصياغة العادية للدّوال في لغة CSS.
p {
color: hsl(0, 100%, 50%);
}
ستُصرّف الشيفرة السابقة إلى:
p {
color: #ff0000; }
راجع صفحة الدوال في Sass للحصول على قائمة كاملة بالدوال المتاحة.
الوسائط المسمّاة (Keyword Arguments)
يمكنُ استدعاء دوالّ Sass باستخدام وسائط (arguments) مسماةٍ بشكل صريح. المثال أعلاه يُمكن أن يُكتب على النحو التالي:
p {
color: hsl($hue: 0, $saturation: 100%, $lightness: 50%);
}
قد تكون هذه الصياغة أقلّ إيجازًا، ولكنّها يمكن أن تجعل مقروئيَّة ملف الأنماط أيْسر. كما ستسمح للدوالّ بتقديم واجهات أكثر مرونة، وتمرير العديد من الوسائط دون أن تكون هناك صعوبة في استدعائها.
يمكن تمرير الوسائط المسمّاة حسب أيّ ترتيب، ويمكن حذف المعطياتُ ذات القيم الافتراضيَّة. لمَّا كانت الوسائط المُسمّاة أسماءُ متغيراتِ، فلا فرق بين استخدام الشرطات السفلية _
واستخدام الشرطات العادية -
.
انظر صفحة الدوال في Sass للحصول على قائمة كاملة من دوالّ sass وأسماء مُعطياتها، وكذلك إرشادات تعريفها في لغة Ruby.
الاستيفاء (Interpolation): #{}
يمكنك أيضًا استخدام المتغيرات في لغة SassScript في المُحدّدات (selectors) وأسماء الخاصيّات باستخدام صياغة الاستيفاء {}#
.
$name: foo;
$attr: border;
p.#{$name} {
#{$attr}-color: blue;
}
ستُصرّف الشيفرة إلى:
p.foo {
border-color: blue; }
من الممكن أيضًا استخدام الاستيفاء {}#
في قيم الخاصيات. في معظم الحالات، هذا ليس أفضل من استخدام المتغيرات، ولكن باستخدام الصيغة {}#
فكلّ العمليات المجاورة لها ستُعامل على أنّها صياغة عادية للغة CSS. على سبيل المثال:
p {
$font-size: 12px;
$line-height: 30px;
font: #{$font-size}/#{$line-height};
}
ستُصرّف إلى:
p {
font: 12px/30px; }
الرمز &
في SassScript
يشير الرمز &
في SassScript إلى المُحدّد الأب الحالي، تمامًا كما هو الحال عندما يُستخدم في المحدّدات. وهو قائمةٌ مفصولة بالفواصل لقوائم مفصولة بالمسافات. انظر على سبيل المثال:
.foo.bar .baz.bang, .bip.qux {
$selector: &;
}
قيمة $selector
في المثال هي ((".foo.bar" ".baz.bang"), ".bip.qux")
. وُضعت المحدِّدات المُركّبة بين علامتي اقتباس للإشارة إلى أنها سلاسلٌ نصّيةٌ، ولكن يمكن أن تكون غير مُقتبسة.
حتى إن لم يحتوِ المحدِّد الأب على فاصلةً أو مسافةً، فسيكون لقيمة الرمز &
دائمًا مستويان من التشعّب، بحيث يمكن الوصول إليها بطريقة موحدة.
إن لم يكن هناك محددٌ أب، فإنّ قيمة &
ستكون معدومةً (null). هذا يعني أنَّه يمكنك استخدامها في مخلوط (mixin) للتحقَّق من وجود المحدِّد الأب.
@mixin does-parent-exist {
@if & {
&:hover {
color: red;
}
} @else {
a {
color: red;
}
}
}
القيمة الافتراضية للمتغيرات: !default
يمكنك ضبط قيمة افتراضيَّة للمتغيرٍ إن لم يكن قد ضُبِط سلفًا بإضافة الراية !default
عقِب تلك القيمة. هذا يعني أنه متى أسندت قيمة إلى المتغير، فلن تسند تلك القيمة (الافتراضية) إليه مجدّدًا. أمَّا إن لم تسند قيمة إلى المتغير، فستكون قيمته هي القيمة الافتراضيَّة المحدَّدة. انظر الشيفرة التالية على سبيل المثال:
$content: "First content";
$content: "Second content?" !default;
$new_content: "First time reference" !default;
#main {
content: $content;
new-content: $new_content;
}
ستُصرّف إلى:
#main {
content: "First content";
new-content: "First time reference"; }
تعامَل القيمة المعدومة (null) المسندة إلى المتغير على أنَّها قيمة غير مسندة، لذا ستسند القيمة الإفتراضيَّة إليه آنذاك.
$content: null;
$content: "Non-null content" !default;
#main {
content: $content;
}
ستُصرّف إلى:
#main {
content: "Non-null content"; }