<?xml version="1.0"?>
<rss version="2.0"><channel><title>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;: Sass</title><link>https://academy.hsoub.com/programming/css/sass/?d=2</link><description>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;: Sass</description><language>ar</language><item><title>&#x62A;&#x639;&#x631;&#x641; &#x639;&#x644;&#x649; &#x644;&#x63A;&#x629; Sass</title><link>https://academy.hsoub.com/programming/css/sass/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%84%D8%BA%D8%A9-sass-r2288/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_04/--SASS.png.7b73fca3522ed0f9ed89f03af0062d0c.png" /></p>
<p>
	نوضح في مقال اليوم ما هي لغة Sass، وماهي استخداماتها، ولماذا تستخدم كبديل للغة CSS في تنسيق الواجهات الأمامية لمواقع الويب، فإذا كنت مهتمًا بمعرفة ماذا تعني Sass؟ وما الفرق بين لغة CSS و Sass وما هي أساسيات Sass التي عليك تعلمها، وماهي مصادر تعلمها باللغة العربية، والعديد من المعلومات المفيدة الأخرى حولها فهذا المقال سيفيدك بكل تأكيد.
</p>

<h2 id="sass">
	ما هي لغة Sass؟
</h2>

<p>
	لغة Sass هي اختصار لعبارة <strong>S</strong>yntactically <strong>a</strong>wesome <strong>s</strong>tyle <strong>s</strong>heets وتعني أوراق الأنماط الرائعة من الناحية النحوية وهي بمثابة توسعة أو تطوير للغة تنسيق صفحات الويب <a href="https://academy.hsoub.com/programming/css/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%84%D8%BA%D8%A9-css/" rel="">CSS</a> وهي لغة مفتوحة المصدر تخضع لترخيص MIT -بالرغم من ذلك هنالك إصدارات معينة من لغة Sass تخضع لتراخيص ملكية، وتوفر مرونة وسهولة أكبر في التعامل معها- ولكي تفهم ماذا تعني Sass يجب أن تعرف بدايةً ما هي لغة CSS وما الهدف منها؟
</p>

<p>
	ففي الأساس <a href="https://wiki.hsoub.com/CSS" rel="external">لغة CSS</a> وهي اختصار لعبارة <strong>C</strong>ascading <strong>S</strong>tyle <strong>S</strong>heet أي لغة تنسيق الأنماط المتعاقبة، هي اللغة الأساسية المستخدمة لتنسيق وتصميم عناصر المواقع الإلكترونية الممثلة بلغة<a href="https://wiki.hsoub.com/HTML" rel="external">HTML</a> فلو كنت تصمم موقعًا إلكترونيًا خاصًا بك وأردت تغيير لون خلفية عنصر معين على إحدى صفحات هذا الموقع أو <a href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%AA%D9%86%D8%B3%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-%D9%84%D9%84%D9%86%D8%B5%D9%88%D8%B5-%D9%88%D8%AE%D8%B7%D9%88%D8%B7-%D8%A7%D9%84%D9%83%D8%AA%D8%A7%D8%A8%D8%A9-%D9%81%D9%8A-css-r2211/" rel="">تغيير الخطوط</a> المستخدمة في الكتابة أو <a href="https://academy.hsoub.com/programming/css/%D8%AA%D9%86%D8%B3%D9%8A%D9%82-%D8%A7%D9%84%D9%82%D9%88%D8%A7%D8%A6%D9%85-%D9%81%D9%8A-css-r2220/" rel="">تنسيق القوائم</a> أو تعديل تموضع عنصر معين ضمن الصفحة، أو غيرها من التعديلات على مظهر موقعك فعليك كتابة كافة أكواد التنسيق المطلوبة باستخدام لغة CSS.
</p>

<p>
	لكن عندما تتعامل مع شيفرات CSS في تصميم <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%A7-%D9%87%D9%8A-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8%D8%9F-r2094/" rel="">صفحات الويب</a> فستلاحظ أنها تعاني من محدودية وقيود عديدة لا سيما عند الحاجة لكتابة الكثير من التنسيقات إذ سيصبح التعامل معها مربكًا ومعقدًا وتصعب عملية صيانتها وتصحيح أخطائها لكونها لغة تنسيقية بحتة ولا تملك إمكانيات برمجية، وللتخفيف من هذه المشكلات والقيود ظهرت لغة Sass لكي تضيف العديد من المميزات الجديدة للغة CSS، مثل ميزة تداخل الكود وميزة التصريح عن الثوابت والمتغيرات وإمكانية تعريف الدوال وغيرها من المميزات المتقدمة التي سنوضحها بالأمثلة العملية في الفقرات التالية، والتي من شأنها أن تقلل حجم الكود وتنظم وتبسّط عملية كتابة التنسيقات اللازمة لتصميم مواقع الويب وصيانتها.
</p>

<p>
	باختصار Sass هي لغة تحسينية للغة CSS ولكن تجدر الإشارة لأنك ستحتاج لأن تترجم كل أكواد Sass إلى لغة CSS كي تتمكن من تطبيقها على عناصر صفحة الويب، أي لا يمكنك استخدم أكواد Sass مباشرة في صفحات موقعك كما هو الحال في CSS وستحتاج لاستخدام تقنيات مخصصة للقيام بعملية التحويل.
</p>

<h2 id="sasscss">
	طريقة تحويل لغة Sass إلى CSS
</h2>

<p>
	قد تتساءل لماذا يتوجب عليَّ تحويل كود Sass إلى CSS وإليك السبب، يمكن لجميع متصفحات الويب الحديثة عرض أكواد CSS دون أي مشكلات، لكن هذا لا ينطبق على لغة Sass لذا تحتاج قبل ذلك لإجراء عملية تحويل أو ترجمة لكافة أكواد Sass إلى أكواد اللغة القياسية CSS ثم تطبيق هذه التنسيقات على عناصر الموقع الإلكتروني.
</p>

<p>
	لهذا السبب تعد لغة Sass بمثابة <strong>معالج مسبق</strong> للغة CSS أو ما يعرف بمصطلح <strong>CSS pre-processor</strong> لأنك تحتاج إلى تحويل أو ترجمة أكوادها المتقدمة للشكل المتبع في أكواد CSS التقليدية قبل عرض العناصر على صفحة الويب.
</p>

<p>
	حيث يتوجب عليك بداية كتابة تنسيقات أو أكواد Sass في ملف بالامتداد ‎.sass ثم ترجمتها أو تجميعها في ملف CSS وبعدها سيتم تحميل شيفرة CSS إلى المتصفح لتنسيق عناصر HTML، ولكي تتمكن من إجراء عملية التحويل تحتاج إلى <a href="https://sass-lang.com/install/" rel="external nofollow">تثبيت مترجم Sass</a> على جهازك لترجمة كود Sass إلى كود CSS القياسي.
</p>

<p>
	وتتوفر عدة طرق يمكنك من خلالها تثبيت مترجم Sass على أنظمة التشغيل ويندوز Windows وماك Mac ولينكس Linux، إما من خلال تطبيق واجهة رسومية مثل scout-app أو من خلال استخدام أداة سطر الأوامر مثل <a href="https://sass-lang.com/dart-sass/" rel="external nofollow">Dart Sass</a> أو <a href="https://www.npmjs.com/package/node-sass" rel="external nofollow">Node sass</a> وتختلف طريقة التثبيت بحسب نظام التشغيل وبيئة التطوير ومدير الحزم الذي تستخدمه.
</p>

<p>
	على سبيل المثال إذا كنت تستخدم مدير الحزم شوكولاتي Chocolatey لنظام ويندوز فيمكنك تثبيت Dart Sass عن طريق كتابة الأمر التالي:
</p>

<pre class="ipsCode">choco install sass
</pre>

<p>
	اختر الطريقة التي تناسبك للتثبيت، وبعد اكتمال التثبيت سيكون بإمكانك تحويل ملفات sass إلى CSS من خلال كتابة التعليمة التالية:
</p>

<pre class="ipsCode"> sass file_name.sass file_name.css
</pre>

<h3 id="sasscss-1">
	مثال على تحويل ملف Sass إلى CSS
</h3>

<p>
	على سبيل المثال لنفترض أن لدينا لدينا ملف Sass يسمى style.sass يحتوي على التنسيقات التالية:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5013_12" style=""><span class="pun">//</span><span class="pln"> </span><span class="pun">ملف</span><span class="pln"> styles</span><span class="pun">.</span><span class="pln">sass

</span><span class="pun">$</span><span class="kwd">primary-color</span><span class="pun">:</span><span class="pln"> blue

body
  </span><span class="kwd">font-family</span><span class="pun">:</span><span class="pln"> Arial</span><span class="pun">,</span><span class="pln"> sans-serif

</span><span class="pun">.</span><span class="pln">container
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">100%</span><span class="pln">
  </span><span class="kwd">max-width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">960px</span><span class="pln">
  </span><span class="kwd">margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> auto

</span><span class="pun">.</span><span class="pln">button
  </span><span class="kwd">padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">10px</span><span class="pln"> </span><span class="lit">20px</span><span class="pln">
  </span><span class="kwd">background-color</span><span class="pun">:</span><span class="pln"> </span><span class="pun">$</span><span class="pln">primary-color
  </span><span class="kwd">color</span><span class="pun">:</span><span class="pln"> white
  </span><span class="kwd">border</span><span class="pun">:</span><span class="pln"> none
  </span><span class="kwd">border-radius</span><span class="pun">:</span><span class="pln"> </span><span class="lit">5px</span></pre>

<p>
	لمعالجة هذا الملف وتحويله إلى كود CSS قياسي، افتح نافذة سطر الأوامر وانتقل إلى المجلد الذي يحتوي على ملف style.sass ثم نفذ هذا الأمر:
</p>

<pre class="ipsCode"> sass style.sass style.css
</pre>

<p>
	يحول هذا الأمر ملف style.sass إلى ملف style.css يحتوي على الكود التالي:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_2938_8" style=""><span class="com">/* ملف styles.css */</span><span class="pln">

body </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">font-family</span><span class="pun">:</span><span class="pln"> Arial</span><span class="pun">,</span><span class="pln"> sans-serif</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">.</span><span class="pln">container </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">100%</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">max-width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">960px</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> auto</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">.</span><span class="pln">button </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">10px</span><span class="pln"> </span><span class="lit">20px</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">background-color</span><span class="pun">:</span><span class="pln"> blue</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">color</span><span class="pun">:</span><span class="pln"> white</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">border</span><span class="pun">:</span><span class="pln"> none</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">border-radius</span><span class="pun">:</span><span class="pln"> </span><span class="lit">5px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	بهذا تكون قد حولت ملف Sass إلى CSS بكل بساطة وبتعليمة واحدة فقط.
</p>

<p>
	كما توفر Sass ميزة ضغط أو تقليص حجم ملفات CSS الناتجة عن طريق إزالة المسافات الزائدة والتنسيقات غير الضرورية وهذا يساعد في تقليل زمن تحميل ملفات التنسيق وتحسين أداء موقع الويب.
</p>

<p>
	فلتحويل ملف Sass إلى CSS مضغوط، يمكنك إضافة خيار إضافي لتفعيل ضغط الملفات كما يلي:
</p>

<pre class="ipsCode" id="ips_uid_2938_12"> sass style.sass styles.css --style compressed</pre>

<p>
	يحدد الخيار  <code>style compressed--</code>   في الكود أعلاه بأن كود Sass يجب أن يُنتج لنا ملف CSS مضغوطًا يحتوي على نسخة مختصرة من شيفرات CSS إذا ستكون الشيفرة الناتجة بدون أي مسافات زائدة أو تنسيقات غير ضرورية، وهذا يقلل من حجم الملف الناتج ويساعد في تسريع تحميل الموقع.
</p>

<h2>
	الفرق بين Sass و SCSS و Less
</h2>

<p>
	كل من Sass و SCSS و Less هي مُعالجِات مسبقة للغة CSS لكنها تختلف عن بعضها بالقليل من المميزات والتي سنشرحها لك تباعًا.
</p>

<h3>
	أولًا: الفرق بين Sass و SCSS
</h3>

<p>
	بدايةً يتمثل الفرق بين Sass و SCSS في اعتمادهما على طريقة مختلفة لكتابة التنسيقات فلغة Sass تعتمد في تنظيم كتل الكود على المسافات البادئة Indented Syntax، ولها امتداد ملف sass. أما صيغة SCSS فهي صيغة أحدث وأكثر انتشارًا وتعرف باسم Sassy CSS وتعتمد على الأقواس المتعرجة <code>{}</code> لتجميع وتنطيم كتل الكود، وتستخدم الفواصل المنقوطة لفصل القواعد وهي تشبه CSS القياسية أكثر ولها امتداد ملف scss. فكلاهما بالتالي متشابهان ويفعلان نفس الشيء، لكنهما مكتوبتان بأسلوب مختلف.
</p>

<p>
	فيما يلي مثال بسيط على كود مكتوب بأسلوب Sass:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_2938_14" style=""><span class="pun">$</span><span class="kwd">primary-color</span><span class="pun">:</span><span class="pln"> blue

body
  </span><span class="kwd">font-family</span><span class="pun">:</span><span class="pln"> Arial</span><span class="pun">,</span><span class="pln"> sans-serif
  </span><span class="kwd">color</span><span class="pun">:</span><span class="pln"> </span><span class="pun">$</span><span class="pln">primary-color

</span><span class="pun">.</span><span class="pln">header
  </span><span class="kwd">background-color</span><span class="pun">:</span><span class="pln"> </span><span class="pun">$</span><span class="pln">primary-color
  </span><span class="kwd">padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">10px</span><span class="pln">


  nav
 ul
  </span><span class="kwd">margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln">
  </span><span class="kwd">padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln">
  </span><span class="kwd">list-style</span><span class="pun">:</span><span class="pln"> none

 li
  </span><span class="kwd">display</span><span class="pun">:</span><span class="pln"> inline-block</span></pre>

<p>
	في حين يبين المثال التالي كود مكتوب بأسلوب SCSS:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_2938_16" style=""><span class="pun">$</span><span class="kwd">primary-color</span><span class="pun">:</span><span class="pln"> blue</span><span class="pun">;</span><span class="pln">

body </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">font-family</span><span class="pun">:</span><span class="pln"> Arial</span><span class="pun">,</span><span class="pln"> sans-serif</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">color</span><span class="pun">:</span><span class="pln"> </span><span class="pun">$</span><span class="pln">primary-color</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">.</span><span class="pln">header </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">background-color</span><span class="pun">:</span><span class="pln"> </span><span class="pun">$</span><span class="pln">primary-color</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">10px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

nav </span><span class="pun">{</span><span class="pln">
 ul </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">list-style</span><span class="pun">:</span><span class="pln"> none</span><span class="pun">;</span><span class="pln">
 </span><span class="pun">}</span><span class="pln">
 li </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">display</span><span class="pun">:</span><span class="pln"> inline-block</span><span class="pun">;</span><span class="pln">
 </span><span class="pun">}</span></pre>

<h3>
	ثانيًا: الفرق بين Sass و Less
</h3>

<p>
	أما بالنسبة للفرق بين Sass و Less فكلاهما معالجان مسبقان شائعان تستخدمان لتسهيل عملية كتابة CSS وجعلها أكثر تنظيمًا وقابليةً للصيانة، لكنهما تختلفان أيضًا ببعض الجوانب حيث أن Sass مبنية على <a href="https://academy.hsoub.com/programming/ruby/" rel="">لغة روبي Ruby</a>، بينما Less مبنية على لغة <a href="https://academy.hsoub.com/programming/javascript/" rel="">جافاسكريبت JavaScript </a>كما أن Sass أكثر شعبيةً وانتشارًا من Less، وقد زادت شعبيتها بعد أن اعتمد عليها <a href="https://academy.hsoub.com/programming/css/bootstrap/%D8%AF%D9%84%D9%8A%D9%84%D9%83-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-%D9%84%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D9%88%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A5%D8%B7%D8%A7%D8%B1-%D8%A7%D9%84%D8%B9%D9%85%D9%84-%D8%A8%D9%88%D8%AA%D8%B3%D8%AA%D8%B1%D8%A7%D8%A8-bootstrap-r2256/" rel="">بوتستراب Bootstrap</a> وتكتب شيفرات Less بنفس أسلوب Scss.
</p>

<p>
	باختصار الفرق بين Sass و Scss و Less هو الصياغة النحوية لكل منها، وإن كانت في نهاية المطاف كلها معالجات مسبقة تحول إلى CSS لكن تستخدم Sass صيغة نحوية خاصة به حيث يتم حذف الأقواس والفاصلات المنقوطة، بينما تشبه SCSS صيغة CSS مما يجعلها أسهل قراءةً وفهمًا، وأخيرًا تمتلك LESS صيغة نحوية مشابهة لصياغة SCSS، لكنها مبينة باستخدام لغة <a href="https://academy.hsoub.com/javascript/" rel="">جافا سكريبت</a> ويعتمد اختيار اللغة المناسبة من بينها على تفضيلاتك ومتطلباتك الشخصية.
</p>

<h2>
	ما هي أساسيات Sass
</h2>

<p>
	تضيف لغة Sass مجموعة من القواعد والمفاهيم الأساسية والإمكانيات التي لا توفرها لغة CSS كما وضحنا سابقًا، وفيما يلي أوضح أهم أساسيات Sass مع أمثلة عملية بسيطة توضح كيفية استخدام ميزات Sass المختلفة في توسيع أكواد CSS.
</p>

<h3>
	1. المتغيرات
</h3>

<p>
	يمكنك تخزين معلومات التنسيق في المتغيرات باستخدام Sass وإعادة استخدامها لاحقًا. على سبيل المثال، يمكنك تخزين قيمة لون كمتغير كما في الكود التالي الذي يعرف متغيرين باسم <code>my-fore-color$ </code>و <code>my-back-color$ </code>ويسند لهما <a href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D8%A7%D9%84%D8%A3%D9%84%D9%88%D8%A7%D9%86-%D9%81%D9%8A-css-r255/" rel="">قيم لونية</a> مختلفة.
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_2938_18" style=""><span class="pun">$</span><span class="kwd">my-fore-color</span><span class="pun">:</span><span class="pln"> </span><span class="lit">#3445db</span><span class="pun">;</span><span class="pln">
</span><span class="pun">$</span><span class="kwd">my-back-color</span><span class="pun">:</span><span class="pln"> </span><span class="lit">#78a3d1</span><span class="pun">;</span><span class="pln">

</span><span class="pun">.</span><span class="pln">container </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">background-color</span><span class="pun">:</span><span class="pln"> </span><span class="pun">$</span><span class="pln">my-back-color</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">.</span><span class="pln">text </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">color</span><span class="pun">:</span><span class="pln"> </span><span class="pun">$</span><span class="pln">my-fore-color</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	عند معالجة ملف Sass أعلاه، سيأخذ القيم المذكورة في المتغيرين <code>my-fore-color$ </code>و <code>my-back-color$ </code>ويستخدمها في الأماكن التي يذكر فيهما اسم كل متغير فيها وينسق ألوان العناصر بناءً عليها، ماذا لو أردت بعدها تغيير لون الخلفية أو لون النص في موقعك؟ يكفي أن تعدل القيمة التي أسندتها للمتغير فقط بكل سهولة.
</p>

<h3>
	2. العمليات الحسابية
</h3>

<p>
	يمكن استخدام الدوال الحسابية كالجمع والضرب والقسمة في Sass لتنفيذ عمليات حسابية على قيم تنسيقات العناصر وتعديلها. على سبيل المثال، يحدد الكود التالي حجم الخط المستخدم في الموقع بشكل ديناميكي بناءً على حجم الخط الأساسي:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_2938_20" style=""><span class="pun">$</span><span class="kwd">base-font-size</span><span class="pun">:</span><span class="pln"> </span><span class="lit">16px</span><span class="pun">;</span><span class="pln">

</span><span class="pun">.</span><span class="pln">element </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">font-size</span><span class="pun">:</span><span class="pln"> </span><span class="pun">$</span><span class="pln">base-font-size </span><span class="pun">+</span><span class="pln"> </span><span class="lit">2px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<h3>
	3. الحلقات التكرارية
</h3>

<p>
	توفر Sass إمكانية استخدام الحلقات التكرارية لتكرار كود التنسيقات عدد من المرات وهو أمر غير متاح في لغة CSS، للتوضيح لاحظ الكود التالي الذي يطبق مجموعة من التنسيقات على ثلاثة عناصر، بحيث يتزايد عرض كل عنصر عن السابق بمقدار 50 بكسل.
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_2938_22" style=""><span class="pun">@</span><span class="pln">for </span><span class="pun">$</span><span class="pln">i from </span><span class="lit">1</span><span class="pln"> through </span><span class="lit">3</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="pun">.</span><span class="pln">item-</span><span class="pun">#{$</span><span class="pln">i</span><span class="pun">}</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">100px</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="pun">$</span><span class="pln">i </span><span class="pun">*</span><span class="pln"> </span><span class="lit">50px</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<h3>
	4. التعليمات الشرطية
</h3>

<p>
	توفر Sass أيضًا إمكانية كتابة تعليمات شرطية مثل if و else بطريقة مماثلة لطريقة عملها في مختلف لغات البرمجة، وبهذه الطريقة تمكنك من تحقيق تنسيقات شرطية وتُنفذ التنسيقات المحددة فقط عند تحقق حالات معينة، على سبيل المثال يغير الكود التالي تنسيق العناصر في الوضع الليلي أو النهاري بحسب قيمة المتغير ‎<code>dark-theme$</code>.
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_2938_24" style=""><span class="pun">$</span><span class="kwd">dark-theme</span><span class="pun">:</span><span class="pln"> true</span><span class="pun">;</span><span class="pln">

</span><span class="pun">@</span><span class="pln">if </span><span class="pun">$</span><span class="pln">dark-theme </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">color</span><span class="pun">:</span><span class="pln"> </span><span class="lit">#b3b3b3</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">font-weight</span><span class="pun">:</span><span class="pln"> </span><span class="lit">300</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">background-color</span><span class="pun">:</span><span class="pln"> </span><span class="lit">#333333</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">@</span><span class="pln">else </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">color</span><span class="pun">:</span><span class="pln"> </span><span class="lit">#333333</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">font-weight</span><span class="pun">:</span><span class="pln"> </span><span class="lit">400</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">background-color</span><span class="pun">:</span><span class="pln"> </span><span class="lit">#f5f5f5</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<h3>
	5. الدوال Functions
</h3>

<p>
	توفر لك Sass إمكانية تعريف دوال برمجية يمكنها استقبال وسطاء أو بارامترات وإرجاع قيمة معينة، وهذا يسهل تطبيق التنسيقات على العناصر وإعادة استخدامها في أكواد التنسيق الخاصة بك. على سبيل المثال نعرف في الكود التالي دالة باسم add-numbers تستقبل وسيطين هما ‎<code>first-number$</code> و ‎<code>second-number$</code>. وترجع مجموعهما:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_2938_26" style=""><span class="pun">@</span><span class="pln">function add-numbers</span><span class="pun">($</span><span class="pln">first-number</span><span class="pun">,</span><span class="pln"> </span><span class="pun">$</span><span class="pln">second-number</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="pun">@</span><span class="pln">return </span><span class="pun">$</span><span class="pln">first-number </span><span class="pun">+</span><span class="pln"> </span><span class="pun">$</span><span class="pln">second-number
</span><span class="pun">}</span></pre>

<p>
	بعد تعريف هذه الدالة يمكننا استخدامها في كتابة قواعد التنسيق، لنفرض مثلًا أننا نريد استبدال قيمة الخاصية <code><a href="https://wiki.hsoub.com/CSS/padding" rel="external">padding</a> </code>بمجموع قيمتين منفصلتين، سنستدعي الدالة ونمرر لها قيم الوسطاء بهذا الشكل:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_2938_28" style=""><span class="pun">.</span><span class="pln">box1 </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">padding</span><span class="pun">:</span><span class="pln"> add-numbers</span><span class="pun">(</span><span class="lit">20px</span><span class="pun">,</span><span class="pln"> </span><span class="lit">10px</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	ولتفهم الأمر أكثر سيكون CSS الناتج عن تحويل الكود أعلاه على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_2938_30" style=""><span class="pln">box1 </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">30px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<h3>
	6. المخاليط mixins
</h3>

<p>
	تمثل المخاليط mixins في Sass قوالب تحتوي على خليط أو تجمّع لعدة خصائص CSS متكررة بحيث يمكنك إعادة استخدامها في أماكن متعددة داخل الكود .ولتعريف مزيج في Sass نكتب كالتالي:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5013_21" style=""><span class="pun">@</span><span class="pln">mixin name </span><span class="pun">{</span><span class="pln">
    properties</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	ولاستداعئه نكتب كود كالتالي:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5013_23" style=""><span class="pln">element </span><span class="pun">{</span><span class="pln">
    </span><span class="pun">@</span><span class="pln">include name</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	لنوضح الأمر بمثال عملي، لاحظ في المثال التالي كيف عرّفنا خليط وأسميناه <code>button-styles</code> ووظيفته هي تعريف مجموعة من خصائص التنسيق للأزرار مثل لون الزر والخط المستخدم في الكتابة عليه وحجمه وغيرها من الخصائص:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_2938_36" style=""><span class="pun">@</span><span class="pln">mixin button-styles</span><span class="pun">($</span><span class="pln">background-color</span><span class="pun">,</span><span class="pln"> </span><span class="pun">$</span><span class="pln">text-color</span><span class="pun">,</span><span class="pln"> </span><span class="pun">$</span><span class="pln">font-size</span><span class="pun">,</span><span class="pln"> </span><span class="pun">$</span><span class="pln">padding</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">background-color</span><span class="pun">:</span><span class="pln"> </span><span class="pun">$</span><span class="pln">background-color</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">color</span><span class="pun">:</span><span class="pln"> </span><span class="pun">$</span><span class="pln">text-color</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">font-size</span><span class="pun">:</span><span class="pln"> </span><span class="pun">$</span><span class="pln">font-size</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">padding</span><span class="pun">:</span><span class="pln"> </span><span class="pun">$</span><span class="pln">padding</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">border</span><span class="pun">:</span><span class="pln"> none</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">border-radius</span><span class="pun">:</span><span class="pln"> </span><span class="lit">5px</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">cursor</span><span class="pun">:</span><span class="pln"> pointer</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">transition</span><span class="pun">:</span><span class="pln"> background-color </span><span class="lit">0.3s</span><span class="pln"> ease</span><span class="pun">;</span></pre>

<p>
	بعدها يمكننا بسهولة استخدام هذا الخليط من القيم في تنسيق أي زر في الموقع وليكن الزر الذي يملك الصنف <code>button-primary.</code> من خلال كتابة التعليمة <code>include@ </code>وتمرير القيم المناسبة للمتغيرات كما يلي:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_2938_38" style=""><span class="pun">.</span><span class="pln">button-primary </span><span class="pun">{</span><span class="pln">
 </span><span class="pun">@</span><span class="pln">include button-styles</span><span class="pun">(#</span><span class="lit">3498db</span><span class="pun">,</span><span class="pln"> </span><span class="lit">#ffffff</span><span class="pun">,</span><span class="pln"> </span><span class="lit">16px</span><span class="pun">,</span><span class="pln"> </span><span class="lit">10px</span><span class="pln"> </span><span class="lit">20px</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	كما يمكن تنسيق زر آخر وليكن الزر الذي يملك الصنف <code>button-secondary.</code>بتمرير قيم مختلفة على هذا النحو:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_2938_40" style=""><span class="pun">.</span><span class="pln">button-secondary </span><span class="pun">{</span><span class="pln">
 </span><span class="pun">@</span><span class="pln">include button-styles</span><span class="pun">(#</span><span class="lit">2ecc71</span><span class="pun">,</span><span class="pln"> </span><span class="lit">#ffffff</span><span class="pun">,</span><span class="pln"> </span><span class="lit">14px</span><span class="pun">,</span><span class="pln"> </span><span class="lit">8px</span><span class="pln"> </span><span class="lit">16px</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	بهذه الطريقة أعدنا استخدام مجموعة الخصائص وطبقناها على أنماط متعددة بسهولة وبحجم كود قليل جدًا مقارنة بالكود المكافئ الذي سنكتبه بلغة CSS.
</p>

<h3>
	7. ميزة الأكواد المتشعبة Nesting
</h3>

<p>
	لا تسمح CSS بالعمل مع التداخلات في الكود، بينما تمكننا Sass من كتابة أكواد متشعبة وفق تسلسل هرمي، لاحظ الكود التالي المكتوب بلغة CSS:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_2938_42" style=""><span class="pun">.</span><span class="pln">header </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">background-color</span><span class="pun">:</span><span class="pln"> </span><span class="lit">#333</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">.</span><span class="pln">header h1 </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">color</span><span class="pun">:</span><span class="pln"> white</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">.</span><span class="pln">header p </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">font-size</span><span class="pun">:</span><span class="pln"> </span><span class="lit">16px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	يمكن كتابته بكود Sass مكافئ باستخدام ميزة التضمين داخل المحدد <code>header.</code> كما يلي:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5413_8" style=""><span class="pun">.</span><span class="pln">header </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">background-color</span><span class="pun">:</span><span class="pln"> </span><span class="lit">#333</span><span class="pun">;</span><span class="pln">
  h1 </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">color</span><span class="pun">:</span><span class="pln"> white</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
  p </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">font-size</span><span class="pun">:</span><span class="pln"> </span><span class="lit">16px</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	هذا يعني أن جميع قواعد لغة CSS التي تظهر داخل <code>header.</code> تنطبق على العناصر داخل <code>header.</code> فقاعدة <code>h1</code> هنا سنطبق على العناصر <code>h1</code> الموجودة داخل عنصر يملك الصنف <code>header.</code>فقط، وقاعدة  <code>p</code> ستنطبق على العناصر <code>p</code> الموجودة داخل عنصر له الصنف <code>header.</code> فقط، والكتابة بهذا الأسلوب كما تلاحظ تجعل الكود أكثر تنظيمًا وسهولة في القراءة.
</p>

<p>
	كانت هذه أهم أساسيات لغة Sass، ولمطالعة المزيد حول أساسيات Sass ننصحك بمشاهدة الفيديو التالي:
</p>

<p>
	<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" frameborder="0" height="495" id="ips_uid_444_6" referrerpolicy="strict-origin-when-cross-origin" src="https://academy.hsoub.com/applications/core/interface/index.html" title="أساسيات استخدام Sass" width="880" data-embed-src="https://www.youtube.com/embed/dZxcSy6IDYo"></iframe>
</p>

<p>
	 
</p>

<h2>
	مميزات Sass
</h2>

<p>
	توفر لنا لغة Sass مجموعة من المميزات من أبرزها:
</p>

<ul>
	<li>
		توفر لغة Sass مرونة في كتابة تنسيقات عناصر الموقع.
	</li>
	<li>
		 إمكانية حفظ قيم التنسيقات في متغيرات بدلاً من استخدام قيم محددة.
	</li>
	<li>
		تُمكنك من توليد شيفرة منظمة وسهلة الفهم والصيانة.
	</li>
	<li>
		 تُمكنك من توليد شيفرة قابلة لإعادة الاستخدام وتجنب تكرار الكود.
	</li>
	<li>
		سهلة الصيانة والتعديل حيث يتم التعديل في مكان واحد بدلاً من عدة أماكن.
	</li>
	<li>
		سهلة التعلم لا سيما إذا كنت ملمًا بأساسيات لغة CSS.
	</li>
	<li>
		متوافقة مع جميع إصدارات CSS ويمكنك استخدام أي مكتبات CSS متاحة.
	</li>
</ul>

<h2>
	عيوب Sass
</h2>

<p>
	من بين عيوب أو سلبيات لغة Sass نذكر التالي:
</p>

<ul>
	<li>
		 لا يمكن تنفيذ أكواد Sass مباشرة بل يجب ترجمة الكود المكتوب إلى CSS قبل استخدامه، مما يضيف خطوة إضافية لعملية التطوير.
	</li>
	<li>
		عند إجراء أي تغييرات في تنسيق الموقع تحتاج من جديد لترجمة التغييرات.
	</li>
	<li>
		صعوبة التصحيح فقد تؤدي الترجمة إلى ظهور أخطاء وتجعل عملية التصحيح أصعب
	</li>
	<li>
		قد يستغرق تعلم استخدام مميزات Sass والتآلف معها لبعض الوقت.
	</li>
</ul>

<h2>
	تعلم Sass
</h2>

<p>
	إذا كنت مهتمًا بتعلم لغة Sass واحتراف التعامل مع شيفراتها البرمجة فإليك مجموعة من الخطوات التي عليك اتباعها لتحقيق هذفك:
</p>

<ul>
	<li>
		تعلم طريقة تثبيت Sass حسب بيئة التطوير ونظام التشغيل الذي تستخدمه.
	</li>
	<li>
		تعلم أساسيات البرمجة والتفكير المنطقي فهي تساعدك على فهم مبادئ Sass.
	</li>
	<li>
		تعلم القواعد الصياغية ومبادئ وأساسيات Sass وتدرب على أمثلة تطبيقية بسيطة حولها.
	</li>
	<li>
		ابدأ بكتابة أكواد Sass بسيطة تتضمن مفاهيم أساسية مثل تعريف المتغيرات في Sass والتعليمات الشرطية والحلقات في Sass وغيرها من المفاهيم، وتحويلها إلى ملفات CSS وافهم آلية عملها.
	</li>
	<li>
		انتقل إلى كتابة أكواد أكثر تعقيدًا تتضمن الدوال وخليط الميزات وغيرها من المفاهيم المتقدمة.
	</li>
	<li>
		طبَّق كل ما تعلمته على مشاريع فعلية، فالفوائد الحقيقى ستظهر لك عند العمل على مشاريع أكبر وأكثر تعقيدًا.
	</li>
</ul>

<p>
	ستجد في أكاديمية حسوب الكثير من المصادر التعليمية التي تساعدك على تعلم لغات تطوير الواجهة الأمامية من دورس ومقالات وكتب متنوعة، كما توفر الأكاديمية دورة متكاملة تأخذ بيدك خطوة بخطوة لتتعلم كل التقنيات التي تحتاجها لتصبح مطور واجهات أمامية محترف مع التطبيق العملي لمشاريع متنوعة تساعدك على بناء معرض أعمال مميز وشهادة معتمدة في ختام الدورة تثبت خبرتك وتعزز فرصتك في الحصول على فرصة عمل.
</p>

<div class="banner-container ipsBox ipsPadding">
	<div class="inner-banner-container">
		<p class="banner-heading">
			دورة تطوير واجهات المستخدم
		</p>

		<p class="banner-subtitle">
			ابدأ عملك الحر بتطوير واجهات المواقع والمتاجر الإلكترونية فور انتهائك من الدورة
		</p>

		<div>
			<a class="ipsButton ipsButton_large ipsButton_primary ipsButton_important" href="https://academy.hsoub.com/learn/front-end-web-development/" rel="">اشترك الآن</a>
		</div>
	</div>

	<div class="banner-img">
		<a href="https://academy.hsoub.com/learn/front-end-web-development/" rel=""><img alt="دورة تطوير واجهات المستخدم" src="https://academy.hsoub.com/learn/assets/images/courses/front-end-web-development.png"></a>
	</div>
</div>

<h2>
	الخلاصة
</h2>

<p>
	أرجو أن يكون هذا المقال قد وضح لك ماذا تعني Sass وكيفية التعامل معها واستخدامها لتحسين وتسريع عملية تنسيق صفحات المواقع بدل استخدام لغة CSS القياسية، ووضح لك أهم الفروقات بين Sass و SCSS و Less وكيفية استخدام كل منهما وما هي أهم خطوات تعلمها. إذا كان لديك سؤال حول هذه التقنية المفيدة في تصميم الواجهات الأمامية يمكنك تركه في قسم التعليقات أسفل المقال أو كتابته في <a href="https://academy.hsoub.com/questions/" rel="">قسم الأسئلة والأجوبة في أكاديمية حسوب</a>.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://wiki.hsoub.com/Sass" rel="external">توثيق Sass باللغة العربية</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/sass/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-sass-r8/" rel="">مدخل إلى Sass</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/sass/%D8%A3%D9%85%D8%AB%D9%84%D8%A9-%D9%84%D8%A8%D8%B9%D8%B6-%D8%A7%D9%84%D8%AF%D9%88%D8%A7%D9%84-%D8%A7%D9%84%D9%85%D8%B3%D8%A7%D8%B9%D8%AF%D8%A9-mixins-%D8%B9%D9%86%D8%AF-%D9%83%D8%AA%D8%A7%D8%A8%D8%A9-css-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-sass-r219/" rel="">أمثلة لبعض الدوال المساعدة (mixins) عند كتابة CSS باستخدام SASS</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/sass/%D9%84%D8%A7-%D8%AA%D9%83%D8%B1%D9%91%D8%B1-%D9%86%D9%81%D8%B3%D9%83-dry-%D8%A3%D8%B9%D8%AF-%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%AF%D9%88%D8%A7%D9%84%D9%91-sass-%D8%A7%D9%84%D8%AA%D9%8A-%D9%83%D8%AA%D8%A8%D8%AA%D9%87%D8%A7-r50/" rel="">لا تكرّر نفسك (DRY): أعد استخدام دوالّ Sass التي كتبتها</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2288</guid><pubDate>Mon, 01 Apr 2024 12:00:00 +0000</pubDate></item><item><title>[&#x641;&#x64A;&#x62F;&#x64A;&#x648;] &#x623;&#x633;&#x627;&#x633;&#x64A;&#x627;&#x62A; &#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; Sass</title><link>https://academy.hsoub.com/programming/css/sass/%D9%81%D9%8A%D8%AF%D9%8A%D9%88-%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-sass-r1346/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2021_10/616ecf352cf00_--Sass.png.eb47f85aae1564b05c7566ecb23506a6.png" /></p>

<p>
	<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/dZxcSy6IDYo" title="YouTube video player" width="560"></iframe>
</p>

<p>
	يشرح الفيديو لغة <a href="https://wiki.hsoub.com/Sass" rel="external">Sass</a> التي هي أساسًا امتداد للغة CSS، حيث يوضح الفيديو ميزاتها وفوائد استخدامها، إلى جانب الفرق بينها وبين <a href="https://academy.hsoub.com/programming/css/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A7%D8%B3%D8%AA%D8%B9%D9%85%D8%A7%D9%84-%D9%84%D8%BA%D8%A9-css-r1049/" rel="">CSS</a>.
</p>
]]></description><guid isPermaLink="false">1346</guid><pubDate>Wed, 20 Oct 2021 07:14:22 +0000</pubDate></item><item><title>&#x623;&#x645;&#x62B;&#x644;&#x629; &#x644;&#x628;&#x639;&#x636; &#x627;&#x644;&#x62F;&#x648;&#x627;&#x644; &#x627;&#x644;&#x645;&#x633;&#x627;&#x639;&#x62F;&#x629; (mixins) &#x639;&#x646;&#x62F; &#x643;&#x62A;&#x627;&#x628;&#x629; CSS &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; SASS</title><link>https://academy.hsoub.com/programming/css/sass/%D8%A3%D9%85%D8%AB%D9%84%D8%A9-%D9%84%D8%A8%D8%B9%D8%B6-%D8%A7%D9%84%D8%AF%D9%88%D8%A7%D9%84-%D8%A7%D9%84%D9%85%D8%B3%D8%A7%D8%B9%D8%AF%D8%A9-mixins-%D8%B9%D9%86%D8%AF-%D9%83%D8%AA%D8%A7%D8%A8%D8%A9-css-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-sass-r219/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_12/mixins-sass.png.3a14a333b038c4deb951e23ceec1c809.png" /></p>

<div id="wmd-preview-section-17"><p><strong>SASS</strong> و <strong>Compass</strong> هما أداتان تساعدانك على كتابة شيفرة CSS أفضل وبشكل أسرع، ويوجد بهما ما يسمى بالـ<strong>mixins</strong> وهناك أيضًا الدّوال (functions). </p><p style="text-align: center;"><a href="https://academy.hsoub.com/uploads/monthly_2015_12/mixins-sass.png.e69dc75cbca211448b331c118b492f03.png" class="ipsAttachLink ipsAttachLink_image"><img data-fileid="9825" src="https://academy.hsoub.com/uploads/monthly_2015_12/mixins-sass.thumb.png.e2174b358b862345d46fcfa4e1ac5177.png" class="ipsImage ipsImage_thumbnailed" alt="mixins-sass.thumb.png.e2174b358b862345d4"></a></p><p>الـ<strong>mixins</strong> والدّوال ببساطة هي مجموعة من شيفرة CSS التي تقوم بتعريفها/كتابتها مرة واحدة وبعدها يمكنك استخدامها في أي مكان تريده. </p><p>الفرق بين الـ<strong>mixin</strong> والدالة هو أن الأولى تقوم بمناداتها باستخدام <span style="font-family:courier new,courier,monospace;">include@</span> وبعدها يتم ادخال الشيفرة الموجود بها في المكان الذي تمت مناداتها فيه، أما الدالة فلا تحتاج لكتابة كلمة معينة لمناداتها وتقوم بإرجاع قيمة معينة. يمكنك أن تقرأ المزيد حول الفرق بينهما <a rel="external nofollow" href="http://thesassway.com/advanced/pure-sass-functions">من هنا</a>. </p><p><strong>Compass</strong> هي مكتبة تحتوي على مجموعة من الـ<strong>mixins</strong> الخاصة بـ<a href="https://academy.hsoub.com/programming/css/sass/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-sass-r8/">SASS</a> وبها العديد من الأمور المفيدة مثل<span style="font-family:courier new,courier,monospace;"> border-radius</span> و <span style="font-family:courier new,courier,monospace;">box-shadow</span>. ولكن يمكنك بكل تأكيد أن تقوم بإنشاء <strong>mixins</strong> ودوال خاصة بك، وهذه بعضها والتي أقوم باستخدامها في كل مشروع أعمل عليه.</p></div><div id="wmd-preview-section-18"><h2 id="تأثير-أبيض-وأسود">تأثير أبيض وأسود</h2><p>لنقل أنك تريد نصًا بلون أبيض وبشفافية 90% على خلفية سوداء بشفافية 15%. في حالة كتابة شيفرة CSS كالمعتاد سيكون لديك شيء كهذا:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.my-class{ 
  background:rgba(0,0,0,0.15); 
  color:rgba(255,255,255,0.9); 
}</pre><p>ولكن مع SASS يمكننا كتابة دالتين مفيدتين كالتالي:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">@function black($opacity){ 
  @return rgba(0,0,0,$opacity) 
} 

@function white($opacity){ 
  @return rgba(255,255,255,$opacity) 
}</pre><p>الآن كل ما سنحتاج لكتابته هو:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.my-class{ 
  background:black(0.15); 
  color:white(0.9); 
}</pre><p>فكما ترى هذا سيوفر علينا بعض الوقت والجهد في كتابة شيفرة CSS اعتيادية ويمكننا كذلك أن نستخدم تلك الدوال في أي مكان نريده حتى نخرج بنفس النتيجة.</p></div><div id="wmd-preview-section-22"><h2 id="تأثيرا-emboss-وletterpress">تأثيرا Emboss وLetterpress</h2><p>صحيح أن عالم التصميم أصبح يبتعد عن التصاميم المزخرفة التي تجعل الأشياء تبدو شبه حقيقة وذلك بسبب ظهور <a href="https://academy.hsoub.com/design/general/%D9%87%D9%84-%D8%A7%D9%84%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D8%A7%D9%84%D9%85%D8%B3%D8%B7%D8%AD-flat-design-%D9%85%D8%B9%D9%8A%D8%A7%D8%B1%D9%8C-%D9%88%D9%8F%D8%AC%D9%90%D8%AF-%D9%84%D9%8A%D8%AF%D9%88%D9%85%D8%9F-r45">التصميم المسطح</a>، إلّا أنّك في بعض الأحيان تحتاج إلى بعض الظلال أو شيء من هذا القبيل في تصاميمك. </p><p>المشكلة الوحيدة هي أنّ الظلال في CSS ليست بتلك الجودة وسهولة الاستخدام، ولذلك فإنّ Compass تحتوي على mixin تحمل الاسم<span style="font-family:courier new,courier,monospace;"> box-shadow</span> لتسهل علينا استخدامها، ومع ذلك أعتقد أنه يمكننا أن نقوم بإنشاء شيء أفضل. </p><p>إذا قمت بتصفح موقع Dribbble فسوف ترى أن 90% من التصاميم التي تحتوي على ظلال تكون تقريبًا بنفس النوع، بحيث يكون هناك خطين بحجم 1px موضوعين أسفل وأعلى التصميم لإعطاء المستخدم انطباعًا وكأنّ ذلك الجزء من التصميم منقوش/محفور في التصميم. أنظر الى الصورة التالية لتفهم ما أعنيه: </p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_12/boxemboss.png.573074a94e48efe2a20b86407844d3e9.png"><img data-fileid="9822" class="ipsImage ipsImage_thumbnailed" alt="boxemboss.thumb.png.0e8a24be0a149fe22acd" src="https://academy.hsoub.com/uploads/monthly_2015_12/boxemboss.thumb.png.0e8a24be0a149fe22acd0f50b2ede964.png"></a></p><p>وهذه mixin بسيطة يمكنك استخدامها لإنشاء ذلك النوع من التأثيرات بسهولة:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">@mixin box-emboss($opacity, $opacity2){ 
  box-shadow:white($opacity) 0 1px 0, inset black($opacity2) 0 1px 0; 
}</pre><p>والآن كل ما عليك فعله للحصول على ذلك التأثير هو أن تقوم بالتالي:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.box{ 
  @include box-emboss(0.8, 0.05); 
}</pre><p>وهناك تأثير مشابه يسمى Letterpress وهو نفس التأثير السابق ولكن عندما يتم تطبيقه على النصوص، فالخط الأبيض لا يقوم فقط بالمساعدة في إنشاء ذلك التأثير وإنما يجعل النص مقروءًا أكثر. </p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_12/letterpress.png.029c60f78e9540d95115469d83d1f5f9.png"><img data-fileid="9823" class="ipsImage ipsImage_thumbnailed" alt="letterpress.thumb.png.aff996cfb9fb26033a" src="https://academy.hsoub.com/uploads/monthly_2015_12/letterpress.thumb.png.aff996cfb9fb26033a53a2f5de037b11.png"></a></p><p>وها هي الـmixin التي تقوم بذلك:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">@mixin letterpress($opacity){ 
  text-shadow:white($opacity) 0 1px 0; 
}
</pre></div><div id="wmd-preview-section-26"><h2 id="إخفاء-النصوص-واستبدال-الصور">إخفاء النصوص واستبدال الصور</h2><p>إلى الآن كل ما قمنا باستخدامه كان على العناصر والتأثيرات البصرية، ولكن الـmixins يمكنها أيضًا مساعدتنا في القيام ببعض الأمور المخفية والمتعبة في CSS. <br>فمن أحد الامثلة الشائعة هو استبدال النص بصورة باستخدام خاصية <span style="font-family:courier new,courier,monospace;">background</span> في CSS. عادةً يتم استبدال الشعارات (logos) والأزرار (buttons) باستخدام هذه الطريقة. </p><p>هذه هي الـmixin التي نريدها:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">@mixin hide-text{ 
  overflow:hidden; 
  text-indent:-9000px; 
  display:block; 
}</pre><p>ويمكن استخدامها هكذا:</p></div><div id="wmd-preview-section-27"><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.logo{ 
  background: url("logo.png"); 
  height:100px; 
  width:200px;   
  @include hide-text; 
}</pre><p>وكما هو الحال في كل شيء متعلق بتطوير الويب فإن المتصفحات تتطور أيضًا وتحدث تغيرات كثيرة بسرعة. فالطريقة الموضحة بالأعلى يمكننا استبدالها بطريقة أفضل ويمكنك قراءة <a rel="external nofollow" href="http://nicolasgallagher.com/another-css-image-replacement-technique/">هذه المقالة</a> للتعرف على هذه الطريقة. <br><br>تخيّل لو أننا أردنا أن نقوم باستبدال الطريقة الأولى بالثانية فقط باستخدام CSS الاعتيادي، فعندها كنا سنحتاج إلى أن نقوم باستبدال جميع الشيفرات يدويًا، أمّا مع الـmixin فإنه يمكننا ببساطة تغيير محتويات الـmixin أو التعديل عليها وسوف ينطبق التعديل/التغيير على جميع الشيفرات وفي جميع الأماكن التي استخدمنا فيها الـmixin. </p><p>أنظر إلى نفس الـmixin الموجود في الأعلى ولكن بتغيير محتوياته إلى الطريقة الثانية (الموجودة في المقال الذي وضعت رابطه بالأعلى):</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">@mixin hide-text{ 
  font: 0/0 a; 
  text-shadow: none; 
  color: transparent; 
}
</pre></div><div id="wmd-preview-section-30"><h2 id="قوائم-التنقل-الأفقية-horizontal-navigations">قوائم التنقل الأفقية (horizontal navigations)</h2><p>شيء آخر نستخدمه كثيرًا وهو استخدام عناصر <span style="font-family:courier new,courier,monospace;">ul</span> و <span style="font-family:courier new,courier,monospace;">li</span> لبناء القوائم الأفقية، وهذا في العادة يحتاج منا أن نقوم بتجريد هذه العناصر من بعض تنسيقاتها لنضع تنسيقات خاصة بنا ومفيدة أكثر وحتى نستطيع أيضًا أن نجعل عناصر القائمة تظهر بجانب بعضها بشكل أفقي. </p><p>فبدلًا من كتابة الشيفرة في كل مرة ولكل قائمة فإننا نستخدم mixin كالتالي:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">@mixin navigation-list { 
  list-style-type:none; 
  padding:0; 
  margin:0; 
  overflow:hidden; 
  &gt; li{ 
    display:block; 
    float:left; 
    &amp;:last-child{ margin-right:0px; } 
  } 
}</pre><p>يمكنك أن ترى من هذه الـmixin مبدئين من مبادئ الـSASS وهما القواعد المتداخلة (nested rules) وإشارة "&amp;". </p><p>القواعد المتداخلة تعني أنك لن تحتاج إلى كتابة العنصر الأب في كل مرة، فمثلًا الشيفرة التالية:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">ul{ 
  color:red; 
} 

ul li{ 
  font-weight:bold; 
}</pre><p>يمكن كتابتها هكذا:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">ul{ 
  color:red; 
  li{ 
    font-weight:bold; 
  } 
}</pre><p>وإشارة "&amp;" هي عبارة عن اختصار للعنصر الحالي، ففي الشيفرة التالية تدل إشارة "&amp;" على العنصر "<span style="font-family:courier new,courier,monospace;">a.my-link</span>":</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">a.my-link{ 
  color:red; 
  &amp;:hover{ 
    color:blue; 
  } 
}</pre><p>وبالعودة إلى مثال القائمة يمكنك أن ترى كيف أنّ mixin واحدة يمكنها التأثير على أكثر من عنصر في نفس الوقت، وعندما تقوم بدمجها مع اشارة "&amp;" فتستطيع عندها القيام بالكثير من الأمور المفيدة والرائعة. </p><p>ترجمة -وبتصرّف- للمقال <a rel="external nofollow" href="http://sachagreif.com/useful-sass-mixins/">Useful SASS Mixins</a> لصاحبه Sacha Greif.</p></div>
]]></description><guid isPermaLink="false">219</guid><pubDate>Mon, 21 Dec 2015 22:46:33 +0000</pubDate></item><item><title>&#x625;&#x646;&#x634;&#x627;&#x621; &#x62A;&#x623;&#x62B;&#x64A;&#x631; &#x642;&#x637;&#x631;&#x627;&#x62A; &#x645;&#x637;&#x631; &#x639;&#x644;&#x649; &#x646;&#x627;&#x641;&#x630;&#x629; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; CSS &#x641;&#x642;&#x637; &#x639;&#x628;&#x631; HAML &#x648;Sass</title><link>https://academy.hsoub.com/programming/css/sass/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D8%AA%D8%A3%D8%AB%D9%8A%D8%B1-%D9%82%D8%B7%D8%B1%D8%A7%D8%AA-%D9%85%D8%B7%D8%B1-%D8%B9%D9%84%D9%89-%D9%86%D8%A7%D9%81%D8%B0%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-css-%D9%81%D9%82%D8%B7-%D8%B9%D8%A8%D8%B1-haml-%D9%88sass-r135/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_08/css-only-rain-drops.jpg.9172fbbe1c3e714a24014f5d726055bc.jpg" /></p>

<div id="wmd-preview-section-16"><p id="إنشاء-تأثير-قطرات-مطر-على-نافذة-باستخدام-css-فقطكيف-تقوم-بإنشاء-تأثير-قطرات-مطر-على-نافذة-باستخدام-css-فقط">إن إنشاء عروض وتصاميم باستخدام أوراق الأنماط المُتتالية CSS ليس بالأمر الجلل بحدّ ذاته، ولكنّها وسيلة جيّدة لاستعراض قدرات وإمكانيات CSS، وتجربة أدوات ومفاهيم جديدة، أو للتدريب على العمل ضمن شروط وقيود مُحدّدة، حيثُ سيُلقي هذا المقال نظرةً على كيفيّة إنشاء تأثير قطرات مطر (raindrops) على نافذة وذلك باستخدام تقنيات <a rel="external nofollow" href="http://haml.info/">HAML</a> و <a rel="external nofollow" href="http://sass-lang.com/">SASS</a>.</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_07/raindrops-nofilter-optimized-700x370.png.e5147b91e960cb3de16d49e1c32f80cc.png"><img data-fileid="3461" class="ipsImage ipsImage_thumbnailed" alt="raindrops-nofilter-optimized-700x370.thu" src="https://academy.hsoub.com/uploads/monthly_2015_07/raindrops-nofilter-optimized-700x370.thumb.png.f1b033e79f8aa2a801d13bb681bfeb4f.png"></a></p><p>يُمكن استعراض مثال كامل لفكرة الدرس على موقع <a rel="external nofollow" href="http://codepen.io/lbebber/pen/ZGGNvZ">CodePen</a> مع الشيفرة الخاصّة به.</p></div><div id="wmd-preview-section-17"><h2 id="المعالج-التمهيدي-preprocessor">المعالج التمهيدي (Preprocessor)</h2><p>سيتمّ أوّلًا وقبل كل شيء توضيح لماذا سيتمّ استخدام تقنيتي HAML/SASS بدلًا من الزوج الشائع HTML/CSS، ومع العلم أنّهما يتمتعان بالعديد من المزايا والتسهيلات ولكن السبب في الحاجة إلى معالجات تمهيديّة هنا هو أنها تسمح للمطوّر باستخدام المُتغيّرات، إنشاء حلقات تكراريّة (loops)، وتوليد قيم عشوائيّة، وبذلك لن يتمّ التعامل مع المئات من قطرات المطر بشكل منفصل بل سيتمّ إنشاؤها برمجيًّا.</p><p>يُمكن الاستزادة حول الإعداد الأوّلي والصياغة (syntax) من خلال زيارة موقع كل تقنيّة سواءً SCSS أو HAML، أو من المُمكن مبدئيًّا تطبيق الدرس على موقع <a rel="external nofollow" href="http://codepen.io/">CodePen</a>، من خلال إنشاء pen جديد واختيار SCSS كمُعالج تمهيدي لـِ CSS و HAML من أجل HTML.</p></div><div id="wmd-preview-section-18"><h2 id="إنشاء-النافذة">إنشاء النافذة</h2><p>ستكون الخطوة الأولى هي عرض النافذة نفسها.</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.container .window 
// صورة الخلفية
$image: 'http://i.imgur.com/xQdYC7x.jpg'; 

// عرض وطول الحاوية 
$width:100vw; 
$height:100vh; 

.container{ 
    position:relative; 
    width:$width; 
    height:$height; 
    overflow:hidden; } 
.window{ 
    position:absolute; 
    width:$width; 
    height:$height; 
    background:url($image); 
    background-size:cover; 
    background-position:50%; 
    filter:blur(10px); }</pre><p>تمّ في الشيفرة السابقة وبكل بساطة رسم <span style="font-family:courier new,courier,monospace;">div</span> مع <a href="https://academy.hsoub.com/code/css/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%AA%D9%8E%D9%85%D9%88%D8%B6%D9%8F%D8%B9-%D8%A7%D9%84%D8%AE%D9%84%D9%81%D9%8A%D9%91%D8%A9-background-positioning-%D9%81%D9%8A-css-r81/">صورة خلفيّة</a> (background image)، وتطبيق مُرشح غشاوة (blur) عليها لكي تُصبح القطرات جليّة أكثر للناظر.</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_07/window-optimized-700x375.png.43522c521605fd1bc5527995701f9994.png"><img data-fileid="3464" class="ipsImage ipsImage_thumbnailed" alt="window-optimized-700x375.thumb.png.e9200" src="https://academy.hsoub.com/uploads/monthly_2015_07/window-optimized-700x375.thumb.png.e9200b19b76c86cc38c492ef06d4d588.png"></a></p><p>يُلاحظ كيف أنّه تمّ تخزين مسار (URL) صورة الخلفيّة في مُتغيّر <span style="font-family:courier new,courier,monospace;">image$</span>، وذلك لأنه سيتمّ استخدام ذات الصورة للقطرات نفسها كما سيتّضح ذلك فيما بعد.</p></div><div id="wmd-preview-section-19"><h2 id="قطرات-المطر-في-الطبيعة">قطرات المطر في الطبيعة</h2><p>سيتمّ إلقاء نظرة على القطرة وكيف تبدو في الحياة الطبيعيّة قبل الشروع في تطبيق التأثير.</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_07/real-700x375.jpg.3c2e9a23f75907d76f2cd8d2ef7bc5c7.jpg"><img data-fileid="3462" class="ipsImage ipsImage_thumbnailed" alt="real-700x375.thumb.jpg.8b6962d7fe990ae27" src="https://academy.hsoub.com/uploads/monthly_2015_07/real-700x375.thumb.jpg.8b6962d7fe990ae27681272e0d132013.jpg"></a></p><p>يعود مصدر الصورة إلى <a rel="external nofollow" href="http://en.wikipedia.org/wiki/File:Water_Droplets_Background.JPG">موسوعة ويكيبيديا</a>.</p><p>ستَقلب القطرة الصورة الّتي خلفها بمقتضى انكسار الضوء، كما سيكون للقطرة حدودًا (border) سوداء عندما يكون شكلها نصف كرويّ كامل أو غير كامل.</p></div><div id="wmd-preview-section-20"><h2 id="إنشاء-قطرات-المطر-raindrops">إنشاء قطرات المطر (Raindrops)</h2><p>سيتمّ في الخطوة التّالية إنشاء قطرة مطر واحدة بعد أن تمّ معرفة الأساسيات.</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.container .window .raindrop $drop-width:15px; 
// قطرات المطر لن تكون دائرية تماما لذلك سنقوم بتمديدها قليلا 
// حتى لا تتمدد الخلفية أيضا transform:scale لن نستخدم
$drop-stretch:1.1; 
$drop-height:$drop-width*$drop-stretch; 
.raindrop{ 
    position:absolute; 
    top:$height/2; 
    left:$width/2; 
    width:$drop-width; 
    height:$drop-height; 
    // border-radius:100% بدلا من border-radius:100px, حتى يكون شكل قطرات المطر بيضاوي وليس كبسولي
    border-radius:100%; 
    background-image:url($image); 
    background-size:$width*0.05 $height*0.05; 
    transform:rotate(180deg); }</pre><p>ما تمّ عمله في الشيفرة السابقة هو رسم <span style="font-family:courier new,courier,monospace;">div</span> على شكل إهليلجي (بيضاوي)، وتطبيق صورة خلفيّة (background image) داخله، وهي نفس الصورة المُستخدمة سابقًا، وبعد ذلك تم تقليص حجم الخلفيّة ومن ثم قلب القطرة رأسًا على عقب.</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_07/borderless-optimized-700x374.png.a2d72d2941e4a1663318e584e5844998.png"><img data-fileid="3459" class="ipsImage ipsImage_thumbnailed" alt="borderless-optimized-700x374.thumb.png.f" src="https://academy.hsoub.com/uploads/monthly_2015_07/borderless-optimized-700x374.thumb.png.f9d15134958e3242cb9bafb76cbb67e3.png"></a></p><p>سيتمّ الآن إضافة حدودًا حول القطرة، لتبدو القطرة وكأن لها حجمًا.</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">... 
.border .raindrop 
... 
.border{ 
    position:absolute; 
    top:$height/2; 
    left:$width/2; 
    margin-left:2px; 
    margin-top:1px; 
    width:$drop-width - 4; 
    height:$drop-height; 
    border-radius:100%; 
    box-shadow:0 0 0 2px rgba(0,0,0,0.6); }</pre><p>يُلاحظ كيف أنّه لم يتمّ إضافة حدودًا كاملة حول القطرة، بل التعديل على مكانها والضغط على جانبيها قليلًا لتبدو أقرب إلى القطرة الطبيعيّة.</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_07/bordered-optimized-700x374.png.c162fac27a1257d7138aae51be946cd9.png"><img data-fileid="3458" class="ipsImage ipsImage_thumbnailed" alt="bordered-optimized-700x374.thumb.png.a20" src="https://academy.hsoub.com/uploads/monthly_2015_07/bordered-optimized-700x374.thumb.png.a2075a6f87ef85253e38e4fd3f9204bf.png"></a></p><p>سيتمّ في الخطوة التّالية إضافة المئات من هذه القطرات وذلك بعد الانتهاء من استكمال رسم القطرة الأولى على أكمل وجه.</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">... 
.raindrops .borders - (1..100).each do .border .drops - (1..100).each do .raindrop</pre><p>إن الشيفرة السابقة ما هي إلا شيفرة HAML في صياغة حلقة تكرار (loop)، فكل ما تمّ عمله هو إضافة مئة كائن من <span style="font-family:courier new,courier,monospace;">raindrop.</span>و مثلها للكائن <span style="font-family:courier new,courier,monospace;">border.</span></p><p>سيتمّ إلقاء نظرة مُفصّلة على شيفرة SASS بما أنّها مُحيّرة بعض الشيء.</p><p>سيتمّ بدايةً إنشاء الحلقة التكراريّة (loop) ومن ثُمّ اختيار كل عنصر (element) بشكل منفصل:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">@for $i from 1 through 100{ 
    .raindrop:nth-child(#{$i}){ } 
    .border:nth-child(#{$i}){ } 
}</pre><p>سيتمّ الآن توليد وتطبيق تَمَوْضُعات (positions) وأحجام عشوائية لقطرات المطر:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">@for $i from 1 through 200{ 
    //توليد رقم عشوائي من 0 إلى 1 لإختيار التموضع 
    $x:random(); 
    $y:random(); 
    // إختيار حجم وتمديد قطرة المطر عشوائيا 
    // بما أن لكل قطرة مطر حجم مختلف، سنقوم بحساباتنا هنا
    .raindrop selector $drop-width:5px+random(11); 
    $drop-stretch:0.7+(random()*0.5); 
    $drop-height:$drop-width*$drop-stretch; 
    .raindrop:nth-child(#{$i}){ 
        // ضرب قيمة الموضع العشوائي في حجم الحاوية
        left:$x * $width; 
        top:$x * $height; 
        width:$drop-width; 
        height:$drop-height; 
    } 
    .border:nth-child(#{$i}){ 
        // سنقوم بنفس الشيء لحدود القطرة 
        left:$x * $width; 
        top:$x * $height; 
        width:$drop-width - 4; 
        height:$drop-height; 
    } 
}</pre><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_07/raindrops-nopos-optimized-700x370.png.4b3f051a37c42173ede4d0784d0a9c05.png"><img data-fileid="3463" class="ipsImage ipsImage_thumbnailed" alt="raindrops-nopos-optimized-700x370.thumb." src="https://academy.hsoub.com/uploads/monthly_2015_07/raindrops-nopos-optimized-700x370.thumb.png.2c37856de29eec17f0782d3541901035.png"></a></p><p>سيتمّ أخيرًا تغيير تموضع خلفيّة كل قطرة بحسب تموضع القطرة، ليكون تأثير الانعكاس أكثر جمالًا.</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">... 
.raindrop:nth-child(#{$i}){ 
    ... 
    background-position:percentage($x) percentage($y); 
} 
...</pre><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_07/raindrops-nofilter-optimized-700x370.png.e5147b91e960cb3de16d49e1c32f80cc.png"><img data-fileid="3461" class="ipsImage ipsImage_thumbnailed" alt="raindrops-nofilter-optimized-700x370.thu" src="https://academy.hsoub.com/uploads/monthly_2015_07/raindrops-nofilter-optimized-700x370.thumb.png.f1b033e79f8aa2a801d13bb681bfeb4f.png"></a></p><p>سيكون بذلك قد تمّ الانتهاء من إنشاء التأثير الرئيسي، ولكن بالإمكان التعديل والتحسين عليه، وذلك من خلال الاهتمام ببعض التفاصيل الصغيرة، مثل زيادة السطوع (brightness) للقطرات قليلًا لتبدو صافية وذات لمعة، أو تغيير التركيز البصري ليكون على الخلفيّة بدلًا من القطرات، أو رُبّما تغيير صورة الخلفيّة.</p><p>يُمكن الوصول إلى النسخة النهائيّة للمثال بجانب الشيفرة بشكلها النهائي من خلال موقع <a rel="external nofollow" href="http://codepen.io/lbebber/pen/waGydW">CodePen</a>.</p><p>ترجمة وبتصرّف للمقال <a rel="external nofollow" href="https://blogs.adobe.com/dreamweaver/2015/06/css-only-raindrops-on-window-effect.html">CSS-Only Raindrops on Window Effect</a> لصاحبه Lucas Bebber.</p></div>
]]></description><guid isPermaLink="false">135</guid><pubDate>Sun, 02 Aug 2015 19:33:56 +0000</pubDate></item><item><title>&#x644;&#x627; &#x62A;&#x643;&#x631;&#x651;&#x631; &#x646;&#x641;&#x633;&#x643; (DRY): &#x623;&#x639;&#x62F; &#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x62F;&#x648;&#x627;&#x644;&#x651; Sass &#x627;&#x644;&#x62A;&#x64A; &#x643;&#x62A;&#x628;&#x62A;&#x647;&#x627;</title><link>https://academy.hsoub.com/programming/css/sass/%D9%84%D8%A7-%D8%AA%D9%83%D8%B1%D9%91%D8%B1-%D9%86%D9%81%D8%B3%D9%83-dry-%D8%A3%D8%B9%D8%AF-%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%AF%D9%88%D8%A7%D9%84%D9%91-sass-%D8%A7%D9%84%D8%AA%D9%8A-%D9%83%D8%AA%D8%A8%D8%AA%D9%87%D8%A7-r50/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_03/sass_480x300.png.a7196e3d549aa3a1055f76db661b3445.png" /></p>
<p>لعلّ من أقوى ميّزات Sass الدّوالّ (mixins) ﻷنّها تسمح بتحديد نمط مُتكرِّر وعزله في صورة قطعة برمجيّة يمكن إعادة استخدامها مرارًا. مثال ذلك: عزل كلّ الخصائص المسؤولة عن تنسيق زرّ في صفحة الويب ثمّ —بدل الحاجة لتذكّر كل هذه الخصائص— جمعها في قطعة منفصلة يمكن استدعاؤها في مُحدِّد آخر (selector). هذا يحفظ أنماط الزرّ في موضع واحد ممّا يجعل تعديلها وتحديثها أسهل.</p><p>المشكلة في هذا أنّ كثيرًا من دوّال Sass هذه تُكتب بأسلوب يجعل الخصائص مُكرّرة، وهذا قد يؤدي إلى حدوث أخطاء في عدة مواضع عند تحويلها إلى CSS بالإضافة إلى زيادة حجم الملفّ النّهائي دون طائل. صحيح أنّ استخدام Sass هو خطوةٌ على الطّريق الصّحيح لإنتاج CSS أخفّ حجمًا وأكثر اختصارًا ممّا قد يكتبه مبرمج متوسّط المستوى، لكنّك إن كنت مهووسًا بتحسين الأداء مثلي، فلن ترضى بوجود أدنى مقدار من التّكرار الّذي لا مُبرِّر له. سأدلكّ في هذه المقالة على كيفيّة تحسين مستوى CSS النّاتج عن دوالّ Sass الّتي تكتبها.</p><h2>مقدّمة سريعة عن Sass</h2><p>يمكن وصف Sass بأنّها مرحلة وسيطة بين ورقة الأنماط الّتي يكتبها مُصمّم الموقع وناتج CSS النّهائي الّذي يطلبه المتصفّح، وتفيد Sass في هذه المرحلة بإضافة العديد من الميّزات الّتي تُسهلّ كتابة CSS وصيانتها. واحدة من فوائد Sass أنّها تُساعِد الُمصمّمين في تجنّب التّكرارات في CSS، ممّا يجعل صيانتها أكثر سهولة. اصطلح على مبدأ "لا تُكرِّر نفسك" (Don't Repeat Yourself أو اختصارًا DRY) في كتاب <a rel="external nofollow" href="http://pragprog.com/the-pragmatic-programmer">"المُبرمج البراغماتيّ"</a>، والذي نصّ على التّالي:</p><blockquote><blockquote class="ipsQuote" data-cite="اقتباس" data-ipsquote=""><p>كلّ مفهوم يجب أن يُمثّله مُكوِّنٌ مفردٌ واضح ضمن النّظام.</p></blockquote></blockquote><p>لا تُساعِدنا CSS كثيرًا في تطبيق هذا المبدأ، لأنّها تُضطرّنا إلى تكرار كتابة الكثير من الخصّائص (كما في مثال الأزرار الذي ضربناه). فلو احتجت إلى إنشاء أنماط لثلاثة أنواع من الأزرار، فستضطر إلى كتابة هذه الأنماط مرّة لكلّ نوع من الأزرار، أو تجزئة الأنماط على أكثر من مُحدّد. وهما أمران أحلاهما مُرٌّ. فالأوّل يعني نسخ الخصائص ولصقها (وزيادة حجم الملفّ بالنتيجة) وتكرار مواضع الأخطاء، وغياب مصدر واحدٍ للحقيقة، وبنية هشّة في حصيلة الأمر؛ وأمّا الثاني فيعني غياب تمثيل مُفرد ومُوحَّد لكلّ نوع من الأزرار في النّظام، لأنّه يُجبرك على تجزئة الأنماط على عدّة مُحدِّدات، وهو ما يجعل البنية هشّة أيضًا، لأنّ تكوينها غير واضح.</p><p>لو أردنا تحرّي المثاليّة، فعلينا إيجاد طريقة لتعريف الأنماط الأساسيّة في موضع واحد دون تكرار، ثمّ تعريف مُحدِّد مُفرد يمكن استخدامه لتطبيق كلّ الأنماط.</p><h2>لماذا قد أرغب باتّباع مبدأ "لا تُكرِّر نفسك"؟</h2><p>قد تسأل نفسك: لم كلّ هذا التّعقيد؟ الجواب باختصار: لأنّ اتّباع مبدأ DRY يُحسّن من أداء الموقع. فعندما تؤسّس هيكل الموقع، سيكون الأداء عاملًا مُهمًّا، بدءًا من صيغ الصّور الّتي نختارها ومرورًا بطريقة كتابة مُحدِّدات CSS. وهذا العاملّ يُصبح أكثر أهمّية عندما نتحدّث عن الأجهزة المحمولة، ففي هذه الأجهزة قد يفرض مُجرّد طلب HTTP بسيط <a rel="external nofollow" href="http://alistapart.com/blog/post/breaking-the-1000ms-time-to-glass-mobile-barrier">تحدّيات كبيرةً في الأداء</a>، وخطأ الاعتقاد الشّائع بعدم أهمّيّة حجم ملفّ CSS في أداء الموقع يظهر أكثر وضوحًا في الأجهزة المحمولة الّتي <a rel="external nofollow" href="http://www.guypo.com/uncategorized/mobile-browser-cache-sizes-round-2/">لا تسمح بأكثر من 100 ميغابايت من الحجم الكلّي للتّخزين المؤقّت لكلّ المواقع</a>، وعندها يجب استغلال أكبر مقدار ممكن من مساحة التّخزين المؤقّت بأفضل صورة.</p><p>الهدف من ذلك إذن هو إنشاء مُحدِّدات يمكن صيانتها في Sass وفي HTML، ويمكن تمثيلها في CSS بأقصر أسلوبٍ ممكن لتقليل حجم التّخزين المؤقّت.</p><h2>الدّوال (mixins) والتّوسعة (extends): حلّان غير كاملين</h2><p>تٌقدّم دوالّ Sass حلًّا لإحدى هاتين المُشكلتين، فهي تسمح بإنشاء موضع واحد يمكن فيه تعريف الأنماط الأساسيّة والرّجوع إليها. يمكن لهذه الدّوال أن تقبل مُعاملات (arguments) كذلك، مما يسمح باختلافات طفيفة بين استدعاء وآخر للدّالة وإنشاء أشكال مختلفة لنفس النّمط. لكن الأمر لا يخلو من مُشكلات: فقد تُسبّب هذه الدّوال تكرارًا غير مُبرّر للخصائص لأنّها ستكتب الخصائص الّتي تحويها في كلّ موضع استدعيت فيه. فالدّوالّ إذن تحل مشكلة التُمثيل المُفردّ في مبدأ DRY، لكنّها تترك خصائص متكرّرة في النّاتج النّهائيّ من CSS.</p><p>ولهذا تُقدّم Sass مفهومًا آخر يُساعِد في تطبق مبدأ DRY: التّوسعة (extends)، والّتي يمكن استخدامها بكتابة الكلمة <code>‎@extend</code>، والّتي تسمح لمُصمّم CSS أن يقول: "أريد للُمحدّد A أن يظهر كما يظهر المُحدّد B"، وعندها تقوم Sass بإنشاء نمط جديد يجمع بين A وB (مفصول بينهما بفاصلة)، ثمّ كتابة الخواصّ غير المشتركة بالأسلوب العاديّ. لا يمكن تمرير مُعاملات للتّوسعة (خلافًا للدّوالّ)، فهي حلّ من نوع "الكلّ أو لا شيء".</p><pre class="css ipsCode prettyprint">.couch {
    padding: 2em;
    height: 37in;
    width: 88in;
    z-index: 40;  
}

.couch-leather {
    @extend .couch;
    background: saddlebrown;
}

.couch-fabric {
    @extend .couch;
    background: linen;
}

.couch, 
.couch-leather, 
.couch-fabric {
    padding: 2em;
    height: 37in;
    width: 88in;
    z-index: 40;
}

.couch-leather {
    background: saddlebrown;
}

.couch-fabric {
    background: linen;
}
</pre><p>تحلّ التّوسعة مشكلة تكرار الخصائص والمُحدِّد المُفرّد في CSS النّاتج، لكنّها لا تُخلّص مُصمّمي المواقع من الحاجة لصيانة مجموعتين منفصلتين من الأنماط في ملفّات Sass، ولا من الحاجة لتذكّر أيّ الخصائص ينطبق على أيّ نوع—فالأمر لا يختلف كثيرًا فيما لو كتبنا محدّدين منفصلين في الأساس.</p><p>كما نرى، فكلا الحّلين (الدّوالّ والتّوسعة) غير كاملين، ولكن عند جمعهما معًا ثمّ اعتماد بنيّة ذكيّة في تصميم مشروعنا، مع الاستفادة من بعض ميّزات Sass سنحصل على دالّة نهائيّة تخضع لمبدأ DRY تمامًا، وتجمع نصفي الحلّ في صيغة موحّدة سواءٌ في ملفّات Sass الأصليّة أو في ناتج CSS.</p><h2>المكوّنات الأساسيّة لمبدأ "لا تُكرِّر نفسك"</h2><p>تضع المُكوّنات الأربعة التّالية حجر الأساس لبناء دوالّ موافقة لمبدأ DRY في Sass: المُحدّدات بالنّيابة (placeholder selectors)، والجداول (maps)، والكلمة <code>‎@at-root</code>، والدّالة <code>unique-id()‎</code>.</p><h3>المُحدّدات بالنّيابة</h3><p>وهي نوعٌ خاصّ من المُحدّدات يُستخدم مع الكلمة <code>‎@extend</code> في Sass. تُكتب هذه المُحدّدات كما تُكتب الأصناف التّقليديّة (classes)، ولكنّها تبدأ بالرّمز <code>%</code> بدل النّقطة <code>.</code>، وتتصرّف عند توسعتها بصورة عاديّة، ولكنّها لا تُضاف إلى النّاتج النّهائيّ إلّا عند توسعتها. وكما في التّوسعة العاديّة، تُضاف خواصّ المحدّدات في الموضع الّذي عُرّف فيه المُحدّد.</p><pre class="css ipsCode prettyprint">%foo {
    color: red;
}

.bar {
    @extend %foo;
    background: blue;
}

.baz {
    @extend %foo;
    background: yellow;
}

.bar, 
.baz {
    color: red;
}

.bar {
    background: blue;
}

.baz {
    background: yellow;
}
</pre><h3>الجداول (maps)</h3><p>وهي نوعٌ من أنواع البيانات في Sass ‎3.3 (مثلها مثل الأرقام والسلاسل النّصيّة والقوائم) تتصرّف بطريقة مُشابهة للكائنات في JavaScript. تتألّف الجداول من أزواج مفتاح/قيمة (key/value)، حيث يمكن للمفتاح والقيمة أن يكونا أي نوع من أنواع البيانات في Sass (بما في ذلك الجداول نفسها). المفاتيح فريدة دومًا ويمكن الوصول إليها باسمها، ممّا يجعلها مثاليّة لتخزين البيانات المُميّزة واسترجاعها.</p><pre class="css ipsCode prettyprint">$properties: (
    background: red,
    color: blue,
    font-size: 1em,
    font-family: (Helvetica, arial, sans-serif)
);

.foo {
    color: map-get($properties, color);
}</pre><h3>الكلمة <code>‎@at-root</code></h3><p>قُدّمت هذه الكلمة في Sass ‎3.3، وهي تقوم بنقل الخواصّ المُعرّفة ضمنها إلى جذر ورقة الأنماط (أعلى مستوىً فيها)، بغض النّظر عن الموضع الّذي استخدمت فيه.</p><h3>الدّالّة <code>unique-id()‎</code></h3><p>قدّمت في Sass ‎3.3 كذلك، وهي تُعيد مُعرّف CSS <a rel="external nofollow" href="http://hugogiraudel.com/2013/10/17/sass-random/">يُضمن كونُه فريدًا</a> في كلّ عمليّة تحويل من Sass إلى CSS.</p><h2>كتابة دالّة بسيطة</h2><p>يتطلّب تحويل نمط مُتكرِّر إلى دالّة النّظرَ في الأنماط الأساسيّة المُكوّنة لها ثم تحديد ما المشترك بينها وما الذي يختلف بحسب مُدخَلات المستخدم. سنستخدم زرًّا بسيطًا كمثال في حالتنا:</p><pre class="css ipsCode prettyprint">.button {
    background-color: #b4d455;
    border: 1px solid mix(black, #b4d455, 25%);
    border-radius: 5px;
    padding: .25em .5em;

    &amp;:hover {
        cursor: pointer;
        background-color: mix(black, #b4d455, 15%);
        border-color: mix(black, #b4d455, 40%);
    }
}</pre><p>لتحويل هذا إلى دالّة، اختر الخصائص الّتي يتحكّم بها المستخدم (الديناميكيّة)، والخصائص الثّابتة. يُتحكّم بالخصائص الدّيناميكيّة عبر مُعامِلات تُمرّر إلى الدّالة، أمّا الخصائص الثّابتة فتكتب بالأسلةب العاديّ. في حالة الزّرّ الذي نُصمّمه، لا نريد سوى أن يتغيّر اللّون، ولهذا نستدعي الدّالّة بمُعامل اللّون، لُينتَج CSS كما نتوقّع:</p><pre class="css ipsCode prettyprint">@mixin button($color) {
    background-color: $color;
    border: 1px solid mix(black, $color, 25%);
    border-radius: 5px;
    padding: .25em .5em;

    &amp;:hover {
        cursor: pointer;
        background-color: mix(black, $color, 15%);
        border-color: mix(black, $color, 40%);
    }
}

.button {
    @include button(#b4d455);
}</pre><p>لا بأس بهذا الحلّ، ولكنّه سيؤدّي إلى تكرار خصائص كثيرة، افترض مثلًا أنّنا نريد إنشاء زرّ آخر بلون مختلف، عندها ستبدو شيفرة Sass كما يلي (دون تعريف الدّالّة):</p><pre class="css ipsCode prettyprint">.button-badass {
    @include button(#b4d455);
}

.button-coffee {
    @include button(#c0ffee);
}</pre><p>وستبدو شيفرة CSS كما يلي:</p><pre class="css ipsCode prettyprint">.button-badass {
    background-color: #b4d455;
    border: 1px solid #879f3f;
    border-radius: 5px;
    padding: .25em .5em;
}
.button-badass:hover {
    cursor: pointer;
    background-color: #99b448;
    border-color: #6c7f33;
}

.button-coffee {
    background-color: #c0ffee;
    border: 1px solid #90bfb2;
    border-radius: 5px;
    padding: .25em .5em;
}
.button-coffee:hover {
    cursor: pointer;
    background-color: #a3d8ca;
    border-color: #73998e;
}</pre><p>هناك الكثير من الخصائص المُكرَّرة هنا، لا نريد هذا! لذا سنلجأ إلى استخدام المُحدِّدات بالنّيابة.</p><h2>إزالة التّكرار من دالّة</h2><p>إزالة التّكرار من الدّالة يقتضي تجزئتها إلى أجزاء ثابتة وأخرى ديناميكيّة. الأجزاء الدّيناميكيّة هي ما سيستدعيه المستخدم، وأمّا الثّابتة فتحوي الأجزاء الّتي ستكون مُكرّرة فيما لو لم نجمعها في دالّة.</p><pre class="css ipsCode prettyprint">@mixin button($color) {
        @include button-static;

    background-color: $color;
    border-color: mix(black, $color, 25%);

    &amp;:hover {
        background-color: mix(black, $color, 15%);
        border-color: mix(black, $color, 40%);
    }
}

@mixin button-static {
    border: 1px solid;
    border-radius: 5px;
    padding: .25em .5em;

    &amp;:hover {
        cursor: pointer;
    }
}</pre><p>الآن وقد فصلنا دالّتنا على جزأين، نريد أن نُوسِّع العناصر في <code>button-static</code> لتجنّب التّكرار. يمكن إنجاز ذلك باستخدام مُحدّد بالنّيابة بدل الدّالة، ولكن هذا يعني نقل المُحدّدات في ورقة الأنماط، لذا سنقوم بإنشاء مُحدّد بالنّيابة في الموضع ذاته ديناميكيًّا، بحيث يُنشأ حالما يُحتاج إليه ويبقى بترتيبه الأصليّ كما نتوقّع. لفعل ذلك، سنقوم أوّلًا بإنشاء مُتغيّر في النّطاق العامّ لحفظ أسماء المُحدّدات الدّيناميكيّة:</p><pre class="css ipsCode prettyprint">$Placeholder-Selectors: ();</pre><p>ثمّ نتحرّى وجود مفتاح يُطابق محدّدنا في <code>button-static</code>، وسندعو هذا المفتاح <code>"button"</code> في الوقت الحالي. باستخدام الدّالّة <code>map-get</code>، سنحصل على قيمة المفتاح المطلوب أو القيمة <code>null</code> إن لم يُوجد، وفي الحالة الأخية سنُعيّن قيمته إلى مُتغيّر فريد (unique ID) باستخدام <code>map-merge</code>. سنستخدم الوسم <code>‎!global</code> كوننا نريد كتابة قيمة متغيّر عُرِّف في النّطاق العامّ:</p><pre class="css ipsCode prettyprint">$Placeholder-Selectors: ();
// ...
@mixin button-static {
    $button-selector: map-get($Placeholder-Selectors, 'button');

    @if $button-selector == null {
        $button-selector: unique-id();
        $Placeholder-Selectors: map-merge($Placeholder-Selectors, ('button': $button-selector)) !global;
    }

    border: 1px solid;
    border-radius: 5px;
    padding: .25em .5em;

    &amp;:hover {
        cursor: pointer;
    }
}</pre><p>بعد معرفة وجود مُعرّف لمُحدّدنا، نُريد إنشاء هذا المُحدّد، ونفعل هذا باستخدام الكلمة <code>‎@at-root</code> وصياغة تعويض القيم في النّصوص (<code>‎#{}‎</code>) لإنشاء مُحدّد بالنّيابة في جذر ورقة الأنماط اسمه هو المُعرِّف الفريد الّذي حصلنا عليه. محتويات هذا المُحدِّد ستكون استدعاء للدّالة الثّابتة (لاحظ الاستدعاءات المتداخلة! يا للرّوعة!). ثمّ نُوسّع هذا المُحدّد بالنّيابة ذاته، ممّا يُفعّله ويؤديّ لكتابة خواصّه إلى CSS.</p><p>باستخدام مُحدّد بالنّيابة في هذه الحالة بدل توسعة مُحدّد تقليديّ كصنف (class)، فإنّ محتويات المُحدّد ستُضاف إلى CSS النّهائي فقط إن وُسِّع المُحدِّد، ممّا يسمح بتقليص حجم الملفّ. وباستخدام التّوسعة بدل كتابة الخصائص مباشرةً، نكون قد تجنّبنا تكرار الخصائص في الوقت ذاته. في النّهاية سيمنع هذا هشاشة النّاتج النّهائي من CSS، لأنّه في كلّ مرّة تُستدعى هذه الدّالة، فستكون الخصائص المُشتركة ضمنها مُشاركة بالفعل ضمن ناتج CSS، وليس فقط مرتبطة مع بعضها في مرحلة المُعالجة المسبقة لـCSS فحسب.</p><pre class="css ipsCode prettyprint">$Placeholder-Selectors: ();
// ...
@mixin button-static {
    $button-selector: map-get($Placeholder-Selectors, 'button');
    @if $button-selector == null {
        $button-selector: unique-id();
        $Placeholder-Selectors: map-merge($Placeholder-Selectors, ('button': $button-selector)) !global;

        @at-root %#{$button-selector} {
            @include button-static;
        }
    }
    @extend %#{$button-selector};   


    border: 1px solid;
    border-radius: 5px;
    padding: .25em .5em;

    &amp;:hover {
        cursor: pointer;
    }
}</pre><p>لكن مهلًا، فلم ننتهِ بعدُ. ستبقى هناك محتويات مُكرّرة في النّاتج النّهائي، وهذا شيء لا نريده (حيث سنخصل على مُحدّد يوسّع نفسه، وهذا لا نريده أيضًا). لتجنّب هذا، سُنضيف مُعاملًا إلى <code>button-static</code> يُحدّد إن كان يجب المُضيّ بعمليّة التّوسعة أم لا. سُنضيفه هذا إلى دالّتنا الدّيناميكيّة أيضًا، ونمرّره إلى دالّتنا الثّابتة، وفي النّهاية ستكون لدينا الدّوالّ التّالية:</p><pre class="css ipsCode prettyprint">$Placeholder-Selectors: ();

@mixin button($color, $extend: true) {
    @include button-static($extend);

    background-color: $color;
    border-color: mix(black, $color, 25%);

    &amp;:hover {
        background-color: mix(black, $color, 15%);
        border-color: mix(black, $color, 40%);
    }
}

@mixin button-static($extend: true) {
    $button-selector: map-get($Placeholder-Selectors, 'button');

    @if $extend == true {
        @if $button-selector == null {
            $button-selector: unique-id();
            $Placeholder-Selectors: map-merge($Placeholder-Selectors, ('button': $button-selector)) !global;

            @at-root %#{$button-selector} {
                @include button-static(false);
            }
        }
        @extend %#{$button-selector};
        }
        @else {
        border: 1px solid;
        border-radius: 5px;
        padding: .25em .5em;

        &amp;:hover {
            cursor: pointer;
        }
    }
}</pre><p>بعد كلّ هذا العناء، أنشأنا لأنفسنا طريقة لتسهيل صيانة أنماط Sass وتوفير مُحدِّد مُفرد في HTML، وإبقاء حجم CSS في أدنى الحدود. فهمها بلغ عدد استدعاءات دالّة <code>button</code> في شيفرتنا، لن تُكرَّر الخصائص الثّابتة فيها.</p><p>عند استدعاء دالّتنا لأوّل مرّة، سُتنشأ الأنماط الّتي فيها ضمن CSS في الموضع الّذي استدعيت فيه، ممّا يُحافظ على تراكب الأنماط بالتّرتيب المُتوقّع، ويقلّل هشاشة البنية. وبما أنّنا نسمح بعدّة استدعاءات للدّالّة نفسها، فبإمكاننا إنشاء "نكهات" مُختلفة بسهولة وصيانتها في كلا Sass وHTML.</p><p>في هذه المرحلة سيكون لدينا مصدر Sass وناتج CSS كما يلي:</p><pre class="css ipsCode prettyprint">.button-badass {
    @include button(#b4d455);
}

.button-coffee {
    @include button(#c0ffee);
}

.button-decaff {
    @include button(#decaff);
}

.button-badass {
    background-color: #b4d455;
    border-color: #879f3f;
}
.button-badass, 
.button-coffee, 
.button-decaff {
    border: 1px solid;
    border-radius: 5px;
    padding: .25em .5em;
}
.button-badass:hover, 
.button-coffee:hover, 
.button-decaff:hover {
    cursor: pointer;
}
.button-badass:hover {
    background-color: #99b448;
    border-color: #6c7f33;
}

.button-coffee {
    background-color: #c0ffee;
    border-color: #90bfb2;
}
.button-coffee:hover {
    background-color: #a3d8ca;
    border-color: #73998e;
}

.button-decaff {
    background-color: #decaff;
    border-color: #a697bf;
}
.button-decaff:hover {
    background-color: #bcabd8;
    border-color: #857999;
}
</pre><p> </p><p>لاحظ كيف يُفصل بين الخصائص الثّابتة بفواصل في موضع تعريفها، ممّا يجعل تتبّع الأخطاء أسهل، ويحافظ على ترتيب النّصّ المصدريّ، ويقلّل حجم ملف CSS، وبحيث لا تُنشأ مُحدّدات جديدة إلّا للخصائص الّتي تتغيّر. أليس هذا رائعًا؟</p><h2>المتابعة</h2><p>الحقيقة أنّ كتابة النّمط نفسه لكلّ دالّة لا يتوافق مع مبدأ DRY على الإطلاق؛ بل على العكس تمامًا فهو WET (اختصارًا لـWrite Everything Twice، هل لاحظت ظرافة المبرمجين؟!). لا نريد هذا، بل يجب أن نُفكّر في كتابة دالّة لتوليد المُحدّدات بالنّيابة، يمكننا استدعاءها بدل ذلك. أو في حال استخدام إضافة <a rel="external nofollow" href="https://github.com/team-sass/toolkit">Toolkit</a> لـSass (إما من خلال Bower أو كإضافة لـCompass)، فيمكن في هذه الحالة استخدام الدّالة <code>dynamic-extend</code> لإيجاد وإنشاء وتوسعة مُحدّد ديناميكيّ بالنّيابة. كلّ ما عليك فعله إرسال سلسلة نصيّة للبحث عنها (مثل <code>"button"</code>):</p><pre class="css ipsCode prettyprint">@import "toolkit";

@mixin button($color, $extend: true) {
    @include button-static($extend);

    background-color: $color;
    border-color: mix(black, $color, 25%);

    &amp;:hover {
        background-color: mix(black, $color, 15%);
        border-color: mix(black, $color, 40%);
    }
}

@mixin button-static($extend: true) {
    $button-selector: map-get($Placeholder-Selectors, 'button');

    @if $extend == true {
        @include dynamic-extend('button') {
            @include button-static(false);
        }
    }
    @else {
        border: 1px solid;
        border-radius: 5px;
        padding: .25em .5em;

        &amp;:hover {
            cursor: pointer;
        }
    }
}</pre><p>وهكذا يمكن القضاء على أي تكرار في دالّتنا، مما يقلّل حجم ملفّات Sass الأصلية وملفّات CSS النّهائيّة معًا، ممّا يدفعنا خطوة على طريق إعادة استخدام مكوّناتنا في مشاريع أخرى.</p><p>ترجمة (بشيء من التصرف) للمقال ‎<a rel="external nofollow" href="http://alistapart.com/article/dry-ing-out-your-sass-mixins">DRY-ing out Your Sass Mixins</a>‎ لصاحبه Sam Richard.</p>
]]></description><guid isPermaLink="false">50</guid><pubDate>Sun, 29 Mar 2015 08:28:06 +0000</pubDate></item><item><title>&#x645;&#x62F;&#x62E;&#x644; &#x625;&#x644;&#x649; Sass</title><link>https://academy.hsoub.com/programming/css/sass/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-sass-r8/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_03/sass_480x300.png.d041ed293c66dea0b2726dbb2469eb28.png" /></p>
<p dir="rtl"><span style="font-size:14px;">تُعتبر بساطة </span><strong><span style="font-size:14px;">CSS </span></strong><span style="font-size:14px;">إحدى أهم الخواص المُميزة والمرغوبة فيه، حيث أن أوراق أنماط </span><span style="font-size:14px;">CSS </span><span style="font-size:14px;">ما هي سوى قوائم طويلة من الأوامر والتي تُحدد كل واحدة منها مُنتقيا </span><span style="font-size:14px;">selector </span><span style="font-size:14px;">وبعضا من الأنماط التي يجب تطبيقها عليه</span><span style="font-size:14px;">. </span><span style="font-size:14px;">لكن وبحكم أن مواقعنا وتطبيقاتنا أصبحت تكبر أكثر فأكثر وزادت درجة تعقيدها مع ذلك، كما أنها أصبحت تستهدف أجهزة وأحجام شاشات مُختلفة، فإن البساطة التي تُميز </span><span style="font-size:14px;">CSS </span><span style="font-size:14px;">سرعان ما تُصبح ثقلا على كاهل المُبرمجين بحكم أن الأمر لم يعد مُتعلقا فقط ببعض الخواص القاعدية</span><span style="font-size:14px;">.</span></p><p dir="rtl" align="right">في حين أن البعض قد اقترح حلولا لمشاكل CSS عبر إضافة المُتغيرات والثوابت إليها مثلا إلا أن المُتصفحات امتنعت عن استخدامها ودعمها. وحتى ولو قام أي من المُتصفحات بدعم نسخة جديدة أكثر تطورا من CSS، فإن الأمر سيحتاج إلى سنوات ليتم تعميم الأمر على جميع المُتصفحات مما يجعل من الاعتماد عليه فكرة غير صائبة.</p><p dir="rtl" align="right">لكن لحسن الحظ اقترح منذ بضعة سنين المُطوران <a rel="external nofollow" href="http://www.hamptoncatlin.com/">Hampton Catlin</a> و<a rel="external nofollow" href="http://nex-3.com/">Nathan Weizenbaum</a> طريقة أفضل للتعامل مع أوراق الأنماط المعقدة. بما أن المُتصفحات ليست مُستعدة لاعتماد إصدار جديد من CSS وجد المُطوران بأنه بإمكانهما تصميم تراكيب (syntax) جديدة لأوراق الأنماط تجعل من مهمة كتابة وصيانة تلك الأوراق أسهل، حيث يكفي استخدام مُعالج قبلي preprocessor لترجمة التركيب الجديد إلى التركيب القديم المُعتمد في أوراق CSS التي نعرفها.</p><p dir="rtl" align="right">تم إطلاق اسم <strong>Sass</strong> على التركيب الجديد والذي هو اختصار لـ <strong>syntactically awesome style sheets</strong>. الإصدارات الأولى من Sass كان مُختلفة جدا عن CSS الكلاسيكي، فعلى سبيل المثال لم يكن هناك وجود لأي حاضنات curly braces، كما أنه وجب تسنين indent الخواص على نحو مُعين وبعدد مُحدد من المسافات لتجنب ظهور أخطاء لدى ترجمة الملف. لم يمنع الأمر المُبرمجين الذين اعتادوا على تعلم لغات برمجة جديدة والاستمتاع بذلك من التعامل مع هذه اللغة ولم يجدوا مُشكلا مع التراكيب الجديدة التي أتت بها Sass.، لكن الأمر كان مُختلفا مع المُصممين الذين رأوا أن البنية اللغوية لـ Sass كانت مُختلفة جدا عن الـ CSS الذي ألفوه ولذلك لم يرغبوا في استخدامه. المُشكل الآخر هو أن الاختلاف في البُنية اللغوية مع CSS الكلاسيكية جعل من مهمة الاستفادة من Sass في المشاريع الحالية أمرا مستحيلا من دون إمضاء الكثير من الوقت لترجمة ملفات CSS الحالية إلى Sass.</p><p dir="rtl" align="right">ولدرء هذه المشاكل عمد المُطورون في الإصدار 3.0 من Sass إلى إضافة بُنية لغوية جديدة أقرب ما تكون من بنية CSS والتي أطلقوا عليها اسم <strong>SCSS</strong> أو <strong>Sassy CSS</strong>. يوصف SCSS عادة بأنه "مُجمع صارم" Strict Superset أو لغة مُترفعة مشتقة من CSS وهو الأمر الذي يعني بأن أي ملف يُعتبر صحيح البُنية في CSS سيكون صحيح البُنية في SCSS أيضا. بعبارة أخرى يُمكنك استخدام ملفات CSS الحالية مع معالج Sass القبلي من دون أية مشاكل، مما سيسمح لك بتعلم واستخدام بعض خواص Sass دون الحاجة إلى تعلم جميع الخواص لاستخدامه.</p><p dir="rtl" align="right">عكس ما هو الحال مع CSS العادي فإنه يُمكن اعتبار Sass/ SCSS لغة برمجية scripting language بكل ما تحمله الكلمة من معنى، حيث أنه يدعم العديد من خواص لغات البرمجة مثل: expressions،functions، variables، conditional logic، و loops. بطبيعة الحال أنت في غنى عن استعمال كل هذه الخواص دفعة واحدة، لكنها قيد إشارتك لما تكون في حاجة إليها، بل وستجعل من مهمة كتابة أوراق أنماط مُعقدة -والتي عادة ما تحتوي على شفرات مُكررة- أمرا في غاية السهولة.</p><p dir="rtl" align="right">سنستعرض في هذا المقال جُملة من قواعد Sass/SCSS لإعطائك فكرة واضحة عما يُمكنك القيام به باستخدام هذه اللغة الجديدة، وسنختم بجُملة من الروابط والكتب إن رغبت في الذهاب بعيدا معها.</p><p dir="rtl" align="right">ولإبقاء الأمر بسيطا قدر الإمكان فإننا سنركز في أغلب الأمثلة التي سنستعرضها هنا على شفرة SCSS فقط وليس شفرة CSS التي تنتج عنها بعد ترجمتها. بطبيعة الحال فإن أفضل طريقة لتعلم Sass هي أن تقوم تجربها بنفسك وتكتب بعض الشفرات ثم تلاحظ ملفات CSS التي تنتج عن ذلك. يُمكن إيجاد جميع الأمثلة المعروضة هنا إضافة إلى ملفات CSS التي تنتج عنها على هذا <a rel="external nofollow" href="https://github.com/ddemaree/ala_sass_examples">المُستودع على </a><a rel="external nofollow" href="https://github.com/ddemaree/ala_sass_examples">Github</a>.</p><h1 dir="rtl" align="right">البداية</h1><p dir="rtl" align="right">تمت كتابة Sass بلغة روبي، ويتم توزيعها عبر مدير الحزم الخاص بها والمعروف باسم RubyGems. سيكون بإمكان الذين يستعملون روبي أو الذين لا يجدون صعوبة في التعامل مع سطر الأوامر تنصيب Sass بسهولة باتباع التعليمات الموجودة على <a rel="external nofollow" href="http://sass-lang.com/">موقع </a><a rel="external nofollow" href="http://sass-lang.com/">Sass</a>، أما من يجب صعوبة في ذلك أو لم يسبق له التعامل مع روبي فإنه بإمكانه الاعتماد على تطبيق <a rel="external nofollow" href="http://mhs.github.io/scout-app/">Scout</a> على نظامي Windows وmac والذي يأتي مجهزا بروبي وبـ Sass (إن كنت على نظام لينكس فإنه يفترض بك أن تكون مرتاحا مع سطر الأوامر وبالتالي... ).</p><p dir="rtl" align="right">سواء نصبت Sass عبر سطر الأوامر أو عبر تطبيق <strong>Scout</strong> فإن مبدأ العمل يبقى نفسه، حيث تتم مراقبة ملفات SCSS الخاصة بك وفي كل مرة يتم إدخال تحديثات عليها وحفظها تتم ترجمة ذلك إلى ملف CSS كلاسيكي. نطلق اسم مجلد المُدخلات Input Folder على المُجلد الذي يحتوي ملفات Sass ويتم حفظ ملفات CSS الناتجة في مُجلد يُطلق عليه اسم مجلد المخرجات Output Folder. يُمكن لأحد هذه المُجلدين أن يكون داخل الآخر، بل من الشائع أن يكون مجلد المُدخلات والذي يُمكن أن نسميه بـ scss داخل مجلد أوراق الأنماط الخاصة بمشروعك والذي نسميه css على النحو التالي:</p><pre class="html ipsCode prettyprint">my_project/
  index.html
  css/
    main_style.css
    scss/
      main_style.scss 
      _mixins.scss
      _colors.scss</pre><p dir="rtl" align="right">في المثال السابق، يُطلق على الملفات التي تبدأ أسماؤها بمحرف _ داخل مُجلد scss وصف <strong>partials</strong> وتوصف بذلك لأنها عبارة عن أوراق أنماط جزئية يتم استيرادها في ملفات SCSS الرئيسية.</p><h1 dir="rtl" align="right">استخدم الملفات الجزئية لتنظيم شفرتك</h1><p dir="rtl" align="right">يوفر CSS تعليمة<strong> @import</strong> لاستيراد ملفات css إضافية، وعادة ما يعمد المُطورون إلى استخدام هذه التعليمة لتقسيم المشاريع الكبيرة إلى ملفات صغيرة الحجم لتسهيل مهمة صيانتها. فعلى سبيل المثال يُمكن لملف main_style.css الرئيسي أن لا يحتوي سوى على مجموعة من تعليمات @import على النحو التالي:</p><pre class="css ipsCode prettyprint">@import url('/shared/global.css');
@import url('/pages/home.css');
@import url('/pages/blog.css');</pre><p dir="rtl" align="right"><span style="font-size:14px;">بطبيعة الحال فإنه لا يُنصح بالقيام بذلك نظرا للآثار التي ستترتب عن ذلك، حيث أن كل سطر عبارة عن ملف إضافي يجب على المُتصفح تحميله مما قد يسبب ثقلا في تحميل موقعك وبالتالي تراجعا في تقييمي Yslow وgoogle Page Speed الخاصين بموقعك.</span></p><p dir="rtl" align="right">يسمح Sass بتقسيم الملفات إلى ملفات جزئية Partials بنفس الطريقة السابقة واستيرادها باستعمال نفس التعليمة @import، لكن لدى ترجمة ملفات Sass إلى CSS فإنه سيتم تضمين كامل الشفرة في ملف واحد.</p><pre class="css ipsCode prettyprint">@import 'shared/global';
@import 'pages/home';
@import 'pages/blog';</pre><p>ينتج عن الكود السابق ملف CSS واحد فقط. يُمكن لـ Sass القيام بعملية minification لملف CSS الناتج والتخلص من كل المسافات الزائدة وذلك لتحسين أداء الموقع لدى وتقليص زمن تحميله.</p><p dir="rtl" align="right">هناك أمر يجب أخذه بالحسبان وهو أن الملفات الجزئية هي ملفات من نوع خاص خاصة بـ SCSS ليست مُعدة لتُستعمل كملفات CSS كلاسيكية، ويجب القيام باستيرادها باستخدام تعليمة @import لأخذها بالحسبان. كما تبدأ أسماء الملفات الجزئية بالمحرف "_”، حيث أن pages/home في المثال السابق تقوم باستيراد ملف pages/_home.scss . يسمح مُحرف _ لـ Sass بمعرفة أن الملف عبارة عن ملف جزئي وبالتالي يتجنب ترجمته إلى ملف CSS مستقل بذاته.</p><h1 dir="rtl" align="right">لا تكرر ما تقوم به</h1><p dir="rtl" align="right">بعد أن أصبحت أوراق الأنماط خاصتنا أكثر تنظيما يتوجب علينا الآن التخلص من التكرار الموجود في محتواها.</p><p dir="rtl" align="right">إحدى أهم خواص Sass هي خاصية القواعد المُضمنة <strong>Nested rules</strong>. في ملفات CSS الكلاسيكية تأتي مُختلف القواعد بعضها تلو الأخرى، وعلى مُحدد كل قاعدة أن يشمل جميع عناصره:</p><pre class="css ipsCode prettyprint">body.home .media-unit {
  border: 1px solid #ccc;
  background-color: #fff;
}
body.home  .media-unit .right {
  border-left: 1px solid #ccc;
}
body.home .media-unit .right h1 {
  font-size: 24px;
}</pre><p dir="rtl" align="right"><span style="font-size:14px;">علاوة على أن هذه الشفرة تحتوي على الكثير من التكرار فإنها لا تساعدنا لفهم العلاقة الموجودة ما بين العناصر التي نقوم بإضافة أنماط عرض إليها. لكن بفضل القواعد المُضمنة فإنه بإمكاننا كتابة شفرة SCSS لا تتجنب التكرار فحسب، وإنما تجعل من معرفة العلاقة ما بين العناصر أوضح وأسهل للفهم:</span></p><pre class="css ipsCode prettyprint">body.home {
  .media-unit {
    border: 1px solid #ccc;
    background-color: #fff;
    .right {
      border-left: 1px solid #ccc;
      h1 {
        font-size: 24px;
      }
    }
  }
}</pre><p dir="rtl" align="right"><span style="font-size:14px;">بعد ترجمة هذه الشفرة فإننا سنحصل على نفس الشفرة السابقة. للأسف فإن الحجم الصغير لشفرة SCSS لا تنتج عنه بالضرورة شفرة CSS صغيرة الحجم أيضا أو سريعة التحميل، لكن استخدام القواعد المُضمنة من شأنه أن يبقي الشفرة أنظف، أكثر منطقية وأكثر تنظيما، وهي مزايا ستسهل من مهمة إدارة وصيانة هذه الشفرة مع مرور الوقت.</span></p><p dir="rtl" align="right">تسمح القواعد المُضمنة أيضا بتضمين media queries داخل قواعد أخرى، مما يجعل من السهل معرفة أي نمط يتم تنفيذه على أي من عناصر صفحتك:</p><pre class="css ipsCode prettyprint">.container {
  width: 940px;  // If the device is narrower than 940px, switch to 
  // a fluid layout
  @media screen and (max-width:940px) {
    width: auto;
  }
}</pre><p dir="rtl" align="right">لدى ترجمة هذه الشفرة يقوم Sass بتحويله إلى شفرة CSS كلاسيكية وذلك عبر نسخ مُحدد .container داخل media query على النحو التالي:</p><pre class="css ipsCode prettyprint">.container {
  width: 940px;
}@media screen and (max-width:940px) {
  .container {
    width: auto;
  }
}</pre><h1 dir="rtl" align="right"><span style="color:inherit;font-family:'Helvetica Neue', Helvetica, Arial, sans-serif;font-size:31.5px;font-weight:bold;line-height:40px;">المتغيرات</span></h1><p dir="rtl" align="right">متغيرات Sass مفيدة جدا لسببين: أولها وأكثرها أهمية هو تسهيل مهمة تعديل الشفرة وتجنيب التكرار، وثانيها هو تمكين المُطور من إعطاء أسماء خاصة لبعض الخواص خاصة الألوان مما يزيد من مقروئية الشفرة ويسهل فهمه.</p><p dir="rtl" align="right">على موقع Typekit مثلا نجد أن العديد من العناصر تستخدم اللون #99CC00 أو ما يُطلق عليه مطورو الموقع اسم Typekit green اختصارا. وبما أنه يتم استخدام هذا اللون في جميع أجزاء الموقع بدءا بالأزرار ووصولا بالعناوين الرئيسية، فإنه، وفي حالة أردنا تغيير هذا اللون الأخضر إلى لون آخر يجب علينا استبداله هذه القيمة بقيمة أخرى أينما ظهرت على ملف CSS. لكن في حال استخدام متغيرات Sass بدل القيمة الست عشرية آنفة الذكر فإنه يكفي تغيير قيمة المتغير المعني بهذا اللون (والذي يُمكن تعريفه في بداية الملف أو حتى في الملفات الجزئية) حتى يتم تغييره في جميع عناصر الصفحة بشكل آني وآلي. يُمكن أيضا استخدام المتغيرات لإعطاء قيم لمتغيرات أخرى مما يسهل من الحفاظ على أنماطك أكثر تنظيما:</p><pre class="css ipsCode prettyprint">$typekit-green: "#99cc00";
$typekit-link-color: $typekit-green;a {
  color: $typekit-link-color;
}</pre><p dir="rtl" align="right"><span style="font-size:14px;">بإمكانك أيضا أن تعطي هذه المتغيرات تقريبا أي قيمة ترغب فيها، وتماما مثلما أفادتنا هذه المُتغيرات مع الألوان فإنها ستفيدنا أيضا مع الخطوط:</span></p><pre class="css ipsCode prettyprint">$sans-serif-font: 'ff-dagny-web-pro', 'Helvetica Neue', Arial,  
Helvetica, 'Liberation Sans', sans-serif;
$serif-font: 'ff-tisa-web-pro', Georgia, Times, serif;.banner h1 {
  font-family: $sans-serif-font;
}</pre><p> </p><p dir="rtl" align="right"><span style="color:inherit;font-family:'Helvetica Neue', Helvetica, Arial, sans-serif;font-size:31.5px;font-weight:bold;line-height:40px;">MIXINS</span></p><p dir="rtl" align="right"><strong>Mixins</strong> عبارة عن مجموعة من القواعد أو الخواص التي يُمكنك تضمينها أو "دمجها' مع قواعد أخرى. نقوم بتعريف هذه المجموعات باستخدام التعليمة<strong> @mixin</strong> ونقوم بتضمينها في قواعد أخرى باستخدام @include.</p><p dir="rtl" align="right">في المثال التالي نطلب من Sass أن يقوم بتنفيذ جميع الخواص الموجودة في مجموعة خواص highlighted-bold-text على عناصر span الموجودة داخل result-with-highlights:</p><pre class="css ipsCode prettyprint">$highlight-color: #ffa;@mixin highlighted-bold-text {
  font-weight: bold;
  background-color: $highlight-color;
}.result-with-highlights {
  span {
    @include highlighted-bold-text;
  }
}</pre><p dir="rtl" align="right">يكفي أن تقوم بتعريف الـ mixin مرة واحدة حتى يُصبح بإمكانك استخدامه أينما شئت في نفس الملف. في المثال التالي تتم إضافة جميع خواص الـ mixin الذي قمنا بتعريفه سابقا إلى الصنف الذي يحمل الاسم highlighted:</p><pre class="css ipsCode prettyprint">.highlighted {
  @include highlighted-bold-text;
}</pre><p dir="rtl" align="right">هذا الأمر مفيد خاصة لدى القيام بإضافة خواص CSS3 على بعض العناصر مع الرغبة في ضمان ظهور هذه العناصر على نفس الشكل على جميع المُتصفحات وذلك باستخدام البادئات prefixes الخاصة بكل متصفح إضافة إلى توفير تراجع رشيق للمتصفحات التي لا تدعم تلك الخواص. عادة ما يكون التعامل مع مختلف البادئات في ملفات CSS الكلاسيكية أمرا مُزعجا نظرا لطولها وللحاجة إلى نسخها ولصقها في كل مرة. لكن مع mixins فإنه بالإمكان القيام بذلك بشكل أسرع ومن دون الوقوع في الأخطاء ومن دون الحاجة إلى كتابة الكثير من الشفرات.</p><p dir="rtl" align="right">في المثال التالي، نقوم بإضافة الحواف الدائرية بقيمة 4px على عنصر وذلك باستخدام بادئات كل من Webkit، Firefox وIE مع إضافة خاصية border-radius الخاصة بـ CSS3. كما أننا نقوم بتحديد قيمة الدوران في مُتغير وذلك لتسهيل مهمة تعديلها لاحقا:</p><pre class="css ipsCode prettyprint">@mixin rounded-corners {
  $rounded-corner-radius: 4px;
  -webkit-border-radius: $rounded-corner-radius;
  -moz-border-radius: $rounded-corner-radius;
  -ms-border-radius: $rounded-corner-radius;
  border-radius: $rounded-corner-radius;
}.button {
  @include rounded-corners;
}</pre><p align="right"><span style="font-size:14px;">يُمكن للـ mixins احتواء قواعد مُضمنة كاملة وليس مجرد خواص. المثال التالي يُوضح كيف يُمكن كتابة clearfix CSS باستخدام Sass mixin:</span></p><pre class="css ipsCode prettyprint">@mixin clearfix {
 // For modern browsers
  &amp;:before,
  &amp;:after {
    content:"";
    display:table;
  }  &amp;:after {
    clear:both;
  }  // For IE 6/7 (trigger hasLayout)
  &amp; {
    zoom:1;
  }
}.group {
  @include clearfix;
}</pre><p dir="rtl" align="right"><span style="font-size:14px;">رمز &amp; في Sass يرمز إلى "العنصر الحالي"، حيث أنه ولدى ترجمة الملف يتم استبداله بـ المُحدد Selector الحالي. في المثال السابق سيتم استبداله بـ .group</span></p><h1 dir="rtl" align="right">أوراق أنماط أكثر ذكاء</h1><p dir="rtl" align="right">استخدام mixins لتنفيذ أنماط مُعينة على بعض العناصر أمر مفيد جدا، لكن الأفيد والأروع هو إمكانية استخدام المتغيراتarguments تماما مثلما هو عليه الحال مع لغات البرمجة المُختلفة كـ JavaScript وPHP، كما يُمكن استخدامها مع خواص أخرى أكثر تقدما مثل التعابير expressions والدوال functions وذلك بغية الذهاب أبعد من مُجرد تنظيم أوراق الأنماط وتنفيذ أنماط أكثر تعقيدا.</p><p dir="rtl" align="right">تُعتبر Grid Layout systems إحدى أشهر استعمالات Sass. هناك العديد من أنظمة 960px الجاهزة لكن أغلبها يتطلب إضافة أسماء أصناف غير دلالية إلى شفرتك، هذا إلى جانب حاجتك إلى تحميل كامل النظام في مشروعك قبل استخدامه حتى ولو لم تكن ترغب في استخدام سوى جزء يسير منه.</p><p dir="rtl" align="right">في مثالنا الأخير في هذا المقال سنقوم بإنشاء نظام Grid Layout من 12 وحدة باستخدام Sass. بدل استخدام اسم خاص لكل وحدة سنوليmixin مهمة تحديد العرض والهوامش الأنسب لكل عنصر لتحويله إلى وحدة في النظام الشبكي الذي نقوم بإعداده.</p><p dir="rtl" align="right">بداية نحتاج إلى تحديد عرض كل عمود وهوامشه:</p><pre class="css ipsCode prettyprint">$column-width: 60px;    // 12 columns = 720px
$gutter-width: 20px;    // 11 gutters =</pre><p dir="rtl" align="right">ومن ثم نطلب من Sass أن يقوم بحساب عرض كل وحدة بالنيابة عنا، حيث أن عرض كل وحدة يساوي مجموع أعراض الأعمدة التي يغطيها إضافة إلى الهوامش التي تتخللها، وبالتالي يُمكن حسابه على النحو التالي:</p><pre class="css ipsCode prettyprint">width: ($column-width * $span) + ($gutter-width * ($span – 1));</pre><p dir="rtl" align="right">وعليه فإننا سنكتب mixin يقبل متغيرا واحدا (والمتمثل في عدد الأعمدة span)، سيتم محاذاة كل وحدة إلى اليسار، وإضافة هامش 20px بين الوحدات، كما أنه ستتم إضافة هامش على يمين كل وحدة بنفس القيمة:</p><pre class="css ipsCode prettyprint">@mixin grid-unit($span) {
  float: left;
  margin-right: $gutter-width;
  width: ($column-width * $span) + ($gutter-width * ($span - 1));
}</pre><p><span style="font-size:14px;">بالرغم من بساطة الشفرة السابقة فإنها في غاية القوة، حيث أنه بإمكاننا مثلا تنفيذ نمط قاعدي متكون من عمود يحتوي ثلثي المساحة وعمود آخر يحتوي الثلث الباقي على النحو التالي:</span></p><pre class="css ipsCode prettyprint">.container {
  @include clearfix;
  @include grid-unit(12);
  float: none;
  margin: 0 auto;
}.main-content {
  @include grid-unit(8);
}.sidebar {
  @include grid-unit(4);
  margin-right: 0;
}</pre><p dir="rtl" align="right"><span style="font-size:14px;">وما هذا إلا جزء يسير مما يُمكن القيام به باستخدام Sass.</span></p><p dir="rtl" align="right">دعم Sass للعمليات الحسابية القاعدية يجعل من مهمة العمل على تصاميم مُتكيفة adaptive fluid-width layouts أسهل. في المثال التالي نستخدم "الوصفة" الخاصة بـ Ethan Marcotte لتحويل التصميم السابق إلى تصميم مُتكيف. بما أن Sass لا يقوم بالتحويل ما بين الوحدات ما لم يتم طلب ذلك بشكل صريح فإننا نقوم باستخدام الدالة percentage() للقيام بذلك:</p><pre class="css ipsCode prettyprint">.container {
// result = target / context
  width: percentage(940px / 960px);  .main-content {
    // This is nested inside of .container, so its context is 940px
    width: percentage(620px / 940px);
  }  .sidebar {
    width: percentage(300px / 940px);
  }
}</pre><p dir="rtl" align="right"><span style="font-size:14px;">يتوفر Sass أيضا على دوال للتحكم في الألوان كالسطوع والدكانة والشفافية وما إلى ذلك على النحو التالي:</span></p><pre class="css ipsCode prettyprint">$base-link-color: #00f;
a {
  color: $base-link-color;
}
a:visited {
  // This reduces the lightness of the color (in HSL terms) 
  // by 50%, leaving hue and saturation alone
  color: darken($base-link-color, 20%);
}figcaption {
  // Generates an rgba() color value with 50% opacity
  background-color: transparentize(#fff, 50%);
}</pre><p dir="rtl" align="right">إذا لم تكن هذه الدوال كافية في نظرك فإنه بإمكانك إضافة دوال أخرى و تشاركها وإعادة استخدامها ما بين مختلف مشاريعك عبر الملفات الجزئية. ألق نظرة على <a rel="external nofollow" href="http://sass-lang.com/documentation/Sass/Script/Functions.html">القائمة الكاملة لدوال </a><a rel="external nofollow" href="http://sass-lang.com/documentation/Sass/Script/Functions.html">Sass</a> لتأخذ فكرة عما يُمكن لهذه الدوال أن تقوم به.</p><h1 dir="rtl" align="right">هل من مزيد؟</h1><p dir="rtl" align="right"><a rel="external nofollow" href="http://sass-lang.com/">موقع </a><a rel="external nofollow" href="http://sass-lang.com/">Sass </a><a rel="external nofollow" href="http://sass-lang.com/">الرسمي</a> يحتوي الكثير من المعلومات المهمة والمفيدة للراغب في تعلم Sass ويحتوي <a rel="external nofollow" href="http://sass-lang.com/documentation/file.SASS_REFERENCE.html">دليلا شاملا لكل خواص ومزايا </a><a rel="external nofollow" href="http://sass-lang.com/documentation/file.SASS_REFERENCE.html">SCSS</a>.</p><p dir="rtl" align="right">أما لو كنت تفضل قراءة الكتب، فقد ترغب في قراءة كتاب <a rel="external nofollow" href="http://pragprog.com/book/pg_sass/pragmatic-guide-to-sass">Pragmatic Guide to Sass</a> والذي شارك في تأليفه Hampton Catlin مطور Sass.</p><p dir="rtl" align="right">أما لو أردت الذهاب إلى أبعد من ذلك فقد ترغب في إلقاء نظرة على مكتبة <a rel="external nofollow" href="http://compass-style.org/">Compass</a> والتي تحتوي مجموعة كبيرة من دوال أنماط SCSS والتي تدعم كلا من ورقة التصفير CSS reset الخاصة بـ Eric Meyer، نظام الشبكات Blueprint Grid system، إضافة إلى العديد من خواص وتأثيرات CSS3، والتي يصفها مطورها بأنها “jQuery for stylesheets”.</p><p dir="rtl" align="right">إن كنت تستخدم تطبيق scout فإنك ستجد <strong>Compass</strong> متوفرة فيه بشكل مباشر، كما يُمكنك تنصيبه باتباع التعليمات المتوفرة على موقع المكتبة.</p><p dir="rtl" align="right">ترجمة -وبتصرف- للمقال <a rel="external nofollow" href="http://alistapart.com/article/getting-started-with-sass">Getting Started with Sass</a> لصاحبه <a rel="external nofollow" href="https://twitter.com/ddemaree">David Demaree</a></p>
]]></description><guid isPermaLink="false">8</guid><pubDate>Sat, 26 Oct 2013 15:49:00 +0000</pubDate></item></channel></rss>
