الفرق بين المراجعتين ل"Sass/@ rules"

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث
ط (←‏‎الموجّه ‎@at-root: تعديل العنوان)
ط (استبدال النص - '\[\[تصنيف:(.*)\]\]' ب'{{SUBPAGENAME}}')
 
(مراجعة متوسطة واحدة بواسطة مستخدم واحد آخر غير معروضة)
سطر 1: سطر 1:
<noinclude>{{DISPLAYTITLE:قواعد ‎@-Rules في Sass}}</noinclude>
+
تدعم Sass جميع [[:تصنيف:CSS At-rule|قواعد CSS]] التي تبدأ بالرمز <code>@</code>، فضلًا عن أخرى خاصَّة بلغة Sass تسمى بالتعليمات (directives). لهذه القواعد تأثيرات مختلفة في Sass سنفصلها بعد قليل. انظر أيضًا [[Sass/control directives|تعليمات التحكم]] (control directives) وتعليمات [[Sass/mixins|المخاليط]] (mixin directives).
تدعم Sass جميع قواعد @ الخاصة بلغة CSS، فضلًا عن أخرى خاصة بلغة Sass تسمى المُوجّهات (directives). لهذه القواعد تأثيرات مختلفة في Sass، وقد فصّلناها في الأسفل. انظر أيضًا [[Sass/control directives|موجّهات التحكم]] (control directives) وموجّهات [[Sass/mixins|المخاليط]] (mixin directives).
+
==القاعدة <code>‎@import</code>==
 +
توسّع Sass استخدامات القاعدة <code>[[CSS/@import|‎@import]]</code> الخاصَّة بلغة CSS للسماح لها باستيراد ملفات SCSS وملفات Sass. ستُدمج جميع ملفات SCSS وملفات Sass المُستورَدة معًا في ملف CSS واحدٍ. إضافةً إلى ذلك، يمكن استخدام المتغيرات أو [[Sass/mixins|المخاليط]] (mixins) المُعرّفة في الملفات المستوردة في الملف الرئيسي.
  
== <code>‎@import</code> ==
+
تبحث Sass عن ملفات Sass أخرى في المجلّد الحالي، وفي مجلّد ملفات Sass في Rack و Rails و Merb. يمكن تحديد مجلدات بحث إضافية أيضًا باستخدام الخيار <code>‎:load_paths</code> أو الخيار <code>‎--load-path</code> في سطر الأوامر.
توسّع Sass استخدامات القاعدة <code>[[CSS/@import|@import]]</code> الخاصة بلغة CSS للسماح لها باستيراد ملفات SCSS و Sass. ستُدمج جميع ملفات SCSS و Sass المُستورَدة معًا في ملف CSS واحدٍ. وإضافةً إلى ذلك، فالمتغيرات أو [[Sass/mixins|المخاليط]] (mixins) المُعرّفة في الملفات المستوردة يمكن استخدامها في الملف الرئيسي.
 
  
تبحث Sass عن ملفات Sass أخرى في المجلّد الحالي، وفي مجلّد ملفات Sass في التقنيات Rack و Rails و Merb. يمكن تعيين مجلدات بحث إضافية باستخدام الخيار <code>‎:load_paths</code> أو الخيار <code>‎--load-path</code> في سطر الأوامر.
+
تأخذ القاعدة <code>‎@import</code> اسمَ الملف المراد استيراده. تبحث افتراضيًا عن ملف Sass لاستيراده مباشرةً، ولكن هناك بعض الظروف التي تجعلها تُصرَّف إلى القاعدة <code>[[CSS/@import|‎@import]]</code> الخاصّة بلغة CSS وهي:
 
+
*إن كان امتداد اسم الملف هو <code>‎.css</code>.
تأخذ القاعدة <code>‎@import</code> اسمَ الملف المراد استيراده. افتراضيًا، تبحث عن ملف Sass لأجل استيراده مباشرةً، ولكن هناك بعض الظروف التي ستجعلها تُصرَّف إلى القاعدة <code>[[CSS/@import|‎@import]]</code> الخاصّة بلغة CSS، وهي:
+
*إن بدأ اسم الملف بالبروتوكول <code>http:‎//‎</code>.
* إن كان امتداد اسم الملف هو <code>‎.css</code>.
+
*إن كان اسم الملف عنوانًا <code>url(‎)‎</code>.
* إن بدأ اسم الملف بالبروتوكول <code>http:‎//‎</code>.
+
*إن كان للقاعدة <code>‎@import</code> أيّ [[CSS/@media|استعلامات وسائط]] (media queries).
* إن كان اسم الملف مكتوبًا بالصياغة <code>url(‎)‎</code>.
+
إن لم يُستوفَ أيٌّ من الشروط المذكورة أعلاه وكان امتداد الملف هو <code>‎.scss</code> أو <code>‎.sass</code>، فسيُستورد حينئذ ملف Sass أو ملف SCSS المُعيّن. وإذا لم يكن هناك أي امتداد، فستحاول Sass العثور على ملف بحسب الاسم المعطى سواء كان امتداده <code>‎.scss</code> أو <code>‎.sass</code> لتستورده. انظر المثال التالي:<syntaxhighlight lang="sass">
* إن كان للقاعدة <code>‎@import</code> أيّ [[CSS/@media|استعلامات وسائط]] (media queries).
 
إذا لم يُستوفى أيٌّ من الشروط المذكورة أعلاه وكان امتداد الملف هو <code>‎.scss</code> أو <code>‎.sass</code>، فحينها سيُستورد ملف Sass أو SCSS المُعيّن. وإذا لم يكن هناك أي امتداد، فستحاول Sass العثور على ملف بهذا الاسم وامتداده <code>‎.scss</code> أو <code>‎.sass</code> لتستورده.
 
 
 
على سبيل المثال:<syntaxhighlight lang="sass">
 
 
@import "foo.scss";
 
@import "foo.scss";
  
سطر 32: سطر 28:
 
@import url(foo);
 
@import url(foo);
  
</syntaxhighlight>من الممكن أيضًا استيراد أكثر من ملف واحدٍ في قاعدة <code>‎@import</code> واحدة. على سبيل المثال:<syntaxhighlight lang="sass">
+
</syntaxhighlight>يمكن أيضًا استيراد عدَّة ملفات في آن واحد  باستعمال قاعدة <code>‎@import</code>. انظر على سبيل المثال الشيفرة التالية:<syntaxhighlight lang="sass">
 
@import "rounded-corners", "text-shadow";
 
@import "rounded-corners", "text-shadow";
  
</syntaxhighlight>ستستورد الملفّين <code>rounded-corners</code> و <code>text-shadow</code>.
+
</syntaxhighlight>سيُستورد الملف <code>rounded-corners</code> والملف <code>text-shadow</code>.
  
يجوز أن تحتوي التعليمة import على استيفاء ‎(<code>#{}</code>)‎، ولكن مع بعض القيود. فلا يمكن استيراد ملف Sass ديناميكيًا باستعمال المتغيرات. الاستيفاء لا يصلح إلا في استيرادات CSS. وعلى هذا النحو، فهي لا تعمل إلّا مع استيرادات <code>url(‎)</code>‎. على سبيل المثال:<syntaxhighlight lang="sass">
+
يجوز أن تحتوي التعليمة import على استيفاء ‎(<code>#{}</code>)‎ لكن مع بعض القيود إذ لا يمكن استيراد ملف Sass ديناميكيًا باستعمال المتغيرات؛ لا يصلح استعمال الاستيفاء سوى مع استيرادات CSS. وعلى هذا النحو، فهي لا تعمل إلّا مع استيرادات <code>url(‎)</code>‎. انظر على سبيل المثال الشيفرة التالية:<syntaxhighlight lang="sass">
 
$family: unquote("Droid+Sans");
 
$family: unquote("Droid+Sans");
 
@import url("http://fonts.googleapis.com/css?family=#{$family}");
 
@import url("http://fonts.googleapis.com/css?family=#{$family}");
سطر 45: سطر 41:
  
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
==المجزوءات (Partials)==
 +
إن كنت تريد استيراد ملف SCSS أو Sass دون تصريفه إلى ملف CSS، فأضف شرطة سفلية إلى بداية اسم الملف إذ هذا سيخبر Sass أن لا تترجمه إلى ملف CSS عادي. يمكنك بعد ذلك استيراد تلك الملفات من دون استخدام الشرطة السفلية.
  
== المجزوءات (Partials) ==
+
إن كان لديك مثلًا ملف <code>‎_colors.scss</code> فلن يُنشَأ ملفٌ باسم <code>‎_colors.css</code> ويمكنك تنفيذ الأمر:<syntaxhighlight lang="sass">
إن كنت تريد استيراد ملف SCSS أو Sass دون تصريفه إلى ملف CSS، فأضف شرطة سفلية إلى بداية اسم الملف. هذا سيخبر Sass أن لا تترجمه إلى ملف CSS عادي. يمكنك بعد ذلك استيراد تلك الملفات من دون استخدام الشرطة السفلية.
 
 
 
على سبيل المثال، إن كان لديك ملف <code>‎_colors.scss</code> فلن يُنشَأ ملفٌ باسم <code>‎_colors.css</code> ويمكنك كتابة:<syntaxhighlight lang="sass">
 
 
@import "colors";
 
@import "colors";
  
</syntaxhighlight>وسيُستورد الملف <code>‎_colors.scss</code>.
+
</syntaxhighlight>الذي سيُستورد الملف <code>‎_colors.scss</code>.
 
 
تذكر أنّه لا يجوز استخدام ملف مجزوء (partial) وآخر غير مجزوء لهما نفس الاسم في نفس المجلّد. على سبيل المثال، لا يجوز أن يوجد الملف <code>‎_colors.scss</code> في نفس المجلد مع <code>colors.scss</code>.
 
  
== قواعد <code>‎@import</code> المتشعّبة ==
+
الجدير بالذكر أنّه لا يجوز استخدام ملف مجزوء (partial) وآخر غير مجزوء لهما نفس الاسم في نفس المجلّد. على سبيل المثال، لا يجوز أن يوجد الملف <code>‎_colors.scss</code> في نفس المجلد مع <code>colors.scss</code>.
على الرغم من أنه في أكثر الأحيان سيكون وضع <code>‎@import</code> في المستوى الأعلى من الملف أفْيَد، لكن من الممكن إدراجها ضمن قواعد CSS وقواعد <code>[[CSS/@media|‎@media]]</code>. مثل قاعدة <code>‎@import</code> في المستوى الأساسي (base-level @import)، وهذا يشمل محتويات الملف المُستورّد بواسطة <code>‎@import</code>. ومع ذلك، ستتشعّبُ القواعد المستوردة في نفس مكان قاعدة <code>‎@import</code> الأصلية.
+
==القاعدة <code>‎@import</code> المتشعّبة==
 +
بالرغم من أنَّه من المفيد في أكثر الأحيان استيراد الملفات باستعمال <code>‎@import</code> في المستوى الأعلى من الملف، إلا أنه من الممكن إدراجهم باستعمال قواعد CSS وقواعد <code>[[CSS/@media|‎@media]]</code>. مثل قاعدة <code>‎@import</code> في المستوى الأساسي (base-level @import)، وهذا يشمل محتويات الملف المُستورّد بواسطة <code>‎@import</code>. مع ذلك، ستتشعّبُ القواعد المستوردة في نفس مكان قاعدة <code>‎@import</code> الأصليَّة.
  
 
على سبيل المثال، إن احتوى الملف <code>example.scss</code> على:<syntaxhighlight lang="sass">
 
على سبيل المثال، إن احتوى الملف <code>example.scss</code> على:<syntaxhighlight lang="sass">
سطر 63: سطر 57:
 
   color: red;
 
   color: red;
 
}
 
}
</syntaxhighlight>فإذًا:<syntaxhighlight lang="sass">
+
</syntaxhighlight>فستصرف الشيفرة:<syntaxhighlight lang="sass">
 
#main {
 
#main {
 
   @import "example";
 
   @import "example";
 
}
 
}
</syntaxhighlight>ستُصرّف إلى:<syntaxhighlight lang="sass">
+
</syntaxhighlight>إلى:<syntaxhighlight lang="sass">
 
#main .example {
 
#main .example {
 
   color: red;
 
   color: red;
 
}
 
}
</syntaxhighlight>إنّ المُوجّهات (Directives) التي لا يُسمح باستخدامها إلا في المستوى الأساسي للملف، مثل <code>‎@mixin</code> أو <code>‎@charset</code>، لا يجوز استخدامها في الملفات المستوردة عبر <code>‎@import</code> في سياق متشعب.
+
</syntaxhighlight>لا يجوز استخدام التعليمات (Directives) التي لا يُسمح باستخدامها إلا في المستوى الأساسي للملف، مثل <code>‎@mixin</code> أو <code>‎@charset</code>، في الملفات المستوردة عبر <code>‎@import</code> في سياق متشعب. كما لا يجوز أن تتشعّب <code>‎@import</code> داخل [[Sass/mixins|المخاليط]] (mixins) أو تعليمات المراقبة (control directives).
 
+
==التعليمات ‎<code>@media</code>==
كما لا يجوز أن تتشعّب <code>‎@import</code> داخل [[Sass/mixins|المخاليط]] (mixins) أو مُوجّهات المراقبة (control directives).
+
تسلك تعليمات <code>‎@media</code> في Sass السلوك ذاته الذي تسلكه في [[CSS/@media|CSS]] مع قدرة إضافيةٍ واحدةٍ وهي أنه يمكن أن تتشعّب داخل قواعد CSS. إن ظهر أحد تعليمات <code>‎@media</code> ضمن قاعدةٍ من قواعد CSS، فستُعمّم صعودًا إلى أن تصل إلى أعلى مستوى في ملف الأنماط، وستضع جميع المٌحدّدات الموجودة في طريقها داخل القاعدة. هذا سيُسهّل إضافة أنماطِ وسائط معيّنة (media-specific styles) دون الحاجة إلى تكرار المحدِّدات أو كسر تسلسل ملف الأنماط. انظر مثلًا الشيفرة التالية:<syntaxhighlight lang="sass">
 
 
== الموجّه ‎<code>@media</code> ==
 
تتصرّف موجّهات <code>‎@media</code> في Sass مثلما تفعل في لغة [[CSS/@media|CSS]]، مع قدرة إضافيةٍ واحدةٍ، وهي أنه يمكن أن تتشعّب داخل قواعد CSS. إن ظهر أحد موجّهات <code>‎@media</code> ضمن قاعدةٍ من قواعد CSS، فستُعمّم صعودًا إلى أن تصل إلى أعلى مستوى في ملف الأنماط، وستضع جميع المٌحدّدات الموجودة في طريقها داخل القاعدة. وهذا سيُسهّل إضافة أنماطِ وسائط معيّنة دون الحاجة إلى تكرار المحددات أو كسر تسلسل ملف الأنماط. على سبيل المثال:<syntaxhighlight lang="sass">
 
 
.sidebar {
 
.sidebar {
 
   width: 300px;
 
   width: 300px;
سطر 89: سطر 80:
 
     .sidebar {
 
     .sidebar {
 
       width: 500px; } }
 
       width: 500px; } }
</syntaxhighlight>ويمكن أيضًا أن تتشعّب استعلامات <code>[[CSS/@media|‎@media]]</code> ‏(‎@media queries) داخل بعضها البعض. وحينها ستُجمع  الاستعلامات باستخدام المعامل <code>and</code>. على سبيل المثال:<syntaxhighlight lang="sass">
+
</syntaxhighlight>ويمكن أيضًا أن تتشعّب استعلامات <code>[[CSS/@media|‎@media]]</code> ‏(‎@media queries) داخل بعضها البعض،  وستُجمع  الاستعلامات حينها باستخدام المعامل <code>and</code>. انظر على سبيل المثال إلى الشيفرة:<syntaxhighlight lang="sass">
 
@media screen {
 
@media screen {
 
   .sidebar {
 
   .sidebar {
سطر 102: سطر 93:
 
   .sidebar {
 
   .sidebar {
 
     width: 500px; } }
 
     width: 500px; } }
</syntaxhighlight>وأخيرًا، يمكن أن تحتوي استعلامات <code>‎@media</code> على تعبيرات SassScript (بما في ذلك المتغيرات والدوال والعوامل) بدلًا من أسماء وقيم الميزات (features). على سبيل المثال:<syntaxhighlight lang="sass">
+
</syntaxhighlight>أخيرًا، يمكن أن تحتوي استعلامات <code>‎@media</code> على تعابير SassScript (بما في ذلك المتغيرات والدوال والعوامل) بدلًا من أسماء وقيم الميزات (features). انظر المثال التالي:<syntaxhighlight lang="sass">
 
$media: screen;
 
$media: screen;
 
$feature: -webkit-min-device-pixel-ratio;
 
$feature: -webkit-min-device-pixel-ratio;
سطر 118: سطر 109:
 
     width: 500px; } }
 
     width: 500px; } }
 
</syntaxhighlight>
 
</syntaxhighlight>
 
+
==القاعدة <code>‎@extend</code>==
== <code>‎@extend</code> ==
+
قد تحتاج في بعض الحالات عند تصميم صفحة إلى أن يكون لصنف معين جميع أنماط صنفٍ آخرٍ إضافةٍ إلى أنماطه الخاصة. الطريقة الأكثر شيوعًا لفعل ذلك هي باستخدام الصنف العام المطلق والصنف المحدَّد المخصَّص في شيفرة HTML. لنفترض على سبيل المثال أنّ لدينا تصميمًا مُخصّصًا للأخطاء العادية وآخر للأخطاء الخطيرة؛ يمكننا لفعل ذلك أن نكتب في ملف [[HTML]] ما يلي:<syntaxhighlight lang="html">
في بعض الحالات قد تحتاج إلى أن يكون لأحد الأصناف جميع أنماط صنفٍ آخرٍ إضافةٍ إلى أنماطه الخاصة. الطريقة الأكثر شيوعًا لفعل ذلك هي باستخدام الصنف العام والصنف الأكثر تحديدًا في شيفرة HTML. على سبيل المثال، لنفترض أنّ لدينا تصميمًا مُخصّصًا للأخطاء العادية وآخر للأخطاء الخطيرة. لفعل ذلك يمكننا أن نكتب في ملف [[HTML]] ما يلي:<syntaxhighlight lang="html">
 
 
<div class="error seriousError">
 
<div class="error seriousError">
 
تنبيه، لقد تمت قرصنتك
 
تنبيه، لقد تمت قرصنتك
 
</div>
 
</div>
</syntaxhighlight>ونكتب التنسيق هكذا:<syntaxhighlight lang="css">
+
</syntaxhighlight>ونكتب التنسيق بالشكل التالي:<syntaxhighlight lang="css">
 
.error {
 
.error {
 
   border: 1px #f00;
 
   border: 1px #f00;
سطر 132: سطر 122:
 
   border-width: 3px;
 
   border-width: 3px;
 
}
 
}
</syntaxhighlight>لسوء الحظ، فإنّ هذا يعني أنّ علينا أن نتذكر دائمًا استخدام المحدّد <code>‎.error</code> مع <code>‎.seriousError</code>. وهذا سيكون عبئًا على الصّيانة ويؤديَ إلى عيوب برمجية يصعب رصدها، ويمكن أن تؤثر سلبًا على مقروئية ملف [[HTML]].
+
</syntaxhighlight>لسوء الحظ، إنّ هذا يعني أنّ علينا أن نتذكر دائمًا استخدام المحدّد <code>‎.error</code> مع <code>‎.seriousError</code> وهذا سيكون عبئًا على الصّيانة ويؤديَ إلى عيوب برمجية يصعب رصدها، ويمكن أن تؤثر سلبًا على مقروئية ملف [[HTML]].
  
سيُجنّبنا الموجّه <code>‎@extend</code> هذه المشاكل بإخبار Sass بأنّ أحد المُحدّديْن سيرث أنماط الآخر. على سبيل المثال:<syntaxhighlight lang="sass">
+
ستجنّبنا التعليمة <code>‎@extend</code> هذه المشاكل بإخبار Sass بأنّ أحد المُحدّديْن سيرث أنماط الآخر. انظر على سبيل المثال إلى الشيفرة التالية:<syntaxhighlight lang="sass">
 
.error {
 
.error {
 
   border: 1px #f00;
 
   border: 1px #f00;
سطر 152: سطر 142:
 
   border-width: 3px;
 
   border-width: 3px;
 
}
 
}
</syntaxhighlight>وهذا يعني أنّ جميع الأنماط المعرّفة في المحدّد <code>‎.error</code> ستُطبّق أيضًا على المحدّد <code>‎.seriousError</code> بالإضافة إلى تلك الخاصة به، وفي الواقع، كل عناصر الصنف <code>‎.seriousError</code> هي أيضًا عناصر من <code>‎.error</code>.
+
</syntaxhighlight>وهذا يعني أنّ جميع الأنماط المعرّفة في المحدّد <code>‎.error</code> ستُطبّق أيضًا على المحدّد <code>‎.seriousError</code> بالإضافة إلى تلك الخاصَّة به؛ في الواقع، كل عناصر الصنف <code>‎.seriousError</code> هي أيضًا عناصر من <code>‎.error</code>.
  
القواعد الأخرى التي تستخدم <code>‎.error</code> ستُطبّق كذلك على <code>‎.seriousError</code>. على سبيل المثال، إن خصّصنا أنماطًا للأخطاء الناجمة عن القراصنة:<syntaxhighlight lang="css">
+
القواعد الأخرى التي تستخدم <code>‎.error</code> ستُطبّق أيضًا على <code>‎.seriousError</code>. إن خصّصنا مثلًا أنماطًا للأخطاء الناجمة عن القراصنة مثل:<syntaxhighlight lang="css">
 
.error.intrusion {
 
.error.intrusion {
 
   background-image: url("/image/hacked.png");
 
   background-image: url("/image/hacked.png");
 
}
 
}
</syntaxhighlight>فستكون الصورة الخلفية للعنصر <code><nowiki><div class="seriousError intrusion"‎></nowiki></code> هي <code>hacked.png</code> كذلك.
+
</syntaxhighlight>فستكون حينئذ صورة الخلفية للعنصر <code><nowiki><div class="seriousError intrusion"‎></nowiki></code> هي hacked.png أيضًا.
 
+
===كيف تعمل القاعدة <code>‎@extend</code>===
=== كيف تعمل القاعدة <code>‎@extend</code> ===
+
تعمل القاعدة <code>‎@extend</code> عبر إدراج المُحدّد المُمتد (على سبيل المثال <code>‎.seriousError</code>) في كل مكانٍ في ملف الأنماط يظهر فيه المحدّد الذي مُدِّد (مثل <code>‎.error</code>). وبناء على ذلك، المثال السابق:<syntaxhighlight lang="sass">
تعمل القاعدة <code>‎@extend</code> عبر إدراج المُحدّد المُمتد (على سبيل المثال <code>‎.seriousError</code>) في كل مكانٍ في ملف الأنماط يظهر فيه المحدّد الذي مُدِّد (مثل <code>‎.error</code>). وبالتالي فالمثال:<syntaxhighlight lang="sass">
 
 
.error {
 
.error {
 
   border: 1px #f00;
 
   border: 1px #f00;
سطر 183: سطر 172:
 
.seriousError {
 
.seriousError {
 
   border-width: 3px; }
 
   border-width: 3px; }
</syntaxhighlight>عند دمج المُحدّدات، فإنّ القاعدة <code>‎@extend</code> ذكية بما فيه الكفاية لتتجنّب التكرار غير الضروري، فالتعبير <code>‎.seriousError.seriousError</code> سيُترجم إلى <code>‎.seriousError</code>. وإضافة إلى ذلك، لن تنتج مُحدّدات لا يمكن أن تُطابق أيَّ شيء، مثل <code>‎#main#footer</code>.
+
</syntaxhighlight>عند دمج المُحدّدات، فإنّ القاعدة <code>‎@extend</code> ذكيَّة بما فيه الكفاية لتتجنّب التكرار غير الضروري، لذا سيترجم التعبير <code>‎.seriousError.seriousError</code> إلى <code>‎.seriousError</code>. إضافة إلى ذلك، لن تنتج مُحدّدات لا يمكن أن تُطابق أيَّ شيء، مثل <code>‎#main#footer</code>.
 
+
==توسعة المحدّدات المُركّبة==
== توسعة المحدّدات المُركّبة ==
+
ليست [[CSS/Class Selectors|مُحدِّدات الأصناف]] (Class selectors) الوحيدة التي يمكن توسعتها إذ يمكن توسعة أيِّ محدّد فيه عنصر واحد فقط، مثل ‎<code>.special.cool</code> أو <code>a:hover</code> أو <code>‎.user[href^="http://"]</code>‎. انظر المثال التالي:<syntaxhighlight lang="sass">
بالإضافة إلى [[CSS/Class Selectors|مُحدِّدات الأصناف]] (Class selectors). يمكن توسعة أيِّ محدّد فيه عنصر واحد فقط، مثل ‎<code>.special.cool</code> أو <code>a:hover</code> أو <code>‎.user[href^="http://"]</code>‎. على سبيل المثال:<syntaxhighlight lang="sass">
 
 
.hoverlink {
 
.hoverlink {
 
   @extend a:hover;
 
   @extend a:hover;
 
}
 
}
</syntaxhighlight>كما هو الحال مع الأصناف، هذا يعني أنّ جميع الأنماط المُعرّفة لأجل <code>a:hover</code> ستُطبّق أيضًا على المحدّد <code>‎.hoverlink</code>. على سبيل المثال:<syntaxhighlight lang="sass">
+
</syntaxhighlight>هذا يعني أنّ جميع الأنماط المُعرّفة لأجل <code>a:hover</code> ستُطبّق، كما هو الحال مع الأصناف، أيضًا على المحدّد <code>‎.hoverlink</code>. ستصرف مثلًا الشيفرة التالية:<syntaxhighlight lang="sass">
 
.hoverlink {
 
.hoverlink {
 
   @extend a:hover;
 
   @extend a:hover;
سطر 197: سطر 185:
 
   text-decoration: underline;
 
   text-decoration: underline;
 
}
 
}
</syntaxhighlight>ستُصرّف إلى:<syntaxhighlight lang="css">
+
</syntaxhighlight>إلى:<syntaxhighlight lang="css">
 
a:hover, .hoverlink {
 
a:hover, .hoverlink {
 
   text-decoration: underline; }
 
   text-decoration: underline; }
</syntaxhighlight>كما هو الحال مع المُحدّد <code>‎.error.intrusion</code> أعلاه، كلّ قاعدةٍ تستخدم <code>a:hover</code> ستعمل أيضًا على <code>‎.hoverlink</code> حتى لو كان لها مُحددّات أخرى. على سبيل المثال:<syntaxhighlight lang="sass">
+
</syntaxhighlight>كما هو الحال مع المُحدّد <code>‎.error.intrusion</code> أعلاه، فستعمل أي قاعدةٍ تستخدم <code>a:hover</code> أيضًا على <code>‎.hoverlink</code> حتى لو كان لها مُحددّات أخرى. الشيفرة التالية:<syntaxhighlight lang="sass">
 
.hoverlink {
 
.hoverlink {
 
   @extend a:hover;
 
   @extend a:hover;
سطر 211: سطر 199:
 
   font-weight: bold; }
 
   font-weight: bold; }
 
</syntaxhighlight>
 
</syntaxhighlight>
 
+
===التوسعة المتعددة (Multiple Extends)===
=== التوسعة المتعددة (Multiple Extends) ===
+
يمكن لمُحدّدٍ واحدٍ أن يوسّع عدة محدّدات. هذا يعني أنه سيرث أنماطَ جميع المحدّدات التي مُدِّدت. ستصرف الشيفرة التالية على سبيل المثال:<syntaxhighlight lang="sass">
يمكن لمُحدّدٍ واحدٍ أن يُمدِّد عدة محدّدات. وهذا يعني أنه سيرث أنماط جميع المحدّدات التي مُدِّدت. على سبيل المثال:<syntaxhighlight lang="sass">
 
 
.error {
 
.error {
 
   border: 1px #f00;
 
   border: 1px #f00;
سطر 228: سطر 215:
 
}
 
}
  
</syntaxhighlight>ستُصرّف إلى:<syntaxhighlight lang="css">
+
</syntaxhighlight>إلى:<syntaxhighlight lang="css">
 
.error, .seriousError {
 
.error, .seriousError {
 
   border: 1px #f00;
 
   border: 1px #f00;
سطر 240: سطر 227:
 
   border-width: 3px; }
 
   border-width: 3px; }
  
</syntaxhighlight>في الواقع، كل عنصرٍ من الصنف <code>‎.seriousError</code> سيكون أيضًا من الصنفين <code>‎.error</code> و <code>‎.attention</code>. وهكذا، ستكون الأولوية للأنماط المُعرفة آخرًا في الملف، أي أنّ لون الخلفية للمحدّد <code>‎.seriousError</code> سيكون هو اللون <code>‎#ff0</code> وليس <code>‎#fdd</code>، لأنّ <code>‎.attention</code> معرفة بعد <code>‎.error</code>.
+
</syntaxhighlight>في الواقع، كل عنصرٍ من الصنف <code>‎.seriousError</code> سيكون أيضًا من الصنف <code>‎.error</code> والصنف <code>‎.attention</code> وستكون حينئذ الأولوية للأنماط المُعرفة آخرًا في الملف، أي أنّ لون الخلفية للمحدّد <code>‎.seriousError</code> سيكون هو اللون <code>‎#ff0</code> وليس <code>‎#fdd</code>، لأنّ <code>‎.attention</code> معرفة بعد <code>‎.error</code>.
  
يمكن أيضًا كتابة التوسعة المتعددة باستخدام قائمةٍ من المُحدّدات مفصولةٍ بفواصل. على سبيل المثال <code>‎@extend .error, .attention</code> مَثَلُها كَمَثَلِ <code>.error; @extend .attention</code>.
+
يمكن أيضًا كتابة التوسعة المتعدِّدة باستخدام قائمةٍ من المُحدّدات مفصولةٍ بفواصل. سيكون مثلًا استعمال<code>‎@extend .error, .attention</code> مماثل تمامًا لاستعمال <code>@extend .error; @extend .attention</code>.
 
+
===التوسعات المتسلسلة (Chaining Extends)===
=== التوسعات المتسلسلة (Chaining Extends) ===
+
من الممكن توسعة مُحدّد مُمدّد من قبل مثل الشيفرة التالية:<syntaxhighlight lang="sass">
من الممكن توسعة مُحدّد مُمدّد من قبل. على سبيل المثال:<syntaxhighlight lang="sass">
 
 
.error {
 
.error {
 
   border: 1px #f00;
 
   border: 1px #f00;
سطر 263: سطر 249:
 
}
 
}
  
</syntaxhighlight>الآن، فأيّ شيءٍ له الصنف <code>‎.seriousError</code> سيكون لديه أيضًا الصنف <code>‎.error</code> وكل شيء له الصنف <code>‎.criticalError</code> سيكون لديه أيضًا الصنفان <code>‎.seriousError</code> و <code>‎.error</code>، المثال أعلاه سيُصرّف إلى:<syntaxhighlight lang="css">
+
</syntaxhighlight>أيّ شيءٍ آنذاك له الصنف <code>‎.seriousError</code> سيكون لديه أيضًا الصنف <code>‎.error</code>؛ وكل شيء له الصنف <code>‎.criticalError</code> سيكون لديه أيضًا الصنف <code>‎.seriousError</code> والصنف <code>‎.error</code>، المثال أعلاه سيُصرّف إلى:<syntaxhighlight lang="css">
 
.error, .seriousError, .criticalError {
 
.error, .seriousError, .criticalError {
 
   border: 1px #f00;
 
   border: 1px #f00;
سطر 279: سطر 265:
  
 
</syntaxhighlight>
 
</syntaxhighlight>
 
+
===المحدّدات المتتابعة (Selector Sequences)===
=== المحدّدات المتتابعة (Selector Sequences) ===
+
لا يمكن حاليًا توسعة المحدّدات المتتابعة، مثل <code>‎.foo .bar</code> أو <code>‎.foo + .bar</code> بيْد أنّه من الممكن أن تستخدم المحدَّداتُ المتشعبةُ القاعدةَ <code>‎@extend</code>. ستصرف مثلًا الشيفرة:<syntaxhighlight lang="sass">
لا يمكن حاليًا توسعة المحدّدات المتتابعة، مثل <code>‎.foo .bar</code> أو <code>‎.foo + .bar</code>. بيْد أنّه من الممكن أن تستخدم المحدداتُ المتشعبةُ القاعدةَ <code>‎@extend</code>. على سبيل المثال:<syntaxhighlight lang="sass">
 
 
#fake-links .link {
 
#fake-links .link {
 
   @extend a;
 
   @extend a;
سطر 292: سطر 277:
 
   }
 
   }
 
}
 
}
</syntaxhighlight>ستُصرّف إلى:<syntaxhighlight lang="css">
+
</syntaxhighlight>إلى:<syntaxhighlight lang="css">
 
a, #fake-links .link {
 
a, #fake-links .link {
 
   color: blue; }
 
   color: blue; }
سطر 299: سطر 284:
  
 
</syntaxhighlight>
 
</syntaxhighlight>
 
+
===دمج المحدّدات المتتابعة (Merging Selector Sequences)===
=== دمج المحدّدات المتتابعة (Merging Selector Sequences) ===
+
أحيانًا تُوسّع المحدّدات المتتابعة محدّدًا يظهرُ في محدِّدٍ متتابع آخر. يجب في هذه الحالة دمج المُحدّدين المتتابعين، مثل:<syntaxhighlight lang="sass">
أحيانًا تُوسّع المحدّدات المتتابعة محدّدًا يظهرُ في محدِّدٍ متتابع آخر. في هذه الحالة، وجب دمج المُحدّدين المتتابعين. على سبيل المثال:<syntaxhighlight lang="sass">
 
 
#admin .tabbar a {
 
#admin .tabbar a {
 
   font-weight: bold;
 
   font-weight: bold;
سطر 309: سطر 293:
 
}
 
}
  
</syntaxhighlight>صحيحٌ أنّه من الممكن تقنيًا توليد كل المحددات التي يمكن أن تُطابق كلا المحدّدين المتتابعين، إلا أنّ ذلك سيجعل ملف الأنماط كبيرًا جدًّا. المثال أعلاه سيتطلب عشر محدّدات. ولكنّ Sass ستكتفي بتوليد المحدّدات التي يُحتمل أن تكون مفيدةً.
+
</syntaxhighlight>صحيحٌ أنّه من الممكن تقنيًا توليد كلّ المحدَّدات التي يمكن أن تُطابق كلا المحدّدين المتتابعين، إلا أنّ ذلك سيجعل ملف الأنماط كبيرًا جدًّا. المثال أعلاه سيتطلب عشر محدّدات ولكنّ Sass ستكتفي بتوليد المحدّدات التي يُحتمل أن تكون مفيدةً.
  
عندما لا يكون بين المحدّدين المتتابعين المراد دمجهما أيُّ محدّدات مشتركةٍ، فسيُنشأ مُحدّدان جديدان: أحدهما يتضمّن المحدّد المتتابع الأول قبل الثاني، والآخر يتضمّن المحدّد المتتابع الثاني قبل الأوّل. على سبيل المثال:<syntaxhighlight lang="sass">
+
عندما لا يكون بين المحدّدين المتتابعين المراد دمجهما أيُّ محدّدات مشتركةٍ، فسيُنشأ مُحدّدان جديدان: أحدهما يتضمّن المحدّد المتتابع الأول قبل الثاني، والآخر يتضمّن المحدّد المتتابع الثاني قبل الأوّل. المثال التالي:<syntaxhighlight lang="sass">
 
#admin .tabbar a {
 
#admin .tabbar a {
 
   font-weight: bold;
 
   font-weight: bold;
سطر 318: سطر 302:
 
   @extend a;
 
   @extend a;
 
}
 
}
</syntaxhighlight>ستُصرّف إلى:<syntaxhighlight lang="css">
+
</syntaxhighlight>سيصرّف إلى:<syntaxhighlight lang="css">
 
#admin .tabbar a,
 
#admin .tabbar a,
 
#admin .tabbar #demo .overview .fakelink,
 
#admin .tabbar #demo .overview .fakelink,
 
#demo .overview #admin .tabbar .fakelink {
 
#demo .overview #admin .tabbar .fakelink {
 
   font-weight: bold; }
 
   font-weight: bold; }
</syntaxhighlight>أمّا إن اشترك المحدّدان المتتابعان في بعض المحددات، فستُدمج تلك المحددات معًا مع تعديل الاختلافات (إن وُجدت). في هذا المثال، كلا المحدّدين المتتابعين يحتويان على المُعرّف <code>‎#admin</code>، وبالتالي فإنّ المحددات الناتجة  ستدمج هذين المعرّفين:<syntaxhighlight lang="sass">
+
</syntaxhighlight>أمّا إن اشترك المحدّدان المتتابعان في بعض المحددات، فستُدمج تلك المحددات معًا مع تعديل الاختلافات (إن وُجدت). في المثال التالي، كلا المحدّدين المتتابعين يحتويان على المُعرّف <code>‎#admin</code>، وبالتالي فإنّ المحددات الناتجة ستدمج هذين المعرّفين:<syntaxhighlight lang="sass">
 
#admin .tabbar a {
 
#admin .tabbar a {
 
   font-weight: bold;
 
   font-weight: bold;
سطر 330: سطر 314:
 
   @extend a;
 
   @extend a;
 
}
 
}
</syntaxhighlight>ستُصرّف إلى:<syntaxhighlight lang="css">
+
</syntaxhighlight>ستُصرّف الشيفرة السابقة إلى:<syntaxhighlight lang="css">
 
#admin .tabbar a,
 
#admin .tabbar a,
 
#admin .tabbar .overview .fakelink,
 
#admin .tabbar .overview .fakelink,
سطر 336: سطر 320:
 
   font-weight: bold; }
 
   font-weight: bold; }
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
===المحدّدات المُعدّة للتوسعة (‎@extend-Only Selectors)===
 +
قد تحتاج في بعض الأحيان إلى كتابة أنماط لأجل أصناف معدّة للتوسعة وحسب، ولا تريد استخدامها مباشرةً في شيفرة [[HTML]]. هذا مفيدٌ بشكل خاص عندما تريد إنشاء مكتبةٍ لأجل Sass، إذ ستُوفّر حينئذ أنماطًا يمكن أن يُمدّدها المُستخدمون إن شاؤوا.
  
=== المحدّدات المُعدّة للتوسعة (‎@extend-Only Selectors) ===
+
إن استخدمت أصنافًا عاديةً لأجل ذلك، فسينتهي بك الأمر بإنشاء ملف CSS كبير مع إمكانية التداخل مع الأصناف الأخرى المستخدمة في شيفرة HTML. تدعم Sass لهذا السبب المُحددات النائبة (placeholder selector) (مثل <code>‎%foo</code>).
في بعض الأحيان، قد تحتاج إلى كتابة أنماط لأجل أصناف معدّة للتوسعة وحسب، ولا تريد استخدامها مباشرةً في شيفرة [[HTML]]. هذا مفيدٌ بشكل خاص عندما تريد إنشاء مكتبةٍ لأجل Sass، حيث ستُوفّر أنماط ليُمدّدها المُستخدمون إن شاؤوا.
 
  
إن استخدمت أصنافًا عاديةً لأجل ذلك، فسينتهي بك الأمر بإنشاء ملف CSS كبير، مع إمكانية التداخل مع الأصناف الأخرى المستخدمة في شيفرة HTML. لهذا السبب تدعم Sass المُحددات النائبة (placeholder selector) (على سبيل المثال <code>‎%foo</code>).
+
تبدو المحدَّدات النائبة مثل محدَّدات الأصناف والمعرّفات باستثناء أنّ الرمزين <code>#</code> أو <code>.</code> يُستبدلان بالرمز ‎<code>%</code>. ويمكن استخدامها في أي مكان تُستخدم فيه الأصناف أو المعرّفات، كما تمنع مجموعات القواعد (rulesets) من أن تُدرج في ملف CSS. على سبيل المثال:<syntaxhighlight lang="sass">
 
 
تبدو المحددات النائبة مثل محددات الأصناف والمعرّفات، باستثناء أنّ الرمزين <code>#</code> أو <code>.</code> يُستبدلان بالرمز ‎<code>%</code>. ويمكن استخدامها في أي مكان تُستخدم فيه الأصناف أو المعرّفات، كما تمنع مجموعات القواعد (rulesets) من أن تُدرج في ملف CSS. على سبيل المثال:<syntaxhighlight lang="sass">
 
 
// لن تعرض هذه القاعدة بمفردها
 
// لن تعرض هذه القاعدة بمفردها
 
#context a%extreme {
 
#context a%extreme {
سطر 350: سطر 333:
 
}
 
}
  
</syntaxhighlight>ومع ذلك، يمكن توسعة المحددات النائبة، تمامًا كمثل الأصناف والمُعرّفات (id). ستُنشأ المحددات الممدودة، بخلاف المحدد النائب الأساسي (base placeholder selector). على سبيل المثال:<syntaxhighlight lang="sass">
+
</syntaxhighlight>مع ذلك، يمكن توسعة المحدِّدات النائبة تمامًا مثل الأصناف والمُعرّفات (id) إذ ستُنشأ المحدِّدات الموسَّعة، بخلاف المحدد النائب الأساسي (base placeholder selector). المثال التالي:<syntaxhighlight lang="sass">
 
.notice {
 
.notice {
 
   @extend %extreme;
 
   @extend %extreme;
 
}
 
}
</syntaxhighlight>ستُصرّف إلى:<syntaxhighlight lang="css">
+
</syntaxhighlight>سيصرّف إلى:<syntaxhighlight lang="css">
 
#context a.notice {
 
#context a.notice {
 
   color: blue;
 
   color: blue;
سطر 361: سطر 344:
  
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
===الراية ‎<code>!optional</code>===
 +
إن لم تعمل القاعدة <code>‎@extend</code> عند توسعة مُحددٍ، فسيُطلق خطأٌ في العادة. على سبيل المثال، إن كتبت <code>important {@extend .notice}</code>‎، فسيحدث خطأٌ إن لم يكن هناك أيُّ محددٍ يحتوي على ‎<code>.notice</code>. وسيحدث خطأ كذلك إن كان المحدِّد الوحيد الذي يحتوي <code>‎.notice</code> هو <code>h1.notice</code>، لأنّ <code>h1</code> تتداخل مع العنصر <code>a</code>، لذلك لن يُنشأ أي محدّدٍ جديدٍ.
  
=== الراية ‎<code>!optional</code> ===
+
قد ترغب في بعض الأحيان بالسماح للقاعدة <code>‎@extend</code> بألا تنتج أيَّ محددات جديدةٍ. لفعل ذلك، يكفي أن تضيف الراية <code>optional!</code> بعد المُحدد مثل:<syntaxhighlight lang="sass">
عند توسعة مُحددٍ، إن لم تعمل القاعدة <code>‎@extend</code> فسيُطلق خطأٌ في العادة. على سبيل المثال، إن كتبت <code>important {@extend .notice}</code>‎، فسيحدث خطأٌ إن لم يكن هناك أيُّ محددٍ يحتوي ‎.notice. وسيحدث خطأ كذلك إن كان المحدد الوحيد الذي يحتوي <code>‎.notice</code> هو <code>h1.notice</code>، لأنّ <code>h1</code> تتداخل مع العنصر <code>a</code>، لذلك فلن يُنشأ أي محدّدٍ جديدٍ.
 
 
 
في بعض الأحيان، قد ترغب بالسماح للقاعدة <code>‎@extend</code> بألا تنتج أيَّ محددات جديدةٍ. لفعل ذلك، يكفي أن تضيف الراية <code>optional</code>! بعد المُحدد. على سبيل المثال:<syntaxhighlight lang="sass">
 
 
a.important {
 
a.important {
 
   @extend .notice !optional;
 
   @extend .notice !optional;
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
===استخدام <code>‎@extend</code> داخل التعليمات===
 +
هناك بعض القيود على استخدام <code>‎@extend</code> ضمن التعليمات من مثل <code>‎@media</code> إذ لغة Sass غير قادرة على جعل قواعد [[CSS]] الموجودة خارج الكتلة <code>[[CSS/@media|‎@media]]</code> تنطبق على المحدَّدات الموجودة بداخلِها دون جعل ملف الأنماط يتضخّم نتيجة نسخ الأنماط الموجودة. هذا يعني أنّه إن استخدمت <code>‎@extend</code> داخل <code>‎@media</code> (أو غيرها من تعليمات CSS)، فلن توسَّع إلا المحدَّدات التي تظهر داخل نفس كتلة التعليمة.
  
=== استخدام <code>‎@extend</code> داخل المُوجّهات ===
+
الشيفرة البرمجية التالية مثلًا تعمل جيدًا:<syntaxhighlight lang="sass">
هناك بعض القيود على استخدام <code>‎@extend</code> ضمن المُوجّهات من مثل <code>‎@media</code>. فلغة Sass غير قادرة على جعل قواعد [[CSS]] الموجودة خارج الكتلة <code>[[CSS/@media|‎@media]]</code> تنطبق على المحددات الموجودة بداخلِها دون جعل ملف الأنماط يتضخّم نتيجة نسخ الأنماط الموجودة. وهذا يعني أنّه إن استخدمت <code>‎@extend</code> داخل <code>‎@media</code> (أو غيرها من مُوجّهات CSS)، فلن تمُدّ إلا المحددات التي تظهر داخل نفس كتلة الموجّه
 
 
 
على سبيل المثال، الشيفرة البرمجية التالية تعمل جيدًا:<syntaxhighlight lang="sass">
 
 
@media print {
 
@media print {
 
   .error {
 
   .error {
سطر 400: سطر 381:
 
}
 
}
  
</syntaxhighlight>نأمل أن تُدعم <code>‎@extend</code> افتراضيًا في المتصفحات مستقبلًا، وهو ما سيسمح باستخدامها في ‎ <code>@media</code> وغيرها من المُوجّهات.
+
</syntaxhighlight>نأمل أن تُدعم <code>‎@extend</code> افتراضيًا في المتصفحات مستقبلًا، وهو ما سيسمح باستخدامها في ‎ <code>@media</code> وغيرها من التعليمات.
 
+
==التعليمة <code>‎@at-root</code>==
== الموجه <code>‎@at-root</code> ==
+
تنقل ‎التعليمة <code>‎@at-root</code> قاعدةً أو أكثر إلى مستوى جذر المستند، وتمنعها من أن تتشعّب داخل المحدَّدات الأم. ويمكن أن تستخدم إمّا مع محددٍ مضمّنٍ (inline selector) واحدٍ، مثل:<syntaxhighlight lang="sass">
ينقل ‎الموجّه <code>‎@at-root</code> قاعدةً أو أكثر إلى مستوى جذر المستند، ويمنعها من أن تتشعّب داخل المحددات الأم. ويمكن أن تستخدم إمّا مع محددٍ مضمّنٍ (inline selector) واحدٍ، مثل:<syntaxhighlight lang="sass">
 
 
.parent {
 
.parent {
 
   ...
 
   ...
سطر 412: سطر 392:
 
.parent { ... }
 
.parent { ... }
 
.child { ... }
 
.child { ... }
</syntaxhighlight>أو يمكن استخدامها مع كتلة تحتوي عدة مُحدّدات، مثل:<syntaxhighlight lang="sass">
+
</syntaxhighlight>أو يمكن استخدامها مع كتلة تحتوي على عدة مُحدّدات، مثل:<syntaxhighlight lang="sass">
 
.parent {
 
.parent {
 
   ...
 
   ...
سطر 429: سطر 409:
  
 
</syntaxhighlight>
 
</syntaxhighlight>
 
+
===القاعدة ‎<code>@at-root (without: …)‎</code> والقاعدة <code>‎@at-root (with: ...)</code>‎===
=== ‎<code>@at-root (without: …)‎</code> و <code>‎@at-root (with: ...)</code>‎ ===
+
افتراضيًا، تُستخدم <code>‎@at-root</code> لإقصاء المُحدّدات وحسب. بيْد أنّه يمكن أيضًا استخدامها‎ للخروج من التعليمات المتشعّبة مثل <code>‎@media</code>. المثال التالي مثلًا:<syntaxhighlight lang="sass">
افتراضيًا، تُستخدم <code>‎@at-root</code> لإقصاء المُحدّدات وحسب. بيْد أنّه يمكن أيضًا استخدامها‎ للخروج من المُوجّهات المتشعّبة مثل <code>‎@media</code>. على سبيل المثال:<syntaxhighlight lang="sass">
 
 
@media print {
 
@media print {
 
   .page {
 
   .page {
سطر 441: سطر 420:
 
}
 
}
  
</syntaxhighlight>ستُنتِج:<syntaxhighlight lang="css">
+
</syntaxhighlight>سينتِج:<syntaxhighlight lang="css">
 
@media print {
 
@media print {
 
   .page {
 
   .page {
سطر 451: سطر 430:
 
}
 
}
  
</syntaxhighlight>يمكنك استخدام <code>‎@at-root (without: …)‎</code> للخروج من أيّ مُوجّه. كما يمكنك الخروج من عدة مُوجّهات مفصولة بمسافات بيضاء، فمثلًا <code>‎@at-root (without: media supports)</code>‎ ستخرج المحدّد خارج الاستعلامَين <code>[[CSS/@media|‎@media]]</code> و <code>[[CSS/@supports|‎@supports]]</code>.
+
</syntaxhighlight>يمكنك استخدام <code>‎@at-root (without: …)‎</code> للخروج من أيّ تعليمة. كما يمكنك الخروج من عدَّة تعليمات مفصولة بمسافات بيضاء مثل <code>‎@at-root (without: media supports)</code>‎ التي ستخرج المحدّد خارج الاستعلامَين <code>[[CSS/@media|‎@media]]</code> و <code>[[CSS/@supports|‎@supports]]</code>.
  
يمكنك تمرير قيمتين خاصتين إلى <code>‎@at-root</code>. وهما، "rule" التي تشير إلى قواعد CSS العادية. فالقاعدة ‎<code>@at-root (without: rule)</code>‎‎ مثلها كمثلِ <code>‎@at-root</code> بدون أيِّ استعلام. أما ‎<code>@at-root (without: all)</code>‎‎ فتعني أنّ الأنماط يجب أن تُنقل خارج كل موجّهات وقواعد [[CSS]].
+
يمكنك تمرير قيمتين خاصتين إلى <code>‎@at-root</code>. تشير "rule" إلى قواعد CSS العادية، فالقاعدة ‎<code>@at-root (without: rule)</code>‎‎ مثلها كمثلِ <code>‎@at-root</code> بدون أيِّ استعلام. أمَّا ‎<code>@at-root (without: all)</code>‎‎ فتعني أنّ الأنماط يجب أن تُنقل خارج كل تعليمات وقواعد [[CSS]].
  
إذا كنت ترغب في تحديد أيّ الموجّهات أو القواعد ينبغي أن تُشمل، بدلًا من تلك التي ينبغي أن تُستبعد، فيمكنك استخدام <code>with</code> بدلًا من <code>without</code>. على سبيل المثال، ستنقل <code>‎@at-root (with: rule)</code>‎‎ المُحدّد خارج كل الموجّهات، ولكن ستحافظ على قواعد CSS.
+
إذا كنت ترغب في تحديد أيّ التعليمات أو القواعد ينبغي أن تُشمل بدلًا من تلك التي ينبغي أن تُستبعد، فيمكنك استخدام <code>with</code> بدلًا من <code>without</code>. على سبيل المثال، ستنقل <code>‎@at-root (with: rule)</code>‎‎ المُحدّد خارج كل التعليمات، ولكن ستحافظ على قواعد CSS.
 
+
==التعليمة <code>@debug</code>==
== ‎@debug ==
+
تطبع التعليمة <code>‎@debug</code> قيمة تعبير من تعابير SassScript إلى مجرى الخطأ القياسي (standard error stream). هذا مفيدٌ لتنقيح ملفات Sass التي تتضمّن أكواد SassScript معقّدةً. مُخرجات الشيفرة التالية مثلًا:<syntaxhighlight lang="sass">
يطبع المُوجّه <code>‎@debug</code> قيمة تعبير من تعابير SassScript إلى مجرى الخطأ القياسي (standard error stream). وهو مفيدٌ لتنقيح ملفات Sass التي تتضمّن أكواد SassScript معقّدةً. على سبيل المثال:<syntaxhighlight lang="sass">
 
 
@debug 10em + 12em;
 
@debug 10em + 12em;
  
</syntaxhighlight>المُخرجات ستكون:<syntaxhighlight lang="text">
+
</syntaxhighlight>ستكون:<syntaxhighlight lang="text">
 
Line 1 DEBUG: 22em
 
Line 1 DEBUG: 22em
  
 
</syntaxhighlight>
 
</syntaxhighlight>
 
+
==التعليمة <code>‎@warn</code>==
== <code>‎@warn</code> ==
+
تطبع التعليمة <code>‎‎@warn</code> قيمة تعبير من تعابير SassScript إلى مجرى الخطأ القياسي. هذا مفيدٌ للمكتبات التي تحتاج إلى تحذير المستخدمين من إهمال بعض الخصائص في المكتبة أو التعافي من الأخطاء الصغيرة في استخدام [[Sass/mixins|المخاليط]] (mixins). هناك فرقان رئيسيان بين التعليمة <code>‎‎@warn</code> والتعليمة <code>‎@debug</code> هما:
يطبع المُوجّه <code>‎‎@warn</code> قيمة تعبير من تعابير SassScript إلى مجرى الخطأ القياسي. وهو مفيدٌ للمكتبات التي تحتاج إلى تحذير المستخدمين من إهمال بعض الخصائص في المكتبة (deprecations) أو التعافي من الأخطاء الصغيرة في استخدام [[Sass/mixins|المخاليط]] (mixins). هناك فرقان رئيسيان بين <code>‎‎@warn</code> و <code>‎@debug</code>:
+
#يمكنك تعطيل التحذيرات من سطر الأوامر بواسطة الخيار <code>‎--quiet</code> أو الخيار <code>‎:quiet</code>.
# يمكنك تعطيل التحذيرات من سطر الأوامر بواسطة الخيار <code>‎--quiet</code> أو الخيار <code>‎:quiet</code>.
+
#سيُطبع أثرٌ لملف الأنماط (stylesheet trace) إلى جانب الرسالة حتّى يرى المستخدم الذي حُذِّر مكمن الخطأ.
# سيُطبع أثرٌ لملف الأنماط (stylesheet trace) إلى جانب الرسالة حتّى يرى المستخدم الذي حُذِّر مكمن الخطأ.
 
 
مثال توضيحيّ:<syntaxhighlight lang="sass">
 
مثال توضيحيّ:<syntaxhighlight lang="sass">
 
@mixin adjust-location($x, $y) {
 
@mixin adjust-location($x, $y) {
سطر 484: سطر 461:
  
 
</syntaxhighlight>
 
</syntaxhighlight>
 
+
==<code>‎@error</code>==
== <code>‎@error</code> ==
+
ترمي التعليمة <code>‎@error</code> قيمةَ تعبيرٍ من تعابير SassScript بوصفه خطأً فادحًا (fatal error)، بما في ذلك أثر الخطأ (stack trace). هذا الموجّه مفيدٌ لأجل التحقَّق من وسائط (arguments) [[Sass/mixins|المخاليط]] (mixins) [[Sass/functions|والدوال]]. انظر المثال التالي مثلًا:<syntaxhighlight lang="sass">
يرمي الموجّه <code>‎@error</code> قيمةَ تعبيرٍ من تعابير SassScript باعتباره خطأً فادحًا (fatal error)، بما في ذلك أثر الخطأ (stack trace). هذا الموجّه مفيدٌ لأجل التحقق من وسائط (arguments) [[Sass/mixins|المخاليط]] (mixins) [[Sass/functions|والدوال]]. على سبيل المثال:<syntaxhighlight lang="sass">
 
 
@mixin adjust-location($x, $y) {
 
@mixin adjust-location($x, $y) {
 
   @if unitless($x) {
 
   @if unitless($x) {
سطر 497: سطر 473:
 
}
 
}
 
</syntaxhighlight>لا توجد حاليًا أي وسيلة لمعالجة الأخطاء في Sass.
 
</syntaxhighlight>لا توجد حاليًا أي وسيلة لمعالجة الأخطاء في Sass.
 
+
==مصادر==
== مصادر ==
+
*[https://sass-lang.com/documentation/file.SASS_REFERENCE.html#directives قسم ‎@-Rules and Directives من توثيق Sass الرسمي].
* [https://sass-lang.com/documentation/file.SASS_REFERENCE.html#directives قسم ‎@-Rules and Directives من توثيق Sass الرسمي].
+
[[تصنيف:Sass|{{SUBPAGENAME}}]]
[[تصنيف:Sass]]
 

المراجعة الحالية بتاريخ 07:00، 20 مايو 2018

تدعم Sass جميع قواعد CSS التي تبدأ بالرمز @، فضلًا عن أخرى خاصَّة بلغة Sass تسمى بالتعليمات (directives). لهذه القواعد تأثيرات مختلفة في Sass سنفصلها بعد قليل. انظر أيضًا تعليمات التحكم (control directives) وتعليمات المخاليط (mixin directives).

القاعدة ‎@import

توسّع Sass استخدامات القاعدة ‎@import الخاصَّة بلغة CSS للسماح لها باستيراد ملفات SCSS وملفات Sass. ستُدمج جميع ملفات SCSS وملفات Sass المُستورَدة معًا في ملف CSS واحدٍ. إضافةً إلى ذلك، يمكن استخدام المتغيرات أو المخاليط (mixins) المُعرّفة في الملفات المستوردة في الملف الرئيسي.

تبحث Sass عن ملفات Sass أخرى في المجلّد الحالي، وفي مجلّد ملفات Sass في Rack و Rails و Merb. يمكن تحديد مجلدات بحث إضافية أيضًا باستخدام الخيار ‎:load_paths أو الخيار ‎--load-path في سطر الأوامر.

تأخذ القاعدة ‎@import اسمَ الملف المراد استيراده. تبحث افتراضيًا عن ملف Sass لاستيراده مباشرةً، ولكن هناك بعض الظروف التي تجعلها تُصرَّف إلى القاعدة ‎@import الخاصّة بلغة CSS وهي:

  • إن كان امتداد اسم الملف هو ‎.css.
  • إن بدأ اسم الملف بالبروتوكول http:‎//‎.
  • إن كان اسم الملف عنوانًا url(‎)‎.
  • إن كان للقاعدة ‎@import أيّ استعلامات وسائط (media queries).

إن لم يُستوفَ أيٌّ من الشروط المذكورة أعلاه وكان امتداد الملف هو ‎.scss أو ‎.sass، فسيُستورد حينئذ ملف Sass أو ملف SCSS المُعيّن. وإذا لم يكن هناك أي امتداد، فستحاول Sass العثور على ملف بحسب الاسم المعطى سواء كان امتداده ‎.scss أو ‎.sass لتستورده. انظر المثال التالي:

@import "foo.scss";

أو:

@import "foo";

كلاهما سيستوردان الملف foo.scss، في حين أنّ:

@import "foo.css";
@import "foo" screen;
@import "http://foo.com/bar";
@import url(foo);

ستُصرّف إلى:

@import "foo.css";
@import "foo" screen;
@import "http://foo.com/bar";
@import url(foo);

يمكن أيضًا استيراد عدَّة ملفات في آن واحد باستعمال قاعدة ‎@import. انظر على سبيل المثال الشيفرة التالية:

@import "rounded-corners", "text-shadow";

سيُستورد الملف rounded-corners والملف text-shadow. يجوز أن تحتوي التعليمة import على استيفاء ‎(#{})‎ لكن مع بعض القيود إذ لا يمكن استيراد ملف Sass ديناميكيًا باستعمال المتغيرات؛ لا يصلح استعمال الاستيفاء سوى مع استيرادات CSS. وعلى هذا النحو، فهي لا تعمل إلّا مع استيرادات url(‎)‎. انظر على سبيل المثال الشيفرة التالية:

$family: unquote("Droid+Sans");
@import url("http://fonts.googleapis.com/css?family=#{$family}");

ستُصرّف إلى:

@import url("http://fonts.googleapis.com/css?family=Droid+Sans");

المجزوءات (Partials)

إن كنت تريد استيراد ملف SCSS أو Sass دون تصريفه إلى ملف CSS، فأضف شرطة سفلية إلى بداية اسم الملف إذ هذا سيخبر Sass أن لا تترجمه إلى ملف CSS عادي. يمكنك بعد ذلك استيراد تلك الملفات من دون استخدام الشرطة السفلية.

إن كان لديك مثلًا ملف ‎_colors.scss فلن يُنشَأ ملفٌ باسم ‎_colors.css ويمكنك تنفيذ الأمر:

@import "colors";

الذي سيُستورد الملف ‎_colors.scss.

الجدير بالذكر أنّه لا يجوز استخدام ملف مجزوء (partial) وآخر غير مجزوء لهما نفس الاسم في نفس المجلّد. على سبيل المثال، لا يجوز أن يوجد الملف ‎_colors.scss في نفس المجلد مع colors.scss.

القاعدة ‎@import المتشعّبة

بالرغم من أنَّه من المفيد في أكثر الأحيان استيراد الملفات باستعمال ‎@import في المستوى الأعلى من الملف، إلا أنه من الممكن إدراجهم باستعمال قواعد CSS وقواعد ‎@media. مثل قاعدة ‎@import في المستوى الأساسي (base-level @import)، وهذا يشمل محتويات الملف المُستورّد بواسطة ‎@import. مع ذلك، ستتشعّبُ القواعد المستوردة في نفس مكان قاعدة ‎@import الأصليَّة.

على سبيل المثال، إن احتوى الملف example.scss على:

.example {
  color: red;
}

فستصرف الشيفرة:

#main {
  @import "example";
}

إلى:

#main .example {
  color: red;
}

لا يجوز استخدام التعليمات (Directives) التي لا يُسمح باستخدامها إلا في المستوى الأساسي للملف، مثل ‎@mixin أو ‎@charset، في الملفات المستوردة عبر ‎@import في سياق متشعب. كما لا يجوز أن تتشعّب ‎@import داخل المخاليط (mixins) أو تعليمات المراقبة (control directives).

التعليمات ‎@media

تسلك تعليمات ‎@media في Sass السلوك ذاته الذي تسلكه في CSS مع قدرة إضافيةٍ واحدةٍ وهي أنه يمكن أن تتشعّب داخل قواعد CSS. إن ظهر أحد تعليمات ‎@media ضمن قاعدةٍ من قواعد CSS، فستُعمّم صعودًا إلى أن تصل إلى أعلى مستوى في ملف الأنماط، وستضع جميع المٌحدّدات الموجودة في طريقها داخل القاعدة. هذا سيُسهّل إضافة أنماطِ وسائط معيّنة (media-specific styles) دون الحاجة إلى تكرار المحدِّدات أو كسر تسلسل ملف الأنماط. انظر مثلًا الشيفرة التالية:

.sidebar {
  width: 300px;
  @media screen and (orientation: landscape) {
    width: 500px;
  }
}

ستُصرّف إلى:

.sidebar {
  width: 300px; }
  @media screen and (orientation: landscape) {
    .sidebar {
      width: 500px; } }

ويمكن أيضًا أن تتشعّب استعلامات ‎@media ‏(‎@media queries) داخل بعضها البعض، وستُجمع  الاستعلامات حينها باستخدام المعامل and. انظر على سبيل المثال إلى الشيفرة:

@media screen {
  .sidebar {
    @media (orientation: landscape) {
      width: 500px;
    }
  }
}

ستُصرّف إلى:

@media screen and (orientation: landscape) {
  .sidebar {
    width: 500px; } }

أخيرًا، يمكن أن تحتوي استعلامات ‎@media على تعابير SassScript (بما في ذلك المتغيرات والدوال والعوامل) بدلًا من أسماء وقيم الميزات (features). انظر المثال التالي:

$media: screen;
$feature: -webkit-min-device-pixel-ratio;
$value: 1.5;

@media #{$media} and ($feature: $value) {
  .sidebar {
    width: 500px;
  }
}

ستُصرّف إلى:

@media screen and (-webkit-min-device-pixel-ratio: 1.5) {
  .sidebar {
    width: 500px; } }

القاعدة ‎@extend

قد تحتاج في بعض الحالات عند تصميم صفحة إلى أن يكون لصنف معين جميع أنماط صنفٍ آخرٍ إضافةٍ إلى أنماطه الخاصة. الطريقة الأكثر شيوعًا لفعل ذلك هي باستخدام الصنف العام المطلق والصنف المحدَّد المخصَّص في شيفرة HTML. لنفترض على سبيل المثال أنّ لدينا تصميمًا مُخصّصًا للأخطاء العادية وآخر للأخطاء الخطيرة؛ يمكننا لفعل ذلك أن نكتب في ملف HTML ما يلي:

<div class="error seriousError">
تنبيه، لقد تمت قرصنتك
</div>

ونكتب التنسيق بالشكل التالي:

.error {
  border: 1px #f00;
  background-color: #fdd;
}
.seriousError {
  border-width: 3px;
}

لسوء الحظ، إنّ هذا يعني أنّ علينا أن نتذكر دائمًا استخدام المحدّد ‎.error مع ‎.seriousError وهذا سيكون عبئًا على الصّيانة ويؤديَ إلى عيوب برمجية يصعب رصدها، ويمكن أن تؤثر سلبًا على مقروئية ملف HTML. ستجنّبنا التعليمة ‎@extend هذه المشاكل بإخبار Sass بأنّ أحد المُحدّديْن سيرث أنماط الآخر. انظر على سبيل المثال إلى الشيفرة التالية:

.error {
  border: 1px #f00;
  background-color: #fdd;
}
.seriousError {
  @extend .error;
  border-width: 3px;
}

ستُصرّف إلى:

.error, .seriousError {
  border: 1px #f00;
  background-color: #fdd;
}

.seriousError {
  border-width: 3px;
}

وهذا يعني أنّ جميع الأنماط المعرّفة في المحدّد ‎.error ستُطبّق أيضًا على المحدّد ‎.seriousError بالإضافة إلى تلك الخاصَّة به؛ في الواقع، كل عناصر الصنف ‎.seriousError هي أيضًا عناصر من ‎.error. القواعد الأخرى التي تستخدم ‎.error ستُطبّق أيضًا على ‎.seriousError. إن خصّصنا مثلًا أنماطًا للأخطاء الناجمة عن القراصنة مثل:

.error.intrusion {
  background-image: url("/image/hacked.png");
}

فستكون حينئذ صورة الخلفية للعنصر <div class="seriousError intrusion"‎> هي hacked.png أيضًا.

كيف تعمل القاعدة ‎@extend

تعمل القاعدة ‎@extend عبر إدراج المُحدّد المُمتد (على سبيل المثال ‎.seriousError) في كل مكانٍ في ملف الأنماط يظهر فيه المحدّد الذي مُدِّد (مثل ‎.error). وبناء على ذلك، المثال السابق:

.error {
  border: 1px #f00;
  background-color: #fdd;
}
.error.intrusion {
  background-image: url("/image/hacked.png");
}
.seriousError {
  @extend .error;
  border-width: 3px;
}

سيُصرّف إلى:

.error, .seriousError {
  border: 1px #f00;
  background-color: #fdd; }

.error.intrusion, .seriousError.intrusion {
  background-image: url("/image/hacked.png"); }

.seriousError {
  border-width: 3px; }

عند دمج المُحدّدات، فإنّ القاعدة ‎@extend ذكيَّة بما فيه الكفاية لتتجنّب التكرار غير الضروري، لذا سيترجم التعبير ‎.seriousError.seriousError إلى ‎.seriousError. إضافة إلى ذلك، لن تنتج مُحدّدات لا يمكن أن تُطابق أيَّ شيء، مثل ‎#main#footer.

توسعة المحدّدات المُركّبة

ليست مُحدِّدات الأصناف (Class selectors) الوحيدة التي يمكن توسعتها إذ يمكن توسعة أيِّ محدّد فيه عنصر واحد فقط، مثل ‎.special.cool أو a:hover أو ‎.user[href^="http://"]‎. انظر المثال التالي:

.hoverlink {
  @extend a:hover;
}

هذا يعني أنّ جميع الأنماط المُعرّفة لأجل a:hover ستُطبّق، كما هو الحال مع الأصناف، أيضًا على المحدّد ‎.hoverlink. ستصرف مثلًا الشيفرة التالية:

.hoverlink {
  @extend a:hover;
}
a:hover {
  text-decoration: underline;
}

إلى:

a:hover, .hoverlink {
  text-decoration: underline; }

كما هو الحال مع المُحدّد ‎.error.intrusion أعلاه، فستعمل أي قاعدةٍ تستخدم a:hover أيضًا على ‎.hoverlink حتى لو كان لها مُحددّات أخرى. الشيفرة التالية:

.hoverlink {
  @extend a:hover;
}
.comment a.user:hover {
  font-weight: bold;
}

ستُصرّف إلى:

.comment a.user:hover, .comment .user.hoverlink {
  font-weight: bold; }

التوسعة المتعددة (Multiple Extends)

يمكن لمُحدّدٍ واحدٍ أن يوسّع عدة محدّدات. هذا يعني أنه سيرث أنماطَ جميع المحدّدات التي مُدِّدت. ستصرف الشيفرة التالية على سبيل المثال:

.error {
  border: 1px #f00;
  background-color: #fdd;
}
.attention {
  font-size: 3em;
  background-color: #ff0;
}
.seriousError {
  @extend .error;
  @extend .attention;
  border-width: 3px;
}

إلى:

.error, .seriousError {
  border: 1px #f00;
  background-color: #fdd; }

.attention, .seriousError {
  font-size: 3em;
  background-color: #ff0; }

.seriousError {
  border-width: 3px; }

في الواقع، كل عنصرٍ من الصنف ‎.seriousError سيكون أيضًا من الصنف ‎.error والصنف ‎.attention وستكون حينئذ الأولوية للأنماط المُعرفة آخرًا في الملف، أي أنّ لون الخلفية للمحدّد ‎.seriousError سيكون هو اللون ‎#ff0 وليس ‎#fdd، لأنّ ‎.attention معرفة بعد ‎.error.

يمكن أيضًا كتابة التوسعة المتعدِّدة باستخدام قائمةٍ من المُحدّدات مفصولةٍ بفواصل. سيكون مثلًا استعمال‎@extend .error, .attention مماثل تمامًا لاستعمال @extend .error; @extend .attention.

التوسعات المتسلسلة (Chaining Extends)

من الممكن توسعة مُحدّد مُمدّد من قبل مثل الشيفرة التالية:

.error {
  border: 1px #f00;
  background-color: #fdd;
}
.seriousError {
  @extend .error;
  border-width: 3px;
}
.criticalError {
  @extend .seriousError;
  position: fixed;
  top: 10%;
  bottom: 10%;
  left: 10%;
  right: 10%;
}

أيّ شيءٍ آنذاك له الصنف ‎.seriousError سيكون لديه أيضًا الصنف ‎.error؛ وكل شيء له الصنف ‎.criticalError سيكون لديه أيضًا الصنف ‎.seriousError والصنف ‎.error، المثال أعلاه سيُصرّف إلى:

.error, .seriousError, .criticalError {
  border: 1px #f00;
  background-color: #fdd; }

.seriousError, .criticalError {
  border-width: 3px; }

.criticalError {
  position: fixed;
  top: 10%;
  bottom: 10%;
  left: 10%;
  right: 10%; }

المحدّدات المتتابعة (Selector Sequences)

لا يمكن حاليًا توسعة المحدّدات المتتابعة، مثل ‎.foo .bar أو ‎.foo + .bar بيْد أنّه من الممكن أن تستخدم المحدَّداتُ المتشعبةُ القاعدةَ ‎@extend. ستصرف مثلًا الشيفرة:

#fake-links .link {
  @extend a;
}

a {
  color: blue;
  &:hover {
    text-decoration: underline;
  }
}

إلى:

a, #fake-links .link {
  color: blue; }
  a:hover, #fake-links .link:hover {
    text-decoration: underline; }

دمج المحدّدات المتتابعة (Merging Selector Sequences)

أحيانًا تُوسّع المحدّدات المتتابعة محدّدًا يظهرُ في محدِّدٍ متتابع آخر. يجب في هذه الحالة دمج المُحدّدين المتتابعين، مثل:

#admin .tabbar a {
  font-weight: bold;
}
#demo .overview .fakelink {
  @extend a;
}

صحيحٌ أنّه من الممكن تقنيًا توليد كلّ المحدَّدات التي يمكن أن تُطابق كلا المحدّدين المتتابعين، إلا أنّ ذلك سيجعل ملف الأنماط كبيرًا جدًّا. المثال أعلاه سيتطلب عشر محدّدات ولكنّ Sass ستكتفي بتوليد المحدّدات التي يُحتمل أن تكون مفيدةً. عندما لا يكون بين المحدّدين المتتابعين المراد دمجهما أيُّ محدّدات مشتركةٍ، فسيُنشأ مُحدّدان جديدان: أحدهما يتضمّن المحدّد المتتابع الأول قبل الثاني، والآخر يتضمّن المحدّد المتتابع الثاني قبل الأوّل. المثال التالي:

#admin .tabbar a {
  font-weight: bold;
}
#demo .overview .fakelink {
  @extend a;
}

سيصرّف إلى:

#admin .tabbar a,
#admin .tabbar #demo .overview .fakelink,
#demo .overview #admin .tabbar .fakelink {
  font-weight: bold; }

أمّا إن اشترك المحدّدان المتتابعان في بعض المحددات، فستُدمج تلك المحددات معًا مع تعديل الاختلافات (إن وُجدت). في المثال التالي، كلا المحدّدين المتتابعين يحتويان على المُعرّف ‎#admin، وبالتالي فإنّ المحددات الناتجة ستدمج هذين المعرّفين:

#admin .tabbar a {
  font-weight: bold;
}
#admin .overview .fakelink {
  @extend a;
}

ستُصرّف الشيفرة السابقة إلى:

#admin .tabbar a,
#admin .tabbar .overview .fakelink,
#admin .overview .tabbar .fakelink {
  font-weight: bold; }

المحدّدات المُعدّة للتوسعة (‎@extend-Only Selectors)

قد تحتاج في بعض الأحيان إلى كتابة أنماط لأجل أصناف معدّة للتوسعة وحسب، ولا تريد استخدامها مباشرةً في شيفرة HTML. هذا مفيدٌ بشكل خاص عندما تريد إنشاء مكتبةٍ لأجل Sass، إذ ستُوفّر حينئذ أنماطًا يمكن أن يُمدّدها المُستخدمون إن شاؤوا.

إن استخدمت أصنافًا عاديةً لأجل ذلك، فسينتهي بك الأمر بإنشاء ملف CSS كبير مع إمكانية التداخل مع الأصناف الأخرى المستخدمة في شيفرة HTML. تدعم Sass لهذا السبب المُحددات النائبة (placeholder selector) (مثل ‎%foo).

تبدو المحدَّدات النائبة مثل محدَّدات الأصناف والمعرّفات باستثناء أنّ الرمزين # أو . يُستبدلان بالرمز ‎%. ويمكن استخدامها في أي مكان تُستخدم فيه الأصناف أو المعرّفات، كما تمنع مجموعات القواعد (rulesets) من أن تُدرج في ملف CSS. على سبيل المثال:

// لن تعرض هذه القاعدة بمفردها
#context a%extreme {
  color: blue;
  font-weight: bold;
  font-size: 2em;
}

مع ذلك، يمكن توسعة المحدِّدات النائبة تمامًا مثل الأصناف والمُعرّفات (id) إذ ستُنشأ المحدِّدات الموسَّعة، بخلاف المحدد النائب الأساسي (base placeholder selector). المثال التالي:

.notice {
  @extend %extreme;
}

سيصرّف إلى:

#context a.notice {
  color: blue;
  font-weight: bold;
  font-size: 2em; }

الراية ‎!optional

إن لم تعمل القاعدة ‎@extend عند توسعة مُحددٍ، فسيُطلق خطأٌ في العادة. على سبيل المثال، إن كتبت important {@extend .notice}‎، فسيحدث خطأٌ إن لم يكن هناك أيُّ محددٍ يحتوي على ‎.notice. وسيحدث خطأ كذلك إن كان المحدِّد الوحيد الذي يحتوي ‎.notice هو h1.notice، لأنّ h1 تتداخل مع العنصر a، لذلك لن يُنشأ أي محدّدٍ جديدٍ.

قد ترغب في بعض الأحيان بالسماح للقاعدة ‎@extend بألا تنتج أيَّ محددات جديدةٍ. لفعل ذلك، يكفي أن تضيف الراية optional! بعد المُحدد مثل:

a.important {
  @extend .notice !optional;
}

استخدام ‎@extend داخل التعليمات

هناك بعض القيود على استخدام ‎@extend ضمن التعليمات من مثل ‎@media إذ لغة Sass غير قادرة على جعل قواعد CSS الموجودة خارج الكتلة ‎@media تنطبق على المحدَّدات الموجودة بداخلِها دون جعل ملف الأنماط يتضخّم نتيجة نسخ الأنماط الموجودة. هذا يعني أنّه إن استخدمت ‎@extend داخل ‎@media (أو غيرها من تعليمات CSS)، فلن توسَّع إلا المحدَّدات التي تظهر داخل نفس كتلة التعليمة.

الشيفرة البرمجية التالية مثلًا تعمل جيدًا:

@media print {
  .error {
    border: 1px #f00;
    background-color: #fdd;
  }
  .seriousError {
    @extend .error;
    border-width: 3px;
  }
}

ولكنّ هذا خطأ:

.error {
  border: 1px #f00;
  background-color: #fdd;
}

@media print {
  .seriousError {
    // INVALID EXTEND: .error is used outside of the "@media print" directive
    @extend .error;
    border-width: 3px;
  }
}

نأمل أن تُدعم ‎@extend افتراضيًا في المتصفحات مستقبلًا، وهو ما سيسمح باستخدامها في ‎ @media وغيرها من التعليمات.

التعليمة ‎@at-root

تنقل ‎التعليمة ‎@at-root قاعدةً أو أكثر إلى مستوى جذر المستند، وتمنعها من أن تتشعّب داخل المحدَّدات الأم. ويمكن أن تستخدم إمّا مع محددٍ مضمّنٍ (inline selector) واحدٍ، مثل:

.parent {
  ...
  @at-root .child { ... }
}

والذي سيُنتج:

.parent { ... }
.child { ... }

أو يمكن استخدامها مع كتلة تحتوي على عدة مُحدّدات، مثل:

.parent {
  ...
  @at-root {
    .child1 { ... }
    .child2 { ... }
  }
  .step-child { ... }
}

والتي ستُنتج ما يلي:

.parent { ... }
.child1 { ... }
.child2 { ... }
.parent .step-child { ... }

القاعدة ‎@at-root (without: …)‎ والقاعدة ‎@at-root (with: ...)

افتراضيًا، تُستخدم ‎@at-root لإقصاء المُحدّدات وحسب. بيْد أنّه يمكن أيضًا استخدامها‎ للخروج من التعليمات المتشعّبة مثل ‎@media. المثال التالي مثلًا:

@media print {
  .page {
    width: 8in;
    @at-root (without: media) {
      color: red;
    }
  }
}

سينتِج:

@media print {
  .page {
    width: 8in;
  }
}
.page {
  color: red;
}

يمكنك استخدام ‎@at-root (without: …)‎ للخروج من أيّ تعليمة. كما يمكنك الخروج من عدَّة تعليمات مفصولة بمسافات بيضاء مثل ‎@at-root (without: media supports)‎ التي ستخرج المحدّد خارج الاستعلامَين ‎@media و ‎@supports.

يمكنك تمرير قيمتين خاصتين إلى ‎@at-root. تشير "rule" إلى قواعد CSS العادية، فالقاعدة ‎@at-root (without: rule)‎‎ مثلها كمثلِ ‎@at-root بدون أيِّ استعلام. أمَّا ‎@at-root (without: all)‎‎ فتعني أنّ الأنماط يجب أن تُنقل خارج كل تعليمات وقواعد CSS.

إذا كنت ترغب في تحديد أيّ التعليمات أو القواعد ينبغي أن تُشمل بدلًا من تلك التي ينبغي أن تُستبعد، فيمكنك استخدام with بدلًا من without. على سبيل المثال، ستنقل ‎@at-root (with: rule)‎‎ المُحدّد خارج كل التعليمات، ولكن ستحافظ على قواعد CSS.

التعليمة ‎@debug

تطبع التعليمة ‎@debug قيمة تعبير من تعابير SassScript إلى مجرى الخطأ القياسي (standard error stream). هذا مفيدٌ لتنقيح ملفات Sass التي تتضمّن أكواد SassScript معقّدةً. مُخرجات الشيفرة التالية مثلًا:

@debug 10em + 12em;

ستكون:

Line 1 DEBUG: 22em

التعليمة ‎@warn

تطبع التعليمة ‎‎@warn قيمة تعبير من تعابير SassScript إلى مجرى الخطأ القياسي. هذا مفيدٌ للمكتبات التي تحتاج إلى تحذير المستخدمين من إهمال بعض الخصائص في المكتبة أو التعافي من الأخطاء الصغيرة في استخدام المخاليط (mixins). هناك فرقان رئيسيان بين التعليمة ‎‎@warn والتعليمة ‎@debug هما:

  1. يمكنك تعطيل التحذيرات من سطر الأوامر بواسطة الخيار ‎--quiet أو الخيار ‎:quiet.
  2. سيُطبع أثرٌ لملف الأنماط (stylesheet trace) إلى جانب الرسالة حتّى يرى المستخدم الذي حُذِّر مكمن الخطأ.

مثال توضيحيّ:

@mixin adjust-location($x, $y) {
  @if unitless($x) {
    @warn "Assuming #{$x} to be in pixels";
    $x: 1px * $x;
  }
  @if unitless($y) {
    @warn "Assuming #{$y} to be in pixels";
    $y: 1px * $y;
  }
  position: relative; left: $x; top: $y;
}

‎@error

ترمي التعليمة ‎@error قيمةَ تعبيرٍ من تعابير SassScript بوصفه خطأً فادحًا (fatal error)، بما في ذلك أثر الخطأ (stack trace). هذا الموجّه مفيدٌ لأجل التحقَّق من وسائط (arguments) المخاليط (mixins) والدوال. انظر المثال التالي مثلًا:

@mixin adjust-location($x, $y) {
  @if unitless($x) {
    @error "$x may not be unitless, was #{$x}.";
  }
  @if unitless($y) {
    @error "$y may not be unitless, was #{$y}.";
  }
  position: relative; left: $x; top: $y;
}

لا توجد حاليًا أي وسيلة لمعالجة الأخطاء في Sass.

مصادر