الفرق بين المراجعتين لصفحة: «Sass/mixins»

من موسوعة حسوب
ط إضافة عنوان الصفحة والتصنيفات
ط استبدال النص - '\[\[تصنيف:(.*)\]\]' ب'{{SUBPAGENAME}}'
 
(5 مراجعات متوسطة بواسطة مستخدمين اثنين آخرين غير معروضة)
سطر 1: سطر 1:
<noinclude>{{DISPLAYTITLE:المخاليط (Mixins) في Sass}}</noinclude>
تتيحُ المخاليط تعريف الأنماط التي يمكن إعادة استخدامها في ملف الأنماط دون اللجوء إلى الأصناف غير الدلاليَّة مثلِ <code>‎.float-left</code>. يمكن أن تحوي المخاليط أيضًا جميع [[:تصنيف:CSS At-rule|قواعد CSS]] وأيَّ شيء آخر يُسمح باستعماله في ملفات Sass. يمكن أيضًا أن يُمرَّر لها وسائط (arguments) وبذلك يمكن إنتاج مجموعة واسعة من الأنماط بعدد قليل من المخاليط.
تتيحُ المخاليط تعريف الأنماط التي يُمكن إعادة استخدامها في ملف الأنماط دون الحاجة إلى اللجوء إلى الأصناف غير الدلالية مثلِ <code>‎.float-left</code>. يمكن أن تحتوي المخاليط أيضًا جميع قواعد CSS، وأيَّ شيء آخر يُسمح باستعماله في ملفات Sass. بل يمكن أن تأخذ وسائطَ (arguments) لتمكينك من إنتاج مجموعة واسعةٍ من الأنماط بعددٍ قليلٍ من المخاليط.
==تعريف المخلوط (Defining a Mixin):‏ ‎<code>@mixin</code>==
 
تعرَّف المخاليط (Mixins) بوساطة التعليمة <code>‎@mixin</code> متبوعةً باسم المخلوط، ويمكن اختياريًا إضافة وسائط له، ثمّ كتلة من الأنماط تتضمّن محتويات المخلوط. يُعرّف مثلًا المخلوط <code>large-text</code> على النحو التالي:<syntaxhighlight lang="sass">
== تعريف المخلوط (Defining a Mixin):‏ ‎<code>@mixin</code> ==
تُعرّف المخاليط (Mixins) بواسطة الموجّه <code>‎@mixin</code>، متبوعًا باسم المخلوط، ويمكن اختياريًا إضافة وسائط (arguments)، ثمّ كتلةٌ من الأنماط تتضمّن محتويات المخلوط. على سبيل المثال، يُعرّف المخلوط <code>large-text</code> على النحو التالي:<syntaxhighlight lang="sass">
@mixin large-text {
@mixin large-text {
   font: {
   font: {
سطر 13: سطر 11:
}
}


</syntaxhighlight>قد تحتوي المخاليط أيضًا على المُحدّدات، وعلى الخاصيات أحيانًا. بل يمكن أن تحتوي المُحددات على [[Sass/CSS extensions|مؤشرت أبوية]] (parent references). على سبيل المثال:<syntaxhighlight lang="sass">
</syntaxhighlight>قد تحتوي المخاليط أيضًا على مُحدّدات، وعلى خاصِّيَّات أحيانًا. بل يمكن أن تحتوي المُحدّدات على [[Sass/CSS extensions|مؤشرات أبوية]] (parent references). انظر الشيفرة التالية مثلًا:<syntaxhighlight lang="sass">
@mixin clearfix {
@mixin clearfix {
   display: inline-block;
   display: inline-block;
سطر 25: سطر 23:
   * html & { height: 1px }
   * html & { height: 1px }
}
}
</syntaxhighlight>لأسباب تاريخية، أسماء المخاليط (وجميع مُعرّفات Sass الأخرى) يمكنها أن تحتوي الشرطاتِ العادية (hyphens) والشرطات السفلية (underscores) دون فرقٍ بينها. على سبيل المثال، إن عرّفت مخلوطًا تحت مُسمّى <code>add_column</code>، فيمكنك استعماله أيضًا بالإسم <code>add_column</code>، والعكس بالعكس.
</syntaxhighlight>يمكن أن تحتوي أسماء المخاليط (وجميع مُعرّفات Sass الأخرى)، لأسباب تاريخيَّة، على الشرطات العاديَّة (hyphens) والشرطات السفليَّة (underscores) دون فرقٍ بينها. على سبيل المثال، إن عرّفت مخلوطًا باسم <code>add-column</code>، فيمكنك الإشارة إليه أيضًا بالاسم <code>add_column</code>، والعكس بالعكس.
 
==تضمين المخاليط: <code>‎@include</code>==
== تضمين المخاليط: <code>‎@include</code> ==
تُضمّن المخاليط في الملف عبر التعليمة <code>‎@include</code>. تأخذ هذه التعليمة اسم مخلوطٍ ما ووسيط اختياري إن وجد، وتضمِّن الأنماط التي يُعرّفها المخلوط في القاعدة الحاليَّة. انظر مثلًا الشيفرة التالية:<syntaxhighlight lang="sass">
تُضمّن المخاليط في الملف عبر المُوجّه <code>‎@include</code>. هذا الموجّه يأخذ اسم مخلوطٍ ما ووسيط اختياري، ويُضمِّن الأنماط التي يُعرّفها المخلوط في القاعدة الحالية. على سبيل المثال:<syntaxhighlight lang="sass">
.page-title {
.page-title {
   @include large-text;
   @include large-text;
سطر 44: سطر 41:
   margin-top: 10px; }
   margin-top: 10px; }


</syntaxhighlight>يُمكن أيضًا أن تُدرج المخاليط خارج كل القواعد (أي على مستوى جذر المستند) طالما أنّها لا تُعرّف مباشرةً أي خاصيات أو تستخدمُ أيَّ مؤشّرات أبوية (parent references). على سبيل المثال:<syntaxhighlight lang="sass">
</syntaxhighlight>يُمكن أيضًا أن تُدرج المخاليط خارج كل القواعد (أي على مستوى جذر المستند) طالما أنّها لا تُعرِّف مباشرةً أيَّ خاصِّيَّات أو تستخدم أيَّ [[Sass/CSS extensions|مؤشّرات أبوية]] مثل:<syntaxhighlight lang="sass">
@mixin silly-links {
@mixin silly-links {
   a {
   a {
سطر 54: سطر 51:
@include silly-links;
@include silly-links;


</syntaxhighlight>ستُصرّف إلى:<syntaxhighlight lang="css">
</syntaxhighlight>ستُصرّف الشيفرة السابقة إلى:<syntaxhighlight lang="css">
a {
a {
   color: blue;
   color: blue;
   background-color: red; }
   background-color: red; }


</syntaxhighlight>يمكن أن تتضمّن تعريفات المخاليط مخاليط أخرى. على سبيل المثال:<syntaxhighlight lang="sass">
</syntaxhighlight>يمكن تضمين مخاليط أخرى عند تعريف المخلوط مثل:<syntaxhighlight lang="sass">
@mixin compound {
@mixin compound {
   @include highlighted-background;
   @include highlighted-background;
سطر 68: سطر 65:
@mixin header-text { font-size: 20px; }
@mixin header-text { font-size: 20px; }


</syntaxhighlight>قد تتضمّن المخاليطُ نفسَها. وهذا مُخالفٌ لسلوك الإصدارات السابقة عن Sass 3.3، حيثُ كانت المخاليط التعاودية (mixin recursion) ممنوعةً.
</syntaxhighlight>قد تستطيع المخاليط تضمين نفسَها إلا أنَّ هذا مُخالفٌ لسلوك الإصدارات السابقة للإصدار Sass 3.3، إذ كانت المخاليط التعاوديَّة (mixin recursion) ممنوعةً.


المخاليط التي لا تعرّف إلّا المحددات المُنحدرة (descendent selectors) يمكن أن تُخلط بأمانٍ في المستوى الأعلى من المستند.
المخاليط التي لا تعرّف إلّا المحدَّدات المنحدرة (descendant selectors) يمكن أن تُخلط بأمانٍ في المستوى الأعلى من المستند.
==الوسائط (Arguments)==
يُمكن أن تأخذ المخاليط قيم [[Sass/SassScript|SassScript]] كوسائط والتي تمرَّر إليها عند تضمين المخلوط، إذ تُتاح داخل المخلوط بوصفها متغيراتٍ.


== الوسائط (Arguments) ==
عند تعريف مخلوطٍ ما، تُكتب الوسائط كأسماء متغيرات مفصولةٍ بفواصل وموضوعةٍ كلّها بين قوسين بعد الاسم ثمَّ تُمرَّر قيم تلك الوسائط عند تضمين المخلوط بنفس الطريقة. انظر المثال التالي:<syntaxhighlight lang="sass">
يُمكن أن تأخذ المخاليط قيم SassScript كوسائط، والتي تُعطَى عند تضمين المخلوط، وتُتاح داخل المخلوط كمتغيراتٍ.
 
عند تعريف مخلوطٍ ما، تُكتب الوسائط كأسماء متغيرات مفصولةٍ بفواصل، وموضوعةٍ كلّها بين قوسين بعد الاسم. ثم عند تضمين المخلوط يمكن تمرير القيم بنفس الطريقة. على سبيل المثال:<syntaxhighlight lang="sass">
@mixin beautiful-border($color, $width) {
@mixin beautiful-border($color, $width) {
   border: {
   border: {
سطر 86: سطر 82:
p { @include beautiful-border(blue, 1in); }
p { @include beautiful-border(blue, 1in); }


</syntaxhighlight>ستُصرّف إلى:<syntaxhighlight lang="css">
</syntaxhighlight>سيصرّف إلى:<syntaxhighlight lang="css">
p {
p {
   border-color: blue;
   border-color: blue;
سطر 92: سطر 88:
   border-style: dashed; }
   border-style: dashed; }


</syntaxhighlight>يمكن للمخاليط أيضًا تعيين قيم افتراضيةٍ لوسائطها باستخدام الصياغة العادية لتعيين المتغيرات. ثمّ عند تضمين المخلوط، إذا لم يُمرّر الوسيط، فستُستخدم القيمة الافتراضية. على سبيل المثال:<syntaxhighlight lang="sass">
</syntaxhighlight>يمكن للمخاليط أيضًا تعيين قيم افتراضيَّة للوسائط وذلك باستخدام الصياغة العاديَّة لتعيين المتغيرات. إذا لم يُمرّر الوسيط حينئذٍ عند تضمين المخلوط، فستُستخدم تلك القيمة الافتراضيَّة. انظر مثلًا الشيفرة التالية:<syntaxhighlight lang="sass">
@mixin beautiful-border($color, $width: 1in) {
@mixin beautiful-border($color, $width: 1in) {
   border: {
   border: {
سطر 115: سطر 111:


</syntaxhighlight>
</syntaxhighlight>
 
===الوسائط المُسمّاة (Keyword Arguments)===
=== الوسائط المُسمّاة (Keyword Arguments) ===
يمكن أيضًا استخدام الوسائط المُسمّاة صراحةً عند تضمين المخاليط. يمكن أن يُكتب المثال السابق مثلًا على النحو التالي:<syntaxhighlight lang="sass">
يمكن أيضًا أن تُدرج المخاليط باستخدام الوسائط المُسمّاة صراحةً. مثلًا، المثال أعلاه يمكن أن يُكتب على النحو التالي:<syntaxhighlight lang="sass">
p { @include beautiful-border($color: blue); }
p { @include beautiful-border($color: blue); }
h1 { @include beautiful-border($color: blue, $width: 2in); }
h1 { @include beautiful-border($color: blue, $width: 2in); }


</syntaxhighlight>في حين أنّ هذا قد يكون أقل إيجازًا، إلّا أنه سيجعل ملف الأنماط أسهل للقراءة. كما سيسمح للدوال بتقديم واجهاتٍ أكثر مرونةً، وتوفير العديد من الوسائط دون أن تكون هناك صعوبةٌ في استدعائها.
</syntaxhighlight>في حين أنّ هذا قد يكون أقل إيجازًا إلّا أنه سيجعل ملف الأنماط أسهل للقراءة، وسيسمح للدوال بتقديم واجهاتٍ أكثر مرونةً لتوفير العديد من الوسائط دون أن تكون هناك صعوبةٌ في استدعائها.
 
يمكن تمرير الوسائط المسماة وفق أيِّ ترتيبٍ، كما يجوز حذف الوسائط ذات القيم الافتراضية. ولمّا كانت الوسائطُ المسمّاة هي أسماءُ متغيراتٍ، فلا فرق بين استخدام الشرطات العادية والشرطات السفليّة.
 
=== الفاصلة الزائدة (Trailing Commas) ===
إذا كان الوسيط الأخير لمخلوطٍ أو دالةٍ وسيطًا موضعيًا (positional) أو مُسمًّى، فيُمكن أن يعقُب ذلك الوسيطَ فاصلةٌ زائدةٌ. البعض يُفضّل هذا الأسلوب في البرمجة لأنه يمكن أن يؤدي إلى تقليل الاختلافات والأخطاء في الصياغة عند تصريف الملف.


=== الوسائط المتغيرة (Variable Arguments) ===
يمكن تمرير الوسائط المسماة وفق أيِّ ترتيبٍ، كما يجوز حذف الوسائط ذات القيم الافتراضيَّة. لمّا كانت الوسائطُ المسمّاة هي أسماءُ متغيراتٍ، فلا فرق بين استخدام الشرطات العاديَّة والشرطات السفليّة.
أحيانًا قد يكون من الأفضل ألّا يُحدَّد عدد وسائط المخلوط أو الدالةٍ. على سبيل المثال، قد يأخذ مخلوطٌ مُخصّصٌ لإنشاء ظلال المربعات أيَّ عددٍ من الظلال كوسائط. في هذه الحالات، تدعم Sass "الوسائط المتغيرة"، وهي الوسائط الموجودة في تصريح مخلوطٍ أو دالةٍ والتي تأخذ كل الوسائط المتبقية وتجمعها في قائمة. هذه الوسائط تبدو مثل الوسائط العادية، ولكنّها متبوعةٌ بثلاث نقاط (…). على سبيل المثال:<syntaxhighlight lang="sass">
===الفاصلة الزائدة (Trailing Commas)===
إذا كان الوسيط الأخير لمخلوطٍ أو دالةٍ وسيطًا موضعيًا (positional) أو مُسمًّى، فيُمكن أن يعقُب ذلك الوسيط فاصلةٌ زائدةٌ. يُفضّل البعض هذا الأسلوب في البرمجة لأنَّه يمكن أن يؤدي إلى تقليل الاختلافات والأخطاء في الصياغة عند تصريف الملف.
===الوسائط المتغيرة (Variable Arguments)===
يفضل أحيانًا ألّا يُحدَّد عدد وسائط المخلوط أو الدالة. على سبيل المثال، قد يأخذ مخلوطٌ مُخصّصٌ لإنشاء ظلال المربعات أيَّ عددٍ من الظلال كوسائط. تدعم Sass في تلك الحالات "الوسائط المتغيرة"، وهي الوسائط الموجودة في تصريح مخلوطٍ أو دالةٍ التي تأخذ كلَّ الوسائط الإضافية المتبقيَّة وتجمعها في قائمة. تبدو هذه الوسائط مثل الوسائط العاديَّة ولكنّها متبوعةٌ بثلاث نقاط (…). يوضح المثال التالي ذلك:<syntaxhighlight lang="sass">
@mixin box-shadow($shadows...) {
@mixin box-shadow($shadows...) {
   -moz-box-shadow: $shadows;
   -moz-box-shadow: $shadows;
سطر 140: سطر 133:
}
}


</syntaxhighlight>ستُصرّف إلى:<syntaxhighlight lang="css">
</syntaxhighlight>سيصرّف إلى:<syntaxhighlight lang="css">
.shadows {
.shadows {
   -moz-box-shadow: 0px 4px 5px #666, 2px 6px 10px #999;
   -moz-box-shadow: 0px 4px 5px #666, 2px 6px 10px #999;
سطر 147: سطر 140:
}
}


</syntaxhighlight>تحتوي الوسائط المتغيرة أيضًا كلَّ الوسائطِ المسمّاة المُمرّرةِ إلى المخلوط أو الدالة. ويمكن الوصول إليها باستخدام الدالة <code>[[Sass/keywords|keywords($args)]]</code>‎، التي تُعيدها كقواميس تربط سلاسل نصّية (أسماء الوسائط بدون <code>$</code>) بقيمٍ (الوسائط).
</syntaxhighlight>تحتوي الوسائط المتغيرة أيضًا على كلِّ الوسائط المسمّاة المُمرّرةِ إلى المخلوط أو الدالة، ويمكن الوصول إليها باستعمال الدالة <code>[[Sass/keywords|keywords($args)]]</code>التي تُعيدها [[Sass/SassScript#.D8.A7.D9.84.D8.AE.D8.B1.D8.A7.D8.A6.D8.B7 .28Maps.29|كخرائط]] (maps) إذ تربط أسماء الوسائط (بدون <code>$</code>) بقيمها.


ويمكن أيضًا أن تُستخدم الوسائط المتغيرة عند استدعاء المخلوط. فباستخدام نفس الصياغة، يمكنك توسيع قائمةٍ مكوّنةٍ من قيم بحيث تُمرّر كل قيمة كوسيط منفصل، أو توسيع قاموسٍ مكوّن من قيم بحيث يُعامَل كل زوجٍ وكأنّه وسيطٌ مُسمّى. على سبيل المثال:<syntaxhighlight lang="sass">
يمكن أيضًا أن تُستخدم الوسائط المتغيرة عند استدعاء المخلوط. يمكنك استخدام نفس الصياغة لتوسيع قائمةٍ مكوّنةٍ من قيم بحيث تُمرّر كل قيمة كوسيط منفصل، أو لتوسيع [[Sass/SassScript#.D8.A7.D9.84.D8.AE.D8.B1.D8.A7.D8.A6.D8.B7 .28Maps.29|خريطة]] (map) مكوّنة من قيم بحيث يُعامَل كل زوجٍ وكأنّه وسيط مُسمّى. انظر مثلًا الشيفرة التالية:<syntaxhighlight lang="sass">
@mixin colors($text, $background, $border) {
@mixin colors($text, $background, $border) {
   color: $text;
   color: $text;
سطر 179: سطر 172:
}
}


</syntaxhighlight>يمكنك أن تُمرّر قائمةً من الوسائط ثم قاموسًا طالما سبّقت القائمة على القاموس، كما هو الحال في ‎<code>@include colors($values..., $map...)‎</code>.
</syntaxhighlight>يمكنك أن تُمرّر [[Sass/SassScript#.D8.A7.D9.84.D9.82.D9.88.D8.A7.D8.A6.D9.85|قائمةً]] [[Sass/SassScript#.D8.A7.D9.84.D8.AE.D8.B1.D8.A7.D8.A6.D8.B7 .28Maps.29|وخريطة]] من الوسائط في آن واحد شرط أن تُمرَّر القائمة قبل الخريطة، مثل ‎<code>@include colors($values..., $map...)‎</code>.


يمكنك استخدام الوسائط المتغيرة لتغليف (wrap) المخلوط وإضافة أنماط إضافيةٍ دون تغيير شكل وسائط المخلوط. وإن فعلت ذلك، فستُمرّر الوسائط المُسمّاة مباشرةً خلال المخلوط المُغلَّف (wrapped mixin). على سبيل المثال:<syntaxhighlight lang="sass">
يمكنك استخدام الوسائط المتغيرة لتغليف (wrap) المخلوط وإضافة أنماط إضافيَّةٍ دون تغيير شكل وسائط المخلوط. إن فعلت ذلك، فستُمرّر الوسائط المُسمّاة مباشرةً إلى المخلوط المُغلَّف (wrapped mixin) مثل:<syntaxhighlight lang="sass">
@mixin wrapped-stylish-mixin($args...) {
@mixin wrapped-stylish-mixin($args...) {
   font-weight: bold;
   font-weight: bold;
سطر 196: سطر 189:


</syntaxhighlight>
</syntaxhighlight>
 
==تمرير كتل الأنماط إلى المخلوط==
== تمرير كتل الأنماط إلى المخلوط ==
من الممكن تمرير كتلةٍ من الأنماط إلى المخلوط لوضعها داخل الأنماط المُدرجة في المخلوط. ستظهر الأنماط في مكان التعليمة <code>‎@content</code> الموجودة داخل المخلوط، وهذا سيجعل من الممكن تحديد أشكال مُجرّدةٍ متعلقة بإنشاء المُحدّدات والتعليمات. انظر مثلًا إلى المثال التالي:<syntaxhighlight lang="sass">
من الممكن تمرير كتلةٍ من الأنماط إلى المخلوط لوضعها داخل الأنماط المُدرجة في المخلوط. ستظهر الأنماط في محلّ المُوجّهات <code>‎@content</code> الموجودة داخل المخلوط. وهذا سيجعل من الممكن تحديد أشكال مُجرّدةٍ متعلقة بإنشاء المُحدّدات والمُوجّهات.
 
على سبيل المثال:<syntaxhighlight lang="sass">
@mixin apply-to-ie6-only {
@mixin apply-to-ie6-only {
   * html {
   * html {
سطر 212: سطر 202:
}
}


</syntaxhighlight>ستُصرّف إلى:<syntaxhighlight lang="css">
</syntaxhighlight>سيصرّف إلى:<syntaxhighlight lang="css">
* html #logo {
* html #logo {
   background-image: url(/logo.gif);
   background-image: url(/logo.gif);
}
}


</syntaxhighlight>ويمكن إنشاء نفس المخاليط باستخدام الصياغة المختصرة الخاصة بملفات <code>‎.sass</code>:<syntaxhighlight lang="sass">
</syntaxhighlight>يمكن إنشاء نفس المخاليط باستخدام الصياغة المختصرة الخاصَّة بملفات <code>‎.sass</code> مثل:<syntaxhighlight lang="sass">
=apply-to-ie6-only
=apply-to-ie6-only
   * html
   * html
سطر 226: سطر 216:
     background-image: url(/logo.gif)
     background-image: url(/logo.gif)


</syntaxhighlight>ملاحظة: عندما يُحدَّد الموجّه <code>‎@content</code> أكثر من مرةٍ واحدةٍ أو في حلقةٍ (loop)، فستُكرّر كتلة الأنماط عند كل استدعاء.
</syntaxhighlight>'''ملاحظة''': عندما تتواجد التعليمة <code>‎@content</code> أكثر من مرة واحدة أو تُستعمل في حلقة (loop)، فستُكرّر حينئذٍ كتلة الأنماط عند كل استدعاء.


قد تتطلب بعض المخاليط أن تُمرّر إليها كتلةٌ من الأنماط وإلّا سيكون لها سلوكٌ مختلفٌ. ستُعيد الدالة <code>[[Sass/content exists|content-exists()]]</code>‎ القيمة <code>true</code> في حالة تمرير كتلةٍ من الأنماط إلى المخلوط الراهن، ويمكن استخدامها لتنفيذ مثل هذه السلوكيّات.
قد تتطلب بعض المخاليط أن تُمرّر إليها كتلةٌ من الأنماط وإلّا ستسلك سلوكًا مختلفًا. ستُعيد الدالة <code>[[Sass/content exists|content_exists()]]</code>‎ القيمة <code>TRUE</code> في حالة تمرير كتلة من الأنماط إلى المخلوط الحالي، ويمكن استخدامها لمعرفة السلوك المنفَّذ آنذاك.
 
===نطاقات المتغيرات وكتل الأنماط (Variable Scope and Content Blocks)===
=== نطاقات المتغيرات وكتل الأنماط (Variable Scope and Content Blocks) ===
تُحدَّد قيمة كتل الأنماط التي مُرِّرت إلى المخلوط داخل النطاق حيث عُرِّفت الكتلة وليس في نطاق المخلوط. هذا يعني أنّ المتغيرات المحليَّة في المخلوط لا يمكن استخدامها داخل كتلة الأنماط التي مُرِّرت وستُحال المتغيرات إلى القيمة الكليّة (global value).<syntaxhighlight lang="sass">
تُحدَّد قيمة كتل الأنماط التي مُرِّرت إلى المخلوط داخل النطاق حيث عُرِّفت الكتلة، وليس في نطاق المخلوط. هذا يعني أنّ المتغيرات المحلية في المخلوط لا يمكن استخدامها داخل كتلة الأنماط التي مُرِّرت وستُحال المتغيرات على القيمة الكليّة (global value):<syntaxhighlight lang="sass">
$color: white;
$color: white;
@mixin colors($color: blue) {
@mixin colors($color: blue) {
سطر 242: سطر 231:
}
}


</syntaxhighlight>ستُصرّف إلى:<syntaxhighlight lang="css">
</syntaxhighlight>ستُصرّف الشيفرة السابقة إلى:<syntaxhighlight lang="css">
.colors {
.colors {
   background-color: blue;
   background-color: blue;
سطر 248: سطر 237:
   border-color: blue;
   border-color: blue;
}
}
</syntaxhighlight>بالإضافة إلى ذلك، فهذا يجعل من الواضح أنّ المتغيرات والمخاليطَ المُستخدمة داخل كتلة الأنماط المُمرّرة تتعلق بالأنماط الأخرى المُجاورة حيثُ عُرِّفت الكتلة. مثلًا:<syntaxhighlight lang="sass">
</syntaxhighlight>إضافةً إلى ذلك، هذا يجعل من الواضح أنّ المتغيرات والمخاليط المُستخدمة داخل كتلة الأنماط المُمرّرة تتعلق بالأنماط الأخرى المُجاورة حيثُ عُرِّفت الكتلة مثل:<syntaxhighlight lang="sass">
#sidebar {
#sidebar {
   $sidebar-width: 300px;
   $sidebar-width: 300px;
سطر 259: سطر 248:
</syntaxhighlight>
</syntaxhighlight>


== مصادر ==
==مصادر==
* [https://sass-lang.com/documentation/file.SASS_REFERENCE.html#mixins قسم Mixin Directives من توثيق Sass الرسمي].
*[https://sass-lang.com/documentation/file.SASS_REFERENCE.html#mixins قسم Mixin Directives من توثيق Sass الرسمي].<noinclude>{{DISPLAYTITLE:المخاليط (Mixins) في Sass}}</noinclude>
[[تصنيف:Sass]]
[[تصنيف:Sass|{{SUBPAGENAME}}]]

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

تتيحُ المخاليط تعريف الأنماط التي يمكن إعادة استخدامها في ملف الأنماط دون اللجوء إلى الأصناف غير الدلاليَّة مثلِ ‎.float-left. يمكن أن تحوي المخاليط أيضًا جميع قواعد CSS وأيَّ شيء آخر يُسمح باستعماله في ملفات Sass. يمكن أيضًا أن يُمرَّر لها وسائط (arguments) وبذلك يمكن إنتاج مجموعة واسعة من الأنماط بعدد قليل من المخاليط.

تعريف المخلوط (Defining a Mixin):‏ ‎@mixin

تعرَّف المخاليط (Mixins) بوساطة التعليمة ‎@mixin متبوعةً باسم المخلوط، ويمكن اختياريًا إضافة وسائط له، ثمّ كتلة من الأنماط تتضمّن محتويات المخلوط. يُعرّف مثلًا المخلوط large-text على النحو التالي:

@mixin large-text {
  font: {
    family: Arial;
    size: 20px;
    weight: bold;
  }
  color: #ff0000;
}

قد تحتوي المخاليط أيضًا على مُحدّدات، وعلى خاصِّيَّات أحيانًا. بل يمكن أن تحتوي المُحدّدات على مؤشرات أبوية (parent references). انظر الشيفرة التالية مثلًا:

@mixin clearfix {
  display: inline-block;
  &:after {
    content: ".";
    display: block;
    height: 0;
    clear: both;
    visibility: hidden;
  }
  * html & { height: 1px }
}

يمكن أن تحتوي أسماء المخاليط (وجميع مُعرّفات Sass الأخرى)، لأسباب تاريخيَّة، على الشرطات العاديَّة (hyphens) والشرطات السفليَّة (underscores) دون فرقٍ بينها. على سبيل المثال، إن عرّفت مخلوطًا باسم add-column، فيمكنك الإشارة إليه أيضًا بالاسم add_column، والعكس بالعكس.

تضمين المخاليط: ‎@include

تُضمّن المخاليط في الملف عبر التعليمة ‎@include. تأخذ هذه التعليمة اسم مخلوطٍ ما ووسيط اختياري إن وجد، وتضمِّن الأنماط التي يُعرّفها المخلوط في القاعدة الحاليَّة. انظر مثلًا الشيفرة التالية:

.page-title {
  @include large-text;
  padding: 4px;
  margin-top: 10px;
}

ستُصرّف إلى:

.page-title {
  font-family: Arial;
  font-size: 20px;
  font-weight: bold;
  color: #ff0000;
  padding: 4px;
  margin-top: 10px; }

يُمكن أيضًا أن تُدرج المخاليط خارج كل القواعد (أي على مستوى جذر المستند) طالما أنّها لا تُعرِّف مباشرةً أيَّ خاصِّيَّات أو تستخدم أيَّ مؤشّرات أبوية مثل:

@mixin silly-links {
  a {
    color: blue;
    background-color: red;
  }
}

@include silly-links;

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

a {
  color: blue;
  background-color: red; }

يمكن تضمين مخاليط أخرى عند تعريف المخلوط مثل:

@mixin compound {
  @include highlighted-background;
  @include header-text;
}

@mixin highlighted-background { background-color: #fc0; }
@mixin header-text { font-size: 20px; }

قد تستطيع المخاليط تضمين نفسَها إلا أنَّ هذا مُخالفٌ لسلوك الإصدارات السابقة للإصدار Sass 3.3، إذ كانت المخاليط التعاوديَّة (mixin recursion) ممنوعةً.

المخاليط التي لا تعرّف إلّا المحدَّدات المنحدرة (descendant selectors) يمكن أن تُخلط بأمانٍ في المستوى الأعلى من المستند.

الوسائط (Arguments)

يُمكن أن تأخذ المخاليط قيم SassScript كوسائط والتي تمرَّر إليها عند تضمين المخلوط، إذ تُتاح داخل المخلوط بوصفها متغيراتٍ.

عند تعريف مخلوطٍ ما، تُكتب الوسائط كأسماء متغيرات مفصولةٍ بفواصل وموضوعةٍ كلّها بين قوسين بعد الاسم ثمَّ تُمرَّر قيم تلك الوسائط عند تضمين المخلوط بنفس الطريقة. انظر المثال التالي:

@mixin beautiful-border($color, $width) {
  border: {
    color: $color;
    width: $width;
    style: dashed;
  }
}

p { @include beautiful-border(blue, 1in); }

سيصرّف إلى:

p {
  border-color: blue;
  border-width: 1in;
  border-style: dashed; }

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

@mixin beautiful-border($color, $width: 1in) {
  border: {
    color: $color;
    width: $width;
    style: dashed;
  }
}
p { @include beautiful-border(blue); }
h1 { @include beautiful-border(blue, 2in); }

ستُصرّف إلى:

p {
  border-color: blue;
  border-width: 1in;
  border-style: dashed; }

h1 {
  border-color: blue;
  border-width: 2in;
  border-style: dashed; }

الوسائط المُسمّاة (Keyword Arguments)

يمكن أيضًا استخدام الوسائط المُسمّاة صراحةً عند تضمين المخاليط. يمكن أن يُكتب المثال السابق مثلًا على النحو التالي:

p { @include beautiful-border($color: blue); }
h1 { @include beautiful-border($color: blue, $width: 2in); }

في حين أنّ هذا قد يكون أقل إيجازًا إلّا أنه سيجعل ملف الأنماط أسهل للقراءة، وسيسمح للدوال بتقديم واجهاتٍ أكثر مرونةً لتوفير العديد من الوسائط دون أن تكون هناك صعوبةٌ في استدعائها.

يمكن تمرير الوسائط المسماة وفق أيِّ ترتيبٍ، كما يجوز حذف الوسائط ذات القيم الافتراضيَّة. لمّا كانت الوسائطُ المسمّاة هي أسماءُ متغيراتٍ، فلا فرق بين استخدام الشرطات العاديَّة والشرطات السفليّة.

الفاصلة الزائدة (Trailing Commas)

إذا كان الوسيط الأخير لمخلوطٍ أو دالةٍ وسيطًا موضعيًا (positional) أو مُسمًّى، فيُمكن أن يعقُب ذلك الوسيط فاصلةٌ زائدةٌ. يُفضّل البعض هذا الأسلوب في البرمجة لأنَّه يمكن أن يؤدي إلى تقليل الاختلافات والأخطاء في الصياغة عند تصريف الملف.

الوسائط المتغيرة (Variable Arguments)

يفضل أحيانًا ألّا يُحدَّد عدد وسائط المخلوط أو الدالة. على سبيل المثال، قد يأخذ مخلوطٌ مُخصّصٌ لإنشاء ظلال المربعات أيَّ عددٍ من الظلال كوسائط. تدعم Sass في تلك الحالات "الوسائط المتغيرة"، وهي الوسائط الموجودة في تصريح مخلوطٍ أو دالةٍ التي تأخذ كلَّ الوسائط الإضافية المتبقيَّة وتجمعها في قائمة. تبدو هذه الوسائط مثل الوسائط العاديَّة ولكنّها متبوعةٌ بثلاث نقاط (…). يوضح المثال التالي ذلك:

@mixin box-shadow($shadows...) {
  -moz-box-shadow: $shadows;
  -webkit-box-shadow: $shadows;
  box-shadow: $shadows;
}

.shadows {
  @include box-shadow(0px 4px 5px #666, 2px 6px 10px #999);
}

سيصرّف إلى:

.shadows {
  -moz-box-shadow: 0px 4px 5px #666, 2px 6px 10px #999;
  -webkit-box-shadow: 0px 4px 5px #666, 2px 6px 10px #999;
  box-shadow: 0px 4px 5px #666, 2px 6px 10px #999;
}

تحتوي الوسائط المتغيرة أيضًا على كلِّ الوسائط المسمّاة المُمرّرةِ إلى المخلوط أو الدالة، ويمكن الوصول إليها باستعمال الدالة keywords($args)‎ التي تُعيدها كخرائط (maps) إذ تربط أسماء الوسائط (بدون $) بقيمها. يمكن أيضًا أن تُستخدم الوسائط المتغيرة عند استدعاء المخلوط. يمكنك استخدام نفس الصياغة لتوسيع قائمةٍ مكوّنةٍ من قيم بحيث تُمرّر كل قيمة كوسيط منفصل، أو لتوسيع خريطة (map) مكوّنة من قيم بحيث يُعامَل كل زوجٍ وكأنّه وسيط مُسمّى. انظر مثلًا الشيفرة التالية:

@mixin colors($text, $background, $border) {
  color: $text;
  background-color: $background;
  border-color: $border;
}

$values: #ff0000, #00ff00, #0000ff;
.primary {
  @include colors($values...);
}

$value-map: (text: #00ff00, background: #0000ff, border: #ff0000);
.secondary {
  @include colors($value-map...);
}

ستُصرّف إلى:

.primary {
  color: #ff0000;
  background-color: #00ff00;
  border-color: #0000ff;
}

.secondary {
  color: #00ff00;
  background-color: #0000ff;
  border-color: #ff0000;
}

يمكنك أن تُمرّر قائمةً وخريطة من الوسائط في آن واحد شرط أن تُمرَّر القائمة قبل الخريطة، مثل ‎@include colors($values..., $map...)‎. يمكنك استخدام الوسائط المتغيرة لتغليف (wrap) المخلوط وإضافة أنماط إضافيَّةٍ دون تغيير شكل وسائط المخلوط. إن فعلت ذلك، فستُمرّر الوسائط المُسمّاة مباشرةً إلى المخلوط المُغلَّف (wrapped mixin) مثل:

@mixin wrapped-stylish-mixin($args...) {
  font-weight: bold;
  @include stylish-mixin($args...);
}

.stylish {
  // سيُمرَّر الوسيط
  // $width
  // كوسيط إلى المخلوط
  // stylish-mixin
  @include wrapped-stylish-mixin(#00ff00, $width: 100px);
}

تمرير كتل الأنماط إلى المخلوط

من الممكن تمرير كتلةٍ من الأنماط إلى المخلوط لوضعها داخل الأنماط المُدرجة في المخلوط. ستظهر الأنماط في مكان التعليمة ‎@content الموجودة داخل المخلوط، وهذا سيجعل من الممكن تحديد أشكال مُجرّدةٍ متعلقة بإنشاء المُحدّدات والتعليمات. انظر مثلًا إلى المثال التالي:

@mixin apply-to-ie6-only {
  * html {
    @content;
  }
}
@include apply-to-ie6-only {
  #logo {
    background-image: url(/logo.gif);
  }
}

سيصرّف إلى:

* html #logo {
  background-image: url(/logo.gif);
}

يمكن إنشاء نفس المخاليط باستخدام الصياغة المختصرة الخاصَّة بملفات ‎.sass مثل:

=apply-to-ie6-only
  * html
    @content

+apply-to-ie6-only
  #logo
    background-image: url(/logo.gif)

ملاحظة: عندما تتواجد التعليمة ‎@content أكثر من مرة واحدة أو تُستعمل في حلقة (loop)، فستُكرّر حينئذٍ كتلة الأنماط عند كل استدعاء.

قد تتطلب بعض المخاليط أن تُمرّر إليها كتلةٌ من الأنماط وإلّا ستسلك سلوكًا مختلفًا. ستُعيد الدالة content_exists()‎ القيمة TRUE في حالة تمرير كتلة من الأنماط إلى المخلوط الحالي، ويمكن استخدامها لمعرفة السلوك المنفَّذ آنذاك.

نطاقات المتغيرات وكتل الأنماط (Variable Scope and Content Blocks)

تُحدَّد قيمة كتل الأنماط التي مُرِّرت إلى المخلوط داخل النطاق حيث عُرِّفت الكتلة وليس في نطاق المخلوط. هذا يعني أنّ المتغيرات المحليَّة في المخلوط لا يمكن استخدامها داخل كتلة الأنماط التي مُرِّرت وستُحال المتغيرات إلى القيمة الكليّة (global value).

$color: white;
@mixin colors($color: blue) {
  background-color: $color;
  @content;
  border-color: $color;
}
.colors {
  @include colors { color: $color; }
}

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

.colors {
  background-color: blue;
  color: white;
  border-color: blue;
}

إضافةً إلى ذلك، هذا يجعل من الواضح أنّ المتغيرات والمخاليط المُستخدمة داخل كتلة الأنماط المُمرّرة تتعلق بالأنماط الأخرى المُجاورة حيثُ عُرِّفت الكتلة مثل:

#sidebar {
  $sidebar-width: 300px;
  width: $sidebar-width;
  @include smartphone {
    width: $sidebar-width / 3;
  }
}

مصادر