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

من موسوعة حسوب
إضافة الصفحة
 
ط استبدال النص - '\[\[تصنيف:(.*)\]\]' ب'{{SUBPAGENAME}}'
 
(4 مراجعات متوسطة بواسطة مستخدمين اثنين آخرين غير معروضة)
سطر 1: سطر 1:
تدعم SassScript موجّهات وتعابير التحكم التي تُستعمل لرَهن تفعيل الأنماط بشروط معيّنةٍ أو لأجل تضمين نفس النمط لكن مع بعض التنويعات عليه.
<noinclude>{{DISPLAYTITLE:تعليمات التحكم في Sass}}</noinclude>
تدعم SassScript تعليمات وتعابير التحكم التي تُستعمل لرَهن تفعيل الأنماط بشروط معيّنةٍ أو لتضمين نفس النمط لكن مع تطبيق بعض التنويعات عليه.


ملاحظة: مُوجّهات التحكم هي ميزة متقدمةٌ، كما أنّها غير شائعة الاستخدام. وقد وُجدت أساسًا لتُستعمل في [[Sass/mixins|المخاليط]] (mixins)، لا سيما تلك التي هي جزءٌ من المكتبات مثل [http://compass-style.org/ Compass]، لذلك فهي تتطلب مرونةً كبيرةً.
'''ملاحظة''': تعليمات التحكم هي ميزة متقدمةٌ، كما أنّها غير شائعة الاستخدام. وُجدت أساسًا لتُستعمل في [[Sass/mixins|المخاليط]] (mixins)، لاسيما تلك التي هي جزءٌ من المكتبات مثل [http://compass-style.org/ Compass]، لذلك فهي تتطلب مرونةً كبيرةً في التعامل معها.


== <code>if()‎</code> ==
== <code>if()‎</code> ==
تُعيد الدالة المضمّنة <code>if()‎</code> إحدى قيمتين على أساس شرط معيّن. ويمكن استخدامها في أيّ سياق برمجي. لا تُقيِّم الدالة <code>if</code> إلا الوسيط (argument) المقابل للقيمة التي ستعيدها، وهذا سيسمح لك بالإشارة إلى المتغيرات غير المعرّفة أو لأجل إدراج حساباتٍ تسبّب خطأً في العادة (على سبيل المثال، القسمة على الصفر).<syntaxhighlight lang="sass">
تُعيد الدالة المضمّنة <code>if()‎</code> إحدى قيمتين محدَّدتين بناءً على شرط معيّن، ويمكن استخدامها في أيّ سياق برمجي. لا تتحقق الدالة <code>if</code> إلا من الوسيط (argument) المقابل للقيمة التي ستعيدها، وهذا يسمح لك بالإشارة إلى المتغيرات غير المعرّفة أو بتنفيذ حساباتٍ قد تسبّب خطأً في العادة (مثل القسمة على الصفر).<syntaxhighlight lang="sass">
if(true, 1px, 2px) => 1px
if(true, 1px, 2px) => 1px
if(false, 1px, 2px) => 2px
if(false, 1px, 2px) => 2px
سطر 11: سطر 12:


== <code>‎@if</code> ==
== <code>‎@if</code> ==
يأخذ الموجّه <code>‎@if</code> تعبيرًا من تعابير SassScript ويَستخدم الأنماط المتشعّبة تحته في حالة أعاد التعبير أيّ قيمة تُخالف <code>false</code> أو <code>null</code>، على سبيل المثال:<syntaxhighlight lang="sass">
تأخذ التعليمة <code>‎@if</code> تعبيرًا من [[Sass/SassScript|تعابير SassScript]] وتستخدم الأنماط المتشعّبة تحتها عندما يعيد التعبير أيّ قيمة غير القيمة <code>false</code> أو القيمة <code>null</code>، مثل:<syntaxhighlight lang="sass">
p {
p {
   @if 1 + 1 == 2 { border: 1px solid;  }
   @if 1 + 1 == 2 { border: 1px solid;  }
سطر 17: سطر 18:
   @if null      { border: 3px double; }
   @if null      { border: 3px double; }
}
}
</syntaxhighlight>ستُصرّف إلى:<syntaxhighlight lang="css">
</syntaxhighlight>ستُصرّف الشيفرة السابقة إلى:<syntaxhighlight lang="css">
p {
p {
   border: 1px solid; }
   border: 1px solid; }
</syntaxhighlight>يمكنك التحقق يدويًا من <code>‎$var == false</code> أو <code>‎$var == null</code> إن كنت تريد أن تُميّز بينهما.
</syntaxhighlight>يمكنك التحقُّق يدويًا من <code>‎$var == false</code> أو <code>‎$var == null</code> إن كنت تريد أن تُميّز بينهما.


يمكن أن تُتبع التعليمة <code>‎@if</code> بعدة تعليمات <code>‎@else if</code> وتعليمةُ <code>‎@else</code> واحدةٍ. إن فشلت التعليمة <code>‎@if</code> فستُحاول تجريب التعليمات <code>‎@else if</code> بالترتيب إلى أن تنجح إحداها أو تُطبّقَ التعليمة ‎<code>@else</code>. على سبيل المثال:<syntaxhighlight lang="sass">
يمكن أن تُتبع التعليمة <code>‎@if</code> بعدَّة تعليمات مثل التعليمة <code>‎@else if</code> والتعليمة <code>‎@else</code> التي تستعمل لمرة واحدة في النهاية. إن لم تحقِّق التعليمة <code>‎@if</code> الشرط، فسيُنتقل إلى التعليمات <code>‎@else if</code> بالترتيب إلى أن تنجح إحداها في تحقيق الشرط أو ستُطبّقَ التعليمة ‎<code>@else</code> إن لم يتحقق الشرط في أيِّ منها. انظر الشيفرة التالية:<syntaxhighlight lang="sass">
$type: monster;
$type: monster;
p {
p {
سطر 41: سطر 42:


== <code>‎@for</code> ==
== <code>‎@for</code> ==
الموجّه <code>‎@for</code> يُخرج مجموعة من الأنماط تكراريًا. وعند كل تكرارٍ يُستخدم عدّادٌ (متغيرٌ)  لأجل ضبط الإخراج. لهذا الموجّه شكلان، وهما: <code>‎@for $var from <start> through <end></code>‎ و <code>‎@for $var from <start> to <end></code>‎. الاختلاف بينهما في الكلمتين <code>through</code> و <code>to</code>. يمكن أن يكون <code>‎$var</code> أيَّ اسم مُتغيّر، مثل <code>‎$i</code>. أمّا <code><start></code> و <code><end></code> فهما تعبيران من تعابير SassScript يُرجعان أعدادًا صحيحةً. عندما يكون <code><start></code> أكبر من <code><end></code> فإنّ العدّاد سيتناقص بدلًا من أن يتزايد.
تستعمل التعليمة <code>‎@for</code> لإظهار مجموعة من الأنماط تكراريًا، ويستخدم عند كل تكرارٍ عدّادٌ (متغيرٌ)  لأجل ضبط عدد مرات ظهور الأنماط. هنالك شكلان لاستعمال هذه التعليمة؛ الشكل الأول هو <code>‎@for $var from <start> through <end></code>‎، والشكل الثاني هو <code>‎@for $var from <start> to <end></code>‎. الاختلاف بينهما هو في الكلمتين <code>through</code> و <code>to</code> اللتين ستحددان مجال التكرار كما سيوضح ذلك. يمكن أن يكون <code>‎$var</code> أيَّ مُتغيّر مثل <code>‎$i</code> أمّا <code><start></code> و <code><end></code> فهما تعبيران من [[Sass/SassScript|تعابير SassScript]] يُرجعان أعدادًا صحيحةً. عندما يكون <code><start></code> أكبر من <code><end></code>، فسيكون العد تنازليًّا بدلًا من أن يكون تصاعديًّا.


التعليمة <code>‎@for</code> تعطي للمتغير <code>‎$var</code> كل القيم الموجود في المجال المحدد بالتتابع، وفي كل مرة تُخرج الأنماط المتشعّبة باستخدام قيمة <code>‎$var</code>. بالنسبة للشكل <code>from ... through</code>،  فسيتضمّن المجالُ القيمتين <code><start></code> و <code><end></code>، أمّا في الشكل <code>from ... to</code> فلن يتضمّن قيمة <code><end></code>.
تضبط التعليمة <code>‎@for</code> المتغير <code>‎$var</code> إلى القيم الموجود في المجال المحدَّد بالتتابع في كل مرة تُخرج الأنماط المتشعّبة باستخدام قيمة <code>‎$var</code>. انتبه إلى أنه ستدخل في الشكل <code>from ... through</code> القيمة <code><start></code> والقيمة <code><end></code> في مجال العد بينما لن تدخل في الشكل <code>from ... to</code> القيمة <code><end></code> أي سيتوقف العد عند القيمة السابقة أو اللاحقة لها بحسب نوع العد (تصاعديًّا أم تنازليًّا).


مثال يستخدم الصياغة <code>through</code>:<syntaxhighlight lang="sass">
يوضح المثال التالي اسخدام الصياغة <code>through</code>:<syntaxhighlight lang="sass">
@for $i from 1 through 3 {
@for $i from 1 through 3 {
   .item-#{$i} { width: 2em * $i; }
   .item-#{$i} { width: 2em * $i; }
سطر 59: سطر 60:


== <code>‎@each</code> ==
== <code>‎@each</code> ==
الشكل الاعتيادي للمُوجّه <code>‎@each</code> هو <code>‎@each $var in <list or map>‎</code>. يمكن أن يكون ‎<code>$var</code> أي اسم مُتغيّر، مثل <code>‎$length</code> أو <code>‎$name</code>، و <code><list or map></code> هو تعبيرٌ من تعابير SassScript يُرجع قائمةً أو قاموسًا.
الشكل الاعتيادي للتعليمة <code>‎@each</code> هو <code>‎@each $var in <list or map>‎</code>. يمكن أن يكون ‎<code>$var</code> أي مُتغيّر، مثل <code>‎$length</code> أو <code>‎$name</code>، والقيمة <code><list or map></code> هي تعبيرٌ من [[Sass/SassScript|تعابير SassScript]] ترجع [[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|خريطة]] (map).


القاعدة <code>‎@each</code> تعطي للمتغير <code>‎$var</code> كل القيم الموجودة في القائمة أو القاموس، ثم تُخرج الأنماط التي تحتويها باستخدام قيمة <code>‎$var</code>. على سبيل المثال:<syntaxhighlight lang="sass">
التعليمة <code>‎@each</code> تعطي للمتغير <code>‎$var</code> كل القيم الموجودة في القائمة أو الخريطة، ثم تُخرج الأنماط التي تحتويها باستخدام قيمة <code>‎$var</code>. انظر المثال التالي:<syntaxhighlight lang="sass">
@each $animal in puma, sea-slug, egret, salamander {
@each $animal in puma, sea-slug, egret, salamander {
   .#{$animal}-icon {
   .#{$animal}-icon {
سطر 68: سطر 69:
}
}


</syntaxhighlight>ستُصرّف إلى:<syntaxhighlight lang="css">
</syntaxhighlight>سيصرّف إلى:<syntaxhighlight lang="css">
.puma-icon {
.puma-icon {
   background-image: url('/images/puma.png'); }
   background-image: url('/images/puma.png'); }
سطر 81: سطر 82:


=== الإسناد المتعدد (Multiple Assignment) ===
=== الإسناد المتعدد (Multiple Assignment) ===
يمكن للموجّه <code>‎@each</code> استخدام عدة متغيرات، كما هو الحال في <code>‎@each $var1, $var2, ... in <list></code>‎. إن كانت <code><list></code> قائمةً مكوّنةً من قوائم، فإنّ كل عنصرٍ من عناصر القوائم الفرعية سيُعيّن في المتغير الموافق له. على سبيل المثال:<syntaxhighlight lang="sass">
يمكن للتعليمة <code>‎@each</code> استخدام عدَّة متغيرات، كما هو الحال في <code>‎@each $var1, $var2, ... in <list></code>‎. إن كانت <code><list></code> قائمةً مكوّنةً من عدَّة قوائم، فإنّ كل عنصرٍ من عناصر القوائم الفرعية سيسند إلى المتغير الموافق له مثل:<syntaxhighlight lang="sass">
@each $animal, $color, $cursor in (puma, black, default),
@each $animal, $color, $cursor in (puma, black, default),
                                   (sea-slug, blue, pointer),
                                   (sea-slug, blue, pointer),
سطر 91: سطر 92:
   }
   }
}
}
</syntaxhighlight>ستُصرّف إلى:<syntaxhighlight lang="css">
</syntaxhighlight>ستُصرّف الشيفرة السابقة  إلى:<syntaxhighlight lang="css">
.puma-icon {
.puma-icon {
   background-image: url('/images/puma.png');
   background-image: url('/images/puma.png');
سطر 105: سطر 106:
   cursor: move; }
   cursor: move; }


</syntaxhighlight>لمّا كانت القواميس تُعامل كأنّها قوائمٌ مُكوّنةٌ من أزواج، فإنّ التعيين المتعددة يعمل عليها كذلك. على سبيل المثال:<syntaxhighlight lang="sass">
</syntaxhighlight>لمّا كانت [[Sass/SassScript#.D8.A7.D9.84.D8.AE.D8.B1.D8.A7.D8.A6.D8.B7 .28Maps.29|الخرائط]] تُعامل كأنّها قوائمٌ مُكوّنةٌ من أزواج، فيمكن تطبيق الاسناد المتعددة عليها أيضًا. الشيفرة التالية:<syntaxhighlight lang="sass">
@each $header, $size in (h1: 2em, h2: 1.5em, h3: 1.2em) {
@each $header, $size in (h1: 2em, h2: 1.5em, h3: 1.2em) {
   #{$header} {
   #{$header} {
سطر 123: سطر 124:


== ‎@while ==
== ‎@while ==
يأخذ الموجّه <code>‎@while</code> تعبيرًا من تعابير SassScript ويُخرج الأنماط المتشعّبة بشكلٍ متكررٍ إلى أن تساوي قيمة ذلك التعبير القيمة <code>false</code>. يمكن أن تُستخدم لإجراء عمليّات تكراريّة أكثر تعقيدًا مما تُتيحه التعليمة <code>[[#@for|‎@for]]</code>، على الرغم من أنّ هذا نادرًا ما يكون ضروريًا. على سبيل المثال:<syntaxhighlight lang="sass">
تأخذ التعليمة <code>‎@while</code> تعبيرًا من [[Sass/SassScript|تعابير SassScript]] وتخرج الأنماط المتشعّبة بشكلٍ متكررٍ إلى أن تساوي قيمة ذلك التعبير القيمة <code>false</code>. يمكن أن تُستخدم لإجراء عمليّات تكراريّة أكثر تعقيدًا مما تُتيحه التعليمة <code>[[#@for|‎@for]]</code>، على الرغم من أنّ هذا نادرًا ما يكون ضروريًا. انظر مثلًا الشيفرة التالية:<syntaxhighlight lang="sass">
$i: 6;
$i: 6;
@while $i > 0 {
@while $i > 0 {
سطر 143: سطر 144:
== مصادر ==
== مصادر ==
* [https://sass-lang.com/documentation/file.SASS_REFERENCE.html#control_directives__expressions قسم Control Directives & Expressions من توثيق Sass الرسمي].
* [https://sass-lang.com/documentation/file.SASS_REFERENCE.html#control_directives__expressions قسم Control Directives & Expressions من توثيق Sass الرسمي].
[[تصنيف:Sass|{{SUBPAGENAME}}]]

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

تدعم SassScript تعليمات وتعابير التحكم التي تُستعمل لرَهن تفعيل الأنماط بشروط معيّنةٍ أو لتضمين نفس النمط لكن مع تطبيق بعض التنويعات عليه.

ملاحظة: تعليمات التحكم هي ميزة متقدمةٌ، كما أنّها غير شائعة الاستخدام. وُجدت أساسًا لتُستعمل في المخاليط (mixins)، لاسيما تلك التي هي جزءٌ من المكتبات مثل Compass، لذلك فهي تتطلب مرونةً كبيرةً في التعامل معها.

if()‎

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

if(true, 1px, 2px) => 1px
if(false, 1px, 2px) => 2px

‎@if

تأخذ التعليمة ‎@if تعبيرًا من تعابير SassScript وتستخدم الأنماط المتشعّبة تحتها عندما يعيد التعبير أيّ قيمة غير القيمة false أو القيمة null، مثل:

p {
  @if 1 + 1 == 2 { border: 1px solid;  }
  @if 5 < 3      { border: 2px dotted; }
  @if null       { border: 3px double; }
}

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

p {
  border: 1px solid; }

يمكنك التحقُّق يدويًا من ‎$var == false أو ‎$var == null إن كنت تريد أن تُميّز بينهما. يمكن أن تُتبع التعليمة ‎@if بعدَّة تعليمات مثل التعليمة ‎@else if والتعليمة ‎@else التي تستعمل لمرة واحدة في النهاية. إن لم تحقِّق التعليمة ‎@if الشرط، فسيُنتقل إلى التعليمات ‎@else if بالترتيب إلى أن تنجح إحداها في تحقيق الشرط أو ستُطبّقَ التعليمة ‎@else إن لم يتحقق الشرط في أيِّ منها. انظر الشيفرة التالية:

$type: monster;
p {
  @if $type == ocean {
    color: blue;
  } @else if $type == matador {
    color: red;
  } @else if $type == monster {
    color: green;
  } @else {
    color: black;
  }
}

ستُصرّف إلى:

p {
  color: green; }

‎@for

تستعمل التعليمة ‎@for لإظهار مجموعة من الأنماط تكراريًا، ويستخدم عند كل تكرارٍ عدّادٌ (متغيرٌ)  لأجل ضبط عدد مرات ظهور الأنماط. هنالك شكلان لاستعمال هذه التعليمة؛ الشكل الأول هو ‎@for $var from <start> through <end>‎، والشكل الثاني هو ‎@for $var from <start> to <end>‎. الاختلاف بينهما هو في الكلمتين through و to اللتين ستحددان مجال التكرار كما سيوضح ذلك. يمكن أن يكون ‎$var أيَّ مُتغيّر مثل ‎$i أمّا <start> و <end> فهما تعبيران من تعابير SassScript يُرجعان أعدادًا صحيحةً. عندما يكون <start> أكبر من <end>، فسيكون العد تنازليًّا بدلًا من أن يكون تصاعديًّا.

تضبط التعليمة ‎@for المتغير ‎$var إلى القيم الموجود في المجال المحدَّد بالتتابع في كل مرة تُخرج الأنماط المتشعّبة باستخدام قيمة ‎$var. انتبه إلى أنه ستدخل في الشكل from ... through القيمة <start> والقيمة <end> في مجال العد بينما لن تدخل في الشكل from ... to القيمة <end> أي سيتوقف العد عند القيمة السابقة أو اللاحقة لها بحسب نوع العد (تصاعديًّا أم تنازليًّا).

يوضح المثال التالي اسخدام الصياغة through:

@for $i from 1 through 3 {
  .item-#{$i} { width: 2em * $i; }
}

ستُصرّف إلى:

.item-1 {
  width: 2em; }
.item-2 {
  width: 4em; }
.item-3 {
  width: 6em; }

‎@each

الشكل الاعتيادي للتعليمة ‎@each هو ‎@each $var in <list or map>‎. يمكن أن يكون ‎$var أي مُتغيّر، مثل ‎$length أو ‎$name، والقيمة <list or map> هي تعبيرٌ من تعابير SassScript ترجع قائمةً أو خريطة (map).

التعليمة ‎@each تعطي للمتغير ‎$var كل القيم الموجودة في القائمة أو الخريطة، ثم تُخرج الأنماط التي تحتويها باستخدام قيمة ‎$var. انظر المثال التالي:

@each $animal in puma, sea-slug, egret, salamander {
  .#{$animal}-icon {
    background-image: url('/images/#{$animal}.png');
  }
}

سيصرّف إلى:

.puma-icon {
  background-image: url('/images/puma.png'); }
.sea-slug-icon {
  background-image: url('/images/sea-slug.png'); }
.egret-icon {
  background-image: url('/images/egret.png'); }
.salamander-icon {
  background-image: url('/images/salamander.png'); }

الإسناد المتعدد (Multiple Assignment)

يمكن للتعليمة ‎@each استخدام عدَّة متغيرات، كما هو الحال في ‎@each $var1, $var2, ... in <list>‎. إن كانت <list> قائمةً مكوّنةً من عدَّة قوائم، فإنّ كل عنصرٍ من عناصر القوائم الفرعية سيسند إلى المتغير الموافق له مثل:

@each $animal, $color, $cursor in (puma, black, default),
                                  (sea-slug, blue, pointer),
                                  (egret, white, move) {
  .#{$animal}-icon {
    background-image: url('/images/#{$animal}.png');
    border: 2px solid $color;
    cursor: $cursor;
  }
}

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

.puma-icon {
  background-image: url('/images/puma.png');
  border: 2px solid black;
  cursor: default; }
.sea-slug-icon {
  background-image: url('/images/sea-slug.png');
  border: 2px solid blue;
  cursor: pointer; }
.egret-icon {
  background-image: url('/images/egret.png');
  border: 2px solid white;
  cursor: move; }

لمّا كانت الخرائط تُعامل كأنّها قوائمٌ مُكوّنةٌ من أزواج، فيمكن تطبيق الاسناد المتعددة عليها أيضًا. الشيفرة التالية:

@each $header, $size in (h1: 2em, h2: 1.5em, h3: 1.2em) {
  #{$header} {
    font-size: $size;
  }
}

ستُصرّف إلى:

h1 {
  font-size: 2em; }
h2 {
  font-size: 1.5em; }
h3 {
  font-size: 1.2em; }

‎@while

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

$i: 6;
@while $i > 0 {
  .item-#{$i} { width: 2em * $i; }
  $i: $i - 2;
}

ستُصرّف إلى:

.item-6 {
  width: 12em; }

.item-4 {
  width: 8em; }

.item-2 {
  width: 4em; }

مصادر