<?xml version="1.0"?>
<rss version="2.0"><channel><title>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;: CSS</title><link>https://academy.hsoub.com/programming/css/page/8/?d=2</link><description>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;: CSS</description><language>ar</language><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x643;&#x62A;&#x627;&#x628;&#x629; &#x62A;&#x639;&#x644;&#x64A;&#x645;&#x627;&#x62A; CSS &#x64A;&#x633;&#x647;&#x644; &#x642;&#x631;&#x627;&#x621;&#x62A;&#x647;&#x627;</title><link>https://academy.hsoub.com/programming/css/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D9%83%D8%AA%D8%A7%D8%A8%D8%A9-%D8%AA%D8%B9%D9%84%D9%8A%D9%85%D8%A7%D8%AA-css-%D9%8A%D8%B3%D9%87%D9%84-%D9%82%D8%B1%D8%A7%D8%A1%D8%AA%D9%87%D8%A7-r250/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_02/css-readable.png.d1944917d20db3faf7ce1b0e4dd0957f.png" /></p>

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

<p style="text-align: center;">
	<img alt="css-readable.png" class="ipsImage ipsImage_thumbnailed" data-fileid="13487" data-unique="8br3lzxve" src="https://academy.hsoub.com/uploads/monthly_2016_02/css-readable.png.ce28ed727e3c88051b458d892409cfdc.png"></p>

<p>
	هذا الدرس جزء من <a href="https://academy.hsoub.com/search/?tags=css+101" rel="">سلسلة تعلم CSS</a>:
</p>

<ul>
<li>
		<a href="https://academy.hsoub.com/programming/css/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A3%D9%88%D8%B1%D8%A7%D9%82-%D8%A7%D9%84%D8%A3%D9%86%D9%85%D8%A7%D8%B7-%D8%A7%D9%84%D9%85%D8%AA%D8%AA%D8%A7%D9%84%D9%8A%D8%A9-css-r246/" rel="">مدخل إلى أوراق الأنماط المتتالية (CSS)</a>.
	</li>
	<li>
		<a data-linktype="link" data-searchable="" href="https://academy.hsoub.com/programming/css/%D8%A2%D9%84%D9%8A%D8%A9-%D8%B9%D9%85%D9%84-%D8%AA%D8%B9%D9%84%D9%8A%D9%85%D8%A7%D8%AA-css-%D8%AF%D8%A7%D8%AE%D9%84-%D8%A7%D9%84%D9%85%D8%AA%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-r247/" rel="">آلية عمل تعليمات CSS داخل المتصفحات</a>.
	</li>
	<li>
		<a data-linktype="link" data-searchable="" href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D9%85%D8%AD%D8%AF%D8%AF%D8%A7%D8%AA-selectors-%D9%81%D9%8A-css-r249/" rel="">المحددات (Selectors) في CSS</a>.
	</li>
	<li>
		كيفية كتابة تعليمات CSS يسهل قراءتها. (هذا الدرس)
	</li>
	<li>
		<a data-linktype="link" data-searchable="" href="https://academy.hsoub.com/programming/css/%D8%AA%D9%86%D8%B3%D9%8A%D9%82-%D9%86%D8%B5%D9%88%D8%B5-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-css-r251/" rel="">تنسيق نصوص صفحات الويب باستخدام CSS</a>.
	</li>
	<li>
		<a data-linktype="link" data-searchable="" 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="">التعامل مع الألوان في CSS</a>.
	</li>
	<li>
		<a data-linktype="link" data-searchable="" href="https://academy.hsoub.com/programming/css/%D8%A5%D8%B6%D8%A7%D9%81%D8%A9-%D9%85%D8%AD%D8%AA%D9%88%D9%89-%D8%A5%D9%84%D9%89-%D8%B5%D9%81%D8%AD%D8%A9-%D9%88%D9%8A%D8%A8-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-css-r258/" rel="">إضافة محتوى إلى صفحة ويب باستخدام CSS</a>.
	</li>
	<li>
		<a data-linktype="link" data-searchable="" 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-lists-%D9%81%D9%8A-css-r259/" rel="">تنسيق القوائم (Lists) في CSS</a>.
	</li>
	<li>
		<a data-linktype="link" data-searchable="" href="https://academy.hsoub.com/programming/css/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D8%B5%D9%86%D8%A7%D8%AF%D9%8A%D9%82-boxes-%D9%81%D9%8A-css-r263/" rel="">تعرف على الصناديق (Boxes) في CSS</a>.
	</li>
	<li>
		<a data-linktype="link" data-searchable="" href="https://academy.hsoub.com/programming/css/%D8%B1%D8%B5%D9%81-%D8%A7%D9%84%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-layout-%D9%81%D9%8A-css-r264/" rel="">رصف العناصر (Layout) في CSS</a>.
	</li>
	<li>
		<a data-linktype="link" data-searchable="" href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%AC%D8%AF%D8%A7%D9%88%D9%84-tables-%D9%81%D9%8A-css-r266/" rel="">الجداول (Tables) في CSS</a>.
	</li>
	<li>
		<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%A3%D8%AC%D9%87%D8%B2%D8%A9-%D8%A7%D9%84%D8%B9%D8%B1%D8%B6-%D8%A7%D9%84%D9%85%D8%AE%D8%AA%D9%84%D9%81%D8%A9-%D9%88%D8%A7%D9%84%D9%85%D8%B7%D8%A8%D9%88%D8%B9%D8%A7%D8%AA-%D9%81%D9%8A-css-r268/" rel="">التعامل مع أجهزة العرض المختلفة والمطبوعات في CSS</a>.
	</li>
</ul>
<h2 id="-whitespace-">
	المسافات الفارغة (Whitespace)
</h2>

<p>
	مصطلح مسافة فارغة (whitespace) يعني المسافة المعروفة وعلامات الجدولة (Tab) ومحرف السّطر الجديد. بإمكانك استخدام هذه المحارف لتسهيل قراءة ورقة الأنماط.
</p>

<p>
	لاحظ أن مصطلح المسافة الفارغة قد يستخدم في سياق تخطيط الواجهات للإشارة إلى الجزء من الصفحة الّذي يُترك دون عناصر: كالحواف (margins) والحشوات (gutters) والمسافات بين الأعمدة والسّطور.
</p>

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

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

<h3 id="-">
	أمثلة
</h3>

<p>
	يُفضّل بعض المُصمّمين أسلوبًا وجيزًا في الكتابة، بحيث لا يفصلون السّطر إلا عندما يصبح طويًلا للغاية:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_1689_7">
<span class="pun">.</span><span class="pln">carrot </span><span class="pun">{</span><span class="pln">color</span><span class="pun">:</span><span class="pln"> orange</span><span class="pun">;</span><span class="pln"> text</span><span class="pun">-</span><span class="pln">decoration</span><span class="pun">:</span><span class="pln"> underline</span><span class="pun">;</span><span class="pln"> font</span><span class="pun">-</span><span class="pln">style</span><span class="pun">:</span><span class="pln"> italic</span><span class="pun">;}</span></pre>

<p>
	ويُفضّل آخرون جعل كل زوج من الخواص وقيمها في سطر منفرد:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_1689_11">
<span class="pun">.</span><span class="pln">carrot
</span><span class="pun">{</span><span class="pln">
color</span><span class="pun">:</span><span class="pln"> orange</span><span class="pun">;</span><span class="pln">
text</span><span class="pun">-</span><span class="pln">decoration</span><span class="pun">:</span><span class="pln"> underline</span><span class="pun">;</span><span class="pln">
font</span><span class="pun">-</span><span class="pln">style</span><span class="pun">:</span><span class="pln"> italic</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	وبعضهم يحاذي هذه السطور بمسافتين أو أربع أو بمحرف Tab:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_1689_13">
<span class="pun">.</span><span class="pln">carrot </span><span class="pun">{</span><span class="pln">
  color</span><span class="pun">:</span><span class="pln"> orange</span><span class="pun">;</span><span class="pln">
  text</span><span class="pun">-</span><span class="pln">decoration</span><span class="pun">:</span><span class="pln"> underline</span><span class="pun">;</span><span class="pln">
  font</span><span class="pun">-</span><span class="pln">style</span><span class="pun">:</span><span class="pln"> italic</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_1689_15">
<span class="pun">.</span><span class="pln">carrot
    </span><span class="pun">{</span><span class="pln">
    color           </span><span class="pun">:</span><span class="pln"> orange</span><span class="pun">;</span><span class="pln">
    text</span><span class="pun">-</span><span class="pln">decoration </span><span class="pun">:</span><span class="pln"> underline</span><span class="pun">;</span><span class="pln">
    font</span><span class="pun">-</span><span class="pln">style      </span><span class="pun">:</span><span class="pln"> italic</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_1689_17">
<span class="pun">.</span><span class="pln">vegetable         </span><span class="pun">{</span><span class="pln"> color</span><span class="pun">:</span><span class="pln"> green</span><span class="pun">;</span><span class="pln"> min</span><span class="pun">-</span><span class="pln">height</span><span class="pun">:</span><span class="pln">  </span><span class="lit">5px</span><span class="pun">;</span><span class="pln"> min</span><span class="pun">-</span><span class="pln">width</span><span class="pun">:</span><span class="pln">  </span><span class="lit">5px</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="pun">.</span><span class="pln">vegetable</span><span class="pun">.</span><span class="pln">carrot  </span><span class="pun">{</span><span class="pln"> color</span><span class="pun">:</span><span class="pln"> orange</span><span class="pun">;</span><span class="pln">    height</span><span class="pun">:</span><span class="pln"> </span><span class="lit">90px</span><span class="pun">;</span><span class="pln">     width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">10px</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="pun">.</span><span class="pln">vegetable</span><span class="pun">.</span><span class="pln">spinach </span><span class="pun">{</span><span class="pln"> color</span><span class="pun">:</span><span class="pln"> darkgreen</span><span class="pun">;</span><span class="pln"> height</span><span class="pun">:</span><span class="pln"> </span><span class="lit">30px</span><span class="pun">;</span><span class="pln">     width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">30px</span><span class="pln"> </span><span class="pun">}</span></pre>

<p>
	البعض يستخدم محارف Tab، والبعض يستخدم المسافات فقط.
</p>

<h2 id="-comments-">
	التعليقات (Comments)
</h2>

<p>
	تبدأ التعليقات في CSS بـ‎<strong><code>/*</code></strong>‎ وتنتهي بـ‎<strong><code>*/</code></strong>‎.
</p>

<p>
	بإمكانك استخدام التعليقات للشرح أو توضيح جزء معيّن في ورقة الأنماط، وأيضًا لحجب (comment out) أجزاء من الورقة مؤقّتًا بغاية تجريب التغيّرات.
</p>

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

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_1689_19">
<span class="com">/* style for initial letter C in first paragraph */</span><span class="pln">
</span><span class="pun">.</span><span class="pln">carrot </span><span class="pun">{</span><span class="pln">
  color</span><span class="pun">:</span><span class="pln">            orange</span><span class="pun">;</span><span class="pln">
  text</span><span class="pun">-</span><span class="pln">decoration</span><span class="pun">:</span><span class="pln">  underline</span><span class="pun">;</span><span class="pln">
  font</span><span class="pun">-</span><span class="pln">style</span><span class="pun">:</span><span class="pln">       italic</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span></pre>

<h2 id="-">
	تجميع المحددات
</h2>

<p>
	عندما تتشارك عدّة عناصر بقاعدة واحدة، يمكن تحديد مجموعة من المحدّدات مفصولة بفاصلة لاتينية "<strong><code>,"</code></strong>، وعندها فإنّ القاعدة ستُطبّق على كلّ العناصر المعنيّة.
</p>

<p>
	لتطبيق قواعد لكلّ عنصر من العناصر السّابقة على حدة، يمكن تعريف قاعدة منفصلة في موضع آخر من ورقة الأنماط تستهدف العناصر المنفردة.
</p>

<h3 id="-">
	مثال
</h3>

<p>
	تجعل هذه القاعدة لون <span style="font-family:courier new,courier,monospace;"><code>&lt;h1&gt;</code></span> و<code>&lt;h2&gt;</code> و<code>&lt;h3&gt;</code> واحدًا. وهذا يجعل من السّهل تغيير اللون من مكان واحد لكلّ العناصر مرّة واحدة:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_1689_21">
<span class="com">/* color for headings */</span><span class="pln">
h1</span><span class="pun">,</span><span class="pln"> h2</span><span class="pun">,</span><span class="pln"> h3 </span><span class="pun">{</span><span class="pln">color</span><span class="pun">:</span><span class="pln"> navy</span><span class="pun">;}</span></pre>

<h2 id="-">
	تمرين: إضافة التعليقات وتحسين هيئة ورقة الأنماط
</h2>

<p>
	حرّر ملف CSS الّذي تتدرّب عليه، وتأكد من احتوائه على هذه القواعد (بغضّ النظر عن الترتيب):
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_1689_23">
<span class="pln">strong </span><span class="pun">{</span><span class="pln">color</span><span class="pun">:</span><span class="pln"> red</span><span class="pun">;}</span><span class="pln">
</span><span class="pun">.</span><span class="pln">carrot </span><span class="pun">{</span><span class="pln">color</span><span class="pun">:</span><span class="pln"> orange</span><span class="pun">;}</span><span class="pln">
</span><span class="pun">.</span><span class="pln">spinach </span><span class="pun">{</span><span class="pln">color</span><span class="pun">:</span><span class="pln"> green</span><span class="pun">;}</span><span class="pln">
</span><span class="com">#first {font-style: italic;}</span><span class="pln">
p </span><span class="pun">{</span><span class="pln">color</span><span class="pun">:</span><span class="pln"> blue</span><span class="pun">;}</span></pre>

<p>
	اجعل قراءته أسهل بإعادة ترتيبه بطريقة تراها منطقيّة، وبإضافة مسافات فارغة وتعليقات في أماكن مناسبة.
</p>

<p>
	احفظ الملفّ وحدّث الصّفحة في المتصفّح لتتأكّد من أن تعديلاتك لم تؤثّر على النّتيجة:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="11751" href="https://academy.hsoub.com/uploads/monthly_2016_01/no-changes.png.af9a2200424329f6a91fd3d7b65a44d3.png" rel="external"><img alt="no-changes.png" class="ipsImage ipsImage_thumbnailed" data-fileid="11751" src="https://academy.hsoub.com/uploads/monthly_2016_01/no-changes.thumb.png.bd19f0222f7d5103fa98487a2f70a20f.png"></a>
</p>

<h2 id="-">
	تمرين
</h2>

<p>
	احجب جزءًا من ورقة أنماطك، دون تعديل أيّ شيء آخر، بحيث تجعل الحرف الأوّل من المستند أحمر اللّون:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="11752" href="https://academy.hsoub.com/uploads/monthly_2016_01/c3.png.f61d82246860fef44290c977e40a7a95.png" rel="external"><img alt="c3.png" class="ipsImage ipsImage_thumbnailed" data-fileid="11752" src="https://academy.hsoub.com/uploads/monthly_2016_01/c3.thumb.png.789497d2b1a0d629c3c65dbca3331f2f.png"></a>
</p>

<p>
	(هناك أكثر من طريقة لتحقيق هذه النّتيجة)
</p>

<div class="challenge">
	 
</div>

<div class="challenge">
	<input id="input_solution" name="input_solution" type="checkbox"><label for="input_solution"> شاهد الحل </label>

	<div class="solution">
		<p>
			إحدى طرق فعل ذلك هي احتواء قاعدة <code>.carrot</code> بتعليق:
		</p>

		<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5874_7">
<span class="pln">/*
.carrot {
  color: orange;
}
*/</span></pre>

		<pre>
 </pre>
	</div>
</div>

<h2 id="-">
	ما التالي؟
</h2>

<p>
	استخدمنا تنسيقي الخطّ المائل والمُسطّر في ورقة أنماطنا. سنتعرّف على كيفية إضافة تنسيقات أخرى للنّصوص في الدرس القادم: <a href="https://academy.hsoub.com/programming/css/%D8%AA%D9%86%D8%B3%D9%8A%D9%82-%D9%86%D8%B5%D9%88%D8%B5-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-css-r251/" rel="">تنسيق نصوص صفحات الويب باستخدام CSS</a>
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Getting_Started/Readable_CSS" rel="external nofollow">Readable CSS</a> من سلسلة <a href="https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Getting_started" rel="external nofollow">Getting started with CSS</a> على شبكة مطوّري Mozilla.
</p>
]]></description><guid isPermaLink="false">250</guid><pubDate>Wed, 24 Feb 2016 19:25:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x645;&#x62D;&#x62F;&#x62F;&#x627;&#x62A; (Selectors) &#x641;&#x64A; CSS</title><link>https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D9%85%D8%AD%D8%AF%D8%AF%D8%A7%D8%AA-selectors-%D9%81%D9%8A-css-r249/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_02/css-selectors.png.0249a4c4626671312c8434e8b02eaed1.png" /></p>

<p>
	في هذا الدرس من <a href="https://academy.hsoub.com/search/?tags=css+101" rel="">سلسلة تعلّم CSS</a>، سنتطرق إلى كيفيّة تطبيق الأنماط على العناصر بطريقة انتقائية، وكيف يكون للمحدّدات المختلفة درجات مختلفة من الأولويّة. سنضيف بعض الخواص (attributes) إلى المستند ثم نستخدمها في ورقة الأنماط.
</p>

<p style="text-align: center;">
	<img alt="css-selectors.png" class="ipsImage ipsImage_thumbnailed" data-fileid="13486" data-unique="tkfabsdff" src="https://academy.hsoub.com/uploads/monthly_2016_02/css-selectors.png.0931bf6619381fc0107817205d7ccdca.png"></p>

<p>
	فهرس السلسلة:
</p>

<ul>
<li>
		<a href="https://academy.hsoub.com/programming/css/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A3%D9%88%D8%B1%D8%A7%D9%82-%D8%A7%D9%84%D8%A3%D9%86%D9%85%D8%A7%D8%B7-%D8%A7%D9%84%D9%85%D8%AA%D8%AA%D8%A7%D9%84%D9%8A%D8%A9-css-r246/" rel="">مدخل إلى أوراق الأنماط المتتالية (CSS)</a>.
	</li>
	<li>
		<a data-linktype="link" data-searchable="" href="https://academy.hsoub.com/programming/css/%D8%A2%D9%84%D9%8A%D8%A9-%D8%B9%D9%85%D9%84-%D8%AA%D8%B9%D9%84%D9%8A%D9%85%D8%A7%D8%AA-css-%D8%AF%D8%A7%D8%AE%D9%84-%D8%A7%D9%84%D9%85%D8%AA%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-r247/" rel="">آلية عمل تعليمات CSS داخل المتصفحات</a>.
	</li>
	<li>
		المحددات (Selectors) في CSS. (هذا الدرس)
	</li>
	<li>
		<a data-linktype="link" data-searchable="" href="https://academy.hsoub.com/programming/css/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D9%83%D8%AA%D8%A7%D8%A8%D8%A9-%D8%AA%D8%B9%D9%84%D9%8A%D9%85%D8%A7%D8%AA-css-%D9%8A%D8%B3%D9%87%D9%84-%D9%82%D8%B1%D8%A7%D8%A1%D8%AA%D9%87%D8%A7-r250/" rel="">كيفية كتابة تعليمات CSS يسهل قراءتها</a>.
	</li>
	<li>
		<a data-linktype="link" data-searchable="" href="https://academy.hsoub.com/programming/css/%D8%AA%D9%86%D8%B3%D9%8A%D9%82-%D9%86%D8%B5%D9%88%D8%B5-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-css-r251/" rel="">تنسيق نصوص صفحات الويب باستخدام CSS</a>.
	</li>
	<li>
		<a data-linktype="link" data-searchable="" 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="">التعامل مع الألوان في CSS</a>.
	</li>
	<li>
		<a data-linktype="link" data-searchable="" href="https://academy.hsoub.com/programming/css/%D8%A5%D8%B6%D8%A7%D9%81%D8%A9-%D9%85%D8%AD%D8%AA%D9%88%D9%89-%D8%A5%D9%84%D9%89-%D8%B5%D9%81%D8%AD%D8%A9-%D9%88%D9%8A%D8%A8-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-css-r258/" rel="">إضافة محتوى إلى صفحة ويب باستخدام CSS</a>.
	</li>
	<li>
		<a data-linktype="link" data-searchable="" 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-lists-%D9%81%D9%8A-css-r259/" rel="">تنسيق القوائم (Lists) في CSS</a>.
	</li>
	<li>
		<a data-linktype="link" data-searchable="" href="https://academy.hsoub.com/programming/css/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D8%B5%D9%86%D8%A7%D8%AF%D9%8A%D9%82-boxes-%D9%81%D9%8A-css-r263/" rel="">تعرف على الصناديق (Boxes) في CSS</a>.
	</li>
	<li>
		<a data-linktype="link" data-searchable="" href="https://academy.hsoub.com/programming/css/%D8%B1%D8%B5%D9%81-%D8%A7%D9%84%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-layout-%D9%81%D9%8A-css-r264/" rel="">رصف العناصر (Layout) في CSS</a>.
	</li>
	<li>
		<a data-linktype="link" data-searchable="" href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%AC%D8%AF%D8%A7%D9%88%D9%84-tables-%D9%81%D9%8A-css-r266/" rel="">الجداول (Tables) في CSS</a>.
	</li>
	<li>
		<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%A3%D8%AC%D9%87%D8%B2%D8%A9-%D8%A7%D9%84%D8%B9%D8%B1%D8%B6-%D8%A7%D9%84%D9%85%D8%AE%D8%AA%D9%84%D9%81%D8%A9-%D9%88%D8%A7%D9%84%D9%85%D8%B7%D8%A8%D9%88%D8%B9%D8%A7%D8%AA-%D9%81%D9%8A-css-r268/" rel="">التعامل مع أجهزة العرض المختلفة والمطبوعات في CSS</a>.
	</li>
</ul>
<h2 id="-">
	ما هي المحددات؟
</h2>

<p>
	لـCSS مجموعة من المصطلحات الخاصة الّتي تصف اللّغة. كنّا قد أنشأنا سطرًا في ورقة الأنماط محتواه:
</p>

<pre class="css ipsCode prettyprint prettyprinted" data-pbcklang="css" data-pbcktabsize="">
<span class="pln">strong </span><span class="pun">{</span><span class="pln"> color</span><span class="pun">:</span><span class="pln"> red</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span></pre>

<p>
	وفي مصطلحات CSS نقول عن هذا السّطر أنّه قاعدة (rule). تبدأ هذه القاعدة بالكلمة <code>strong</code> والّتي نُسمّيها المحدِّد (selector)، لأنّه يحدّد العناصر في DOM الّتي تُطبّق عليها القاعدة المعنيّة.
</p>

<h3 id="-">
	تفاصيل أكثر
</h3>

<ul>
<li>
		نُسمّي الجزء ضمن القوسين من القاعدة التّصريح (declaration).
	</li>
	<li>
		الكلمة <code>color</code> تُسمّى خاصّة (property)، وقيمتها (value) هي <code>red</code>.
	</li>
	<li>
		تفصل الفاصلة اللاتينية المنقوطة <code>;</code> بين أزواجٍ من القيم والخواص ضمن التّصريح ذاته.
	</li>
	<li>
		سنطلق على المُحدّد <code>strong</code> في هذه السلسلة وصف محدّد لوسم (tag selector)، إلّا أنّه في مصطلحات CSS يُسمّى محدّد لنوع (type selector).
	</li>
</ul>
<p>
	يُفصِّل هذا الدرس من السلسلة المحدّدات التي يمكن استخدامها في قواعد CSS، فبالإضافة إلى أسماء الوسوم، يمكن استخدام قيم الخواص (attributes) في المُحدّدات، وهذا ما يسمح لقواعد CSS بتحديد أكثر انتقائيّة للعناصر.
</p>

<p>
	للخاصّتين <code>class</code> و<code>id</code> وضع خاصّ في CSS.
</p>

<h2 id="-class-selectors-">
	محددات الأصناف (Class selectors)
</h2>

<p>
	استخدم الخاصّة <code>class</code> في HTML لإسناد صنف إلى العنصر، بإمكانك اختيار أي اسم للصنف، ويمكن للصّنف الواحد أن يُسند إلى عدّة عناصر في الصّفحة.
</p>

<p>
	لاستخدام محدّد الصنف في CSS اكتب اسم الصّنف مسبوقًا بنقطة (<code>.</code>).
</p>

<h2 id="-id-selectors-">
	محددات المعرفات (ID selectors)
</h2>

<p>
	استخدم الخاصّة <code>id</code> في عنصر لإسناد مُعرّف إلى هذا العنصر، بإمكانك اختيار أي اسم للمُعرّف، ولكن ينبغي أن لا يكون لعنصرين في الصّفحة المُعرّف ذاته.
</p>

<p>
	لاستخدام مُحدّد المعرّف في CSS، اكتب اسم المُعرّف مسبوقًا برمز<strong> <code>#</code></strong>.
</p>

<h4 id="-">
	<strong>مثال:</strong>
</h4>

<p>
	لوسم HTML التالي خاصّتا الصّنف والمعرّف معًا:
</p>

<pre class="html ipsCode prettyprint prettyprinted" data-pbcklang="html" data-pbcktabsize="">
<span class="tag">&lt;p</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"key"</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"principal"</span><span class="tag">&gt;</span></pre>

<p>
	قيمة الخاصّة <code>id</code>، وهي <code>principal</code> يجب أن تكون فريدة لا تتكرّر في كامل المستند، ولكن يمكن استخدام الصّنف <code>key</code> لأي عدد من العناصر.
</p>

<p>
	القاعدة التالية في CSS تجعل كل العناصر في المستند خضراء اللون، حتى وإن تكن جميعها عناصر <code>&lt;p&gt;</code>:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_4514_7">
<span class="pun">.</span><span class="pln">key </span><span class="pun">{</span><span class="pln">
  color</span><span class="pun">:</span><span class="pln"> green</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	القاعدة التالية تجعل العنصر الوحيد ذا المعرّف <code>principal</code> عريض الخطّ:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_4514_9">
<span class="com">#principal {</span><span class="pln">
  font</span><span class="pun">-</span><span class="pln">weight</span><span class="pun">:</span><span class="pln"> bolder</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<h2 id="-attribute-selectors-">
	محددات الخواص (Attribute Selectors)
</h2>

<p>
	لا تقتصر CSS على الخاصتين <code>class</code> و<code>id</code>، بل يمكنك تحديد <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Attribute_selectors" rel="external nofollow">خواصّ أخرى</a> باستخدام الأقواس المربّعة <code>[]</code>. ضع اسم الخاصة ضمن القوسين وأتبعه بعامل ثم قيمة (غير إلزاميّين). يمكن أيضًا جعل المطابقة غير حسّاسة لحالة الحروف اللّاتينية بإضافة "i" بعد القيمة، ولكن هذه الميزة غير مدعومة في معظم المتصفّحات. أمثلة:
</p>

<ul>
<li>
		<span style="font-family:courier new,courier,monospace;">‏‎<code>[disabled]</code>‎</span>: تحدّد كل العناصر التي تملك الخاصّة "disabled".
	</li>
	<li>
		‏‎<span style="font-family:courier new,courier,monospace;"><code>[type='button']</code></span>‎: تحدد كل العناصر من النوع "button".
	</li>
	<li>
		‏‎<span style="font-family:courier new,courier,monospace;"><code>[class~=key]</code></span>‎: تحدّد العناص ذات الصّنف "key" بالضّبط وليس أي كلمة تحوي ضمنها "key" مثل "keyed" أو "monkey". تطابق من حيث الوظيفة المُحدّد <code>.key</code>.
	</li>
	<li>
		‏‎:<span style="font-family:courier new,courier,monospace;"><code>[lang|=es]</code></span>‎ تحدّد العناصر المحدّدة على أنّها باللّغة الإسبانية. هذا يتضمن العناصر "es" و"es-MX" ولكن ليس "eu-ES".
	</li>
	<li>
		‏‎<code>[title*="example" i]</code>‎ يحدّد العناصر التي يحوي عنوانها "example"، متجاهلًا حالة الحروف اللاتينيّة، قد لا يطابق هذا العنصر أي شيء في المتصفّحات الّتى لا تدعم الإشارة "i".
	</li>
	<li>
		‏‎<code>a[href^="https://"]</code>‎ يحدّد الرّوابط الآمنة.
	</li>
	<li>
		‏‎<code>img[src$=".png"]</code>‎ يحدّد الصور بصيغة PNG بطريقة غير مباشرة، إلّا أنه لا يحدد الصور بصيغة PNG إن كانت روابطها لا تنتهي بالحروف ".png".
	</li>
</ul>
<h2 id="-psuedo-classes-">
	محددات الأصناف الزائفة (pseudo-classes)
</h2>

<p>
	تعني كلمة "الصّنف الزائف" في CSS حالة خاصّة للعناصر التي يُراد تحديدها، فمثلًا إضافة ‎<code>:hover</code>‎ إلى المحدّد يؤدّي إلى تطبيق القاعدة عندما يُمرّر المستخدم مؤشّر الفأرة فوق العنصر الذي يستهدفه المُحدّد.
</p>

<p>
	تسمح الأصناف الزائفة (والعناصر الزائفة) بتطبيق تنسيق على عنصر عندما يخضع لعوامل خارجيّة كتاريخ التّصفّح (‎<code>:visited</code>‎ مثلًا)، أو حالة محتواه (مثل ‎<span style="font-family:courier new,courier,monospace;"><code>:checked</code>‎</span>)، أو موضع الفأرة (مثل ‎<code>:hover</code>‎)، يمكنك مراجعة القائمة الكاملة للمحدّدات على <a href="http://www.w3.org/TR/selectors/#selectors" rel="external nofollow">صفحة توصيف مُحدّدات CSS3</a>.
</p>

<h3 id="-">
	الصيغة
</h3>

<pre class="css ipsCode prettyprint prettyprinted" data-pbcklang="css" data-pbcktabsize="">
<span class="pln">selector</span><span class="pun">:</span><span class="pln">pseudo</span><span class="pun">-</span><span class="kwd">class</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">property</span><span class="pun">:</span><span class="pln"> value</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<h3 id="-">
	قائمة بالأصناف الزائفة
</h3>

<ul>
<li>
		<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4514_11">
<span class="pln">:link
:visited
:active
:hover
:focus
:first-child
:last-child
:nth-child
:nth-last-child
:nth-of-type
:first-of-type
:last-of-type
:empty
:target
:checked
:enabled
:disabled</span></pre>
	</li>
</ul>
<h2 id="-specificity-">
	عمق التحديد (Specificity)
</h2>

<p>
	قد يكون لعدّة قواعد مُحدّدات تستهدف العنصر نفسه، فإن كانت الخاصّة غير مكرّرة ضمن هذه القواعد، لن يحدث تعارض، وستُعيّن هذه الخاصة على العنصر، أما إن كانت الخاصة واردة في أكثر من قاعدة، فإن CSS تطبّق الخاصّة الأكثر <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Specificity" rel="external nofollow">عمقًا في التّحديد</a>، فالمُحدّد الّذي يستهدف العنصر بُمعرّفه أكثر عمقًا من مُحدّدات الصّنف والأصناف الزائفة والخواصّ الأخرى، وهذه بدورها أكثر عمقًا من مُحدّدات الوسوم والعناصر الزائفة.
</p>

<h3 id="-">
	تفاصيل أكثر
</h3>

<p>
	يمكنك أيضًا جمع المُحدّدات، مُنشِئًا مُحدّدًا أكثر عمقًا، فمثلًا يحدّد<span style="font-family:courier new,courier,monospace;"> <code>key.</code></span> كل العناصر من الصّنف <span style="font-family:courier new,courier,monospace;"><code>key</code></span>، والمُحدّد <code>p.key</code> يحدّد فقط العناصر <code>&lt;p&gt;</code> ذات الصّنف <code>key</code>.
</p>

<p>
	إن تساوت المُحدّدات بدرجة العمق، كانت الأولوية للقاعدة الّتي ترد آخرًا في ورقة الأنماط.
</p>

<h2 id="-">
	التحديد تبعا للعلاقات بين العناصر
</h2>

<p>
	يمكن في CSS تحديد العناصر بناءً على علاقتها بعناصر أخرى، ويمكن بذلك إنشاء مُحدِّدات أكثر عمقًا.
</p>

<h3 id="-">
	المحددات الشائع استخدامها بناء على علاقة العناصر
</h3>

<center>
	<table>
<thead><tr>
<th>
					المُحدّد
				</th>
				<th>
					يُحدِّد
				</th>
			</tr></thead>
<tbody>
<tr>
<td>
					<code>A E</code>
				</td>
				<td>
					أي عنصر E يكون من سلالة A (أي ابنه أو ابن ابنه...)
				</td>
			</tr>
<tr>
<td>
					<code>A &gt; E</code>
				</td>
				<td>
					أي عنصر E يكون ابنًا مباشرًا للعنصر A
				</td>
			</tr>
<tr>
<td>
					<code>E:first-child</code>
				</td>
				<td>
					أي عنصر E يكون أوّل ابن لأبيه
				</td>
			</tr>
<tr>
<td>
					<code>B + E</code>
				</td>
				<td>
					أي عنصر E يكون أول أخٍ لعنصر B (أي الابن التالي لنفس الأب)
				</td>
			</tr>
</tbody>
</table>
</center>

<p>
	يمكن أيضًا جمع أيّ من هذه المُحدّدات للتّعبير عن علاقات أكثر تعقيدًا.
</p>

<p>
	يمكن استخدام الرّمز <code>*</code> للإشارة إلى "أي عنصر".
</p>

<h3 id="-">
	مثال
</h3>

<p>
	لجدول HTML التالي خاصّة <code>id</code>، ولكن ليس لسطوره وخلاياه أيّة مُعرّفات:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9986_7">
<span class="tag">&lt;table</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"data-table-1"</span><span class="tag">&gt;</span><span class="pln">
...
</span><span class="tag">&lt;tr&gt;</span><span class="pln">
  </span><span class="tag">&lt;td&gt;</span><span class="pln">Prefix</span><span class="tag">&lt;/td&gt;</span><span class="pln">
  </span><span class="tag">&lt;td&gt;</span><span class="pln">0001</span><span class="tag">&lt;/td&gt;</span><span class="pln">
  </span><span class="tag">&lt;td&gt;</span><span class="pln">default</span><span class="tag">&lt;/td&gt;</span><span class="pln">
</span><span class="tag">&lt;/tr&gt;</span><span class="pln">
...</span></pre>

<p>
	القواعد التالية تجعل الخليّة الأولى في كل سطر عريضة الخطّ، والثّانية ذات خطّ ثابت العرض، ولا تنطبق هذه القواعد إلا على الجدول السّابق المستند:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_9986_9">
<span class="com">#data-table-1 td:first-child {text-decoration: underline;}</span><span class="pln">
</span><span class="com">#data-table-1 td:first-child + td {text-decoration: line-through;}</span></pre>

<p>
	هذه هي النّتيجة:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="11736" href="https://academy.hsoub.com/uploads/monthly_2016_01/table.png.f15ed24ce3dcf7d9b5120b9550ca844e.png" rel="external"><img alt="table.png" class="ipsImage ipsImage_thumbnailed" data-fileid="11736" src="https://academy.hsoub.com/uploads/monthly_2016_01/table.thumb.png.09addba29eb0c23c415550949a4c0e52.png"></a>
</p>

<h3 id="-">
	تفاصيل أكثر
</h3>

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

<p>
	لمزيد من الأمثلة عن الجداول، راجع <a href="https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Getting_Started/Tables" rel="external nofollow">صفحة الجداول</a> في مرجع CSS.
</p>

<h2 id="-">
	تدريب: استخدام محددات الأصناف والمعرفات
</h2>

<ol>
<li>
		حرّر ملفّ HTML الّذي تتدرّب عليه، كرّر الفقرة بنسخها ولصقها.
	</li>
	<li>
		أضف الخاصّتين <code>id</code> و<code>class</code> إلى النّسخة الأولى من الفقرة، وأضف <code>id</code> إلى الثّانية كما في المثال أدناه، أو يمكنك نسخ كامل المثال:
		<pre class="html ipsCode prettyprint prettyprinted" data-pbcklang="html" data-pbcktabsize="">
<span class="dec">&lt;!doctype html&gt;</span><span class="pln">
</span><span class="tag">&lt;html&gt;</span><span class="pln">
 </span><span class="tag">&lt;head&gt;</span><span class="pln">
 </span><span class="tag">&lt;meta</span><span class="pln"> </span><span class="atn">charset</span><span class="pun">=</span><span class="atv">"UTF-8"</span><span class="tag">&gt;</span><span class="pln">
 </span><span class="tag">&lt;title&gt;</span><span class="pln">Sample document</span><span class="tag">&lt;/title&gt;</span><span class="pln">
 </span><span class="tag">&lt;link</span><span class="pln"> </span><span class="atn">rel</span><span class="pun">=</span><span class="atv">"stylesheet"</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"style1.css"</span><span class="tag">&gt;</span><span class="pln">
 </span><span class="tag">&lt;/head&gt;</span><span class="pln">
 </span><span class="tag">&lt;body&gt;</span><span class="pln">
   </span><span class="tag">&lt;p</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"first"</span><span class="tag">&gt;</span><span class="pln">
     </span><span class="tag">&lt;strong</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"carrot"</span><span class="tag">&gt;</span><span class="pln">C</span><span class="tag">&lt;/strong&gt;</span><span class="pln">ascading
     </span><span class="tag">&lt;strong</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"spinach"</span><span class="tag">&gt;</span><span class="pln">S</span><span class="tag">&lt;/strong&gt;</span><span class="pln">tyle
     </span><span class="tag">&lt;strong</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"spinach"</span><span class="tag">&gt;</span><span class="pln">S</span><span class="tag">&lt;/strong&gt;</span><span class="pln">heets
   </span><span class="tag">&lt;/p&gt;</span><span class="pln">
   </span><span class="tag">&lt;p</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"second"</span><span class="tag">&gt;</span><span class="pln">
     </span><span class="tag">&lt;strong&gt;</span><span class="pln">C</span><span class="tag">&lt;/strong&gt;</span><span class="pln">ascading
     </span><span class="tag">&lt;strong&gt;</span><span class="pln">S</span><span class="tag">&lt;/strong&gt;</span><span class="pln">tyle
     </span><span class="tag">&lt;strong&gt;</span><span class="pln">S</span><span class="tag">&lt;/strong&gt;</span><span class="pln">heets
   </span><span class="tag">&lt;/p&gt;</span><span class="pln">
 </span><span class="tag">&lt;/body&gt;</span><span class="pln">
</span><span class="tag">&lt;/html&gt;</span></pre>
	</li>
	<li>
		عدّل CSS مُستبدلًا كامل محتوى الملفّ:
		<pre class="css ipsCode prettyprint prettyprinted" data-pbcklang="css" data-pbcktabsize="">
<span class="pln">strong </span><span class="pun">{</span><span class="pln"> color</span><span class="pun">:</span><span class="pln"> red</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="pun">.</span><span class="pln">carrot </span><span class="pun">{</span><span class="pln"> color</span><span class="pun">:</span><span class="pln"> orange</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="pun">.</span><span class="pln">spinach </span><span class="pun">{</span><span class="pln"> color</span><span class="pun">:</span><span class="pln"> green</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="com">#first { font-style: italic; }</span></pre>
	</li>
	<li>
		<p>
			احفظ الملفّات وحدّث المتصفّح لترى النّتيجة:
		</p>

		<p style="text-align: center;">
			<a class="ipsAttachLink ipsAttachLink_image" data-fileid="11737" href="https://academy.hsoub.com/uploads/monthly_2016_01/selectors.png.54af2833eefce370e4fd6f18a263bb74.png" rel="external"><img alt="selectors.png" class="ipsImage ipsImage_thumbnailed" data-fileid="11737" src="https://academy.hsoub.com/uploads/monthly_2016_01/selectors.thumb.png.8d2ac2e54290c8099e072179c727f53d.png"></a>
		</p>

		<p>
			بإمكانك تغير ترتيب الأسطر في CSS للتأكد من أن ترتيبها لا يؤثّر على النّتيجة، لأن مُحدّدات الأصناف <code>carrot.</code> و <code>spinach.</code> مُقدَّمَة على مُحدّد الوسم <code>strong</code>، ومُحدّد المُعرّف <code>first#</code> مُقدّم عليها جميعًا.
		</p>
	</li>
</ol>
<h2 id="-">
	تمرين
</h2>

<ol>
<li>
		<p>
			بدون تعديل ملف HTML، أضف قاعدة وحيدة إلى CSS تبقي كل الحروف الأولى بنفس لونها الحالي، ولكن تجعل الحروف الأخرى في الفقرة الثّانية زرقاء:
		</p>

		<p style="text-align: center;">
			<a class="ipsAttachLink ipsAttachLink_image" data-fileid="11738" href="https://academy.hsoub.com/uploads/monthly_2016_01/c1.png.792c3d52aec6d8a439e7dd81c9bf35c9.png" rel="external"><img alt="c1.png" class="ipsImage ipsImage_thumbnailed" data-fileid="11738" src="https://academy.hsoub.com/uploads/monthly_2016_01/c1.thumb.png.bce9529fa1dea3a3fc76e3fb1f898c1d.png"></a>
		</p>
	</li>
	<li>
		<p>
			عدّل القاعدة الّتي أضفتها للتوّ بحيث تجعل الفقرة الأولى زرقاء أيضًا (بدون تعديل أي شيء آخر):
		</p>

		<p style="text-align: center;">
			<a class="ipsAttachLink ipsAttachLink_image" data-fileid="11739" href="https://academy.hsoub.com/uploads/monthly_2016_01/c2.png.8be86aa3cbd7b7ee5c4968bba27db2ef.png" rel="external"><img alt="c2.png" class="ipsImage ipsImage_thumbnailed" data-fileid="11739" src="https://academy.hsoub.com/uploads/monthly_2016_01/c2.thumb.png.c4f620f3fd437e59e52775a25c3b2482.png"></a>
		</p>
	</li>
</ol>
<div class="challenge">
	 
</div>

<div class="challenge">
	<input id="input_solution" name="input_solution" type="checkbox"><label for="input_solution"> شاهد الحل </label>

	<div class="solution">
		<h3 id="-">
			جعل الفقرة الثانية زرقاء اللون
		</h3>

		<p>
			أضف قاعدة تستهدف <code>#second</code> وتصريحًا <code>color: blue;</code> كما يلي:
		</p>

		<pre>

 </pre>

		<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8299_7">
<span class="pln">#second { color: blue; }</span></pre>

		<p>
			يمكن أيضًا استخدام مُحدّد أكثر عُمقًا مثل <code>p#second</code>.
		</p>

		<h3 id="-">
			جعل الفقرتين زرقاوين
		</h3>

		<p>
			غيّر مُحدّد القاعدة الجديدة ليصبح مُحدّد وسم <code>&lt;p&gt;</code>:
		</p>

		<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_8299_9">
<span class="pln">p </span><span class="pun">{</span><span class="pln"> color</span><span class="pun">:</span><span class="pln"> blue</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span></pre>

		<pre>

 </pre>

		<p>
			قواعد الألوان الأخرى لها مُحدّدات أكثر عمقًا، لذا فهي تطغى على لون الفقرات الأزرق.
		</p>
	</div>
</div>

<h2 id="-">
	مثال عملي: استخدام محددات الأصناف الزائفة
</h2>

<ol>
<li>
		أنشئ ملف HTML بالمحتوى التالي:
		<pre class="html ipsCode prettyprint prettyprinted" data-pbcklang="html" data-pbcktabsize="">
<span class="dec">&lt;!doctype html&gt;</span><span class="pln">
</span><span class="tag">&lt;html&gt;</span><span class="pln">
 </span><span class="tag">&lt;head&gt;</span><span class="pln">
 </span><span class="tag">&lt;meta</span><span class="pln"> </span><span class="atn">charset</span><span class="pun">=</span><span class="atv">"UTF-8"</span><span class="tag">&gt;</span><span class="pln">
 </span><span class="tag">&lt;title&gt;</span><span class="pln">Sample document</span><span class="tag">&lt;/title&gt;</span><span class="pln">
 </span><span class="tag">&lt;link</span><span class="pln"> </span><span class="atn">rel</span><span class="pun">=</span><span class="atv">"stylesheet"</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"style1.css"</span><span class="tag">&gt;</span><span class="pln">
 </span><span class="tag">&lt;/head&gt;</span><span class="pln">
 </span><span class="tag">&lt;body&gt;</span><span class="pln">
   </span><span class="tag">&lt;p&gt;</span><span class="pln">Go to our </span><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"homepage"</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"http://www.example.com/"</span><span class="pln"> </span><span class="atn">title</span><span class="pun">=</span><span class="atv">"Home page"</span><span class="tag">&gt;</span><span class="pln">Home page</span><span class="tag">&lt;/a&gt;</span><span class="pln">.</span><span class="tag">&lt;/p&gt;</span><span class="pln">
 </span><span class="tag">&lt;/body&gt;</span><span class="pln">
</span><span class="tag">&lt;/html&gt;</span></pre>
	</li>
	<li>
		<p>
			عدّل ملف CSS مستبدلًا كلّ محتواه:
		</p>

		<pre class="css ipsCode prettyprint prettyprinted" data-pbcklang="css" data-pbcktabsize="">
<span class="pln"> a</span><span class="pun">.</span><span class="pln">homepage</span><span class="pun">:</span><span class="pln">link</span><span class="pun">,</span><span class="pln"> a</span><span class="pun">.</span><span class="pln">homepage</span><span class="pun">:</span><span class="pln">visited </span><span class="pun">{</span><span class="pln">
   padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1px</span><span class="pln"> </span><span class="lit">10px</span><span class="pln"> </span><span class="lit">1px</span><span class="pln"> </span><span class="lit">10px</span><span class="pun">;</span><span class="pln">
   color</span><span class="pun">:</span><span class="pln"> </span><span class="com">#fff;</span><span class="pln">
   background</span><span class="pun">:</span><span class="pln"> </span><span class="com">#555;</span><span class="pln">
   border</span><span class="pun">-</span><span class="pln">radius</span><span class="pun">:</span><span class="pln"> </span><span class="lit">3px</span><span class="pun">;</span><span class="pln">
   border</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1px</span><span class="pln"> outset rgba</span><span class="pun">(</span><span class="lit">50</span><span class="pun">,</span><span class="lit">50</span><span class="pun">,</span><span class="lit">50</span><span class="pun">,.</span><span class="lit">5</span><span class="pun">);</span><span class="pln">
   font</span><span class="pun">-</span><span class="pln">family</span><span class="pun">:</span><span class="pln"> georgia</span><span class="pun">,</span><span class="pln"> serif</span><span class="pun">;</span><span class="pln">
   font</span><span class="pun">-</span><span class="pln">size</span><span class="pun">:</span><span class="pln"> </span><span class="lit">14px</span><span class="pun">;</span><span class="pln">
   font</span><span class="pun">-</span><span class="pln">style</span><span class="pun">:</span><span class="pln"> italic</span><span class="pun">;</span><span class="pln">
   text</span><span class="pun">-</span><span class="pln">decoration</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">

 a</span><span class="pun">.</span><span class="pln">homepage</span><span class="pun">:</span><span class="pln">hover</span><span class="pun">,</span><span class="pln"> a</span><span class="pun">.</span><span class="pln">homepage</span><span class="pun">:</span><span class="pln">focus</span><span class="pun">,</span><span class="pln"> a</span><span class="pun">.</span><span class="pln">homepage</span><span class="pun">:</span><span class="pln">active </span><span class="pun">{</span><span class="pln">
   background</span><span class="pun">-</span><span class="pln">color</span><span class="pun">:</span><span class="pln"> </span><span class="com">#666;</span><span class="pln">
 </span><span class="pun">}</span></pre>
	</li>
	<li>
		<p>
			احفظ الملفّين وحدّث المتصفّح لمشاهدة النّتيجة (ضع مؤشر الفأرة فوق الرّابط لمشاهدة التأثير):
		</p>
	</li>
</ol>
<div style="text-align: center;">
	Go to our <a class="tutospecial" href="#" rel="external" title="Home page">Home page</a>
</div>

<h2 id="-">
	تدريب: استخدام المحددات بناء على العلاقات بين العناصر والأصناف الزائفة
</h2>

<p>
	بالإمكان الوصول إلى طرق معقدة لاستهداف العناصر بناء على العلاقات بين عناصرها والأصناف الزائفة، تشيع هذه التقنيات مثلًا بهدف إنشاء قوائم مُنسدلة باستخدام CSS فقط دون JavaScript. أساس هذه التقنية يعتمد على قواعد مشابهة لهذه:
</p>

<pre class="css ipsCode prettyprint prettyprinted" data-pbcklang="css" data-pbcktabsize="">
<span class="pln">div</span><span class="pun">.</span><span class="pln">menu</span><span class="pun">-</span><span class="pln">bar ul ul </span><span class="pun">{</span><span class="pln">
  display</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">

div</span><span class="pun">.</span><span class="pln">menu</span><span class="pun">-</span><span class="pln">bar li</span><span class="pun">:</span><span class="pln">hover </span><span class="pun">&gt;</span><span class="pln"> ul </span><span class="pun">{</span><span class="pln">
  display</span><span class="pun">:</span><span class="pln"> block</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	بحيث تطبّق على بنية HTML مثل هذه:
</p>

<pre class="css ipsCode prettyprint prettyprinted" data-pbcklang="css" data-pbcktabsize="">
<span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"menu-bar"</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;ul&gt;</span><span class="pln">
    </span><span class="tag">&lt;li&gt;</span><span class="pln">
      </span><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"example.html"</span><span class="tag">&gt;</span><span class="pln">Menu</span><span class="tag">&lt;/a&gt;</span><span class="pln">
      </span><span class="tag">&lt;ul&gt;</span><span class="pln">
        </span><span class="tag">&lt;li&gt;</span><span class="pln">
          </span><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"example.html"</span><span class="tag">&gt;</span><span class="pln">Link</span><span class="tag">&lt;/a&gt;</span><span class="pln">
        </span><span class="tag">&lt;/li&gt;</span><span class="pln">
        </span><span class="tag">&lt;li&gt;</span><span class="pln">
          </span><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"menu-nav"</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"example.html"</span><span class="tag">&gt;</span><span class="pln">Submenu</span><span class="tag">&lt;/a&gt;</span><span class="pln">
          </span><span class="tag">&lt;ul&gt;</span><span class="pln">
            </span><span class="tag">&lt;li&gt;</span><span class="pln">
              </span><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"menu-nav"</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"example.html"</span><span class="tag">&gt;</span><span class="pln">Submenu</span><span class="tag">&lt;/a&gt;</span><span class="pln">
              </span><span class="tag">&lt;ul&gt;</span><span class="pln">
                </span><span class="tag">&lt;li&gt;&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"example.html"</span><span class="tag">&gt;</span><span class="pln">Link</span><span class="tag">&lt;/a&gt;&lt;/li&gt;</span><span class="pln">
                </span><span class="tag">&lt;li&gt;&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"example.html"</span><span class="tag">&gt;</span><span class="pln">Link</span><span class="tag">&lt;/a&gt;&lt;/li&gt;</span><span class="pln">
                </span><span class="tag">&lt;li&gt;&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"example.html"</span><span class="tag">&gt;</span><span class="pln">Link</span><span class="tag">&lt;/a&gt;&lt;/li&gt;</span><span class="pln">
                </span><span class="tag">&lt;li&gt;&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"example.html"</span><span class="tag">&gt;</span><span class="pln">Link</span><span class="tag">&lt;/a&gt;&lt;/li&gt;</span><span class="pln">
              </span><span class="tag">&lt;/ul&gt;</span><span class="pln">
            </span><span class="tag">&lt;/li&gt;</span><span class="pln">
            </span><span class="tag">&lt;li&gt;&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"example.html"</span><span class="tag">&gt;</span><span class="pln">Link</span><span class="tag">&lt;/a&gt;&lt;/li&gt;</span><span class="pln">
          </span><span class="tag">&lt;/ul&gt;</span><span class="pln">
        </span><span class="tag">&lt;/li&gt;</span><span class="pln">
      </span><span class="tag">&lt;/ul&gt;</span><span class="pln">
    </span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;/ul&gt;</span><span class="pln">
</span><span class="tag">&lt;/div&gt;</span></pre>

<p>
	اطّلع على <a href="https://mdn.mozillademos.org/files/3700/css_dropdown_menu.html" rel="external nofollow">مثالنا الكامل</a> كمساعدة.
</p>

<h2 id="-">
	ما التالي؟
</h2>

<p>
	بدأت ورقة الأنماط تصبح معقّدة ومتشابكة، سنناقش كيف نُبسّطها ونجعلها سهلة القراءة في الدّرس القادم: <a href="https://academy.hsoub.com/programming/css/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D9%83%D8%AA%D8%A7%D8%A8%D8%A9-%D8%AA%D8%B9%D9%84%D9%8A%D9%85%D8%A7%D8%AA-css-%D9%8A%D8%B3%D9%87%D9%84-%D9%82%D8%B1%D8%A7%D8%A1%D8%AA%D9%87%D8%A7-r250/" rel="">كيفية كتابة تعليمات CSS يسهل قراءتها</a>.
</p>

<p>
	ترجمة -وبتصرّف- للمقال <a href="https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Getting_Started/Selectors" rel="external nofollow">Selectors</a> من سلسلة <a href="https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Getting_started" rel="external nofollow">Getting started with CSS</a> على شبكة مطوّري Mozilla.
</p>
]]></description><guid isPermaLink="false">249</guid><pubDate>Mon, 22 Feb 2016 19:01:00 +0000</pubDate></item><item><title>&#x622;&#x644;&#x64A;&#x629; &#x639;&#x645;&#x644; &#x62A;&#x639;&#x644;&#x64A;&#x645;&#x627;&#x62A; CSS &#x62F;&#x627;&#x62E;&#x644; &#x627;&#x644;&#x645;&#x62A;&#x635;&#x641;&#x62D;&#x627;&#x62A;</title><link>https://academy.hsoub.com/programming/css/%D8%A2%D9%84%D9%8A%D8%A9-%D8%B9%D9%85%D9%84-%D8%AA%D8%B9%D9%84%D9%8A%D9%85%D8%A7%D8%AA-css-%D8%AF%D8%A7%D8%AE%D9%84-%D8%A7%D9%84%D9%85%D8%AA%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-r247/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_02/css-how-it-works.png.d81e270d224275cca443353a5a593456.png" /></p>

<p>
	<span style="display: none;"> </span>يشرح هذا الجزء من <a href="https://academy.hsoub.com/search/?tags=css+101" rel="">سلسلة تعليم CSS</a> كيف تعمل CSS في المتصفّحات وما الهدف من وجود DOM. سنتعلّم أيضًا كيف نُحلّل مستندًا بسيطًا.
</p>

<p style="text-align: center;">
	<img alt="css-how-it-works.png" class="ipsImage ipsImage_thumbnailed" data-fileid="12848" data-unique="gcrc86axw" src="https://academy.hsoub.com/uploads/monthly_2016_02/css-how-it-works.png.77bc5343a6e4406acc43ea78dfd22ece.png"></p>

<p>
	فهرس السلسلة:
</p>

<ul>
<li>
		<a href="https://academy.hsoub.com/programming/css/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A3%D9%88%D8%B1%D8%A7%D9%82-%D8%A7%D9%84%D8%A3%D9%86%D9%85%D8%A7%D8%B7-%D8%A7%D9%84%D9%85%D8%AA%D8%AA%D8%A7%D9%84%D9%8A%D8%A9-css-r246/" rel="">مدخل إلى أوراق الأنماط المتتالية (CSS)</a>.
	</li>
	<li>
		آلية عمل تعليمات CSS داخل المتصفحات. (هذا الدرس)
	</li>
	<li>
		<a data-linktype="link" data-searchable="" href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D9%85%D8%AD%D8%AF%D8%AF%D8%A7%D8%AA-selectors-%D9%81%D9%8A-css-r249/" rel="">المحددات (Selectors) في CSS</a>.
	</li>
	<li>
		<a data-linktype="link" data-searchable="" href="https://academy.hsoub.com/programming/css/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D9%83%D8%AA%D8%A7%D8%A8%D8%A9-%D8%AA%D8%B9%D9%84%D9%8A%D9%85%D8%A7%D8%AA-css-%D9%8A%D8%B3%D9%87%D9%84-%D9%82%D8%B1%D8%A7%D8%A1%D8%AA%D9%87%D8%A7-r250/" rel="">كيفية كتابة تعليمات CSS يسهل قراءتها</a>.
	</li>
	<li>
		<a data-linktype="link" data-searchable="" href="https://academy.hsoub.com/programming/css/%D8%AA%D9%86%D8%B3%D9%8A%D9%82-%D9%86%D8%B5%D9%88%D8%B5-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-css-r251/" rel="">تنسيق نصوص صفحات الويب باستخدام CSS</a>.
	</li>
	<li>
		<a data-linktype="link" data-searchable="" 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="">التعامل مع الألوان في CSS</a>.
	</li>
	<li>
		<a data-linktype="link" data-searchable="" href="https://academy.hsoub.com/programming/css/%D8%A5%D8%B6%D8%A7%D9%81%D8%A9-%D9%85%D8%AD%D8%AA%D9%88%D9%89-%D8%A5%D9%84%D9%89-%D8%B5%D9%81%D8%AD%D8%A9-%D9%88%D9%8A%D8%A8-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-css-r258/" rel="">إضافة محتوى إلى صفحة ويب باستخدام CSS</a>.
	</li>
	<li>
		<a data-linktype="link" data-searchable="" 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-lists-%D9%81%D9%8A-css-r259/" rel="">تنسيق القوائم (Lists) في CSS</a>.
	</li>
	<li>
		<a data-linktype="link" data-searchable="" href="https://academy.hsoub.com/programming/css/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D8%B5%D9%86%D8%A7%D8%AF%D9%8A%D9%82-boxes-%D9%81%D9%8A-css-r263/" rel="">تعرف على الصناديق (Boxes) في CSS</a>.
	</li>
	<li>
		<a data-linktype="link" data-searchable="" href="https://academy.hsoub.com/programming/css/%D8%B1%D8%B5%D9%81-%D8%A7%D9%84%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-layout-%D9%81%D9%8A-css-r264/" rel="">رصف العناصر (Layout) في CSS</a>.
	</li>
	<li>
		<a data-linktype="link" data-searchable="" href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%AC%D8%AF%D8%A7%D9%88%D9%84-tables-%D9%81%D9%8A-css-r266/" rel="">الجداول (Tables) في CSS</a>.
	</li>
	<li>
		<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%A3%D8%AC%D9%87%D8%B2%D8%A9-%D8%A7%D9%84%D8%B9%D8%B1%D8%B6-%D8%A7%D9%84%D9%85%D8%AE%D8%AA%D9%84%D9%81%D8%A9-%D9%88%D8%A7%D9%84%D9%85%D8%B7%D8%A8%D9%88%D8%B9%D8%A7%D8%AA-%D9%81%D9%8A-css-r268/" rel="">التعامل مع أجهزة العرض المختلفة والمطبوعات في CSS</a>.
	</li>
</ul>
<h2 id="-css">
	كيفية عمل CSS
</h2>

<p>
	عندما يعرض المتصفّح المستند، فإنّه يجمع محتواه مع معلومات التنسيق، ويُعالج المستند على مرحلتين:
</p>

<ol>
<li>
		يحوّل المتصفّح لغة الرّماز وCSS إلى <a href="https://developer.mozilla.org/en-US/docs/DOM" rel="external nofollow">DOM</a> (اختصارًا لـDocument Object Model). يُمثّل DOM المستند في ذاكرة الحاسوب، ويجمع محتوى المستند مع تنسيقه.
	</li>
	<li>
		يعرض المتصفّح محتويات DOM.
	</li>
</ol>
<p>
	تستخدم لغات الرّماز عناصر (elements) لتعريف هيكل المستند. يُحدّد العنصر بوسم (tag)، وهو نص يبدأ بالرّمز<strong> ‎<code>&lt;</code>‎ </strong>وينتهي بالرّمز ‎<strong><code>&gt;</code>‎</strong>. معظم العناصر لها زوجان من الوسوم، وسم في البداية وآخر في النهاية. لكتابة وسم البداية أدرج اسم العنصر بين ‎<strong><code>&lt;&gt;</code></strong>‎، أما وسم النّهاية فيكتب بإضافة ‎<strong><code>/</code>‎</strong> بعد ‎<strong><code>&lt;</code></strong>‎ وقبل اسم العنصر.
</p>

<p>
	قد يكون لبعض العناصر وسم بادئ فقط، أو وسم وحيد فيه تأتي ‎<strong><code>/</code>‎</strong> بعد اسم العنصر، وذلك تبعًا للغة الرّماز. قد يكون العنصر أيضًا حاويًا على عناصر آخرى ضمن وسْمَيه الأول والأخير. عليك التأكد من إغلاق الوسوم ضمن العنصر الحاوي.
</p>

<p>
	لـDOM بنية تشبه الشجرة، حيث يصبح كل عنصر أو خاصّة أو سلسلة من النصوص في لغة الرماز عقدة (node) في البنية الشجريّة. تُحدّد العُقد بعلاقتها بالعقد الأخرى، فبعض العناصر هي آباء (parent nodes) لعناصر آخرى (children nodes)، وقد يكون للأبناء إخوة (sibling nodes).
</p>

<p>
	يُعينك فهم DOM على تصميم وتنقيح وصيانة CSS، لأنّه يمثّل نقطة التقاء CSS مع محتوى المستند.
</p>

<h3 id="-">
	مثال
</h3>

<p>
	يُنشئ الوسم<span style="font-family:courier new,courier,monospace;"> ‎<code>&lt;p&gt;</code>‎</span> ونظيره ‎<span style="font-family:courier new,courier,monospace;"><code>&lt;/p&gt;</code></span>‎ عنصرًا حاويًا:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6746_7">
<span class="tag">&lt;p&gt;</span><span class="pln">
  </span><span class="tag">&lt;strong&gt;</span><span class="pln">C</span><span class="tag">&lt;/strong&gt;</span><span class="pln">ascading
  </span><span class="tag">&lt;strong&gt;</span><span class="pln">S</span><span class="tag">&lt;/strong&gt;</span><span class="pln">tyle
  </span><span class="tag">&lt;strong&gt;</span><span class="pln">S</span><span class="tag">&lt;/strong&gt;</span><span class="pln">heets
</span><span class="tag">&lt;/p&gt;</span></pre>

<p>
	في هيكل DOM، تُعتير العقدة P أبًا، أبناؤه هي العقد STRONG والعقد النصيّة، وبالمثل فإنّ العقد STRONG آباء للعقد النّصيّة.
</p>

<pre class="ipsCode prettyprint prettyprinted" data-pbcklang="" data-pbcktabsize="">
<span class="pun">├─</span><span class="pln">STRONG
</span><span class="pun">│</span><span class="pln"> </span><span class="pun">└─</span><span class="str">"C"</span><span class="pln">
</span><span class="pun">├─</span><span class="str">"ascading"</span><span class="pln">
</span><span class="pun">├─</span><span class="pln">STRONG
</span><span class="pun">│</span><span class="pln"> </span><span class="pun">└─</span><span class="str">"S"</span><span class="pln">
</span><span class="pun">├─</span><span class="str">"tyle"</span><span class="pln">
</span><span class="pun">├─</span><span class="pln">STRONG
</span><span class="pun">│</span><span class="pln"> </span><span class="pun">└─</span><span class="str">"S"</span><span class="pln">
</span><span class="pun">└─</span><span class="str">"heets"</span></pre>

<h2 id="-dom-dom">
	تدريب: تحليل DOM باستخدام أداة فحص DOM
</h2>

<p>
	لتحليل هيكل DOM، نحتاج إلى برنامج خاصّ، بإمكانك استخدام إضافة <a href="https://developer.mozilla.org/en/DOM_Inspector" rel="external nofollow">DOM Inspector</a> من Mozilla لتحقيق ذلك. ما عليك إلا تثبيت الإضافة (المزيد من التفاصيل أدناه).
</p>

<ol>
<li>
		استخدم متصفح Mozilla لفتح مستند HTML الذي أنشأته.
	</li>
	<li>
		من قائمة المتصفّح اختر: <strong>أدوات &gt; DOM Inspector</strong> أو <strong>أدوات &gt; تطوير الويب &gt; DOM Inspector</strong>. <strong>تفاصيل أكثر</strong> إن لم يحوِ متصفح Mozilla عندك على أداة فحص DOM، فبإمكانك <a href="https://addons.mozilla.org/en-US/firefox/addon/6622/" rel="external nofollow">تثبيت الإضافة من موقع الإضافات</a> وإعادة تشغيل المتصفح ثم العودة لهذا الدّرس.
	</li>
	<li>
		إن لم ترغب بتثبيت هذه الإضافة (أو لم تكن تستعمل متصفح من Mozilla)، بإمكانك استخدام Web X-Ray Goggles كما هو مشروح في القسم التالي. بإمكانك أيضًا تجاوز هذا القسم والمتابعة.
	</li>
	<li>
		في أداة فحص DOM، وسّع عقد المستند بالنقر على الأسهم. <strong>ملاحظة:</strong> قد تؤدي المسافات في ملف HTML إلى عرض عقد نصية فارغة، يمكنك تجاهلها.
	</li>
</ol>
<p>
	يبدو جزء من النتيجة مشابهًا لما يلي، تبعًا للعقد الّتي وسّعتها:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5603_7">
<span class="pln">│ ▼╴P
│ │ │ ▼╴STRONG
│ │ └#text
│ ├╴#text
│ ►╴STRONG
│ │</span></pre>

<p>
	عندما تختار أيّة عقدة، بإمكانك استخدام اللوحة على يمين DOM Inspector للاطّلاع على معلومات إضافية عنها، فمثلًا: يعرض DOM Inspector النص في اللوحة على اليمين عندما تحتار عقدة نصيّة.
</p>

<p>
	عندما تختار عقدة تمثّل عنصرًا، تُحلّل الأداة هذه العقدة وتقدّم معلومات كثيرة في اللّوحة على اليمين، يكون من ضمنها معلومات التنسيق.
</p>

<h3 id="-">
	تمرين
</h3>

<p>
	انقر على عقدة من نوع STRONG في أداة فحص DOM، ثم استخدم اللوحة على اليمين لإيجاد الموضع الّذي يُعيّن فيه لون العقدة إلى أحمر، والموضع الّذي يُجعل فيه خطّها أعرض من النصّ العاديّ.
</p>

<div class="challenge">
	<input id="input_solution" name="input_solution" type="checkbox"><label for="input_solution"> شاهد الحل </label>

	<div class="solution">
		<p>
			في القائمة فوق اللوحة على اليمين، اختر <strong>CSS Rules</strong>، سترى عنصرين مُدرجين، أحدهما هو المصدر الداخلي الّذي ي يُعرّف <code>font-width</code> على أنّها <code>bolder</code>، والآخر آتٍ من ورقة الأنماط الّتي تُحرّرها والّذي يُعرّف <code>color</code> على أنّه <code>red</code>.
		</p>
	</div>
</div>

<h3 id="-web-x-ray-goggles">
	استخدام Web X-Ray Goggles
</h3>

<p>
	تعرض الأداة <a href="https://goggles.webmaker.org/" rel="external nofollow">Web X-Ray Goggles</a> معلومات أقل من DOM Inspector، ولكنّها أبسط في التثبيت والاستعمال:
</p>

<ol>
<li>
		اذهب إلى <a href="https://goggles.webmaker.org/" rel="external nofollow">الصّفحة الرئيسيّة للأداة</a>.
	</li>
	<li>
		اسحب رابط العلامة المرجعيّة إلى شريط المتصفّح.
	</li>
	<li>
		افتح مستند HTML الّذي أنشأته.
	</li>
	<li>
		فعّل الأداة بالنقر على العلامة المرجعيّة في الشّريط.
	</li>
	<li>
		اسحب مؤشّر الفأرة فوق العناصر المختلفة في المستند.
	</li>
</ol>
<h2 id="-">
	تتالي الأنماط ووراثتها
</h2>

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

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

<p>
	تجتمع المصادر الثلاثة الأساسية لمعلومات التنسيق مشكّلة ما نسمّيه تعاقب الأنماط (cascade)، وهذه الأنماط هي:
</p>

<ul>
<li>
		التنسيقات المبدئيّة الّتي يحدّدها المتصفّح للعناصر في لغة الرّماز.
	</li>
	<li>
		التنسيقات الّتي يحدّدها المستخدم الّذي يقرأ المستند.
	</li>
	<li>
		التنسيقات المرتبطة بالمستند الّتي يحدّدها مؤلّفه، والّتي قد تعيّن في ثلاثة مواضع:
		<ul>
<li>
				<strong>في ملفّ خارجيّ</strong>: وهذا الموضوع الأساسيّ لهذه الدّروس.
			</li>
			<li>
				<strong>في تعريف في بداية المستند</strong>: للتنسيقات الخاصّة بصفحة واحدة فقط.
			</li>
			<li>
				<strong>في عنصر معيّن ضمن متن المستند</strong>: وهي الطريقة الأقل سهولة في الصيانة، ويمكن استخدامها على سبيل التّجربة.
			</li>
		</ul>
</li>
</ul>
<p>
	تُغيّر أنماط المستخدم الأنماط الّتي يعيّنها المتصفّح، ثمّ تغيّر أنماط مؤلّف المستند تلك الّتي عيّنها المستخدم. في هذه السّلسلة أنت مؤلّف المستند، ولن نتعامل إلّا مع هذا النّوع من الأنماط.
</p>

<h3 id="-">
	مثال
</h3>

<p>
	عندما تقرأ هذا المستند في متصفّح، يأتي جزء من التنسيق الّذي تراه من الإعدادات المبدئيّة لـHTML في المتصفّح.
</p>

<p>
	وقد يأتي جزء آخر من الإعدادات المخصّصة للمتصفّح، إذ يمكن تخصيصها في مربع التفضيلات في Firefox مثلًا، أو يمكن تعيينها في ملف<span style="font-family:courier new,courier,monospace;"> <code>userContent.css</code></span> في ملفّ المتصفّح الشّخصيّ.
</p>

<p>
	ويأتي الجزء الأخير من التنسيق من خادوم موقع الأكاديميّة.
</p>

<p>
	عندما تفتح المستند الّذي تتدرّب عليه في المتصفّح، تكون العناصر <span style="font-family:courier new,courier,monospace;"><code>&lt;strong&gt;</code></span> أعرض خطًّا من بقيّة النّصّ، هذا التنسيق يأتي من إعدادات المتصفّح المبدئيّة.
</p>

<p>
	كما أن العناصر نفسها ذات لون أحمر، وهذا التنسيق يأتي من ورقة الأنماط الّتي كتبناها بأنفسنا.
</p>

<p>
	ترث عناصر <span style="font-family:courier new,courier,monospace;"><code>&lt;strong&gt;</code></span> أيضًا معظم تنسيقها عن عناصر <span style="font-family:courier new,courier,monospace;"><code>&lt;p&gt;</code></span> لأنّها أبناؤها، وبالمثل ترث العناصر <span style="font-family:courier new,courier,monospace;">&lt;p&gt;</span> معظم تنسيق عنصر<span style="font-family:courier new,courier,monospace;"> &lt;body&gt;</span>.
</p>

<p>
	يكون للتنسيقات الّتي يحدّدها مؤلّف المستند الأولويّة في تعاقب الأنماط على تلك الّتي يحدّدها القارئ، وتكون الأولويّة الأقل لتنسيقات المتصفّح المبدئيّة.
</p>

<p>
	بالنّسبة للتنسيقات الموروثة، يكون للتنسيقات المعرّفة على العقدة ذاتها الأولويّة على تلك الّتي ترثها عن آبائها.
</p>

<p>
	هناك قواعد أخرى لهذه الأولويّات، سنتعرّف عليها لاحقًا.
</p>

<h3 id="-">
	تفاصيل أكثر
</h3>

<p>
	توفّر CSS أيضًا طريقة للقارئ لحجب التنسيق الّذي يحدّده مؤلّف المستند باستخدام الكلمة<span style="font-family:courier new,courier,monospace;"> <code>!important</code></span>.
</p>

<p>
	وهذا يعني أنّه لا يمكن توقّع الشّكل الّذي سيكون عليه المستند لكلّ قارئ.
</p>

<p>
	إذا أردت معرفة المزيد عن موضوع التعاقب والوراثة، انظر فقرة <a href="http://www.w3.org/TR/CSS21/cascade.html" rel="external nofollow">Assigning property values, Cascading and inheritance</a> في تعريف CSS.
</p>

<h2 id="-">
	تمرين: استخدام الوراثة
</h2>

<ol>
<li>
		حرّر ملفّ CSS الّذي تتدرّب عليه.
	</li>
	<li>
		أضف هذا السّطر بنسخه ولصقه. لا يهمّ إن كان فوق أو تحت السّطر الّذي أضفته من قبل. إلّا أن إضافته فوقه أكثر منطقيّة لأن العنصر<span style="font-family:courier new,courier,monospace;"> <code>&lt;p&gt;</code></span> أب للعنصر <span style="font-family:courier new,courier,monospace;"><code>&lt;strong&gt;</code></span> في مستندك.
		<pre class="css ipsCode prettyprint prettyprinted" data-pbcklang="css" data-pbcktabsize="">
<span class="pln">p </span><span class="pun">{</span><span class="pln">color</span><span class="pun">:</span><span class="pln"> blue</span><span class="pun">;</span><span class="pln"> text</span><span class="pun">-</span><span class="pln">decoration</span><span class="pun">:</span><span class="pln"> underline</span><span class="pun">;}</span></pre>
	</li>
	<li>
		احفظ الملفّ وحدّث متصفّحك لتشاهد تأثير ذلك على المستند. يؤدّي ذلك إلى تسطير النّص في كامل الفقرة، بما في ذلك الحروف الأولى من كلّ كلمة، وهذا يعني أن العناصر <span style="font-family:courier new,courier,monospace;"><code>&lt;strong&gt;</code></span> ورثت عن أبيها نمط تسطير النّصّ. ولكّن هذه العناصر ما تزال حمراء اللّون، لأنّ اللون الأحمر هو نمطها الخاص، ولذا يكون له الأولويّة على اللّون الأزرق لأبيها العنصر<span style="font-family:courier new,courier,monospace;"> <code>&lt;p&gt;</code></span>.
	</li>
</ol>
<h3 id="-">
	قبل
</h3>

<pre class="html ipsCode prettyprint prettyprinted" data-pbcklang="html" data-pbcktabsize="">
<span class="tag">&lt;p&gt;</span><span class="pln">
  </span><span class="tag">&lt;strong&gt;</span><span class="pln">C</span><span class="tag">&lt;/strong&gt;</span><span class="pln">ascading
  </span><span class="tag">&lt;strong&gt;</span><span class="pln">S</span><span class="tag">&lt;/strong&gt;</span><span class="pln">tyle
  </span><span class="tag">&lt;strong&gt;</span><span class="pln">S</span><span class="tag">&lt;/strong&gt;</span><span class="pln">heets
</span><span class="tag">&lt;/p&gt;</span></pre>

<pre class="css ipsCode prettyprint prettyprinted" data-pbcklang="css" data-pbcktabsize="">
<span class="pln">strong </span><span class="pun">{</span><span class="pln">color</span><span class="pun">:</span><span class="pln">red</span><span class="pun">}</span></pre>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="11655" href="https://academy.hsoub.com/uploads/monthly_2016_01/3.png.3e43cbc44749fc15915612f87bcb4867.png" rel="external"><img alt="3.png" class="ipsImage ipsImage_thumbnailed" data-fileid="11655" src="https://academy.hsoub.com/uploads/monthly_2016_01/3.thumb.png.c8b86ee1369a12174aecb6bd23904642.png"></a>
</p>

<h3 id="-">
	بعد
</h3>

<pre class="html ipsCode prettyprint prettyprinted" data-pbcklang="html" data-pbcktabsize="">
<span class="tag">&lt;p&gt;</span><span class="pln">
  </span><span class="tag">&lt;strong&gt;</span><span class="pln">C</span><span class="tag">&lt;/strong&gt;</span><span class="pln">ascading
  </span><span class="tag">&lt;strong&gt;</span><span class="pln">S</span><span class="tag">&lt;/strong&gt;</span><span class="pln">tyle
  </span><span class="tag">&lt;strong&gt;</span><span class="pln">S</span><span class="tag">&lt;/strong&gt;</span><span class="pln">heets
</span><span class="tag">&lt;/p&gt;</span></pre>

<pre class="css ipsCode prettyprint prettyprinted" data-pbcklang="css" data-pbcktabsize="">
<span class="pln">p </span><span class="pun">{</span><span class="pln">color</span><span class="pun">:</span><span class="pln">blue</span><span class="pun">;</span><span class="pln"> text</span><span class="pun">-</span><span class="pln">decoration</span><span class="pun">:</span><span class="pln">underline</span><span class="pun">}</span><span class="pln">
strong </span><span class="pun">{</span><span class="pln">color</span><span class="pun">:</span><span class="pln">red</span><span class="pun">}</span></pre>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="11656" href="https://academy.hsoub.com/uploads/monthly_2016_01/4.png.633b1888b37a7f8a2a515dcffa253720.png" rel="external"><img alt="4.png" class="ipsImage ipsImage_thumbnailed" data-fileid="11656" src="https://academy.hsoub.com/uploads/monthly_2016_01/4.thumb.png.51677e271bc03ac2d5cd8ddc037de3b2.png"></a>
</p>

<h3 id="-">
	تمرين
</h3>

<p>
	عدّل ورقة الأنماط بحيث تكون الحروف الأولى فقط مُسطَّرة:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="11657" href="https://academy.hsoub.com/uploads/monthly_2016_01/5.png.fa9c4d330d7876c2e18f25d3ef00d338.png" rel="external"><img alt="5.png" class="ipsImage ipsImage_thumbnailed" data-fileid="11657" src="https://academy.hsoub.com/uploads/monthly_2016_01/5.thumb.png.15e6362ad0880fdaa0d4731a8ef187a4.png"></a>
</p>

<div class="challenge">
	<input id="input_solution_2" name="input_solution" type="checkbox"><label for="input_solution_2"> شاهد الحل </label>

	<div class="solution">
		<p>
			انقل التصريح الذي يُعنى بتسطير النّص من قاعدة <code>&lt;p&gt;</code> إلى <code>&lt;strong&gt;</code>، كما يلي:
		</p>

		<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_1493_7">
<span class="pln">p </span><span class="pun">{</span><span class="pln">color</span><span class="pun">:</span><span class="pln"> blue</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
strong </span><span class="pun">{</span><span class="pln">color</span><span class="pun">:</span><span class="pln"> orange</span><span class="pun">;</span><span class="pln"> text</span><span class="pun">-</span><span class="pln">decoration</span><span class="pun">:</span><span class="pln"> underline</span><span class="pun">;}</span></pre>

		<p>
			 
		</p>
	</div>
</div>

<h2 id="-">
	ما التالي؟
</h2>

<p>
	سنتعرّف في الدّرس التالي <a href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D9%85%D8%AD%D8%AF%D8%AF%D8%A7%D8%AA-selectors-%D9%81%D9%8A-css-r249/" rel="">كيف نستهدف العناصر بطريقة أكثر انتقائيّة</a>.
</p>

<p>
	<span style="color: rgb(39, 42, 52); font-family: 'Droid Arabic Naskh', 'Open Sans', 'Helvetica Neue', Helvetica, Tahoma, Arial, sans-serif; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 35.2px; orphans: auto; text-align: justify; text-indent: 0px; text-transform: none; white-space: normal; widows: 1; word-spacing: 0px; -webkit-text-stroke-width: 0px; display: inline !important; float: none; background-color: rgb(255, 255, 255);"><span>ترجمة -وبتصرف- للمقال </span></span><a href="https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Getting_Started/How_CSS_works" rel="external nofollow">How CSS works</a> من <span style="color: rgb(39, 42, 52); font-family: 'Droid Arabic Naskh', 'Open Sans', 'Helvetica Neue', Helvetica, Tahoma, Arial, sans-serif; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 35.2px; orphans: auto; text-align: justify; text-indent: 0px; text-transform: none; white-space: normal; widows: 1; word-spacing: 0px; -webkit-text-stroke-width: 0px; display: inline !important; float: none; background-color: rgb(255, 255, 255);">سلسلة<span> </span></span><a href="https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Getting_started" rel="external nofollow" style="box-sizing: border-box; color: rgb(0, 201, 165); text-decoration: underline; font-family: 'Droid Arabic Naskh', 'Open Sans', 'Helvetica Neue', Helvetica, Tahoma, Arial, sans-serif; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 35.2px; orphans: auto; text-align: justify; text-indent: 0px; text-transform: none; white-space: normal; widows: 1; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255);" target="_blank">Getting started with CSS</a><span style="color: rgb(39, 42, 52); font-family: 'Droid Arabic Naskh', 'Open Sans', 'Helvetica Neue', Helvetica, Tahoma, Arial, sans-serif; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 35.2px; orphans: auto; text-align: justify; text-indent: 0px; text-transform: none; white-space: normal; widows: 1; word-spacing: 0px; -webkit-text-stroke-width: 0px; display: inline !important; float: none; background-color: rgb(255, 255, 255);"><span> </span>على شبكة مطوّري Mozilla. </span>
</p>
]]></description><guid isPermaLink="false">247</guid><pubDate>Fri, 12 Feb 2016 14:09:00 +0000</pubDate></item><item><title>&#x645;&#x62F;&#x62E;&#x644; &#x625;&#x644;&#x649; &#x623;&#x648;&#x631;&#x627;&#x642; &#x627;&#x644;&#x623;&#x646;&#x645;&#x627;&#x637; &#x627;&#x644;&#x645;&#x62A;&#x62A;&#x627;&#x644;&#x64A;&#x629; (CSS)</title><link>https://academy.hsoub.com/programming/css/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A3%D9%88%D8%B1%D8%A7%D9%82-%D8%A7%D9%84%D8%A3%D9%86%D9%85%D8%A7%D8%B7-%D8%A7%D9%84%D9%85%D8%AA%D8%AA%D8%A7%D9%84%D9%8A%D8%A9-css-r246/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_02/56b72539c98db_css-intro(1).png.00278ccb64f97fcbc0d81f921b531f74.png" /></p>

<p>
	أوراق الأنماط المتتالية (Cascading Style Sheets أو CSS اختصارًا) هي لغة تُستخدم لوصف كيفيّة عرض المستندات للمستخدمين. تُكتب هذه المستندات في لغة رُماز مثل HTML.
</p>

<p style="text-align: center;">
	<img alt="css-intro (1).png" class="ipsImage ipsImage_thumbnailed" data-fileid="12703" data-unique="46r3wm8w8" src="https://academy.hsoub.com/uploads/monthly_2016_02/56b724dc8c185_css-intro(1).png.2dd3694129427d22060628a30069072d.png"></p>

<p>
	<strong>المستند</strong> هو مجموعة من المعلومات التي تهيكل باستخدام لغة رُماز (markup language).
</p>

<p>
	يُقصّد <strong>بعرض المستند للمستخدم</strong> تحويله إلى صيغة مُفيدة للجمهور، فالمتصفحات مثل Firefox وChrome وInternet Explorer مًصمّمة بحيث تعرض المستندات للمستخدمين مرئيًّا، مثلًا: على شاشة حاسوب أو جهاز إسقاط (projector) أو طابعة.
</p>

<p>
	سنتعرض خلال هذه السلسلة إلى المواضيع التالية:
</p>

<ul>
<li>
		مدخل إلى أوراق الأنماط المتتالية (CSS) (هذا الدرس).
	</li>
	<li>
		<a data-linktype="link" data-searchable="" href="https://academy.hsoub.com/programming/css/%D8%A2%D9%84%D9%8A%D8%A9-%D8%B9%D9%85%D9%84-%D8%AA%D8%B9%D9%84%D9%8A%D9%85%D8%A7%D8%AA-css-%D8%AF%D8%A7%D8%AE%D9%84-%D8%A7%D9%84%D9%85%D8%AA%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-r247/" rel="">آلية عمل تعليمات CSS داخل المتصفحات</a>.
	</li>
	<li>
		<a data-linktype="link" data-searchable="" href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D9%85%D8%AD%D8%AF%D8%AF%D8%A7%D8%AA-selectors-%D9%81%D9%8A-css-r249/" rel="">المحددات (Selectors) في CSS</a>.
	</li>
	<li>
		<a data-linktype="link" data-searchable="" href="https://academy.hsoub.com/programming/css/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D9%83%D8%AA%D8%A7%D8%A8%D8%A9-%D8%AA%D8%B9%D9%84%D9%8A%D9%85%D8%A7%D8%AA-css-%D9%8A%D8%B3%D9%87%D9%84-%D9%82%D8%B1%D8%A7%D8%A1%D8%AA%D9%87%D8%A7-r250/" rel="">كيفية كتابة تعليمات CSS يسهل قراءتها</a>.
	</li>
	<li>
		<a data-linktype="link" data-searchable="" href="https://academy.hsoub.com/programming/css/%D8%AA%D9%86%D8%B3%D9%8A%D9%82-%D9%86%D8%B5%D9%88%D8%B5-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-css-r251/" rel="">تنسيق نصوص صفحات الويب باستخدام CSS</a>.
	</li>
	<li>
		<a data-linktype="link" data-searchable="" 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="">التعامل مع الألوان في CSS</a>.
	</li>
	<li>
		<a data-linktype="link" data-searchable="" href="https://academy.hsoub.com/programming/css/%D8%A5%D8%B6%D8%A7%D9%81%D8%A9-%D9%85%D8%AD%D8%AA%D9%88%D9%89-%D8%A5%D9%84%D9%89-%D8%B5%D9%81%D8%AD%D8%A9-%D9%88%D9%8A%D8%A8-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-css-r258/" rel="">إضافة محتوى إلى صفحة ويب باستخدام CSS</a>.
	</li>
	<li>
		<a data-linktype="link" data-searchable="" 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-lists-%D9%81%D9%8A-css-r259/" rel="">تنسيق القوائم (Lists) في CSS</a>.
	</li>
	<li>
		<a data-linktype="link" data-searchable="" href="https://academy.hsoub.com/programming/css/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D8%B5%D9%86%D8%A7%D8%AF%D9%8A%D9%82-boxes-%D9%81%D9%8A-css-r263/" rel="">تعرف على الصناديق (Boxes) في CSS</a>.
	</li>
	<li>
		<a data-linktype="link" data-searchable="" href="https://academy.hsoub.com/programming/css/%D8%B1%D8%B5%D9%81-%D8%A7%D9%84%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-layout-%D9%81%D9%8A-css-r264/" rel="">رصف العناصر (Layout) في CSS</a>.
	</li>
	<li>
		<a data-linktype="link" data-searchable="" href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%AC%D8%AF%D8%A7%D9%88%D9%84-tables-%D9%81%D9%8A-css-r266/" rel="">الجداول (Tables) في CSS</a>.
	</li>
	<li>
		<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%A3%D8%AC%D9%87%D8%B2%D8%A9-%D8%A7%D9%84%D8%B9%D8%B1%D8%B6-%D8%A7%D9%84%D9%85%D8%AE%D8%AA%D9%84%D9%81%D8%A9-%D9%88%D8%A7%D9%84%D9%85%D8%B7%D8%A8%D9%88%D8%B9%D8%A7%D8%AA-%D9%81%D9%8A-css-r268/" rel="">التعامل مع أجهزة العرض المختلفة والمطبوعات في CSS</a>.
	</li>
</ul>
<h2 id="-">
	أمثلة
</h2>

<ul>
<li>
		صفحة الويب هذه الّتي تقرأها هي مُستند. تُهيكل المعلومات التي تشاهدها في صفحة ويب باستخدام لغة HTML (اختصارًا لـHyperText Markup Language).
	</li>
	<li>
		مرُبعات الحوار في التطبيقات هي أيضًا مُستندات، وقد تكون مُهيكلة باستخدام لغة رماز مثل XUL (اختصارًا لـXML User Interface Language)، والتي قد تجدها في بعض برامج Mozilla.
	</li>
</ul>
<p>
	في هذه السلسلة، ستُقرأ معلومات مُدرجة تحت عنوان <strong>تفاصيل أكثر</strong> كالفقرة التالية، تحوي هذه الفقرات على معلومات وروابط لمصادر إضافية عن مفهوم أو موضوع تغطّيه هذه الأقسام. اقرأ هذه المعلومات حالما تُشاهدها وتابع الروابط، أو تجاوزها وعُد لقراءتها لاحقًا.
</p>

<h2 id="-">
	تفاصيل أكثر
</h2>

<p>
	كلمة المستند لا تعني ما تعنيه كلمة "ملفّ"، إلّا أنّه يمكن حفظ المستندات ضمن ملفّات.
</p>

<p>
	المستند الذي تقرأه الآن لم يُحفَظ في ملفّ، بل يُجلب من قاعدة بيانات على الخادم والذي بدوره يولّد المستند بجمع أجزائه من عدّة ملفّات. مهما يكن الأمر، فإنّك في هذه السّلسلة ستتعامل مع مستندات محفوظة في ملفّات.
</p>

<p>
	بإمكانك إيجاد معلومات أكثر عن المستندات ولغات الرُماز في مواقع أخرى من شبكة مطوّري Mozilla:
</p>

<center>
	<table style="border: 1px solid black; border-collapse: collapse; padding: 5px;">
<thead><tr>
<th style="border: 1px solid black;">
					     اللغة     
				</th>
				<th style="border: 1px solid black;">
					الوظيفة
				</th>
			</tr></thead>
<tbody>
<tr>
<td style="border: 1px solid black;">
					      <a href="https://developer.mozilla.org/en-US/docs/Web/HTML" rel="external nofollow">HTML</a>      
				</td>
				<td style="border: 1px solid black;">
					  لصفحات الويب
				</td>
			</tr>
<tr>
<td style="border: 1px solid black; text-align: center;">
					      <a href="https://developer.mozilla.org/en-US/docs/XML" rel="external nofollow">XML</a>      
				</td>
				<td style="border: 1px solid black;">
					  للصفحات المُهيكلة بشكل عامّ           
				</td>
			</tr>
<tr>
<td style="border: 1px solid black; text-align: center;">
					<a href="https://developer.mozilla.org/en-US/docs/Web/SVG" rel="external nofollow">SVG</a>
				</td>
				<td style="border: 1px solid black;">
					  للرسوم
				</td>
			</tr>
<tr>
<td style="border: 1px solid black; text-align: center;">
					<a href="https://developer.mozilla.org/en-US/docs/XUL" rel="external nofollow">XUL</a>
				</td>
				<td style="border: 1px solid black;">
					  لواجهات برامج Mozilla
				</td>
			</tr>
</tbody>
</table>
</center>

<p>
	سنطّلع على أمثلة من هذه اللغات في الجزء الثّاني من السلسلة.
</p>

<h2 id="-">
	تفاصيل أكثر
</h2>

<p>
	يُدعى البرنامج الذي يعرض المستندات على المستخدم في المصطلحات الرسميّة لـCSS بوكيل المستخدم (user agent أو UA). المتصفّح ليس إلّا واحدًا من وكلاء المستخدم، فلا تقتصر CSS على المتصفّحات أو العرض المرئيّ، ولكنّنا في الجزء الأوّل من السّلسلة لن نتعامل إلّا مع CSS في المتصفّح.
</p>

<p>
	للاطّلاع على التعاريف الرسمية للمصطلحات في CSS، انظر <a href="http://www.w3.org/TR/CSS21/conform.html#q1" rel="external nofollow">Definitions</a> في وصف CSS من قبل جمعيّة W3C المسؤولة عن تعيين المعايير القياسيّة للويب.
</p>

<h2 id="-">
	لنبدأ العمل: إنشاء مستند
</h2>

<ul>
<li>
		أنشئ مجلّدًا جديدًا في جهازك لحفظ وتنظيم تمارين هذه السّلسلة.
	</li>
	<li>
		افتح محرّر النصوص وأنشئ ملفًّا نصيًّا جديدًا، سنقوم بكتابة المستند في هذا الملف خلال التمارين القليلة التالية.
	</li>
	<li>
		انسخ والصق HTML أدناه. احفظ الملف باسم <span style="font-family:courier new,courier,monospace;"><code>doc1.html</code></span>.
	</li>
</ul>
<ol>
<li>
		<pre class="html ipsCode prettyprint prettyprinted" data-pbcklang="html" data-pbcktabsize="">
<span class="dec">&lt;!DOCTYPE html&gt;</span><span class="pln">
</span><span class="tag">&lt;html&gt;</span><span class="pln">
 </span><span class="tag">&lt;head&gt;</span><span class="pln">
 </span><span class="tag">&lt;meta</span><span class="pln"> </span><span class="atn">charset</span><span class="pun">=</span><span class="atv">"UTF-8"</span><span class="tag">&gt;</span><span class="pln">
 </span><span class="tag">&lt;title&gt;</span><span class="pln">Sample document</span><span class="tag">&lt;/title&gt;</span><span class="pln">
 </span><span class="tag">&lt;/head&gt;</span><span class="pln">

 </span><span class="tag">&lt;body&gt;</span><span class="pln">
   </span><span class="tag">&lt;p&gt;</span><span class="pln">
     </span><span class="tag">&lt;strong&gt;</span><span class="pln">C</span><span class="tag">&lt;/strong&gt;</span><span class="pln">ascading
     </span><span class="tag">&lt;strong&gt;</span><span class="pln">S</span><span class="tag">&lt;/strong&gt;</span><span class="pln">tyle
     </span><span class="tag">&lt;strong&gt;</span><span class="pln">S</span><span class="tag">&lt;/strong&gt;</span><span class="pln">heets
   </span><span class="tag">&lt;/p&gt;</span><span class="pln">
 </span><span class="tag">&lt;/body&gt;</span><span class="pln">
</span><span class="tag">&lt;/html&gt;</span></pre>
	</li>
</ol>
<ul>
<li>
		افتح علامة تبويب أو نافذة جديدة في متصفّحك، ثم افتح الملف الذي أنشأته. من المُفترض أن ترى النّص وحروفه الأولى بخطّ عريض، كهذه الصّورة:
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="11653" href="https://academy.hsoub.com/uploads/monthly_2016_01/1.png.c650774520a2b415df3e121745aa450e.png" rel="external"><img alt="1.png" class="ipsImage ipsImage_thumbnailed" data-fileid="11653" src="https://academy.hsoub.com/uploads/monthly_2016_01/1.thumb.png.e75421bee284ea346ce27b354c1ca63c.png"></a>
</p>

<p>
	قد يختلف ما تراه في متصفحك قليلًا عن الصّورة من حيث الخط أو الألوان أو المسافات بين الحروف، وهذا غير مهمّ الآن.
</p>

<p>
	المستند الآن لا يستخدم CSS، وهذا ما سنفعله في الخطوة التالية.
</p>

<h2 id="-css-">
	لماذا نستخدم CSS؟
</h2>

<p>
	استخدم CSS لتعريف تنسيق مستنداتك، بما في ذلك التصميم والتخطيط والاختلافات في العرض بين الأجهزة المختلفة وقياسات الشاشات المختلفة. بإمكانك إضافة CSS في رأس (<span style="font-family:courier new,courier,monospace;"><code>&lt;head&gt;</code></span>) مستند (نُسمّي ذلك ورقة أنماط مُضمّنة) أو إرفاق ملف منفصل يحوي تعريف التنسيقات (ورقة أنماط خارجيّة)، ثمّ ربطها مع المستند برابط يُضاف إلى رأسه.
</p>

<p>
	لللأسلوب الأخير عدّة محاسن، ففصل التنسيقات عن الرُماز:
</p>

<ul>
<li>
		يقلّل من التكرار
	</li>
	<li>
		يُسهل الصّيانة
	</li>
	<li>
		يسمح بإجراء تغيير على نطاق الموقع كاملًا من مكان واحد
	</li>
</ul>
<h3 id="-">
	مثال
</h3>

<p>
	يمكنك مثلًا حفظ معلومات التنسيقات في ملفات مشتركة بين كلّ الصّفحات، فعندما يُربَط مستند بورقة أنماط تُحدّد لون العناوين الثانويّة (<span style="font-family:courier new,courier,monospace;"><code>h2</code></span>)، بإمكانك استخدام هذا التنسيق في كل صفحات الموقع بالإشارة إلى هذه الورقة.
</p>

<p>
	عندما يعرض مستخدم صفحة ويب، يقوم المتصفح بجلب معلومات التنسيق في الوقت نفسه.
</p>

<p>
	عندما يطبع مستخدم صفحة ويب، بإمكانك توفير معلومات تنسيق مختلفة تُسهّل من قراءة الصّفحة المطبوعة.
</p>

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

<h2 id="-">
	تفاصيل أكثر
</h2>

<p>
	توفّر لُغة رُماز مثل HTML بعض الوسائل لوصف تنسيق المستند بشكل منفصل عن CSS، فيمكنك مثلًا في HTML استخدام الوسم <code>&lt;b&gt;</code> لجعل النّص عريضًا، ويمكنك تحديد لون خلفيّة المستند في وسم متن المستند <code>&lt;body&gt;</code>. عندما تستخدم CSS، يُفضّل عادةً تجنّب استخدام هذه الميزات في لغة الرُماز بحيث يبقى وصف تنسيق المستند في موضع واحد فقط.
</p>

<h2 id="-">
	لنعمل: إنشاء ورقة أنماط
</h2>

<ol>
<li>
		أنشئ ملفًّا نصيًّا آخر بجوار الملف السابق <code>doc1.html</code>.
	</li>
	<li>
		احفظ الملف باسم <code>style1.css</code>. سيحوي هذا الملف وصف التنسيقات.
	</li>
	<li>
		في ملفّ CSS، انسخ والصق السّطر التالي ثمّ احفظ الملف:
	</li>
	<li>
		<pre class="css ipsCode prettyprint prettyprinted" data-pbcklang="css" data-pbcktabsize="">
<span class="pln">strong </span><span class="pun">{</span><span class="pln">color</span><span class="pun">:</span><span class="pln"> red</span><span class="pun">;}</span></pre>
	</li>
</ol>
<h3 id="-">
	ربط المستند بورقة الأنماط
</h3>

<ul>
<li>
		لربط المستند بورقة الأنماط، عدّل ملفّ HTML، أضف السّطر التالي في موقعه:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4592_9">
<span class="tag">&lt;link</span><span class="pln"> </span><span class="atn">rel</span><span class="pun">=</span><span class="atv">"stylesheet"</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"style1.css"</span><span class="tag">&gt;</span></pre>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4592_7">
<span class="dec">&lt;!DOCTYPE html&gt;</span><span class="pln">
</span><span class="tag">&lt;html&gt;</span><span class="pln">
 </span><span class="tag">&lt;head&gt;</span><span class="pln">
 </span><span class="tag">&lt;meta</span><span class="pln"> </span><span class="atn">charset</span><span class="pun">=</span><span class="atv">"UTF-8"</span><span class="tag">&gt;</span><span class="pln">
 </span><span class="tag">&lt;title&gt;</span><span class="pln">Sample document</span><span class="tag">&lt;/title&gt;</span><span class="pln">
 </span><span class="tag">&lt;link</span><span class="pln"> </span><span class="atn">rel</span><span class="pun">=</span><span class="atv">"stylesheet"</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"style1.css"</span><span class="tag">&gt;</span><span class="pln">
 </span><span class="tag">&lt;/head&gt;</span><span class="pln">
 </span><span class="tag">&lt;body&gt;</span><span class="pln">
   </span><span class="tag">&lt;p&gt;</span><span class="pln">
     </span><span class="tag">&lt;strong&gt;</span><span class="pln">C</span><span class="tag">&lt;/strong&gt;</span><span class="pln">ascading
     </span><span class="tag">&lt;strong&gt;</span><span class="pln">S</span><span class="tag">&lt;/strong&gt;</span><span class="pln">tyle
     </span><span class="tag">&lt;strong&gt;</span><span class="pln">S</span><span class="tag">&lt;/strong&gt;</span><span class="pln">heets
   </span><span class="tag">&lt;/p&gt;</span><span class="pln">
 </span><span class="tag">&lt;/body&gt;</span><span class="pln">
</span><span class="tag">&lt;/html&gt;</span></pre>

<ul>
<li>
		احفظ الملف وحدّث الصّفحة في متصفّحك. تجعل ورقة الأنماط الحروف الأولى بلون أحمر، كهذا:
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="11654" href="https://academy.hsoub.com/uploads/monthly_2016_01/2.png.8f2ce3e46786bec2b71069870f4e7774.png" rel="external"><img alt="2.png" class="ipsImage ipsImage_thumbnailed" data-fileid="11654" src="https://academy.hsoub.com/uploads/monthly_2016_01/2.thumb.png.3eaa47554294c06cdc1dba37ba04f341.png"></a>
</p>

<h2 id="-">
	ما التالي؟
</h2>

<p>
	لدينا الآن مستند بسيط مرتبط بورقة أنماط خارجيّة، وسنتعلّم كيف يجمعهما المتصفح معًا لعرض الصّفحة في الجزء التالي: <a href="https://academy.hsoub.com/programming/css/%D9%83%D9%8A%D9%81-%D8%AA%D8%B9%D9%85%D9%84-css%D8%9F-r247/" rel="">كيف تعمل CSS؟</a>
</p>

<p>
	ترجمة (بتصرّف) للجزأين الأوّلين <a href="https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Getting_Started/What_is_CSS" rel="external nofollow">What is CSS</a> و <a href="https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Getting_Started/Why_use_CSS" rel="external nofollow">Why use CSS</a> من سلسلة <a href="https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Getting_started" rel="external nofollow">Getting started with CSS</a> على شبكة مطوّري Mozilla.
</p>
]]></description><guid isPermaLink="false">246</guid><pubDate>Sun, 07 Feb 2016 11:05:00 +0000</pubDate></item><item><title>&#x62A;&#x623;&#x62B;&#x64A;&#x631;&#x627;&#x62A; &#x625;&#x628;&#x62F;&#x627;&#x639;&#x64A;&#x629; &#x644;&#x625;&#x636;&#x627;&#x641;&#x629; &#x648;&#x625;&#x632;&#x627;&#x644;&#x629; &#x639;&#x646;&#x627;&#x635;&#x631; &#x642;&#x627;&#x626;&#x645;&#x629; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x62A;&#x62D;&#x631;&#x64A;&#x643;&#x627;&#x62A; CSS3</title><link>https://academy.hsoub.com/programming/css/%D8%AA%D8%A3%D8%AB%D9%8A%D8%B1%D8%A7%D8%AA-%D8%A5%D8%A8%D8%AF%D8%A7%D8%B9%D9%8A%D8%A9-%D9%84%D8%A5%D8%B6%D8%A7%D9%81%D8%A9-%D9%88%D8%A5%D8%B2%D8%A7%D9%84%D8%A9-%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-%D9%82%D8%A7%D8%A6%D9%85%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%AA%D8%AD%D8%B1%D9%8A%D9%83%D8%A7%D8%AA-css3-r233/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_01/css3-list-animation-effect.png.96c1805f2368317028b644a00cd9a188.png" /></p>

<div id="wmd-preview-section-53"><p id="تأثيرات-إبداعية-لإضافة-وإزالة-عناصر-قائمة-باستخدام-تحريكات-css3">عند استخدام التحريكات animations والانتقالات transitions ضمن واجهة المستخدم، فإنّه من الضروري أن يكون لها هدف واضح ومحدّد، ألا وهو تحسين تجربة المستخدم.</p><p style="text-align: center;"><a href="https://academy.hsoub.com/uploads/monthly_2016_01/css3-list-animation-effect.png.03a876e5521078952647b8ae5c952382.png" class="ipsAttachLink ipsAttachLink_image"><img data-fileid="10801" src="https://academy.hsoub.com/uploads/monthly_2016_01/css3-list-animation-effect.thumb.png.03acfff86e30f1ae6dd8f8ffa79fdc0e.png" class="ipsImage ipsImage_thumbnailed" alt="css3-list-animation-effect.thumb.png.03a"></a></p><p>تؤمّن لنا الانتقالات transitions الوسيلة المناسبة والمثالية لجعل الحركة سلسة وانسيابية أمام المستخدم. بدون تأثيرات الانتقال من الممكن أن يصبح المستخدم في حيرة من أمره حول الذي حدث بالضبط عند تنفيذه لأمر معين.</p><p>في هذا المقال، سننشئ بعض التحريكات والانتقالات الإبداعية لإضافة وإزالة عناصر من قائمة، لقد أعجبتني الفكرة الواردة في <a rel="external nofollow" href="https://medium.com/design-ux/926eb80d64e3">مقال باسكويل دي سيلفيا</a>. أمّا بالنسبة <a rel="external nofollow" href="http://css-tricks.com/transitional-interfaces-coded/">للشيفرة المسؤولة عن الإنتقالات</a> في مقال باسكويل، فقد كتبه <a rel="external nofollow" href="https://twitter.com/chriscoyier">كريس كوير</a>.</p><p>سأعمل على تطوير المثال الوارد في مقال باسكويل، وذلك بإضافة المزيد من تأثيرات الانتقالات والتحريكات، وسأستخدم أيضاً شيفرة صغيرة من مقال كريس لإضافة خطوة إضافية في كل تحريكة، تتمثل بحجز مكان للعناصر المراد إضافتها إلى القائمة قبل إضافتها فعلياً.</p><p>سأستخدم خصائص CSS بدون أي بادئة prefix وذلك بغرض الاختصار، لكنك ستجد الخصائص كاملة ضمن النص المصدري للمشروع على Github. ستعمل مقاطع الشيفرة التي ستجدها ضمن هذا الدرس على <a rel="external nofollow" href="http://caniuse.com/#feat=transforms2d">متصفحات تدعم</a> خصائص CSS المستخدمة.</p><p>لنبدأ العمل!</p></div><div id="wmd-preview-section-54"><h2 id="الرماز-the-markup">الرماز The Markup</h2><p>لتوضيح فكرة الدرس بشكل جيد، أنشأت تطبيقاً بسيطاً خاصاً بالملاحظات البسيطة. يستخدم هذا التطبيق تقنية التخزين المحلي LocalStorage التي توفرها HTML5 وذلك لحفظ الملاحظات ضمن التخزين المحلي لمتصفح ويب لديك. يسمح لك التطبيق بأخذ ملاحظات وحفظها ضمن المتصفح إن أردت ذلك، في الحقيقة هو السبب الذي من أجله بنيت هذا التطبيق، وذلك من أجل ملاحظاتي الخاصة. لن أخوض في تفاصيل كيفية بناء هذا التطبيق لأنّ ذلك ليس هدف هذا الدرس.</p><p>الرُماز markup المستخدم في هذا التطبيق هو مجرد نموذج form بسيط يحتوي على حقل نصي text field وزر إرسال submit button، بالإضافة إلى قائمة غير مرتّبة unordered list. ستُضاف الملاحظات إلى هذه القائمة بشكل تلقائي. كما يوجد أيضاً عنصري div لعرض التنبيهات، التي ستظهر عند حفظ أو إزالة أي عنصر، بالإضافة إلى عدّاد وزر لحذف جميع العناصر بنقرة واحدة. فيما يلي جميع رُماز HTML الذي سنحتاجه:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">&lt;div class="notification undo-button"&gt;
  Item Deleted. Undo?
&lt;/div&gt; 

&lt;div class="notification save-notification"&gt;
  Item Saved
&lt;/div&gt; 

&lt;div class="reminder-container"&gt; 
  &lt;header&gt; 
    &lt;h1&gt;mini reminders list&lt;/h1&gt; 
  &lt;/header&gt;
 
  &lt;form id="input-form"&gt; 
    &lt;input type="text" id="text" placeholder="Remind me to.."/&gt; 
    &lt;input type="submit" value="Add" /&gt; 
  &lt;/form&gt; 

  &lt;ul class="reminders"&gt; 
  &lt;/ul&gt; 

  &lt;footer&gt; 
    &lt;span class="count"&gt;&lt;/span&gt; 
    &lt;button class="clear-all"&gt;
       Delete All
    &lt;/button&gt; 
  &lt;/footer&gt; 
&lt;/div&gt;</pre><p>يمكنك إضافة وتحرير وإزالة العناصر (الملاحظات) بالإضافة إلى إمكانية إستعادة العنصر المحذوف. في الواقع، تأتي أغلب التحريكات مرافقة لعملية إزالة وإستعادة العناصر. تُعتبر عملية إضافة العناصر بسيطة ولا تترافق مع الكثير من التحريكات، باستثناء التحريك الخاص بالظهور التدريجي fade in والسقوط إلى أسفل falling down واللذان سنتحدث عنهما عندما نبدأ العمل مع CSS.</p></div><div id="wmd-preview-section-56"><h2 id="تنسيقات-css">تنسيقات CSS</h2><p>ستحصل العناصر المُضافة توّاً عن طريق JavaScript على الصنف <span style="font-family:courier new,courier,monospace;">new-item</span>. (صنف CSS). أمّا العناصر المُزالة فستحصل على الصنف<span style="font-family:courier new,courier,monospace;"> removed-item</span>. كما ستحصل العناصر المُستعادة على الصنف <span style="font-family:courier new,courier,monospace;">restored-item</span>. وكل صنف من الأصناف السابقة سيُفعّل التحريكات الخاصة به. ستبقى أسماء الأصناف السابقة ثابتةً لجميع الأمثلة التوضيحية، في حين ستختلف فيما بينها بالتوجيه المسؤول عن مظهر التحريك <span style="font-family:courier new,courier,monospace;">keyframes@</span>. لنبدأ الآن بالمثال التوضيحي الأول.</p></div><div id="wmd-preview-section-57"><h3 id="المثال-الأول">المثال الأول</h3><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2016_01/demo-1.png.b7645198ff3565e59c1d9cb7f85a0ca7.png"><img data-fileid="10759" class="ipsImage ipsImage_thumbnailed" alt="demo-1.thumb.png.03f7fb7222340140d134a29" src="https://academy.hsoub.com/uploads/monthly_2016_01/demo-1.thumb.png.03f7fb7222340140d134a2985d844061.png"></a></p><p>المثال الأول: العناصر المُزالة "تسقط إلى أسفل"، والعناصر المُستعادة ستعود بحركة معاكسة.</p><p>ستسقط العناصر المضافة حديثاً من الأعلى، وهذا تأثير بسيط لكنه جميل. سيبدأ كل عنصر مُضاف حديثاً بالسقوط إلى أسفل وذلك من موقع يعلو 400 بيكسل عن الموقع النهائي الذي سيستقر فيه (أي الموقع النهائي ناقص 400 بيكسل) لا تنس أنّه يجب على الخاصية الفرعية <span style="font-family:courier new,courier,monospace;">animation-fill-mode</span> أن تحمل القيمة <span style="font-family:courier new,courier,monospace;">forwards</span> وذلك للتأكّد من أنّ العناصر ستبقى في موقعها النهائي ضمن القائمة، وإلّا فإنّها ستختفي بمجرّد انتهاء عملية التحريك.</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">li.new-item { 
  opacity: 0; 
  animation: new-item-animation .3s linear forwards; 
} 

@keyframes new-item-animation {   
  from { opacity: 0; transform: translateY(-400px); } to { opacity: 1; transform : translateY(0); } 
}</pre><p>ستسقط العناصر المزالة وتتلاشى fade out. بالنسبة لتحريكة السقوط إلى أسفل فهي بسيطة جداً، حيث ينتقل العنصر إلى أسفل وفق محور التراتيب (محور y) ليحاكي تحريكة السقوط، ويدور بينما يسقط ويتلاشى بالتدريج حتى يختفي تماماً (ستتحقّق شيفرة JavaScript من أنّ العنصر قد أُزيل كليّاً من DOM في نهاية هذه التحريكة).</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">li.removed-item { 
  animation: removed-item-animation 1s cubic-bezier(0.55, -0.04, 0.91, 0.94) forwards; 
  transform-origin: 0% 100%; 
} 

@keyframes removed-item-animation { 
  0% { opacity: 1; transform: rotateZ(0); } 
  100% { opacity: 0; transform: translateY(600px) rotateZ(90deg); } 
}</pre><p>أمّا عندما نستعيد عنصرًا فستعمل تحريكة الاستعادة على عكس المنطق الموجود في تحريكة إزالة عنصر، لذلك فستكون الأُطر الأساسية keyframes مُعرّفة بشكل معاكس تماماً لما هو عليه في تحريكة إزالة عنصر:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">li.restored-item { 
  animation: openspace 0.3s ease forwards, 
             restored-item-animation 0.3s 0.3s cubic-bezier(0, 0.8, 0.32, 1.07) forwards; 
} 

@keyframes openspace { to { height: auto; } } 
@keyframes restored-item-animation { 
  0% { opacity: 0; transform: translateY(600px) rotateZ(90deg); } 
  10% { opacity: 1; transform: translateY(600px) rotateZ(90deg); } 
  100% { opacity: 1; transform: rotateZ(0); } 
}</pre><p>يمكنك أن ترى أننا نستخدم في الشيفرة السابقة مظهر تحريك اسمه <span style="font-family:courier new,courier,monospace;">openspace</span> استعرته من مقال كريس كوير. يتأكّد مظهر التحريك هذا من أنّ العناصر التي تقع أسفل العنصر المُسترجع (إن وجدت)، ستنزلق إلى الأسفل وتفسح مجالاً للعنصر المُسترجَع ليعود إلى مكانه. إذاً عندما تنزلق العناصر إلى الأسفل لتفسح مجالاً open space للعنصر المُسترجَع، فإنّها فعلياً يجب أن تنتقل إلى الأسفل بشكل سلس، ولكن بما أنّ العناصر في هذا التطبيق لا تملك ارتفاعاً height ثابتاً، لذلك فإنّ إطار التحريك الأساسي to (انظر الشيفرة في الأعلى) سيجعل قيمة الارتفاع height لها لتصبح auto في نهاية عملية التحريك، سيؤدي ذلك لسوء الحظ إلى أنّ العناصر لن تنزلق إلى الأسفل، بل ستبدو كما لو أنّها تقفز إلى الأسفل.</p></div><div id="wmd-preview-section-60"><p>على أية حال توجد طريقة تجعل العناصر تغير مواقعها بشكل سلس، وهي تقنية كتب عنها ستيف ساندرسون Steve Sanderson <a rel="external nofollow" href="http://blog.stevensanderson.com/2013/03/15/animating-lists-with-css-3-transitions/">هنا</a>. لكنه يستخدم لهذا الغرض التموضع المطلق absolute positioning، وكمية لا بأس بها من شيفرة JavaScript. يمكنك تفقّد مقالته إذا كنت مهتماً بمعرفة المزيد عن التقنيّة التي يستخدمها، والتي تعطي في الحقيقة نتائج رائعة!</p></div><div id="wmd-preview-section-61"><h3 id="المثال-الثاني">المثال الثاني</h3><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2016_01/demo-2.png.69e29153dee89ffe3df810fbb9796804.png"><img data-fileid="10760" class="ipsImage ipsImage_thumbnailed" alt="demo-2.thumb.png.d7a9bc357dadc6da835cf48" src="https://academy.hsoub.com/uploads/monthly_2016_01/demo-2.thumb.png.d7a9bc357dadc6da835cf484f902d9b5.png"></a></p><p>المثال الثاني: العناصر تكبُر وتتلاشى أمام المستخدم، وتُستَعاد بطريقة معكوسة.</p><p>يعود الفضل في هذه الفكرة إلى <a rel="external nofollow" href="https://twitter.com/TimPietrusky">تيم بيتروسكي</a> Tim Pietrusky، حيث جاء بها عندما أخبرته أنّ الأفكار قد نفذت منّي بعد أن وضعت خمسة أمثلة توضيحية!</p><p>في هذه الفكرة، تظهر العناصر المُضافة حديثاً (أي تلك العناصر التي لم تُزال من قبل ثم استُعيدت) بشكل تدريجي fade in ضمن موقعها.</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">li.new-item { 
  opacity: 0; 
  animation: fadeIn .3s linear forwards; 
} 

@keyframes fadeIn { to { opacity: 1; } }</pre><p>عندما تُزال العناصر، فإنّها تكبُر وتتلاشى أمام المستخدم، أمّا العناصر المُستعادة فتسلك الأسلوب المعاكس، فعملية التحريك بالنسبة للعناصر المستعادة تماثل تماماً عملية التحريك بالنسبة للعناصر المزالة ولكن بالمقلوب.</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">li.removed-item { 
  animation: removed-item-animation .6s ease-out forwards; 
  transform-origin: 50% 50%; 
} 

@keyframes removed-item-animation { 
  0% { opacity: 1; transform: scale(1); } 
  100% { opacity: 0; transform: scale(4); } 
} 

li.restored-item { 
  animation: openspace .3s ease forwards, 
             restored-item-animation .3s .3s ease-out forwards; 
} 

@keyframes openspace { to { height: auto; } } 
@keyframes restored-item-animation { 
  0% { opacity: 0; transform: scale(4); } 
  100% { opacity: 1; transform: scale(1); } 
}</pre><h3>المثال الثالث</h3></div><div id="wmd-preview-section-64"><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2016_01/demo-3.png.e209afb6138981e9deae7e6870591f57.png"><img data-fileid="10761" class="ipsImage ipsImage_thumbnailed" alt="demo-3.thumb.png.da20ebb0b018558282570d3" src="https://academy.hsoub.com/uploads/monthly_2016_01/demo-3.thumb.png.da20ebb0b018558282570d3537efc351.png"></a></p><p>المثال الثالث: ستنزلق العناصر المستعادة لتدخل من اليمين، أما العناصر المزالة فستنزلق يساراً إلى الخارج.</p><p>يُعتبر المثال الثالث أبسط من سابقيه من الناحية الشكلية. فالعناصر المُضافة حديثاً سيكون لها نفس تأثير الظهور التدريجي كما في المثالين السابقين، لذلك سنتجاوز عملية التحريك الخاصة بإضافة عنصر جديد.</p><p>بالنسبة للعناصر المُزالة فإنها ستنزلق يساراً إلى الخارج، مع ملاحظة تأثير جميل يحدث عند بدء عملية الإزالة باستخدام دالة توقيت من النوع Cubic Bezier، انظر إلى المثال التطبيقي لترى كيف تعمل هذه التحريكة.</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">li.removed-item { 
  animation: removed-item-animation .8s cubic-bezier(.65,-0.02,.72,.29); 
} 

@keyframes removed-item-animation { 
  0% { opacity: 1; transform: translateX(0); } 
  30% { opacity: 1; transform: translateX(50px); } 
  80% { opacity: 1; transform: translateX(-800px); } 
  100% { opacity: 0; transform: translateX(-800px); } 
}</pre><p>أمّا العناصر المستعادة فستنزلق إلى الداخل من اليمين، وذلك باستخدام نفس دالة التوقيت السابقة، ولكنها ليست الحالة المعاكسة تماماً لها (تفقّد المثال التطبيقي لترى النتيجة النهائية).</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">li.restored-item { 
  animation: openspace .3s ease forwards, 
             restored-item-animation .5s .3s cubic-bezier(.14,.25,.52,1.56) forwards; 
}  

@keyframes openspace { to { height: auto; } } 
@keyframes restored-item-animation { 
  0% { opacity: 0; transform: translateX(300px); } 
  70% { opacity: 1; transform: translateX(-50px); } 
  100% { opacity: 1; transform: translateX(0); } 
}
</pre></div><div id="wmd-preview-section-67"><h3 id="المثال-الرابع">المثال الرابع</h3><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2016_01/demo-4.png.397f29929e91301480215f36e5a7472f.png"><img data-fileid="10762" class="ipsImage ipsImage_thumbnailed" alt="demo-4.thumb.png.9c259f14df212227033c4d4" src="https://academy.hsoub.com/uploads/monthly_2016_01/demo-4.thumb.png.9c259f14df212227033c4d485b69f60c.png"></a></p><p>المثال الرابع: ستكبر العناصر المستعادة والجديدة وتظهر تدريجياً ضمن موقعها، أمّا العناصر المزالة فإنّها ستصغر وتختفي تدريجياً.</p><p>وهذا المثال بسيط أيضاً. فكل من العناصر الجديدة والمستعادة ستكبر وتظهر تدريجياً في مواقعها، أما العناصر المزالة ستصغر وتختفي تدريجياً. هناك إطارين أساسيين keyframes لهاتين التحريكتين:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">li.removed-item { 
  animation: removed-item-animation .6s cubic-bezier(.55,-0.04,.91,.94) forwards; 
} 

@keyframes removed-item-animation { 
  from { opacity: 1; transform: scale(1); } to { opacity: 0; transform: scale(0); } 
} 

li.restored-item { 
  animation: openspace .3s ease forwards, 
             restored-item-animation .3s .3s cubic-bezier(0,.8,.32,1.07) forwards; 
} 

@keyframes openspace { to { height: auto; } } 
@keyframes restored-item-animation { from { opacity: 0; transform: scale(0); } to { opacity: 1; transform: scale(1); } }
</pre></div><div id="wmd-preview-section-69"><h3 id="المثال-الخامس">المثال الخامس</h3><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2016_01/demo-5.png.61f7943884d9bd753932bbcae98aff66.png"><img data-fileid="10763" class="ipsImage ipsImage_thumbnailed" alt="demo-5.thumb.png.d40535e45e261682e44ceaa" src="https://academy.hsoub.com/uploads/monthly_2016_01/demo-5.thumb.png.d40535e45e261682e44ceaad4615bd16.png"></a></p><p>المثال الخامس: تسقط العناصر الجديدة من الأعلى إلى الأسفل. العناصر المزالة تبقى معلّقة قليلاً ثم تسقط إلى الأسفل. أما العناصر المستعادة فتنزلق إلى الداخل من اليمين.</p><p>في هذا المثال، عندما نُزيل أحد العناصر فإنّه يبقى معلّقاً قليلاً قبل أن يبدأ بالسقوط الفعلي ثم الإختفاء. في الحقيقة هذا هو الجزء الأهم في هذا المثال، لأنّ العناصر الجديدة ستسقط إلى الأسفل كما في المثال الأوّل، والعناصر المستعادة ستنزلق إلى الداخل من اليمين كما في المثال الثالث، ولكن مع فرق طفيف في دالة التوقيت timing function. لذلك فإنّ التحريكة الخاصة بإزالة العناصر هي التأثير الجديد الوحيد في هذا المثال.</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">li.restored-item { 
  transform: translateX(300px); 
  animation: openspace .3s ease forwards, 
             restored-item-animation .3s .3s cubic-bezier(0,.8,.32,1.07) forwards; 
} 

@keyframes openspace { to { height: auto; } } 
@keyframes restored-item-animation { to { opacity: 1; transform: translateX(0); } } 

li.removed-item { 
  animation: removed-item-animation 2s cubic-bezier(.55,-0.04,.91,.94) forwards; 
  transform-origin: 0% 100%; 
}</pre><p>يعطي تغيير زاوية الدوران للعنصر ضمن أُطر frames مختلفة (الأطر الرئيسية: 0% و 20% و 40% و 60% و 70% و 90% و 100%) انطباعاً بأنّ العنصر يتأرجح بينما يكون معلّقاً، وبعد ذلك يبدأ بالسقوط إلى الأسفل.</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">@keyframes removed-item-animation { 
  0% { opacity: 1; transform: rotateZ(0); } 
  20% { opacity: 1; transform: rotateZ(140deg); } 
  40% { opacity: 1; transform: rotateZ(60deg); } 
  60% { opacity: 1; transform: rotateZ(110deg); } 
  70% { opacity: 1; transform: rotateZ(90deg) translateX(0); } 
  90% { opacity: 1; transform: rotateZ(90deg) translateX(600px); } 
  100% { opacity: 0; transform: rotateZ(90deg) translateX(600px); } 
}
</pre></div><div id="wmd-preview-section-72"><h3 id="المثال-السادس">المثال السادس</h3><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2016_01/demo-6.png.4e8aaf4eadc79ace8d88402a7ca0d12f.png"><img data-fileid="10764" class="ipsImage ipsImage_thumbnailed" alt="demo-6.thumb.png.666d49e429b52fc9b3bfc80" src="https://academy.hsoub.com/uploads/monthly_2016_01/demo-6.thumb.png.666d49e429b52fc9b3bfc8039c4ecc1e.png"></a></p><p>المثال السادس: ستختفي العناصر المزالة تدريجياً وتسقط إلى الأسفل باتجاه اليسار، أما العناصر الجديدة والمستعادة فستنزلق إلى الداخل من اليمين.</p><p>سيكون لكل من العناصر الجديدة والمستعادة نفس السلوك في هذا المثال، حيث ستنزلق هذه العناصر إلى الداخل من اليمين ثم تخرج بشكل طفيف من الجهة اليسرى قبل أن تستقرّ في مكانها.</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">li.restored-item { 
  transform: translateX(300px); 
  animation: openspace .3s ease forwards, 
             restored-item-animation .5s .3s cubic-bezier(.14,.25,.52,1.56) forwards; 
} 

@keyframes openspace { to { height: auto; } } 
@keyframes restored-item-animation { 
  0% { opacity: 0; transform: translateX(300px); } 
  70% { opacity: 1; transform: translateX(-50px); } 
  100% { opacity: 1; transform: translateX(0); } 
}</pre><p>ستنزلق العناصر المزالة ببطء نحو اليسار، وبعد ذلك ستسقط إلى الأسفل باتجاه اليسار وتتلاشى. </p><p>من المهم الآن أن نعمل على إعداد تحويل مناسب لموضع نقطة الأصل origin (مبدأ الإحداثيات)، بحيث أنّ التأثير المسؤول عن السقوط إلى أسفل يبدو أكثر واقعية. بغية ذلك، أجريت تحويلاً على نقطة الأصل لكي تنطبق على آخر نقطة تماس بين العنصر والسطر الذي ينتمي إليه، وذلك قبل أن يبدأ بالدوران والسقوط إلى أسفل، يعطي ذلك انطباعاً بأنّ العنصر يسقط بسبب وزنه.</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">li.removed-item { 
  animation: removed-item-animation 1s linear; 
  transform-origin: 390px 100%; 
} 

@keyframes removed-item-animation { 
  0% { opacity: 1; transform: translateX(0) rotateZ(0); } 
  50% { opacity: 1; transform: translateX(-400px) rotateZ(0); } 
  75% { opacity: 1; transform: translateX(-420px) rotateZ(-30deg); } 
  100% { opacity: 0; transform: translateX(-800px) rotateZ(-60deg) translateY(400px); } 
}
</pre></div><div id="wmd-preview-section-75"><h2 id="خاتمة">خاتمة</h2><p>في الواقع، الإمكانيات المتاحة لا حدّ لها تقريباً، هناك الكثير من الطرق الأكثر الإبداعية لإضافة وإزالة عناصر قائمة، وأنا على ثقة بأنّك تستطيع ابتكار تأثيرات خاصة بك، وأرجو أن يكون هذا الدرس مثيراً وملهماً.</p><p>لم أدخل في القسم المتعلّق بـ JavaScript لأنّ ذلك ليس من محور اهتمام الدرس.</p><p>من الملاحظ وجود خطأ ضمن متصفح Firefox (ربما يُصحّح في النسخ اللاحقة) ,والذي يسبب وميضاً للصفحة كلّما تمّ وضع التركيز على العنصر أو حتى إزالة التركيز عنه (أي عندما تضغط زر edit/save). لا أدري إذا كانت توجد طريقة لتجاوز هذا الأمر، لذلك فمن فضلك أعلمني إذا استطعت تحديد سبب ذلك الوميض وإذا كانت هناك أي طريقة لمنعه. على أية حال جُرّبت الأمثلة السابقة بشكل جيّد على المتصفحات التي تدعم Webkit.</p><p>شكراً لقراءتك هذا الدرس، وأرجو أن تكون قد استمتعت فيه.</p><p>بإمكانك الاطّلاع على هذه الأمثلة <a rel="external nofollow" href="https://sarasoueidan.com/demos/creative-list-effects/">من هنا</a>، أما الشيفرة المصدرية فهي متُوفّرة على <a rel="external nofollow" href="https://github.com/sarasoueidan/creative-list-effects">هذا المُستودع</a>.</p><p>ترجمة -وبتصرّف- للمقال <a rel="external nofollow" href="https://sarasoueidan.com/blog/creative-list-effects/">Creative Add/Remove Effects For List Items with CSS3 Animations</a> لصاحبته Sara Soueidan.</p></div>
]]></description><guid isPermaLink="false">233</guid><pubDate>Tue, 05 Jan 2016 21:10:03 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x625;&#x646;&#x634;&#x627;&#x621; &#x642;&#x627;&#x626;&#x645;&#x629; &#x62A;&#x646;&#x642;&#x644; &#x62F;&#x627;&#x626;&#x631;&#x64A;&#x629; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; CSS Transforms</title><link>https://academy.hsoub.com/programming/css/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D9%82%D8%A7%D8%A6%D9%85%D8%A9-%D8%AA%D9%86%D9%82%D9%84-%D8%AF%D8%A7%D8%A6%D8%B1%D9%8A%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-css-transforms-r214/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2019_06/circular-menu-css.png.png.79c66097519f28d58b9678bd5431d89f.png" /></p>

<div id="wmd-preview-section-17">
	<p>
		في هذا الدرس سوف تتعلم كيفية إنشاء قائمة تنقل (navigation) دائرية الشكل باستخدام CSS Transforms. سوف أريك كيف تقوم بذلك خطوة بخطوة وسوف أقوم بشرح الحسابات والمنطق البسيط وراء هذه الطريقة حتى يتسنى لك فهم كيفية عمل هذه الطريقة. 
	</p>

	<p style="text-align: center;">
		 
	</p>

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

	<p style="text-align: center;">
		<img class="ipsImage ipsImage_thumbnailed" data-fileid="30300" data-unique="u46jwgimq" src="https://academy.hsoub.com/uploads/monthly_2019_06/circular-menu-css.png.png.50d2dcb32fa63c53b7fe763034c431ff.png" alt="circular-menu-css.png.png"></p>
</div>

<div id="wmd-preview-section-18">
	<h2 id="بنية-html">
		بنية HTML
	</h2>

	<p>
		بما أننا سنقوم ببناء قائمة تنقل فسوف نبدأ بالبنية المعتادة لأي قائمة، أي أننا سوف نحتاج إلى عنصر <span style="font-family:courier new,courier,monospace;">div</span> ليحتوي على قائمة العناصر المتمثلة بعنصر <span style="font-family:courier new,courier,monospace;">ul</span> وسوف نحتاج أيضًا إلى عناصر القائمة المتمثلة بعناصر <span style="font-family:courier new,courier,monospace;">li</span> كما أننا سوف نحتاج إلى زر (<span style="font-family:courier new,courier,monospace;">button</span>) ليعمل على فتح وإغلاق القائمة عند الضغط عليه. وسوف نحتاج في المثال الأول إلى شيء اضافي وهو عنصر <span style="font-family:courier new,courier,monospace;">div</span> ليعمل كغشاء (overlay) يمنعنا من الضغط على أي مكان آخر في الصفحة طالما أنّ القائمة مفتوحة. 
	</p>

	<p>
		<strong>ملاحظة:</strong> جميع الأيقونات المستخدمة في هذا الدرس هي من خدمة <a href="http://fortawesome.github.io/Font-Awesome/icons/" rel="external nofollow">Font Awesome</a>.
	</p>
</div>

<div id="wmd-preview-section-19">
	<h2 id="شرح-بعض-الالحسابات-خلف-css-transforms">
		شرح بعض الحسابات خلف CSS Transforms
	</h2>

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

	<p>
		لنبدأ أولًا بتعريف ما هو المقصود بالزاوية المركزية. أنظر إلى الصورة التالية متبوعة بشرح بسيط: 
	</p>

	<p style="text-align: center;">
		<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_12/figure1-cn-central-angle1.png.e9befdd33f4c2b8a7b70ab0b9e8db7b9.png" data-fileid="9483" rel=""><img alt="figure1-cn-central-angle1.thumb.png.e695" class="ipsImage ipsImage_thumbnailed" data-fileid="9483" src="https://academy.hsoub.com/uploads/monthly_2015_12/figure1-cn-central-angle1.thumb.png.e6952c4a978a9b9af67d3b5dca726a4e.png"></a>
	</p>

	<p>
		لنفرض أنك تريد توزيع عناصر القائمة على نصف دائرة كما هو الحال بالنسبة لما نريد إنشائه هنا، ولنفرض أيضًا أنّ لدينا 6 عناصر، إذًا كل زاوية سوف يكون لها زاوية مركزية بقيمة: 
	</p>

	<p>
		<strong>180 درجة / 6 = 30 درجة </strong>
	</p>

	<p>
		ماذا لو أردت توزيع العناصر على دائرة كاملة؟ بسيطة كل ما سنقوم بفعله هو التالي: 
	</p>

	<p>
		<strong>360 درجة / 6 = 60 درجة </strong>
	</p>

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

	<p>
		وحتى يكون بامكاننا إنشاء زاوية مساوية للزوايا المركزية التي نريدها فإننا سوف نحتاج إلى حرف/تمييل (skew) العناصر وذلك باستخدام دالّة <span style="font-family:courier new,courier,monospace;">()skew</span>، وسوف تكون القيمة كالتالي: 
	</p>

	<p>
		<strong>90 درجة - x درجة ، بحيث تكون x هي الزاوية المركزية التي نريدها</strong>
	</p>

	<p>
		ولكن في هذه الحالة فإنّ جميع محتوى عناصر القائمة سوف تتم إمالتها وسوف تظهر بشكل غير مناسب، لذلك يجب علينا أن نقوم بتعديلها (أي نعمل لها unskew) حتى يظهر كل شيء بشكل جيد.
	</p>

	<p>
		يمكنك الدخول إلى <a href="http://tympanus.net/Tutorials/CircularNavigation/interactivedemo/index.html" rel="external nofollow">هذا المثال</a> لرؤية كيف يتم تطبيق التحويلات (transforms) إلى عناصر القائمة خطوة بخطوة حتى يتضح لك ما الذي سوف نقوم بفعله في الشيفرة البرمجية (ضع في الحسبان أن التسلسل الموجود في المثال قد يختلف بشكل بسيط عن الخطوات الفعلية التي سوف نتبعها في هذا الدرس). 
	</p>

	<p>
		وهذه لقطات لكل خطوة سوف تراها في هذا المثال: 
	</p>

	<p>
		الحالة الأولية: 
	</p>

	<p style="text-align: center;">
		<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_12/Step-0.png.7b8765124d47f646f85bc9eba7ac4319.png" data-fileid="9485" rel=""><img alt="Step-0.thumb.png.133b167694bc6abb5150954" class="ipsImage ipsImage_thumbnailed" data-fileid="9485" src="https://academy.hsoub.com/uploads/monthly_2015_12/Step-0.thumb.png.133b167694bc6abb5150954184717eed.png"></a>
	</p>

	<p>
		الخطوة الأولى: 
	</p>

	<p style="text-align: center;">
		<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_12/Step-1.png.eb7c176a5cb81648baf2892297d7d6b4.png" data-fileid="9486" rel=""><img alt="Step-1.thumb.png.5e17f5e2ad725234ace253a" class="ipsImage ipsImage_thumbnailed" data-fileid="9486" src="https://academy.hsoub.com/uploads/monthly_2015_12/Step-1.thumb.png.5e17f5e2ad725234ace253a902081e31.png"></a>
	</p>

	<p>
		الخطوة الثانية: 
	</p>

	<p style="text-align: center;">
		<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_12/step-2.png.67bb28ce83635e4de9645e6bafe19873.png" data-fileid="9484" rel=""><img alt="step-2.thumb.png.42ddf3d939d886157a2ca8c" class="ipsImage ipsImage_thumbnailed" data-fileid="9484" src="https://academy.hsoub.com/uploads/monthly_2015_12/step-2.thumb.png.42ddf3d939d886157a2ca8c0833f943e.png"></a>
	</p>

	<p>
		الخطوة الثالثة: 
	</p>

	<p style="text-align: center;">
		<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_12/Step-3.png.c04caf9fdaedf656f3dcc7b33c3f82c3.png" data-fileid="9487" rel=""><img alt="Step-3.thumb.png.79e48ddc7b18e56f105749f" class="ipsImage ipsImage_thumbnailed" data-fileid="9487" src="https://academy.hsoub.com/uploads/monthly_2015_12/Step-3.thumb.png.79e48ddc7b18e56f105749ffec910b82.png"></a>
	</p>

	<p>
		الخطوة الرابعة: 
	</p>

	<p style="text-align: center;">
		<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_12/Step-4.png.bc780c2161ac08f9d3a985158c60619c.png" data-fileid="9488" rel=""><img alt="Step-4.thumb.png.f9157a510e5b2e09df6fda5" class="ipsImage ipsImage_thumbnailed" data-fileid="9488" src="https://academy.hsoub.com/uploads/monthly_2015_12/Step-4.thumb.png.f9157a510e5b2e09df6fda5a51101ca3.png"></a>
	</p>

	<p>
		الخطوة الخامسة: 
	</p>

	<p style="text-align: center;">
		<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_12/Step-5.png.b7d3990cfa4978cc697254f8c670362b.png" data-fileid="9489" rel=""><img alt="Step-5.thumb.png.2599416ec91c06b65eaa9f6" class="ipsImage ipsImage_thumbnailed" data-fileid="9489" src="https://academy.hsoub.com/uploads/monthly_2015_12/Step-5.thumb.png.2599416ec91c06b65eaa9f695b94b090.png"></a>
	</p>

	<p>
		الخطوة السادسة: 
	</p>

	<p style="text-align: center;">
		<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_12/Step-6.png.531f5c1cb8b2b2c9e474c435452e29aa.png" data-fileid="9490" rel=""><img alt="Step-6.thumb.png.0885f80cf85bf75c716c9ad" class="ipsImage ipsImage_thumbnailed" data-fileid="9490" src="https://academy.hsoub.com/uploads/monthly_2015_12/Step-6.thumb.png.0885f80cf85bf75c716c9adf8d9e638b.png"></a>
	</p>

	<p>
		إذًا هذا ما سوف نفعله: 
	</p>

	<ul>
<li>
			سوف نحتاج إلى موضعة عناصر القائمة بشكل مطلق (absolute positioning) داخل الحاوي الخاص بها. 
		</li>
		<li>
			سوف نستعمل الخاصية <span style="font-family:courier new,courier,monospace;">transform-origin</span> على كل عنصر وبالقيمة bottom right corner .
		</li>
		<li>
			بعد ذلك سوف نقوم بتحريك العناصر إلى الأعلى وإلى اليسار بشكل كافٍ حتى تتطابق مراكز التحريك الخاصة بها مع مركز العنصر الذي يحويها. 
		</li>
		<li>
			سوف نقوم بتدوير العناصر في مواضعها باستخدام المعادلة التالية: كل عنصر له index بقيمة i سوف يتم تدويره بقيمة i*x حيث أن x كما سبق وذكرنا هي قيمة الزاوية المركزية. 
		</li>
		<li>
			بعد ذلك نقوم بتمييلها (skew) للحصول على الزاوية المركزية التي نريدها (باستخدام المعادلة الموجودة في الأعلى). 
		</li>
	</ul>
<p>
		في مثالنا سوف يكون هناك 5 عناصر مما يعني وجود 5 زوايا مركزية وبالتالي سوف نقوم بتغطية الجزء العلوي فقط من الدائرة، واعتمادًا على المعادلات التي طرحناها سابقًا فسوف تكون الزاوية المركزية لكل عنصر هي 36 درجة (<strong>180 / 5</strong>) ولكننا سوف نجعل الزاوية المركزية تساوي 40 درجة مما يمنحنا منطقة أكبر قابلة للنقر، وبالتالي يكون مجموع الزوايا هو <strong>40*5=200</strong> وهو رقم أكبر من 180. في هذه الحالة سوف نحتاج إلى تدوير العناصر عكس عقارب الساعة بقيمة<strong> (200-180)/2</strong> لنتأكد من أنها متوازنة على كلا الجانبين. 
	</p>

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

	<p>
		نقوم بتمييل عناصر <span style="font-family:courier new,courier,monospace;">a</span> الموجودة داخل عناصر القائمة وذلك بتطبيق قيمة معاكسة للقيمة المستخدمة لتمييل عناصر القائمة وبعد ذلك نقوم بتدويرها بالقيمة: 
	</p>

	<p>
		<strong>-[90 - (x/2)] (لاحظ أن القيمة سالبة) ، مرة أخرى x هي الزاوية المركزية </strong>
	</p>

	<p>
		إذًا بما أن الزاوية المركزية هي 40 درجة فإننا سوف نحتاج إلى تمييل العناصر aبالقيمة -40 درجة وتدويرها بالقيمة -70 درجة<strong> (90 - (40/2))</strong>. 
	</p>

	<p>
		سوف يتم موضعة عناصر <span style="font-family:courier new,courier,monospace;">a</span> بشكل مطلق داخل الحاوي الخاص بها (الحاوي هنا هي عناصر القائمة) وسوف يتم إعطاء عناصر القائمة الخاصية <span style="font-family:courier new,courier,monospace;">overflow: hidden</span> مما يعني أنّه سوف يتم قطع جزء من كل عنصر من عناصر <span style="font-family:courier new,courier,monospace;">a</span>، وحتى نتأكد بأنّ محتوى العناصر (سواء كانت نص أو أيقونة) يبقى ضمن المحتوى الظاهر منها فإننا سوف نستعمل الخاصية <span style="font-family:courier new,courier,monospace;">text-align: center</span>. 
	</p>

	<p>
		وهذه هي كل الحسابات التي سوف نحتاجها إلى الآن. 
	</p>

	<p>
		تبقى علينا الآن أن نقوم باستعمال تنسيقات CSS المناسبة حتى يصبح كل شيء بشكله المناسب.
	</p>
</div>

<div id="wmd-preview-section-20">
	<h2 id="تنسيقات-css">
		تنسيقات CSS
	</h2>

	<p>
		سوف نقوم أولًا بتنسيق <a href="http://tympanus.net/Tutorials/CircularNavigation/" rel="external nofollow">المثال الأول</a>. 
	</p>

	<p style="text-align: center;">
		<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_12/CircularNavigation_Demo1.png.51c317e92188b97bf9e69e7c9d7d5fd5.png" data-fileid="9478" rel=""><img alt="CircularNavigation_Demo1.thumb.png.a36b3" class="ipsImage ipsImage_thumbnailed" data-fileid="9478" src="https://academy.hsoub.com/uploads/monthly_2015_12/CircularNavigation_Demo1.thumb.png.a36b336a4b87393026ff165db1d03433.png"></a>
	</p>

	<p>
		سوف نستخدم Modernizr حتى نستطيع تحديد المتصفحات التي تدعم CSS Transforms والمتصفحات التي لا تدعمها ونقوم بتوفير fallback للمتصفحات القديمة التي لا تدعمها. 
	</p>

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

	<pre class="css ipsCode prettyprint" data-pbcklang="css" data-pbcktabsize="4">
.csstransforms .cn-wrapper { 
  font-size:1em; 
  width: 26em; 
  height: 26em; 
  overflow: hidden; 
  position: fixed; 
  z-index: 10; 
  bottom: -13em; 
  left: 50%; 
  border-radius: 50%; 
  margin-left: -13em; 
  transform: scale(0.1); 
  transition: all .3s ease; 
} 

/* class applied to the container via JavaScript that will scale the navigation up */ 
.csstransforms .opened-nav { 
  border-radius: 50%; 
  transform: scale(1); 
}</pre>

	<p>
		سوف نقوم كذلك بتنسيق الزر الذي سوف يفتح ويغلق القائمة:
	</p>

	<pre class="css ipsCode prettyprint" data-pbcklang="css" data-pbcktabsize="4">
.cn-button { 
  border:none; 
  background:none; 
  color: white; 
  text-align: Center; 
  font-size: 1.5em; 
  padding-bottom: 1em; 
  height: 3.5em; 
  width: 3.5em; 
  background-color: #111; 
  position: fixed; 
  left: 50%; 
  margin-left: -1.75em; 
  bottom: -1.75em; 
  border-radius: 50%; 
  cursor: pointer; 
  z-index: 11 
} 

.cn-button:hover, .cn-button:active, .cn-button:focus{ 
  background-color: #222; 
}</pre>

	<p>
		عندما يتم فتح القائمة فإنه سوف يظهر غطاء/غشاء شفاف يغطي الصفحة، وهذه هي التنسيقات الخاصة به:
	</p>

	<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
.cn-overlay{ 
  width:100%; 
  height:100%; 
  background-color: rgba(0,0,0,0.6); 
  position:fixed; 
  top:0; left:0; bottom:0; right:0; 
  opacity:0; 
  transition: all .3s ease; 
  z-index:2; 
  pointer-events:none; 
} 

/* Class added to the overlay via JavaScript to show it when navigation is open */ 
.cn-overlay.on-overlay{ 
  pointer-events:auto; 
  opacity:1; 
}</pre>

	<p>
		سوف نقوم الآن بتنسيق عناصر القائمة وعناصر a الموجودة بداخلها وذلك بتطبيق المنطق والالحسابات التي تحدثنا عنها في البداية:
	</p>

	<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
.csstransforms .cn-wrapper li { 
  position: absolute; 
  font-size: 1.5em; 
  width: 10em; 
  height: 10em; 
  transform-origin: 100% 100%; o
  verflow: hidden; 
  left: 50%; top: 50%; 
  margin-top: -1.3em; 
  margin-left: -10em; 
  transition: border .3s ease; 
} 

.csstransforms .cn-wrapper li a { 
  display: block; 
  font-size: 1.18em; 
  height: 14.5em; 
  width: 14.5em; 
  position: absolute; 
  bottom: -7.25em; right: -7.25em; 
  border-radius: 50%; 
  text-decoration: none; 
  color: #fff; 
  padding-top: 1.8em; 
  text-align: center; 
  transform: skew(-50deg) rotate(-70deg) scale(1); 
  transition: opacity 0.3s, color 0.3s; 
} 

.csstransforms .cn-wrapper li a span { 
  font-size: 1.1em; 
  opacity: 0.7; 
} 

/* for a central angle x, the list items must be skewed by 90-x degrees in our case x=40deg so skew angle is 50deg items should be rotated by x, minus (sum of angles - 180)2s (for this demo) */ 
.csstransforms .cn-wrapper li:first-child { 
  transform: rotate(-10deg) skew(50deg); 
} 

.csstransforms .cn-wrapper li:nth-child(2) { 
  transform: rotate(30deg) skew(50deg); 
} 

.csstransforms .cn-wrapper li:nth-child(3) { 
  transform: rotate(70deg) skew(50deg) 
} 

.csstransforms .cn-wrapper li:nth-child(4) { 
  transform: rotate(110deg) skew(50deg); 
} 

.csstransforms .cn-wrapper li:nth-child(5) { 
  transform: rotate(150deg) skew(50deg); 
} 

.csstransforms .cn-wrapper li:nth-child(odd) a { 
  background-color: #a11313; 
  background-color: hsla(0, 88%, 63%, 1); 
} 

.csstransforms .cn-wrapper li:nth-child(even) a { 
  background-color: #a61414; 
  background-color: hsla(0, 88%, 65%, 1); 
} 

/* active style */ 
.csstransforms .cn-wrapper li.active a { 
  background-color: #b31515; 
  background-color: hsla(0, 88%, 70%, 1); 
} 

/* hover style */ 
.csstransforms .cn-wrapper li:not(.active) a:hover, .csstransforms .cn-wrapper li:not(.active) a:active, .csstransforms .cn-wrapper li:not(.active) a:focus { 
  background-color: #b31515; 
  background-color: hsla(0, 88%, 70%, 1); 
} 

.csstransforms .cn-wrapper li:not(.active) a:focus { 
  position: fixed; 
  /* fix the "displacement" bug in webkit browsers when using tab key */ 
}</pre>

	<p>
		سوف نقوم بتوفير fallback بسيط للمتصفحات التي لا تدعم CSS Transforms.
	</p>

	<pre class="css ipsCode prettyprint" data-pbcklang="css" data-pbcktabsize="4">
.no-csstransforms .cn-wrapper{ 
  font-size:1em; 
  height:5em; 
  width:25.15em; 
  bottom:0; 
  margin-left: -12.5em; 
  overflow: hidden; 
  position: fixed; 
  z-index: 10; 
  left:50%; 
  border:1px solid #ddd; 
} 

.no-csstransforms .cn-button{ 
  display:none; 
} 

.no-csstransforms .cn-wrapper li{ 
  position:static; 
  float:left; 
  font-size:1em; 
  height:5em; 
  width:5em; 
  background-color: #eee; 
  text-align:center; 
  line-height:5em; 
} 

.no-csstransforms .cn-wrapper li a{ 
  display:block; 
  width:100%; 
  height:100%; 
  text-decoration:none; 
  color:inherit; 
  font-size:1.3em; 
  border-right: 1px solid #ddd; 
} 

.no-csstransforms .cn-wrapper li a:last-child{ 
  border:none; 
} 

.no-csstransforms .cn-wrapper li a:hover, .no-csstransforms .cn-wrapper li a:active, .no-csstransforms .cn-wrapper li a:focus{ 
  background-color: white; 
} 

.no-csstransforms .cn-wrapper li.active a { 
  background-color: #6F325C; 
  color: #fff; 
}</pre>

	<p>
		وبالطبع فنحن نريد أن تكون القائمة متجاوبة مع جميع الأجهزة وتتقلص للشاشات الصغيرة:
	</p>

	<pre class="css ipsCode prettyprint" data-pbcklang="css" data-pbcktabsize="4">
@media screen and (max-width:480px){ 
  .csstransforms .cn-wrapper{ 
    font-size:.68em; 
  } 
  .cn-button{ 
    font-size:1em; 
  } 
  .csstransforms .cn-wrapper li { 
    font-size:1.52em; 
  } 
} 

@media screen and (max-width:320px){
  .no-csstransforms .cn-wrapper{ 
    width:15.15px; 
    margin-left: -7.5em; 
  } 
  .no-csstransforms .cn-wrapper li{ 
    height:3em; width:3em; 
  } 
}</pre>

	<p>
		هذا كان كل شيء يخص المثال الأول. دعونا الآن ننتقل لتنسيق <a href="http://tympanus.net/Tutorials/CircularNavigation/index2.html" rel="external nofollow">المثال الثاني</a>. 
	</p>

	<p style="text-align: center;">
		<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_12/CircularNavigation_Demo2.png.080f6c98a630a0a6af432ab3b1d691ae.png" data-fileid="9479" rel=""><img alt="CircularNavigation_Demo2.thumb.png.7a346" class="ipsImage ipsImage_thumbnailed" data-fileid="9479" src="https://academy.hsoub.com/uploads/monthly_2015_12/CircularNavigation_Demo2.thumb.png.7a346d14ba50f0e509daea785abdc527.png"></a>
	</p>

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

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

	<p>
		سوف نقوم بتطبيق تدرج لوني دائري على عناصر <span style="font-family:courier new,courier,monospace;">a</span> مع لون خلفية شفاف، وسوف تظهر النتيجة كالتالي: 
	</p>

	<p style="text-align: center;">
		<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_12/cn-radial-gradient.png.e1360cdf00e3d909fc085020ffacb116.png" data-fileid="9482" rel=""><img alt="cn-radial-gradient.thumb.png.07582a08b9e" class="ipsImage ipsImage_thumbnailed" data-fileid="9482" src="https://academy.hsoub.com/uploads/monthly_2015_12/cn-radial-gradient.thumb.png.07582a08b9ee28ad6e5f7bf84ae9557b.png"></a>
	</p>

	<p>
		سوف نقوم الآن بإضافة بعض المسافة بين عناصر القائمة وذلك بتغيير درجة الدوران لكل عنصر. سوف نقوم كذلك بإزالة لون الخلفية لعناصر القائمة وللحاوي وللحدود وسوف نقوم بتقليص قيمة الخاصية <span style="font-family:courier new,courier,monospace;">padding-top</span> لعناصر <span style="font-family:courier new,courier,monospace;">a</span> حتى نجعل الأيقونات متوسطة بشكل مثالي داخل العناصر. النتيجة النهائية ستكون كما في الصورة التالية: 
	</p>

	<p style="text-align: center;">
		<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_12/cn-demo2-step1.png.128a53ee2e39f44942ba27309eb24162.png" data-fileid="9481" rel=""><img alt="cn-demo2-step1.thumb.png.991e996c48fbbca" class="ipsImage ipsImage_thumbnailed" data-fileid="9481" src="https://academy.hsoub.com/uploads/monthly_2015_12/cn-demo2-step1.thumb.png.991e996c48fbbca7574cfebcaf2491f5.png"></a>
	</p>

	<p>
		يمكنك أن ترى بأنّ القائمة بدأت تبدو بمظهر مختلف، وبقي شيء واحد مهم يجب أن نقوم به. ففي حالة بقاء التنسيقات كما هي عليه في الوقت الحالي فإنّ المناطق القابلة للنقر الخاصة بعناصر <span style="font-family:courier new,courier,monospace;">a</span> ستكون أكبر مما نريده، فما نريده هو أن يكون الجزء الملون من القائمة هو فقط القابل للنقر. الصورة التالية توضح الجزء الزائد القابل للنقر والذي لا نريده: 
	</p>

	<p style="text-align: center;">
		<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_12/cn-demo2-cover.png.bf7c0a62906a616c3306bbff0dbda0d3.png" data-fileid="9480" rel=""><img alt="cn-demo2-cover.thumb.png.21297ab252786bf" class="ipsImage ipsImage_thumbnailed" data-fileid="9480" src="https://academy.hsoub.com/uploads/monthly_2015_12/cn-demo2-cover.thumb.png.21297ab252786bf0e2f4f053c49d759b.png"></a>
	</p>

	<p>
		عندما تقوم بوضع مؤشر الفأرة فوق المنطقة الحمراء الموضحة في الصورة الموجودة في الأعلى فإنّه سيتم تفعيل حالة الـhover الخاصة بعناصر <span style="font-family:courier new,courier,monospace;">a</span> وهو شيء طبيعي الحدوث ولكننا لا نريده لأننا نريد أن تظهر العناصر وكأنها هي فقط الجزء البنفسجي، وبالتالي سوف نحتاج إلى منع تفعيل أحداث الفأرة على الجزء الملون باللون الأحمر. لذلك ما سنقوم به هو استخدام pseudo-element (سوف تفي بالغرض لأننا لا نريد استعمال وسم فارغ) ليعمل كغطاء/غشاء يقوم بتغطية منطقة اللون الأحمر وبالتالي نمنع تفعيل أحداث الماوس على هذه المنطقة. 
	</p>

	<p>
		إذًا سوف نقوم بتطبيق الخطوات الثلاثة التي ذكرناها مع تغيير بعض التنسيقات (كاللون والحجم) بالنسبة للقائمة ولعناصر القائمة ليظهر كل شيء كما في الصورة:
	</p>

	<pre class="css ipsCode prettyprint" data-pbcklang="css" data-pbcktabsize="4">
.csstransforms .cn-wrapper { 
  position: absolute; 
  top: 100%; left: 50%; 
  z-index: 10; 
  margin-top: -13em; 
  margin-left: -13.5em; 
  width: 27em; height: 27em; 
  border-radius: 50%; 
  background: transparent; 
  opacity: 0; 
  transition: all .3s ease 0.3s; 
  transform: scale(0.1); 
  pointer-events: none; 
  overflow: hidden; 
} 

/*cover to prevent extra space of anchors from being clickable*/ 
.csstransforms .cn-wrapper:after{ 
  color: transparent; 
  content:"."; 
  display:block; 
  font-size:2em; 
  width:6.2em; height:6.2em; 
  position: absolute; 
  left: 50%; 
  margin-left: -3.1em; 
  top:50%; 
  margin-top: -3.1em; 
  border-radius: 50%; 
  z-index:10; 
} 

.csstransforms .cn-wrapper li { 
  position: absolute; 
  top: 50%; left: 50%; 
  overflow: hidden; 
  margin-top: -1.3em; margin-left: -10em; 
  width: 10em; height: 10em; 
  font-size: 1.5em; 
  transition: all .3s ease; 
  transform: rotate(76deg) skew(60deg); 
  transform-origin: 100% 100%; 
  pointer-events: none; 
} 

.csstransforms .cn-wrapper li a { 
  position: absolute; 
  position: fixed; 
  /* fix the "displacement" bug in webkit browsers when using tab key */ 
  right: -7.25em; bottom: -7.25em; 
  display: block; 
  width: 14.5em; height: 14.5em; 
  border-radius: 50%; 
  background: #429a67; 
  background: radial-gradient(transparent 35%, #429a67 35%); 
  color: #fff; 
  text-align: center; 
  text-decoration: none; 
  font-size: 1.2em; 
  line-height: 2; 
  transition: all .3s ease; 
  transform: skew(-60deg) rotate(-75deg) scale(1); 
  pointer-events: auto; 
} 

.csstransforms .cn-wrapper li a span { 
  position: relative; 
  top: 1.8em; 
  display: block; 
  font-size: .5em; 
  font-weight: 700; 
  text-transform: uppercase; 
} 

.csstransforms .cn-wrapper li a:hover, .csstransforms .cn-wrapper li a:active, .csstransforms .cn-wrapper li a:focus { 
  background: radial-gradient(transparent 35%, #449e6a 35%); 
}</pre>

	<p>
		نريد للعناصر في المثال الثاني أن تظهر بتأثير شبيه لحركة المروحة عندما نقوم بفتح القائمة (يمكنك الذهاب إلى المثال الثاني لترى ما الذي أقصده). 
	</p>

	<p>
		وللحصول على هذا التأثير فإننا قمنا بموضعة العناصر بنفس المكان وبنفس التمييل والتدوير بقيمة <span style="font-family:courier new,courier,monospace;">(rotate(76deg) skew(60deg</span>. 
	</p>

	<p>
		يمكننا باستعمال تأخيرات التنقل (transition delays) بأن نسمح للعناصر بأن تتمدد/تتفرق عن بعضها بعد أن يظهر الحاوي ويتمدد. وعندما نقوم بغلق القائمة فسوف ننتظر حتى تعود عناصر القائمة قبل أن نقوم بتقليص الحاوي وإخفائه. 
	</p>

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

	<pre class="css ipsCode prettyprint" data-pbcklang="css" data-pbcktabsize="4">
.csstransforms .opened-nav { 
  border-radius: 50%; 
  opacity: 1; 
  transition: all .3s ease; 
  transform: scale(1); 
  pointer-events: auto; 
} 

.csstransforms .opened-nav li { 
  transition: all .3s ease .3s; 
} 

.csstransforms .opened-nav li:first-child { 
  transform: rotate(-20deg) skew(60deg); 
} 

.csstransforms .opened-nav li:nth-child(2) { 
  transform: rotate(12deg) skew(60deg); 
} 

.csstransforms .opened-nav li:nth-child(3) { 
  transform: rotate(44deg) skew(60deg); 
} 

.csstransforms .opened-nav li:nth-child(4) { 
  transform: rotate(76deg) skew(60deg); 
} 

.csstransforms .opened-nav li:nth-child(5) { 
  transform: rotate(108deg) skew(60deg); 
} 

.csstransforms .opened-nav li:nth-child(6) { 
  transform: rotate(140deg) skew(60deg); 
} 

.csstransforms .opened-nav li:nth-child(7) { 
  transform: rotate(172deg) skew(60deg); 
}</pre>

	<p>
		وبالطبع سوف نوفر fallback بسيط للمتصفحات غير الداعمة:
	</p>

	<pre class="css ipsCode prettyprint" data-pbcklang="css" data-pbcktabsize="4">
.no-csstransforms .cn-wrapper{ 
  margin:10em auto; 
  overflow:hidden; 
  text-align:center; 
  padding:1em; 
} 

.no-csstransforms .cn-wrapper ul{ 
  display:inline-block; 
} 

.no-csstransforms li{ 
  font-size:1em; 
  width:5em; height:5em; 
  float:left; 
  line-height:5em; 
  text-align:center; 
  background-color: #fff; 
} 

.no-csstransforms li a{ 
  display:block; 
  height:100%; width:100%; 
  text-decoration: none; 
  color: inherit; 
} 

.no-csstransforms .cn-wrapper li a:hover, .no-csstransforms .cn-wrapper li a:active, .no-csstransforms .cn-wrapper li a:focus{ 
  background-color: #f8f8f8; 
} 

.no-csstransforms .cn-wrapper li.active a { 
  background-color: #6F325C; color: #fff; 
} 

.no-csstransforms .cn-button{ 
  display:none; 
}</pre>

	<p>
		وكذلك سوف نجعل القائمة متجاوبة وذلك بتقليصها للشاشات الصغيرة:
	</p>

	<pre class="css ipsCode prettyprint" data-pbcklang="css" data-pbcktabsize="4">
@media only screen and (max-width: 620px) { 
  .no-csstransforms li{ 
    width:4em; 
    height:4em; 
    line-height:4em; 
  } 
} 

@media only screen and (max-width: 500px) {
  .no-ccstransforms .cn-wrapper{ 
    padding:.5em; 
  } 
  .no-csstransforms .cn-wrapper li{ 
    font-size:.9em; 
    width:4em; 
    height:4em; 
    line-height:4em; 
  } 
} 

@media only screen and (max-width: 480px) {   
  .csstransforms .cn-wrapper{ 
    font-size: .68em; 
  } 
  .cn-button{ 
    font-size:1em; 
  } 
} 

@media only screen and (max-width:420px){   
  .no-csstransforms .cn-wrapper li{ 
    width:100%; height:3em; line-height:3em; 
  } 
}</pre>

	<p>
		هذا كان كل ما يخص تنسيقات CSS. دعونا الآن نرى ما الذي سوف نحتاج لعمله باستخدام الجافاسكربت.
	</p>
</div>

<div id="wmd-preview-section-31">
	<h2 id="بعض-الجافاسكربت">
		بعض الجافاسكربت
	</h2>

	<p>
		لن نستخدم أي إطار عمل للجافاسكربت هنا ولكننا سوف نستخدم <a href="https://github.com/desandro/classie" rel="external nofollow">Classie.js</a> لإضافة وإزالة الفئات (classes). وأما بالنسبة للمتصفحات التي لا تدعم <span style="font-family:courier new,courier,monospace;">addEventListener</span> و <span style="font-family:courier new,courier,monospace;">removeEventListener</span> فإننا سوف نستخدم <a href="https://github.com/jonathantneal/EventListener" rel="external nofollow">EventListener polyfill</a>. 
	</p>

	<p>
		سوف نقوم بإضافة مدير أحداث (event handler) إلى الزر بحيث يتم فتح/اغلاق القائمة عند النقر عليه أو استخدام زر tab في لوحة المفاتيح (أي عند حدوث focus على العنصر). نريد أيضًا فيالمثال الأول أن يتم اغلاق القائمة عند النقر على أي مكان خارج القائمة. 
	</p>

	<p>
		لنبدأ أولًا بالجافاسكربت الخاص بالمثال الأول:
	</p>

	<pre class="javascript ipsCode prettyprint" data-pbcklang="javascript" data-pbcktabsize="4">
(function(){ 
  var button = document.getElementById('cn-button'), 
  wrapper = document.getElementById('cn-wrapper'), 
  overlay = document.getElementById('cn-overlay'); 

  //open and close menu when the button is clicked 
  var open = false; 
  button.addEventListener('click', handler, false); 
  button.addEventListener('focus', handler, false); 
  wrapper.addEventListener('click', cnhandle, false);
 
  function cnhandle(e){ 
    e.stopPropagation(); 
  }
 
  function handler(e){ 
    if (!e) 
      var e = window.event; 
    e.stopPropagation();
    //so that it doesn't trigger click event on document 
    if(!open){ openNav(); } 
    else{ closeNav(); } 
  } 

  function openNav(){ 
    open = true; 
    button.innerHTML = "-"; 
    classie.add(overlay, 'on-overlay'); 
    classie.add(wrapper, 'opened-nav'); 
  } 

  function closeNav(){ 
    open = false; 
    button.innerHTML = "+"; 
    classie.remove(overlay, 'on-overlay'); 
    classie.remove(wrapper, 'opened-nav'); 
  } 

  document.addEventListener('click', closeNav); 
})();</pre>

	<p>
		الجافاسكربت الخاص ب المثال الثاني مشابه للأولى نوعًا ما ولكن مع وجود بعض الاختلافات:
	</p>

	<pre class="javascript ipsCode prettyprint" data-pbcklang="javascript" data-pbcktabsize="4">
(function(){ 
  var button = document.getElementById('cn-button'), 
  wrapper = document.getElementById('cn-wrapper'); 

  //open and close menu when the button is clicked 
  var open = false; 
  button.addEventListener('click', handler, false); 
  button.addEventListener('focus', handler, false); 

  function handler(){ 
    if(!open){ this.innerHTML = "Close"; classie.add(wrapper, 'opened-nav'); } 
    else{ this.innerHTML = "Menu"; classie.remove(wrapper, 'opened-nav'); } 
    open = !open; 
  } 

  function closeWrapper(){ 
    classie.remove(wrapper, 'opened-nav'); 
  } 
})();
</pre>
</div>

<div id="wmd-preview-section-34">
	<h2 id="خاتمة">
		خاتمة
	</h2>

	<p>
		هذا كان كل شيء فيما يتعلق بهذا الدرس، أتمنى أن تكون قد استفدت منه وتعلمت شيئًا جديدًا.
	</p>

	<p>
		ترجمة -وبتصرّف- للمقال <a href="http://tympanus.net/codrops/2013/08/09/building-a-circular-navigation-with-css-transforms/" rel="external nofollow">Building a Circular Navigation with CSS Transforms HTML/CSS</a> لصاحبته Sara Soueidan.
	</p>
</div>

<p><a href="https://academy.hsoub.com/uploads/monthly_2015_12/01.jpg.a2c4c49abc43ce9c9601732cbed82666.jpg" class="ipsAttachLink ipsAttachLink_image"><img data-fileid="9397" src="https://academy.hsoub.com/uploads/monthly_2015_12/01.thumb.jpg.2bee9850fa5eedfe443589eb4175a595.jpg" class="ipsImage ipsImage_thumbnailed" alt="01.jpg"></a></p>
<p><a href="https://academy.hsoub.com/uploads/monthly_2015_12/02.jpg.5a03594791fb9b7957b3a6914e1a6eb1.jpg" class="ipsAttachLink ipsAttachLink_image"><img data-fileid="9398" src="https://academy.hsoub.com/uploads/monthly_2015_12/02.thumb.jpg.eac0601f25797f75ea3ac6239bc17cda.jpg" class="ipsImage ipsImage_thumbnailed" alt="02.jpg"></a></p>
<p><a href="https://academy.hsoub.com/uploads/monthly_2015_12/03.jpg.8664a82e519616644e7e2b9b2a01302e.jpg" class="ipsAttachLink ipsAttachLink_image"><img data-fileid="9399" src="https://academy.hsoub.com/uploads/monthly_2015_12/03.thumb.jpg.8a53e242e6215206694b47a1a10da832.jpg" class="ipsImage ipsImage_thumbnailed" alt="03.jpg"></a></p>
<p><a href="https://academy.hsoub.com/uploads/monthly_2015_12/04.jpg.d50df141231cb3bfec506614b4a99582.jpg" class="ipsAttachLink ipsAttachLink_image"><img data-fileid="9400" src="https://academy.hsoub.com/uploads/monthly_2015_12/04.thumb.jpg.3a2fc1b553461170c78e744e8dc57ab4.jpg" class="ipsImage ipsImage_thumbnailed" alt="04.jpg"></a></p>
<p><a href="https://academy.hsoub.com/uploads/monthly_2015_12/05.jpg.190e9b7f6c45be6737dacfbbef6b72c0.jpg" class="ipsAttachLink ipsAttachLink_image"><img data-fileid="9401" src="https://academy.hsoub.com/uploads/monthly_2015_12/05.thumb.jpg.9d0fd9fda074dd9397d717ef9924f8cd.jpg" class="ipsImage ipsImage_thumbnailed" alt="05.jpg"></a></p>
<p><a href="https://academy.hsoub.com/uploads/monthly_2015_12/06.jpg.5d31b895bf78df3effa6ead3b003d8df.jpg" class="ipsAttachLink ipsAttachLink_image"><img data-fileid="9402" src="https://academy.hsoub.com/uploads/monthly_2015_12/06.thumb.jpg.2da9aa50821cefca0c078af36f269144.jpg" class="ipsImage ipsImage_thumbnailed" alt="06.jpg"></a></p>
<p><a href="https://academy.hsoub.com/uploads/monthly_2015_12/07.jpg.7d01b199ef4153db8a1ef4b248b53d0f.jpg" class="ipsAttachLink ipsAttachLink_image"><img data-fileid="9403" src="https://academy.hsoub.com/uploads/monthly_2015_12/07.thumb.jpg.6c7280c4cfab01cbce1bfbf103b8ba7d.jpg" class="ipsImage ipsImage_thumbnailed" alt="07.jpg"></a></p>
<p><a href="https://academy.hsoub.com/uploads/monthly_2015_12/08.jpg.ce571fa7e78378826f134f14b60a1b59.jpg" class="ipsAttachLink ipsAttachLink_image"><img data-fileid="9404" src="https://academy.hsoub.com/uploads/monthly_2015_12/08.thumb.jpg.f64cabf85feb0b102f1929e456ab172e.jpg" class="ipsImage ipsImage_thumbnailed" alt="08.jpg"></a></p>
<p><a href="https://academy.hsoub.com/uploads/monthly_2015_12/09.jpg.e944ff13f29dc0364bb5ce91fa539a01.jpg" class="ipsAttachLink ipsAttachLink_image"><img data-fileid="9405" src="https://academy.hsoub.com/uploads/monthly_2015_12/09.thumb.jpg.be441de89b55ec69b89f0684357ce6b1.jpg" class="ipsImage ipsImage_thumbnailed" alt="09.jpg"></a></p>]]></description><guid isPermaLink="false">214</guid><pubDate>Wed, 16 Dec 2015 20:42:00 +0000</pubDate></item><item><title>&#x62A;&#x62E;&#x637;&#x64A;&#x637; &#x635;&#x641;&#x62D;&#x627;&#x62A; &#x648;&#x64A;&#x628; &#x639;&#x644;&#x649; &#x634;&#x643;&#x644; &#x635;&#x641;&#x62D;&#x627;&#x62A; &#x643;&#x62A;&#x627;&#x628; &#x642;&#x627;&#x628;&#x644;&#x629; &#x644;&#x644;&#x62A;&#x642;&#x644;&#x64A;&#x628; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; CSS</title><link>https://academy.hsoub.com/programming/css/%D8%AA%D8%AE%D8%B7%D9%8A%D8%B7-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D9%88%D9%8A%D8%A8-%D8%B9%D9%84%D9%89-%D8%B4%D9%83%D9%84-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D9%83%D8%AA%D8%A7%D8%A8-%D9%82%D8%A7%D8%A8%D9%84%D8%A9-%D9%84%D9%84%D8%AA%D9%82%D9%84%D9%8A%D8%A8-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-css-r199/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_10/book-css.png.a1581f7b653bde893d99ecebb29d5230.png" /></p>

<p dir="rtl">كما هو موضح في العنوان فإنّك في هذا الدرس سوف تتعلم كيفية إنشاء تأثير وكأنّك تتصفح كتابًا ما. وسوف نستخدم في هذا الدرس إضافة تدعى <a rel="external nofollow" href="http://tympanus.net/codrops/2012/09/03/bookblock-a-content-flip-plugin/">BookBlock</a>، والفكرة من هذا الدرس هو أنّك سوف تقوم بإنشاء تأثير يُمكّن الزوار من تصفح موقع ما وكأنهم يتصفحون أحد الكتب.</p><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_10/book-css.png.56ccee25f433bbcf3d67f96f65a5398e.png"><img data-fileid="6208" class="ipsImage ipsImage_thumbnailed" alt="book-css.thumb.png.dc549fbf32e99c27b0d05" src="https://academy.hsoub.com/uploads/monthly_2015_10/book-css.thumb.png.dc549fbf32e99c27b0d05dc95e33ed40.png"></a></p><p dir="rtl">الفكرة هي أنّك سوف تتصفح صفحات الموقع باستخدام سهمين سوف يكونان موجودين في أعلى الصفحة أو أزرار لوحة المفاتيح أو حتى بالسحب باستخدام الفأرة وأيضًا سيكون هناك قائمة جانبية سوف تظهر عندما تقوم بالضغط على أيقونة ما. وسوف تحتوي القائمة الجانبية على روابط لصفحات الموقع وعندما تقوم بالضغط على أحد هذه الروابط فإنّها سوف تنقلك إلى الصفحة المطلوبة.</p><p dir="rtl">سوف نستخدم أيضًا إضافة اسمها <strong>jScrollPane </strong>وذلك للحصول على شريط تمرير (scrollbar) يظهر عندما يكون المحتوى أطول من ارتفاع المتصفح.</p><p dir="rtl">وهذه قائمة بإضافات jQuery التي سوف نستخدمها:</p><ol><li><a rel="external nofollow" href="http://tympanus.net/codrops/2012/09/03/bookblock-a-content-flip-plugin/">BookBlock</a></li><li><a rel="external nofollow" href="http://jquerypp.com/">Custom jQuery++</a></li><li><a rel="external nofollow" href="http://jscrollpane.kelvinluck.com/">jScrollPane</a></li><li><a rel="external nofollow" href="https://github.com/brandonaaron/jquery-mousewheel/">jQuery Mouse Wheel Plugin</a></li><li><a rel="external nofollow" href="http://modernizr.com/">Custom Mdernizer</a></li></ol><p>يمكنك معاينة المثال الموضح في هذا الدرس <a rel="external nofollow" href="http://tympanus.net/Tutorials/FullscreenBookBlock/">من هنا</a>.</p><p>كما يمكنك تحميل <a class="ipsAttachLink" href="https://academy.hsoub.com/applications/core/interface/file/attachment.php?id=6207">الملفات المصدرية</a>.</p><h2 dir="rtl">بنية ملف HTML</h2><p dir="rtl">في البداية يجب أن يكون لدينا حاوٍ رئيسي لاحتواء جميع العناصر، وداخل هذا الحاوي سوف يكون هناك عنصر <span style="font-family:courier new,courier,monospace;">&lt;div&gt;</span> للقائمة الجانبية وسوف نعطيه فئة (class) بالاسم "menu-panel" وسوف يكون هناك عنصر <span style="font-family:courier new,courier,monospace;">&lt;div&gt;</span> آخر يحتوي على المحتوى الرئيسي للموقع وسوف نعطيه فئة بالاسم "bb-custom-wrapper". وفي داخل كل قسم سوف يكون هناك حاوٍ للمحتوى وعنصر <span style="font-family:courier new,courier,monospace;">&lt;div&gt;</span> سوف نحتاجه من أجل شريط التمرير الذي ذكرناه سابقًا.</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">&lt;div id="container" class="container"&gt;
    &lt;div class="menu-panel"&gt;
        &lt;h3&gt;Table of Contents&lt;/h3&gt;
        &lt;ul id="menu-toc" class="menu-toc"&gt;
            &lt;li class="menu-toc-current"&gt;&lt;a href="#item1"&gt;Self-destruction&lt;/a&gt;&lt;/li&gt;
            &lt;li&gt;&lt;a href="#item2"&gt;Why we die&lt;/a&gt;&lt;/li&gt;
            &lt;li&gt;&lt;a href="#item3"&gt;The honeymoon&lt;/a&gt;&lt;/li&gt;
            &lt;li&gt;&lt;a href="#item4"&gt;A drawing joke&lt;/a&gt;&lt;/li&gt;
            &lt;li&gt;&lt;a href="#item5"&gt;Commencing practice&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
    &lt;/div&gt;

    &lt;div class="bb-custom-wrapper"&gt;
        &lt;div id="bb-bookblock" class="bb-bookblock"&gt;
            &lt;div class="bb-item" id="item1"&gt;
                &lt;div class="content"&gt;
                    &lt;div class="scroller"&gt;
                        &lt;h2&gt;Self-destruction&lt;/h2&gt;
                        &lt;p&gt;...&lt;/p&gt;
                    &lt;/div&gt;
                &lt;/div&gt;&lt;!-- /content --&gt;
            &lt;/div&gt;&lt;!-- /bb-item --&gt;

            &lt;div class="bb-item" id="item2"&gt;&lt;!-- ... --&gt;&lt;/div&gt;
            &lt;div class="bb-item" id="item3"&gt;&lt;!-- ... --&gt;&lt;/div&gt;
            &lt;div class="bb-item" id="item4"&gt;&lt;!-- ... --&gt;&lt;/div&gt;
            &lt;div class="bb-item" id="item5"&gt;&lt;!-- ... --&gt;&lt;/div&gt;
        &lt;/div&gt;&lt;!-- /bb-bookblock --&gt;

        &lt;nav&gt;
            &lt;a id="bb-nav-prev" href="#"&gt;←&lt;/a&gt;
            &lt;a id="bb-nav-next" href="#"&gt;→&lt;/a&gt;
        &lt;/nav&gt;

        &lt;span id="tblcontents" class="menu-button"&gt;Table of Contents&lt;/span&gt;
    &lt;/div&gt;&lt;!-- /bb-custom-wrapper --&gt;
&lt;/div&gt;&lt;!-- /container --&gt;</pre><p>سوف نقوم بربط عناصر القائمة الجانبية بصفحات الموقع (التي تحمل الفئة "bb-item)، وسوف نُضيف أيضًا سهمين في أعلى الصفحة من أجل التنقل بين الصفحات وزر يقوم بفتح وإغلاق القائمة الجانبية.</p><p dir="rtl">لنقم الآن بإضافة تنسيقات CSS.</p><h2 dir="rtl">تنسيقات CSS</h2><p dir="rtl">لن نتحدث هنا عن التنسيقات التي تأتي مع إضافة<strong> BookBlock</strong> لأنك سوف تجدها داخل ملف <span style="font-family:courier new,courier,monospace;">bookblock.css</span>، وإنّما سوف نُركّز على التنسيقات الأخرى المهمة.</p><p dir="rtl">لنبدأ التنسيقات بإضافة سطر يقوم بجلب الخط المسمى "Lato" من خدمة <a rel="external nofollow" href="http://www.google.com/webfonts">Google web fonts</a>:</p><pre data-pbcklang="javascript" data-pbcktabsize="4" class="javascript ipsCode prettyprint">@import url(http://fonts.googleapis.com/css?family=Lato:300,400,700);</pre><p>سوف نقوم بإعطاء الوسم <span style="font-family:courier new,courier,monospace;">&lt;html&gt;</span> الخاصية<span style="font-family:courier new,courier,monospace;"> height: 100% </span>وذلك لأننا سوف نحتاج أن نجعل بعض العناصر تتمدد على ارتفاع المتصفح كاملًا:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">html {
    height: 100%;
}</pre><p>سوف نستخدم أيضًا الخاصية <span style="font-family:courier new,courier,monospace;">box-sizing: border-box</span> وذلك حتى نستخدم قيم مئوية لكل من العرض والإرتفاع أثناء استخدام <span style="font-family:courier new,courier,monospace;">padding</span> دون القلق حول أبعاد العناصر والقيام بعمليات حسابية نحن بغنىً عنها:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">*,
*:after,
*:before {
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
    padding: 0;
    margin: 0;
}</pre><p>لنقم الآن بتعريف الخط الذي سوف نستخدمه في الموقع (العنصر body) ونُعطيه ارتفاع بقيمة 100% (تذكّر أننا نريد ارتفاع بهذه القيمة لأنه سوف يكون هناك عناصر تتموضع بشكل مطلق (absolute positioning) وسوف تحتاج أن تتمدد على ارتفاع المتصفح كاملًا):</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">body {
    font-family: 'Lato', Calibri, Arial, sans-serif;
    font-weight: 400;
    font-size: 100%;
    color: #333;
    height: 100%;
}</pre><p>سوف نستعمل أيضًا إضافة Modernizr وسوف نُضيف الفئة "no-js" إلى وسم <span style="font-family:courier new,courier,monospace;">&lt;html&gt;</span>، فإذا كانت الجافاسكربت مفعّلة فإنّ Modernizr سوف يستبدل تلك الفئة بالفئة "js". وهذا سوف يساعدنا على إعطاء خصائص CSS معينة لبعض العناصر التي لا نريدها إذا كانت الجافاسكربت معطّلة.</p><p dir="rtl">لاحظ أيضًا أننا نحتاج أن يكون عرض الصفحة وارتفاعها بقيمة 100% فقط إذا كانت الجافاسكربت مفعّلة وعندها فقط نريد من العنصر body أن يكون له خاصية <span style="font-family:courier new,courier,monospace;">overflow: hidden</span>:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.js body {
    overflow: hidden;
}</pre><p>وهذه بعض التنسيقات الخاصة بالروابط:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">a {
    color: #555;
    text-decoration: none;
}

a:hover {
    color: #000;
}</pre><p>نريد من الحاوي الرئيسي أن يكون بعرض وارتفاع المتصفح كاملًا، وسوف نقوم بموضعة القائمة الجانبية خارج هذا الحاوي باستعمال الخاصية <span style="font-family:courier new,courier,monospace;">left</span> وإعطائها قيمة سالبة تكون بنفس قيمة العرض الخاص بالقائمة الجانبية. والفكرة هي أنّه عند النقر على أيقونة القائمة الجانبية فإنّ الحاوي سوف يتحرك إلى اليمين مما يؤدي إلى ظهور القائمة الجانبية.</p><p dir="rtl">دعونا إذًا نقوم بإعطاء الحاوي الرئيسي عرضًا وارتفاعًا بقيمة 100% وأن نُضيف الخاصية <span style="font-family:courier new,courier,monospace;">transition</span> إلى الحاوي <span style="font-family:courier new,courier,monospace;">container</span>:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.container,
.bb-custom-wrapper,
.bb-bookblock {
    width: 100%;
    height: 100%;
}

.container {
    position: relative;
    left: 0px;
    transition: left 0.3s ease-in-out;
}</pre><p>عند النقر على أيقونة القائمة الجانبية فإن فئة (class) أخرى سوف يتم إضافتها إلى الحاوي <span style="font-family:courier new,courier,monospace;">container</span> والتي سوف تحتوي على الخاصية <span style="font-family:courier new,courier,monospace;">left: 240px </span>(نفس العرض الخاص بالقائمة الجانبية) وبالتالي فإنّ الصفحة كاملة سوف تتحرك إلى اليمين بمقدار 240px وبالتالي ظهور القائمة الجانبية:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.slideRight {
    left: 240px;
}</pre><p>ولكن بدون الجافاسكربت لن نكون قادرين على القيام بما سبق لذلك سوف نقوم بإضافة الخاصية <span style="font-family:courier new,courier,monospace;">padding-left: 240px</span>:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.no-js .container {
    padding-left: 240px;
}</pre><p>ونريد أن تكون القائمة الجانبية ثابتة في الجانب الأيسر بشكل افتراضي:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.menu-panel {
    background: #f1103a;
    width: 240px;
    height: 100%;
    position: fixed;
    z-index: 1000;
    top: 0;
    left: 0;
    text-shadow: 0 1px 1px rgba(0,0,0,0.1);
}</pre><p>وإذا كانت الجافاسكربت مفعلة فسوف نقوم بموضعة القائمة الجانبية بشكل مطلق وإلى اليسار بقيمة -240px:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.js .menu-panel {
    position: absolute;
    left: -240px;
}</pre><p>وهذه هي التنسيقات الخاصة بعناصر القائمة الجانبية:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.menu-panel h3 {
    font-size: 1.8em;
    padding: 20px;
    font-weight: 300;
    color: #fff;
    box-shadow: inset 0 -1px 0 rgba(0,0,0,0.05);
}

.menu-toc {
    list-style: none;
}

.menu-toc li a {
    display: block;
    color: #fff;
    font-size: 1.1em;
    line-height: 3.5;
    padding: 0 20px;
    cursor: pointer;
    background: #f1103a;
    border-bottom: 1px solid #dd1338;
}

.menu-toc li a:hover,
.menu-toc li.menu-toc-current a{
    background: #dd1338;
}</pre><p>وأمّا بالنسبة للقائمة الرئيسية التي سوف تحتوي على السهمين فإننا سوف نقوم بموضعتها بشكل مطلق وفوق جميع العناصر الأخرى:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.bb-custom-wrapper nav {
    top: 20px;
    left: 60px;
    position: absolute;
    z-index: 1000;
}</pre><p>كما أنّ روابط السهمين وزر القائمة الجانبية سوف يتموضعان بشكل مطلق (<span style="font-family:courier new,courier,monospace;">position: absolute</span>) وسوف نعطيها الخاصية <span style="font-family:courier new,courier,monospace;">border-radius: 50% </span>لنجعلها تظهر كالدائرة:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.bb-custom-wrapper nav span,
.menu-button {
    position: absolute;
    width: 32px;
    height: 32px;
    top: 0;
    left: 0;
    background: #f1103a;
    border-radius: 50%;
    color: #fff;
    line-height: 30px;
    text-align: center;
    speak: none;
    font-weight: bold;
    cursor: pointer;
}

.bb-custom-wrapper nav span:last-child {
    left: 40px;
}

.bb-custom-wrapper nav span:hover,
.menu-button:hover {
    background: #000;
}</pre><p>سوف يكون الزر الذي يفتح ويغلق القائمة الجانبية موجودًا في أعلى يسار الصفحة وسوف نقوم بإخفاء النص الموجود بداخله (نريد أن تظهر الأيقونة فقط):</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.menu-button {
    z-index: 1000;
    left: 20px;
    top: 20px;
    text-indent: -9000px;
}</pre><p>لنقم الآن بإنشاء أيقونة بسيطة بدون استعمال أي صور وذلك باستعمال العنصر الزائف<strong> :after</strong> واستعمال الخاصية <span style="font-family:courier new,courier,monospace;">box-shadow </span>والتي سوف تعمل على إنشاء الخطين العلوي والسفلي للأيقونة:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.menu-button:after {
    position: absolute;
    content: '';
    width: 50%;
    height: 2px;
    background: #fff;
    top: 50%;
    margin-top: -1px;
    left: 25%;
    box-shadow: 0 -4px #fff, 0 4px #fff;
}</pre><p>وفي حالة كان الجافاسكربت معطلًا فإننا نريد أن نخفي هذه العناصر:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.no-js .bb-custom-wrapper nav span,
.no-js .menu-button {
    display: none;
}</pre><p>لننتقل الآن إلى تنسيق الأجزاء الداخلية لكل قسم من أقسام الصفحة (<span style="font-family:courier new,courier,monospace;">bb-item</span>). نريد أن يتم موضعة المحتوى (<span style="font-family:courier new,courier,monospace;">content</span>) بشكل مطلق ونريد ان نستعمل الخاصية <span style="font-family:courier new,courier,monospace;">overflow: hidden</span>، وهذا مهم لأننا نريد تطبيق شريط التمرير هنا ونريد أن نفعل ذلك فقط عند قلب/تغيير الصفحة. فإذا لم نستخدم الخاصية <span style="font-family:courier new,courier,monospace;">overflow: hidden</span> فإنّك سوف ترى المحتوى يتداخل ببعضه. وأعيد وأكرر مرة أخرى بأنّ هذا سوف يحدث فقط إذا كان الجافاسكربت مفعلًا ولذلك سوف نستخدم الفئة "js":</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.js .content {
    position: absolute;
    top: 60px;
    left: 0;
    bottom: 50px;
    width: 100%;
    overflow: hidden;
}</pre><p>العنصر <span style="font-family:courier new,courier,monospace;">&lt;div class="scroller"&gt;</span> هو الذي سوف ينمو مع المحتوى لذلك سوف نعطيه الخاصية <span style="font-family:courier new,courier,monospace;">padding</span>:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.scroller {
    padding: 10px 5% 10px 5%;
}</pre><p>لاحظ أننا استعملنا قيم مئوية للجوانب وذلك حتى نجعل الصفحة تتجاوب مع حجم الشاشة.</p><p dir="rtl">دعونا نتخلص من الحواف الحادة عندما نقوم بالتمرير (scroll) وذلك باستخدام العناصر الزائفة إلى أعلى وأسفل عنصر المحتوى مع استخدام تدرج بين اللون الأبيض والشّفّاف:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.js .content:before,
.js .content:after {
    content: '';
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 20px;
    z-index: 100;
    pointer-events: none;
    background:
        linear-gradient(
            to bottom,
            rgba(255,255,255,1) 0%,
            rgba(255,255,255,0) 100%
        );
}

.js .content:after {
    top: auto;
    bottom: 0;
    background:
        linear-gradient(
            to top,
            rgba(255,255,255,1) 0%,
            rgba(255,255,255,0) 100%
        );
}</pre><p>هذا سوف يجعل النص يظهر بشكل باهت.</p><p dir="rtl">لنقم الآن بتنسيق عناصر النصوص:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.content h2 {
    font-weight: 300;
    font-size: 4em;
    padding: 0 0 10px;
    color: #333;
    margin: 0 1% 40px;
    text-align: left;
    box-shadow: 0 10px 0 rgba(0,0,0,0.02);
    text-shadow: 0 0 2px #fff;
}

.no-js .content h2 {
    padding: 40px 1% 20px;
}

.content p {
    font-size: 1.2em;
    line-height: 1.6;
    font-weight: 300;
    padding: 5px 8%;
    text-align: justify;
}</pre><p>كل ما تبقى علينا الآن من تنسيقات CSS هو استخدام الـmedia queries. فإذا كانت الجافاسكربت معطلة فإننا لا نريد أن تظهر القائمة الجانبية إذا كان العرض أقل من 800px. كان هذا فقط مثالًا بسيطًا على كيفية التحكم بالعناصر تحت ظروف وشروط معينة.</p><p dir="rtl">الـmedia query الأخيرة سوف تعمل على تكبير الخط قليلًا من أجل الأجهزة صغيرة الحجم كالهواتف.</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">@media screen and (max-width: 800px){
    .no-js .menu-panel {
         display: none;
    }

    .no-js .container {
        padding: 0;
    }
}

@media screen and (max-width: 400px){
    .menu-panel,
    .content {
         font-size: 75%;
    }
}</pre><p>كان هذا كل ما يتعلق بتنسيقات CSS ويتبقى علينا استخدام بعض الجافاسكربت.</p><h2 dir="rtl">بعض الجافاسكربت</h2><p dir="rtl">سوف نبدأ اولًا بتخزين (caching) بعض العناصر حتى لا نضطر إلى استدعائها في كل مرة وسوف نقوم أيضًا بتهئية/مناداة إضافة <strong>BookBlock</strong>. نُريد أيضًا أن نقوم بضبط بعض الأمور بعد كل قلب/تغيير للصفحة وهذه الأمور هي رقم الصفحة الحالية والسلوك الخاص بإضافة <strong>jScrollPane</strong>. وهذا محدد في الاستدعاء الخلفي (callback) المسمى <span style="font-family:courier new,courier,monospace;">onEndFlip</span> والممرر إلى إضافة BookBlock.</p><pre data-pbcklang="javascript" data-pbcktabsize="4" class="javascript ipsCode prettyprint">var $container = $( '#container' ),

// the element we will apply the BookBlock plugin to
$bookBlock = $( '#bb-bookblock' ),

// the BookBlock items (bb-item)
$items = $bookBlock.children(),

// index of the current item
current = 0,

// initialize the BookBlock
bb = $( '#bb-bookblock' ).bookblock( {
    speed : 800,
    perspective : 2000,
    shadowSides : 0.8,
    shadowFlip : 0.4,
    // after each flip...
    onEndFlip : function(old, page, isLimit) {
         // update the current value
         current = page;
         
         // update the selected item of the table of contents (TOC)
         updateTOC();

         // show and/or hide the navigation arrows
         updateNavigation( isLimit );

         // initialize the jScrollPane on the content div for the new item
         setJSP( 'init' );

         // destroy jScrollPane on the content div for the old item
         setJSP( 'destroy', old );
    }
} ),

// the navigation arrows
$navNext = $( '#bb-nav-next' ),
$navPrev = $( '#bb-nav-prev' ).hide(),

// the table of content items
$menuItems = $container.find( 'ul.menu-toc &gt; li' ),

// button to open the TOC
$tblcontents = $( '#tblcontents' ),

transEndEventNames = {
    'WebkitTransition': 'webkitTransitionEnd',
    'MozTransition': 'transitionend',
    'OTransition': 'oTransitionEnd',
    'msTransition': 'MSTransitionEnd',
    'transition': 'transitionend'
},

// transition event name
transEndEventName = transEndEventNames[Modernizr.prefixed('transition')],

// check if transitions are supported
supportTransitions = Modernizr.csstransitions;</pre><p>لنقم أولًا بربط الأحداث ببعض العناصر التي تم تهيئتها سابقًا، كما أننا نريد أن نقوم بتهيئة <strong>jScrollPane</strong> لأول عنصر (العنصر الحالي).</p><pre data-pbcklang="javascript" data-pbcktabsize="4" class="javascript ipsCode prettyprint">function init() {
    // initialize jScrollPane on the content div of the first item
    setJSP( 'init' );
    initEvents();
}</pre><p>بما أننا سوف نقوم بتهيئة وإعادة تهيئة وتدمير <strong>jScrollPane</strong> فلنقم بتعريف دالة لذلك:</p><pre data-pbcklang="javascript" data-pbcktabsize="4" class="javascript ipsCode prettyprint">function setJSP( action, idx ) {
    var idx = idx === undefined ? current : idx,
    $content = $items.eq( idx ).children( 'div.content' ),
    apiJSP = $content.data( 'jsp' );

    if( action === 'init' &amp;&amp; apiJSP === undefined ) {
        $content.jScrollPane({verticalGutter : 0, hideFocus : true });
    }
    else if( action === 'reinit' &amp;&amp; apiJSP !== undefined ) {
        apiJSP.reinitialise();
    }
    else if( action === 'destroy' &amp;&amp; apiJSP !== undefined ) {
        apiJSP.destroy();
    }
}</pre><p>سوف نحتاج إلى ربط العديد من الأحداث كالتالي:</p><ol dir="rtl"><li>سوف يتم استدعاء الدالتين <span style="font-family:courier new,courier,monospace;">()next</span> و<span style="font-family:courier new,courier,monospace;">()prev</span> الخاصتين بإضافة BookBlock وذلك عند النقر على أزرار التنقل أو السحب باستخدام الفأرة.</li><li>سوف يظهر جدول المحتويات أو يختفي عند النقر على زر القائمة (<span style="font-family:courier new,courier,monospace;">tblcontents$</span>).</li><li>سوف يتم استدعاء الدالة <span style="font-family:courier new,courier,monospace;">()jump</span> الخاصة بإضافة BookBlock وذلك عند النقر على أي عنصر من عناصر جدول المحتويات.</li><li>سوف يتم تهيئة jScrollPane عند القيام بتغيير حجم النافذة (window resize).</li></ol><pre data-pbcklang="javascript" data-pbcktabsize="4" class="javascript ipsCode prettyprint">function initEvents() {
    // add navigation events
    $navNext.on( 'click', function() {
        bb.next();
        return false;
    } );

    $navPrev.on( 'click', function() {
        bb.prev();
        return false;
    } );

    // add swipe events
    $items.on( {
        'swipeleft' : function( event ) {
             if( $container.data( 'opened' ) ) {
                 return false;
             }
             bb.next();
             return false;
         },

        'swiperight' : function( event ) {
            if( $container.data( 'opened' ) ) {
                return false;
            }
            bb.prev();
            return false;
        }
    } );

    // show TOC
    $tblcontents.on( 'click', toggleTOC );

    // click a menu item
    $menuItems.on( 'click', function() {
        var $el = $( this ),
        idx = $el.index(),
        jump = function() {
            bb.jump( idx + 1 );
        };
        current !== idx ? closeTOC( jump ) : closeTOC();
        return false;
    } );

    // reinit jScrollPane on window resize
    $( window ).on( 'debouncedresize', function() {
        // reinitialise jScrollPane on the content div
        setJSP( 'reinit' );
    } );
}
</pre><p dir="rtl">ظهور أزرار التنقل من عدمه سوف يعتمد على الصفحة الحالية، فإذا كُنّا في الصفحة الأولى فإننا سوف نرى فقط زر "التالي" وإذا كُنّا في الصفحة الأخيرة فإننا سوف نرى فقط زر "السابق":</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">function updateNavigation( isLastPage ) {
    if( current === 0 ) {
        $navNext.show();
        $navPrev.hide();
    }
    else if( isLastPage ) {
        $navNext.hide();
        $navPrev.show();
    }
    else {
        $navNext.show();
        $navPrev.show();
    }
}</pre><p>عندما نفتح جدول المحتويات (القائمة الجانبية) فإننا نريد أن تختفي عناصر التنقل وأن تظهر مرة أخرى عندما نقوم بإغلاق القائمة الجانبية.</p><p dir="rtl">سوف نقوم بتحريك القائمة الجانبية باستخدام خاصية <span style="font-family:courier new,courier,monospace;">transition</span>، وإذا لم تكن هذه الخاصية مدعومة من المتصفح فإننا سوف نستخدم <span style="font-family:courier new,courier,monospace;">fallback</span> بسيط:</p><pre data-pbcklang="javascript" data-pbcktabsize="4" class="javascript ipsCode prettyprint">function toggleTOC() {
    var opened = $container.data( 'opened' );
    opened ? closeTOC() : openTOC();
}

function openTOC() {
    $navNext.hide();
    $navPrev.hide();
    $container.addClass( 'slideRight' ).data( 'opened', true );
}

function closeTOC( callback ) {
    $navNext.show();
    $navPrev.show();
    $container.removeClass( 'slideRight' ).data( 'opened', false );
    if( callback ) {
        if( supportTransitions ) {
            $container.on( transEndEventName, function() {
                 $( this ).off( transEndEventName );
                 callback.call();
            } );
        }
        else {
            callback.call();
        }
    }
}
</pre><h2 dir="rtl">خاتمة</h2><p dir="rtl">هذا كان كل شيء يخص هذا الدرس أتمنى أن يكون قد أعجبك وأن تكون قد وجدته مفيدًا.</p><p dir="rtl">ترجمة -وبتصرّف- للدرس <a rel="external nofollow" href="http://tympanus.net/codrops/2012/12/11/fullscreen-pageflip-layout">Fullscreen Pageflip Layout</a> لصاحبته Mary Lou.</p>
]]></description><guid isPermaLink="false">199</guid><pubDate>Wed, 21 Oct 2015 17:52:00 +0000</pubDate></item><item><title>&#x625;&#x646;&#x634;&#x627;&#x621; &#x646;&#x638;&#x627;&#x645; &#x634;&#x628;&#x643;&#x64A; &#x645;&#x631;&#x646; &#x648;&#x642;&#x648;&#x64A; &#x641;&#x64A; CSS</title><link>https://academy.hsoub.com/programming/css/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D9%86%D8%B8%D8%A7%D9%85-%D8%B4%D8%A8%D9%83%D9%8A-%D9%85%D8%B1%D9%86-%D9%88%D9%82%D9%88%D9%8A-%D9%81%D9%8A-css-r197/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_10/grid.png.5cfcadac920b8124df3789f3fe0a818b.png" /></p>

<p dir="rtl">منذ بدء استخدامنا لمفهوم التصميم المتجاوب في سير العمل الخاص بنا، ظهرت العديد من الأدوات كمحاولة لتسهيل عملنا وتسهيل تصميم المواقع المتجاوبة.</p><p dir="rtl" style="text-align: center;"><a href="https://academy.hsoub.com/uploads/monthly_2015_10/grid.png.fd9fb25045a7258052bf718cd61e50b4.png" class="ipsAttachLink ipsAttachLink_image"><img data-fileid="6132" src="https://academy.hsoub.com/uploads/monthly_2015_10/grid.thumb.png.0a0b59edbcd8c8482a5578b68596b8b5.png" class="ipsImage ipsImage_thumbnailed" alt="grid.thumb.png.0a0b59edbcd8c8482a5578b68"></a></p><p dir="rtl">ولكن مع ذلك فإنّه من الصعب عليك اختيار الأدوات المناسبة والتي سوف تفيدك حقًا في تطوير مشاريعك.</p><p dir="rtl">وفي هذا المقال سوف أتحدث عن بعض الطرق التي طوّرتها لإنشاء نظام شبكي (grid) مرن وسلس يسمح بالتضمين (nesting) كما يعطيك الحرية الكاملة حول كيفية تصرّف هذا النظام الشبكي في كافة الأبعاد.</p><p dir="rtl">كل هذا سوف يتم بمساعدة من مولّد النظام الشبكي المسمى <a rel="external nofollow" href="http://gridpak.com/">Gridpak</a>.</p><h2 dir="rtl">الأمور التي سوف نتمكن من فعلها</h2><p dir="rtl">عندما ننتهي من هذا الدرس سوف يكون لدينا نظام شبكي يمكنه فعل بعض مما يظهر في هذه <a rel="external nofollow" href="http://jsfiddle.net/mousepotatoweb/n6UKP/light/">المعاينة</a>.</p><p dir="rtl">ويمكن استخدامه في تنظيم تخطيط الصفحات كما في هذه <a rel="external nofollow" href="http://jsfiddle.net/Qvh7y/99/">المعاينة</a>.</p><h2 dir="rtl">متطلبات ما قبل البدء</h2><p dir="rtl">قبل أن نبدأ بمعرفة كيفية إنشاء هذا النظام الشبكي دعونا أولًا نقوم بتحديد ما نتوقعه من هذا النظام.</p><p dir="rtl">هذه بعض النقاط التي أرى أنها مهمة عند استعمال أي نظام شبكي:</p><ul dir="rtl"><li>الأعمدة دقيقة ويمكن توقعها لجميع أبعاد الأجهزة.</li><li>التنسيقات والتوصيف (markup) يجب أن يكون بسيطًا وسهل الاستخدام.</li><li>لا يعتمد على جهاز معين أو أبعاد معينة وأن يكون مرن بشكل كامل.</li><li>قابل للتضمين (nestable) لأي عمق.</li><li>مكون من وحدات (modular) وله سيطرة كاملة على الأعمدة في جميع الأبعاد.</li><li>يجب أن يعمل من دون الحاجة لـ polyfill في المتصفحات القديمة.</li></ul><p dir="rtl">بالنسبة للنقطة الأخيرة، فكثير من المطورين يحبون استعمال <a rel="external nofollow" href="https://github.com/scottjehl/Respond">respond.js</a> لاستخدام ودعم الـmedia query في المتصفحات القديمة.</p><p dir="rtl">الجيد في الأمر أنّ المتصفحات القديمة لا تتطلب أن يتم دعمها في أي جهاز سوى أجهزة سطح المكتب وأجهزة الحاسوب المحمول. لذلك سوف أقوم بتوضيح كيفية تحديد هذه المتصفحات وحفظ طلب http واحد.</p><h2 dir="rtl">التنصيب</h2><h3 dir="rtl">1. وسم<span style="font-family:courier new,courier,monospace;"> &lt;html&gt;</span> ودعم تراجعي (fallback) لمتصفح IE</h3><p dir="rtl">سوف نحتاج في البداية إلى التأكد بأنّنا نستطيع تحديد المتصفحات القديمة وجعل تنسيقات CSS تعمل عليها. هذه الطريقة تم استيحاؤها من <a rel="external nofollow" href="http://html5boilerplate.com/">html5 boilerplate</a> وتم توضيحها في <a rel="external nofollow" href="http://paulirish.com/2008/conditional-stylesheets-vs-css-hacks-answer-neither/">هذه المقالة</a>.</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">&lt;!doctype html&gt;

&lt;!--[if IE 8]&gt; &lt;html class="no-js ie8 oldie" lang="en"&gt; &lt;![endif]--&gt;

&lt;!--[if IE 9]&gt; &lt;html class="no-js ie9 oldie" lang="en"&gt; &lt;![endif]--&gt;

&lt;!--[if gt IE 9]&gt;&lt;!--&gt; &lt;html class="no-js" lang="en"&gt; &lt;!--&lt;![endif]--&gt;</pre><p>كل ما تفعله الشيفرة البرمجية في الأعلى هو إضافة فئة (class) إلى وسم<span style="font-family:courier new,courier,monospace;"> &lt;html&gt;</span> بناءً على المتصفح الذي يستخدمه الزائر. في هذا المقال سوف نقوم فقط بدعم متصفحات Internet Explorer بدءًا من الإصدار الثامن.</p><p dir="rtl">وبهذا يمكننا أن نقوم بتحديد الإصدارات القديمة من متصفح Internet Explorer بالشكل التالي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">/* target only IE8 with the following class */

.ie8 .my-class { ... }
</pre><h3 dir="rtl">2. التنسيقات الأساسية ووحدة Rem</h3><p dir="rtl">إذا كنت لا تستخدم الوحدة rem في تطوير المواقع فإنني أنصحك بالقيام بذلك في أقرب وقت، فهي وحدة رائعة خصوصًا فيما يتعلق بأحجام الخطوط (font sizing). وهذه الوحدة رائعة لأنها وحدة نسبية ولكنها نسبية فقط إلى تعريف واحد وهو التعريف الذي يوضع في وسم <span style="font-family:courier new,courier,monospace;">&lt;html&gt;</span>. وهذا يعني أنّ جميع الحسابات المعقدة التي تنتج عن استخدام الوحدة em سوف تختفي.</p><p dir="rtl">أنظر إلى الشيفرة البرمجية التالية:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">html {
    ...
    font-size: 100%;
    ...
}

body {
    ...
    /* base font size: 16px (user agent dependant, but usually 16px) */
    font-size: 1em;
    ...
}

...

.padding {
    /* IE8 fallback */
    padding: 32px;
    padding: 2rem; /* 2 * 16px = 32px */
}
</pre><p>بما أنّ متصفح IE8 لا يدعم وحدة rem فإننا نحتاج إلى استخدام وحدة px أيضًا.</p><p dir="rtl">وسوف أريك لاحقًا كيف يمكن أن تساعدنا هذه الوحدة في تسهيل عملنا عند إنشاء الأنظمة الشبكية.</p><h3 dir="rtl">3. الحصول على Gridpak</h3><p dir="rtl">إذهب إلى موقع <a rel="external nofollow" href="http://gridpak.com/">gridpak.com</a> وحاول التلاعب بالخيارات حتى تحصل على ما يريحك.</p><p dir="rtl">بالنسبة لي سوف أقوم بتحميل نظام شبكي بهذه الخيارات ولكن لك الحرية في اختيار ما تريده:</p><ul dir="rtl"><li>الأبعاد: 480px، 640px، 960px وأعلى.</li><li>12 عمود في جميع الأبعاد (12 عمود في الهواتف والأجهزة اللوحية وأجهزة سطح المكتب).</li><li>padding بقيمة تساوي صفر.</li><li>تباعد بين الأعمدة بقيمة (24px (24px gutter. يسمح لك Gridpak بأن تقوم بإنشاء gutters محددة لكل بعد من الأبعاد، ولكننا لن نقوم بذلك حتى تبقى الأمور بسيطة.</li></ul><p dir="rtl">حاول أن تكون قيم الـpadding والـgutters قيم ناتجة عن حسابات ضرب بسيطة بالنسبة لحجم الخط في الـ body. سوف يساعد هذا على تقليل القيم العشرية لأنّ المتصفحات تتعامل مع القيم العشرية بطريقة مختلفة وحتى نُبقي كل شيء أجمل.</p><p dir="rtl">فعلى سبيل المثال لو كان الخط الأساسي هو 16px فإنّ التباعد بين الأعمدة يمكن أن يكون أحد القيم التالية:</p><ul dir="rtl"><li>8px (وهذه القيمة ناتجة عن ضرب 16 في 0.5).</li><li>12px (وهذه القيمة ناتجة عن ضرب 16 في 0.75).</li><li>24px (وهذه القيمة ناتجة عن ضرب 16 في 1.5).</li><li>32px (وهذه القيمة ناتجة عن ضرب 16 في 2).</li></ul><p dir="rtl">بعد أن تقوم بتحديد جميع الخيارات قم بتحميل النظام الشبكي.</p><h3 dir="rtl">4. تفصيل الـ Gridpak</h3><p dir="rtl">من أفضل خصائص Gridpak هو أنّك سوف تحصل على نظام شبكي دقيق ومتين فقط بعدة سطور من CSS، فقوة Gridpak تأتي من استعمال الخاصية<span style="font-family:courier new,courier,monospace;"> box-sizing: border-box</span> على جميع عناصر الموقع. ففي حالة استعمال <span style="font-family:courier new,courier,monospace;">border-box</span> فإننا سوف نتمكن من الحصول على عمودين كل واحد منهما بعرض 50% وسوف يبقيان بجانب بعضهما وسوف تتمكن أيضًا من استيعاب أي قيمة border نعطيها له.</p><p dir="rtl">ومع تطبيق بعض تنسيقات CSS يمكننا أن نُعطي الـgutters حواف (borders) شفافة مما يمنحنا أعمدة دقيقة ومناسبة:</p><blockquote class="ipsQuote" data-cite="اقتباس" data-ipsquote=""><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.row {
    /*
    * Rows contain columns
    *
    * Pull only the left hand side of our rows 24px left (our gutter width)
    * to allow for the border magic that happens in .col below
    */
    margin-left: -24px;
}

.col {
    /*
    * Create a gutter using a transparent border at the specified gutter width.
    * This pushes our content back the distance the row pulled us left, while
    * allowing border-box calculations to be used.
    */
    border: 0px solid rgba(0,0,0,0);
    border-left-width: 24px;
    float: left;
    /*
    * Include the border in the calculation of the column width
    */
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
    /*
    * Ensure that backgrounds set on columns begin just inside the border, not underneath
    */
    -webkit-background-clip: padding-box !important;
    -moz-background-clip: padding-box !important;
    background-clip: padding-box !important;
}
</pre></blockquote><p>وفوق كل هذا فإنّ Gridpak يقوم بوضع كل نظام شبكي لكل بُعد داخل media query خاص به:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">/*
* Declare a grid between 0 and 479px only
*/

@media screen and (min-width: 0px) and (max-width: 479px) {
    ...
    .span_1 { width:8.33333333333%;}
    .span_2 { width:16.6666666667%;}
    .span_3 { width:25.0%;}
    .span_4 { width:33.3333333333%;}
    .span_5 { width:41.6666666667%;}
    .span_6 { width:50.0%;}
    .span_7 { width:58.3333333333%;}
    .span_8 { width:66.6666666667%;}
    .span_9 { width:75.0%;}
    .span_10 { width:83.3333333333%;}
    .span_11 { width:91.6666666667%;}
    .span_12 {
        margin-left:0;
        width:100%;
    }
}

/*
* Declare a grid between 480px and 639px only
*/

@media screen and (min-width: 480px) and (max-width: 639px) {
    ...
}

/* etc. */
...</pre><p>إذا كان علينا أن نحدد عدد مختلف من الأعمدة لكل بُعد عندما نقوم باختيار الخيارات الخاصة بـGridpak (لنقل أنها عمودين للهواتف وأربعة للأجهزة اللوحية و12 لأجهزة سطح المكتب) فإنّ تعريفات media query سوف تمنحنا مرونة وسيطرة أكبر على الأعمدة بدل أن نقوم بجعل الهواتف والأجهزة اللوحية تأخذ عمود واحد فقط كما هو الحال في معظم الأنظمة الشبكية الأخرى.</p><p dir="rtl">فعلى سبيل المثال يمكن لفئة (class) واحدة أن تجعل أحد الأعمدة يحتل العرض الكامل لصف ما (row) أو نصف العرض أو حتى سُدُسَ (1/6) العرض وذلك بناءً على بُعد المتصفح.</p><p dir="rtl">كل هذا جيد ولكن هناك شيء ما وهو أننا نريد هذه الأعمدة أن تفعل ما أريده في جميع الأبعاد.</p><h3 dir="rtl">5. تطويع Gridpak كما نريد</h3><h4 dir="rtl"><strong>استعمال وحدة rem لتسهيل عملية الصيانة</strong></h4><p dir="rtl">دعونا في البداية نقوم بأخذ أساس الـGridpak ونُعطيه إضافة حديثة (مع دعم المتصفحات القديمة):</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.row {
    margin-left: -24px;
    margin-left: -1.5rem;
}

/* Reusable column setup */
.col {
    border: 0px solid transparent;
    border-left-width: 24px;
    border-left-width: 1.5rem;
    float: left;
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
    -webkit-background-clip: padding-box !important;
    -moz-background-clip: padding-box !important;
    background-clip: padding-box !important;
}</pre><p>إذا أردنا في المستقبل أن نزيل دعم المتصفح IE8 فيمكننا بكل سهولة فعل ذلك عن طريق إزالة القيم ذات الوحدة px (أي أن نُزيل الخاصية <span style="font-family:courier new,courier,monospace;">margin-left: -24px</span> و<span style="font-family:courier new,courier,monospace;">border-left-width: 24px</span>).</p><h4 dir="rtl"><strong>تكبير وتتابع النظام الشبكي</strong></h4><p dir="rtl">نريد أيضًا أن نتأكد بأنّ تخطيط الصفحة لا يصبح سيء عندما يقوم الزائر بتكبير محتوى الموقع. يمكنك قراءة هذا المقال حول استخدام الوحدات المتناسبة مع تعريفات الـmedia query.</p><p dir="rtl">بطبيعة الحال فإنّ استخدام وحدة الـpixel في تعريفات الـmedia query لا يبدو وكأنّه يعمل بشكل جيد عندما يقوم الزائر بتكبير المحتوى لذلك سوف نستعمل وحدة em.</p><p dir="rtl">زيادة على ذلك، فإنّ الـmedia queries تستخدم حجم الخط الأساسي المُعرّف في المتصفح (user agent font size)، وهذا يعني أننا -وبشكل عام- سوف نستخدم حجم الخط 16px في حساباتنا.</p><p dir="rtl">دعونا نتخلّص من استعمال max-width في الـmedia query حتى نستغل قوة التتابع/التعاقب (cascade):</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">/*
* Declare a grid which will be effective from 0px
*/

@media screen and (min-width: 0) {
    ...
}

/*
* Declare a grid which will be effective from 480px
* 480 / 16 = 30em
*/

@media screen and (min-width: 30em) {
    ...
}

/*
* Declare a grid which will be effective from 640px
* 640 / 16 = 40em
*/

@media screen and (min-width: 40em) {
    ...
}

...</pre><p>علاوة على إصلاح مشاكل التكبير، فإنّ هذا الأمر يسمح لعرض الأعمدة المُعرّفة داخل أبعاد أكبر بأن تقوم بإلغاء (override) تلك المعرفة لأبعاد أصغر.</p><h4 dir="rtl"><strong>تسمية الأعمدة الخاصة ببُعد معين</strong></h4><p dir="rtl">حتى نتمكن من السيطرة على الأعمدة في جميع الأبعاد بشكل أفضل فإننا سوف نحتاج إلى إعطائها أسماء فريدة حتى يحدث إلغاء للتنسيقات فقط إذا أردنا نحن ذلك. حتى أنّ متصفح IE8 سوف يحصل على تعريفات خاصة به.</p><p dir="rtl">سوف أقوم بإضافة اسم في نهاية كل <span style="font-family:courier new,courier,monospace;">span</span> لتحديد الأبعاد التي يعمل بها:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">/*
* IE8 grid
* This grid will only work in IE8, and at all widths
*/

.ie8 .span_1_ie8 { ... }
.ie8 .span_2_ie8 { ... }
...
.ie8 .span_1_ie8 { ... }

/*
* VIEWPORT ALPHA
* Declare a grid which will be effective from 0px
*/

@media screen and (min-width: 0) {
    ...
    .span_1_vpalpha { ... }
    .span_2_vpalpha { ... }
    ...
    .span_1_vpalpha { ... }
}

/*
* VIEWPORT BETA
* Declare a grid which will be effective from 480px
* 480 / 16 = 30em
*/

@media screen and (min-width: 20em) {
    ...
    .span_1_vpbeta { ... }
    .span_2_vpbeta { ... }
    ...
    .span_1_vpbeta { ... }
}

/*
* VIEWPORT GAMMA
* Declare a grid which will be effective from 640px
* 640 / 16 = 40em
*/

...</pre><p>لنبدأ الآن باستعمال النظام الشبكي.</p><h2 dir="rtl">استعمال النظام الشبكي</h2><p dir="rtl">إنّ استعمال Gridpak لهو أمر في غاية السهولة، فجميع الأعمدة يجب أن تكون موجودة داخل عنصر حاوي وهذا العنصر يجب أن يملك فئة clearfix وهذ هو كل ما تحتاج معرفته.</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">&lt;!--
    create a row with 2 columns and the following features:
    mobile -&gt; 3 spans + 9 spans
    tablet -&gt; 6 spans + 6 spans
    desktop -&gt; 4 spans + 8 spans
    IE8 -&gt; 4 spans + 8 spans
--&gt;

&lt;div class="row cf"&gt;
    &lt;div class="col span_3_vpalpha span_6_vpbeta span_4_vpgamma span_4_ie8"&gt;
        content...
    &lt;/div&gt;

    &lt;div class="col span_9_vpalpha span_6_vpbeta span_8_vpgamma span_8_ie8"&gt;
        content...
    &lt;/div&gt;
&lt;/div&gt;</pre><p>تضمين الأعمدة يتبع نفس النمط:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">&lt;!--
     create a row with 2 columns spanning half the width for all viewports.
     Have both columns then contain 2 columns each, both spanning half the width of the parent column.
--&gt;

&lt;div class="row cf"&gt;
    &lt;div class="col span_6_vpalpha span_6_ie8"&gt;
        &lt;div class="row cf"&gt;
            &lt;div class="col span_6_vpalpha span_6_ie8"&gt;
                content...
            &lt;/div&gt;
            &lt;div class="col span_6_vpalpha span_6_ie8"&gt;
                content...
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="col span_6_vpalpha span_6_ie8"&gt;
        &lt;div class="row cf"&gt;
            &lt;div class="col span_6_vpalpha span_6_ie8"&gt;
                content...
            &lt;/div&gt;
            &lt;div class="col span_6_vpalpha span_6_ie8"&gt;
                content...
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;</pre><p>قد تقول في نفسك أنّ هناك العديد من الفئات التي يلزم استخدامها، وقد يكون ذلك صحيحًا ولكني متأكد أنّك لن تجد نظام شبكي بهذه المرونة فقط باستعمال بعض الفئات.</p><h2 dir="rtl">خاتمة</h2><p dir="rtl">لقد كانت رحلة طويلة احتوت على العديد من الأمور والأفكار المفيدة، وأتمنى أن تكون قد استفدت من هذا الدرس.</p><p dir="rtl">ترجمة -وبتصرّف- للمقال <a rel="external nofollow" href="http://tympanus.net/codrops/2013/02/04/creating-nestable-dynamic-grids/">Creating Nestable Dynamic Grids</a> لصاحبه Larry Botha.</p>
]]></description><guid isPermaLink="false">197</guid><pubDate>Mon, 19 Oct 2015 20:56:32 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x625;&#x646;&#x634;&#x627;&#x621; &#x645;&#x631;&#x628;&#x639; &#x628;&#x62D;&#x62B; &#x64A;&#x638;&#x647;&#x631; &#x639;&#x646;&#x62F; &#x627;&#x644;&#x646;&#x642;&#x631; &#x639;&#x644;&#x649; &#x623;&#x64A;&#x642;&#x648;&#x646;&#x629; &#x628;&#x62D;&#x62B; &#x641;&#x64A; CSS</title><link>https://academy.hsoub.com/programming/css/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D9%85%D8%B1%D8%A8%D8%B9-%D8%A8%D8%AD%D8%AB-%D9%8A%D8%B8%D9%87%D8%B1-%D8%B9%D9%86%D8%AF-%D8%A7%D9%84%D9%86%D9%82%D8%B1-%D8%B9%D9%84%D9%89-%D8%A3%D9%8A%D9%82%D9%88%D9%86%D8%A9-%D8%A8%D8%AD%D8%AB-%D9%81%D9%8A-css-r194/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_10/searchbar.png.2d9c6c5f85df8623e1137cc8abe275b1.png" /></p>
<p dir="rtl">
	يُعتبر مربع البحث أحد المكونات التي لا غنى عنها في أي موقع، وفي هذا الدرس سوف تتعلم كيف يمكنك إنشاء مربع بحث يظهر ويختفي عند النقر عليه. قد تعتقد أنّ القيام بذلك سيكون سهلًا جدًا ولكنك سوف ترى أنّ الأمر ليس كذلك، فسوف نحتاج إلى تطبيق بعض الخدع حتى نجعل كل شيء يعمل بشكل صحيح.
</p>

<p dir="rtl" style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_10/searchbar.png.4a24aa2b8212f40797c7a7d190bd1359.png" data-fileid="5972" data-fileext="png" rel=""><img alt="searchbar.thumb.png.2100c93e4eaf5f935067" class="ipsImage ipsImage_thumbnailed" data-fileid="5972" src="https://academy.hsoub.com/uploads/monthly_2015_10/searchbar.thumb.png.2100c93e4eaf5f9350672f96922cfefb.png"></a>
</p>

<p dir="rtl">
	هذه هي المتطلبات التي نريدها مبدئيًا:
</p>

<ul dir="rtl">
	<li>
		ما نريده مبدئيًا هو ظهور زر يحتوي على أيقونة بحث.
	</li>
	<li>
		عند النقر على ذلك الزر نريد أن يظهر مربع البحث.
	</li>
	<li>
		نريده أن يكون متجاوبًا مع جميع الأجهزة.
	</li>
	<li>
		عند كتابة أي شيء في مربع البحث نريد أن يقوم المربع بالقيام بالبحث فور النقر على مفتاح الدخول (enter) من لوحة المفاتيح أو النقر على الأيقونة نفسها.
	</li>
	<li>
		إذا كان مربع البحث ظاهرًا ولكنه كان فارغًا فإننا نريده أن يختفي عند النقر على أيقونة البحث (أي أننا إذا قمنا بالنقر على أيقونة البحث وكان المربع فارغًا فإننا لا نريده أن يقوم بالبحث وإنما يقوم بإخفاء مربع البحث).
	</li>
	<li>
		نريد أيضًا أن يختفي مربع البحث عند النقر خارجه سواء كان فارغًا أم لا.
	</li>
	<li>
		لو كانت الجافاسكربت معطلة لدى المستخدم فإننا نريد لمربع البحث أن يكون ظاهرًا (أي دون الحاجة إلى النقر على أيقونة البحث).
	</li>
	<li>
		نريد أيضًا أن ندعم الأجهزة التي تعمل باللمس.
	</li>
</ul>

<p dir="rtl">
	يمكنك معاينة <a href="http://tympanus.net/Tutorials/ExpandingSearchBar/" rel="external nofollow">النتيجة النهائية</a> لهذا الدرس.
</p>

<p dir="rtl">
	بما أننا بتنا الآن نعرف ما نريد فلنقم بذلك.
</p>

<h2 dir="rtl">
	بنية ملف HTML
</h2>

<p dir="rtl">
	كل ما نحتاجه من وسوم HTML هو حاوٍ رئيسي (main container) وسوف يكون عبارة عن وسم <span style="font-family:courier new,courier,monospace;">&lt;div&gt;</span> وسوف نحتاج إلى وسم <span style="font-family:courier new,courier,monospace;">&lt;form&gt;</span> وإلى حقلي إدخال (inputs)؛ واحد من نوع "text" والآخر من نوع "submit" وأخيرًا سوف نحتاج إلى وسم<span style="font-family:courier new,courier,monospace;"> &lt;span&gt;</span> ليحتوي على أيقونة البحث:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">&lt;div id="sb-search" class="sb-search"&gt;
    &lt;form&gt;
        &lt;input class="sb-search-input" placeholder="Enter your search term..." type="search" value="" name="search" id="search"&gt;
        &lt;input class="sb-search-submit" type="submit" value=""&gt;
        &lt;span class="sb-icon-search"&gt;&lt;/span&gt;
    &lt;/form&gt;
&lt;/div&gt;</pre>

<p>
	لنبدأ الآن بتنسيق العناصر باستخدام CSS.
</p>

<h2 dir="rtl">
	تنسيقات CSS
</h2>

<p dir="rtl">
	بناءً على المتطلبات التي ذكرناها سابقًا فإنه يجب في البداية أن يكون لدينا زر يحتوي على أيقونة بحث وباقي العناصر يجب أن تكون مخفية. دعونا الآن نتخيل ما الذي سيحصل عند تمدد مربع البحث وجعله ظاهرًا (الذي هو نفسه سيكون الحاوي الرئيسي الذي ذكرناه سابقًا). كيف نقوم بذلك؟ سوف نستخدم الخاصية<span style="font-family:courier new,courier,monospace;"> overflow: hidden</span> وتكبير العرض الخاص بالعنصر الحاوي (sb-search) يجب أن يقوم بإظهار حقل البحث.
</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">
		<img alt="دورة تطوير واجهات المستخدم" src="https://academy.hsoub.com/learn/assets/images/courses/front-end-web-development.png">
	</div>
</div>

<p dir="rtl">
	إذًا أول شيء نقوم به هو تنسيق العنصر الحاوي (sb-search) بحيث سوف نجعله يطوف إلى اليمين باستخدام الخاصية <span style="font-family:courier new,courier,monospace;">float: right</span> ونعطيه الخاصية <span style="font-family:courier new,courier,monospace;">overflow: hidden</span>، والعرض يجب أن يكون 60px ولكن بما أننا نريد أن يزيد العرض إلى 100% فإننا سنواجه بعض المشاكل في متصفحات iOS فهي لا تقبل التغيير من عرض يعتمد على الـpixels إلى عرض يعتمد على النسب المئوية. لذلك سوف نقوم بتعريف خاصية<span style="font-family:courier new,courier,monospace;"> min-width</span> بالقيمة 60px وخاصية width بقيمة 0%. يمكنك قراءة المزيد عن هذا الحل العبقري من خلال <a href="http://front-back.com/css-transition-from-a-fixed-px-width-to-an-auto-width" rel="external nofollow">هذا الرابط</a>.
</p>

<p dir="rtl">
	سوف نستعمل أيضًا الخاصية <span style="font-family:courier new,courier,monospace;">transition</span> والخاصية <span style="font-family:courier new,courier,monospace;">webkit-backface-visibility: hidden-</span> لتلافي بعض الآثار للحقول في متصفحات الهواتف iOS:
</p>

<pre class="css ipsCode prettyprint" data-pbcklang="css" data-pbcktabsize="4">.sb-search {
    position: relative;
    margin-top: 10px;
    width: 0%;
    min-width: 60px;
    height: 60px;
    float: right;
    overflow: hidden;
    -webkit-transition: width 0.3s;
    -moz-transition: width 0.3s;
    transition: width 0.3s;
    -webkit-backface-visibility: hidden;
}</pre>

<p>
	أي شيء يتجاوز/يفيض عن هذا المربع الصغير لن يكون ظاهرًا.
</p>

<p dir="rtl">
	لنقم الآن بموضعة حقل البحث. سوف نستعمل قيمة مئوية بالنسبة للعرض حتى نسمح للحقل بأن يتمدد مع تمدد العنصر الحاوي. ومع إضافة الارتفاع (<span style="font-family:courier new,courier,monospace;">height</span>) وحجم الخط (<span style="font-family:courier new,courier,monospace;">font-size</span>) والـ<span style="font-family:courier new,courier,monospace;">padding</span> المناسبة يمكننا توسيط النص داخل العنصر (استعملنا <span style="font-family:courier new,courier,monospace;">padding</span> بدل <span style="font-family:courier new,courier,monospace;">line-height</span> لأن الخاصية <span style="font-family:courier new,courier,monospace;">line-height</span> لا تعمل بشكل جيد في متصفح IE8).
</p>

<p dir="rtl">
	قد يبدو استعمالنا للخاصية <span style="font-family:courier new,courier,monospace;">position: absolute</span> غير ضروري، ولكن استعمالها يقوم بحل مشكلة تظهر عند إغلاق مربع البحث بحيث يبدو الحقل وكأنه ظاهر في الجانب الأيمن لفترة قصيرة جدًا.
</p>

<pre class="css ipsCode prettyprint" data-pbcklang="css" data-pbcktabsize="4">.sb-search-input {
    position: absolute;
    top: 0;
    right: 0;
    border: none;
    outline: none;
    background: #fff;
    width: 100%;
    height: 60px;
    margin: 0;
    z-index: 10;
    padding: 20px 65px 20px 20px;
    font-family: inherit;
    font-size: 20px;
    color: #2c3e50;
}

input[type="search"].sb-search-input {
    -webkit-appearance: none;
    -webkit-border-radius: 0px;
}</pre>

<p>
	قمنا أيضًا بإزالة التنسيقات الإفتراضية لحقل البحث في متصفحات WebKit.
</p>

<p dir="rtl">
	دعونا نقوم الآن بتعريف لون الخط بالنسبة للـplaceholder (الـplaceholder هو نص يظهر داخل حقل البحث قبل أن يقوم المستخدم بكتابة أي شيء بداخله حتى يُعطي المستخدم لمحة عما يجب عليه كتابته في ذلك الحقل):
</p>

<pre class="css ipsCode prettyprint" data-pbcklang="css" data-pbcktabsize="4">.sb-search-input::-webkit-input-placeholder {
    color: #efb480;
}

.sb-search-input:-moz-placeholder {
    color: #efb480;
}

.sb-search-input::-moz-placeholder {
    color: #efb480;
}

.sb-search-input:-ms-input-placeholder {
    color: #efb480;
}</pre>

<p>
	دعونا الآن نقوم بتنسيق زر أيقونة البحث وحقل التأكيد/الإرسال (submit input)، فنحن نريدهما أن يظهرا في نفس المكان لذلك يجب أن نضعهما في الجانب الأيمن ونعطيهما نفس الأبعاد. وبما أنهما سيظهران فوق بعضهما فسوف نعطيهما الخاصية <span style="font-family:courier new,courier,monospace;">position: absolute</span>:
</p>

<pre class="css ipsCode prettyprint" data-pbcklang="css" data-pbcktabsize="4">.sb-icon-search,
.sb-search-submit {
    width: 60px;
    height: 60px;
    display: block;
    position: absolute;
    right: 0;
    top: 0;
    padding: 0;
    margin: 0;
    line-height: 60px;
    text-align: center;
    cursor: pointer;
}</pre>

<p>
	نريد في بداية الأمر أن تكون الأيقونة قابلة للنقر، وعند فتح حقل البحث فإننا نريد لحقل التأكيد/الإرسال (submit input) أن يكون قابلًا للنقر. لذلك سوف نُعطي حقل التأكيد الخاصية<span style="font-family:courier new,courier,monospace;"> z-index: -1</span> ونجعله شفافًا/مخفيًا حتى يمكننا رؤية أيقونة البحث:
</p>

<pre class="css ipsCode prettyprint" data-pbcklang="css" data-pbcktabsize="4">.sb-search-submit {
    background: #fff; /* IE needs this */
    -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; /* IE 8 */
     filter: alpha(opacity=0); /* IE 5-7 */

    opacity: 0;
    color: transparent;
    border: none;
    outline: none;
    z-index: -1;
}</pre>

<p>
	لاحظ أننا لم نقم بجعل الخلفية شفافة وذلك لأن الأمر لا يعمل بشكل جيد في متصفح IE فالعنصر لا يكون قابلًا للنقر عند ذلك، لذلك قمنا باستعمال لون معين (الأبيض) وجعلنا الشفافية (<span style="font-family:courier new,courier,monospace;">opacity</span>) تساوي صفر.
</p>

<p dir="rtl">
	وبما أننا نريد لأيقونة البحث أن تظهر فوق كل شيء فإننا سوف نقوم بإعطائها الخاصية <span style="font-family:courier new,courier,monospace;">z-index</span> بقيمة عالية، وسوف نقوم باستخدام الفئة الزائفة <span style="font-family:courier new,courier,monospace;">::before</span> لإضافة الأيقونة:
</p>

<pre class="css ipsCode prettyprint" data-pbcklang="css" data-pbcktabsize="4">.sb-icon-search {
    color: #fff;
    background: #e67e22;
    z-index: 90;
    font-size: 22px;
    font-family: 'icomoon';
    speak: none;
    font-style: normal;
    font-weight: normal;
    font-variant: normal;
    text-transform: none;
    -webkit-font-smoothing: antialiased;
}

.sb-icon-search:before {
    content: "\e000";
}</pre>

<p>
	ودعونا لا ننسى إضافة خط الويب (web font) في بداية ملف الـCSS:
</p>

<pre class="css ipsCode prettyprint" data-pbcklang="css" data-pbcktabsize="4">/* Search icon by IcoMoon, made with http://icomoon.io/app/ */

@font-face {
    font-family: 'icomoon';
    src:url('../fonts/icomoon/icomoon.eot');
    src:url('../fonts/icomoon/icomoon.eot?#iefix') format('embedded-opentype'),
    url('../fonts/icomoon/icomoon.woff') format('woff'),
    url('../fonts/icomoon/icomoon.ttf') format('truetype'),
    url('../fonts/icomoon/icomoon.svg#icomoon') format('svg');
    font-weight: normal;
    font-style: normal;
}</pre>

<p>
	يمكننا الآن إعطاء العنصر الحاوي (sb-search) عرضًا بقيمة 100% وذلك في حالتين؛ الأولى عند النقر على أيقونة البحث وذلك عن طريق إضافة فئة (class) بالاسم "sb-search-open" باستخدام الجافاسكربت والثانية عندما لا يكون الجافاسكربت مفعّلًا لدى المستخدم:
</p>

<pre class="css ipsCode prettyprint" data-pbcklang="css" data-pbcktabsize="4">.sb-search.sb-search-open,
.no-js .sb-search {
    width: 100%;
}</pre>

<p>
	لنقم الآن بتغيير لون الخط الخاص بعنصر أيقونة البحث ونضعه أسفل حقل التأكيد/الإرسال وذلك عن طريق إعطائه قيمة<span style="font-family:courier new,courier,monospace;"> z-index</span> أقل من 90 (وهي القيمة التي أعطيناها للعنصر "sb-icon-search"):
</p>

<pre class="css ipsCode prettyprint" data-pbcklang="css" data-pbcktabsize="4">.sb-search.sb-search-open .sb-icon-search,
.no-js .sb-search .sb-icon-search {
    background: #da6d0d;
    color: #fff;
    z-index: 11;
}</pre>

<p>
	وأخيرًا لنقم بإضافة الخاصية <span style="font-family:courier new,courier,monospace;">z-index</span> لحقل التأكيد/الإرسال ولكن بقيمة أكبر من 11 حتى يمكننا النقر عليها:
</p>

<pre class="css ipsCode prettyprint" data-pbcklang="css" data-pbcktabsize="4">.sb-search.sb-search-open .sb-search-submit,
.no-js .sb-search .sb-search-submit {
    z-index: 90;
}</pre>

<p>
	انتهينا الآن من تنسيقات CSS وبقي علينا الجافاسكربت.
</p>

<h2 dir="rtl">
	بعض الجافاسكربت
</h2>

<p dir="rtl">
	لنبدأ بإضافة وإزالة الفئة "sb-search-open". بحيث سوف يتم إضافة الفئة عند النقر على الحاوي الرئيسي (sb-search) وإزالته عند النقر على حقل التأكيد/الإرسال ولكن فقط إذا كان حقل البحث فارغًا، أمّا إذا لم يكن فارغًا فإننا نريد تأكيد عملية البحث. وحتى لا نقوم بإزالة الفئة عند النقر على الحقل (لأن الحاوي بأكمله قابل للنقر) فإننا نحتاج إلى منع حدث النقر (click event) من الانتشار على ذلك العنصر. هذا يعني أنّ النقر على الحقل لن يؤدي إلى إثارة حدث النقر على العناصر الحاوية له.
</p>

<pre class="javascript ipsCode prettyprint" data-pbcklang="javascript" data-pbcktabsize="4">;( function( window ) {
    function UISearch( el, options ) {
        this.el = el;
        this.inputEl = el.querySelector( 'form &gt; input.sb-search-input' );
        this._initEvents();
    }

    UISearch.prototype = {
        _initEvents : function() {
            var self = this,
            initSearchFn = function( ev ) {
                if( !classie.has( self.el, 'sb-search-open' ) ) { 
                    ev.preventDefault();
                    self.open();
                }
                else if( classie.has( self.el, 'sb-search-open' ) &amp;&amp; /^\s*$/.test( self.inputEl.value ) ) {
                    self.close();
                }
            }
            this.el.addEventListener( 'click', initSearchFn );
            this.inputEl.addEventListener( 'click', function( ev ) { ev.stopPropagation(); });
        },

        open : function() {
            classie.add( this.el, 'sb-search-open' );
        },

        close : function() {
            classie.remove( this.el, 'sb-search-open' );
        }
    }
 
    window.UISearch = UISearch;

} )( window );</pre>

<p>
	سوف نحتاج أيضًا إلى إضافة الأحداث التي تقوم بإزالة الفئة "sb-search-open" عند النقر خارج مربع البحث، وحتى يعمل ذلك فإننا نريد أن نتعامل مع انتشار الأحداث (event bubbling) عند النقر على الحاوي الرئيسي.
</p>

<pre class="javascript ipsCode prettyprint" data-pbcklang="javascript" data-pbcktabsize="4">;( function( window ) {
    function UISearch( el, options ) {
        this.el = el;
        this.inputEl = el.querySelector( 'form &gt; input.sb-search-input' );
        this._initEvents();
    }

    UISearch.prototype = {
        _initEvents : function() {
            var self = this,
            initSearchFn = function( ev ) {
                ev.stopPropagation();
                if( !classie.has( self.el, 'sb-search-open' ) ) { 
                    ev.preventDefault();
                    self.open();
                }
                else if( classie.has( self.el, 'sb-search-open' ) &amp;&amp; /^\s*$/.test( self.inputEl.value ) ) {
                    self.close();
                }
            }
            this.el.addEventListener( 'click', initSearchFn );
            this.inputEl.addEventListener( 'click', function( ev ) { ev.stopPropagation(); });
        },

        open : function() {
            var self = this;
            classie.add( this.el, 'sb-search-open' );
            // close the search input if body is clicked
            var bodyFn = function( ev ) {
                self.close();
                this.removeEventListener( 'click', bodyFn );
            };
            document.addEventListener( 'click', bodyFn );
        },

        close : function() {
            classie.remove( this.el, 'sb-search-open' );
        }
    }

    window.UISearch = UISearch;

} )( window );</pre>

<p>
	وشيء آخر علينا الاهتمام به وهو قصّ مصطلح البحث.
</p>

<p dir="rtl">
	عندما نقوم أيضًا بالنقر على أيقونة البحث فإننا نريد أن يكون الحقل مفعّلًا (focused)، ولأنّ هذا يسبب بعض المشاكل في متصفح iOS (لوحة المفاتيح تظهر في نفس الوقت) فإننا نريد تلافي ذلك في هذه الحالة، وعندما يتم إغلاق مربع البحث فإننا نريد أن يكون مربع البحث غير مفعل (blur). هذا سوف يحل بعض المشاكل في بعض الأجهزة التي تُظهر بأنّ المؤشر يومض حتى بعد أن يكون الحقل مغلقًا.
</p>

<p dir="rtl">
	<strong>ملاحظة جانبية</strong>: كلمة focus تدل على أنّ مربع البحث مفعّل (أي أنّ المؤشر بداخله) وكلمة blur تدل على عكس ذلك.
</p>

<pre class="javascript ipsCode prettyprint" data-pbcklang="javascript" data-pbcktabsize="4">;( function( window ) {
    // http://stackoverflow.com/a/11381730/989439
    function mobilecheck() {
        var check = false;
        (function(a){if(/(android|ipad|playbook|silk|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4)))check = true})(navigator.userAgent||navigator.vendor||window.opera);

        return check;
    }

    // http://www.jonathantneal.com/blog/polyfills-and-prototypes/
    !String.prototype.trim &amp;&amp; (String.prototype.trim = function() {
         return this.replace(/^\s+|\s+$/g, '');
     });

    function UISearch( el, options ) {
        this.el = el;
        this.inputEl = el.querySelector( 'form &gt; input.sb-search-input' );
        this._initEvents();
    }

    UISearch.prototype = {
        _initEvents : function() {
            var self = this,
            initSearchFn = function( ev ) {
                ev.stopPropagation();
                // trim its value
                self.inputEl.value = self.inputEl.value.trim();
                if( !classie.has( self.el, 'sb-search-open' ) ) {
                    ev.preventDefault();
                    self.open();
                }
                else if( classie.has( self.el, 'sb-search-open' ) &amp;&amp; /^\s*$/.test( self.inputEl.value ) ) {
                    self.close();
                }
            }

            this.el.addEventListener( 'click', initSearchFn );
            this.inputEl.addEventListener( 'click', function( ev ) { ev.stopPropagation(); });
        },

        open : function() {
            var self = this;
            classie.add( this.el, 'sb-search-open' );
            // focus the input
            if( !mobilecheck() ) {
                this.inputEl.focus();
            }

            // close the search input if body is clicked
            var bodyFn = function( ev ) {
                self.close();
                this.removeEventListener( 'click', bodyFn );
            };
            document.addEventListener( 'click', bodyFn );
        },

        close : function() {
            this.inputEl.blur();
            classie.remove( this.el, 'sb-search-open' );
        }
    }

    window.UISearch = UISearch;

} )( window );</pre>

<p>
	وحتى يعمل كل شيء بشكل سلس في أجهزة الهواتف فإننا سوف نحتاج إلى إضافة أحداث اللمس (touch events). كما أنّ إضافة preventDefault في دالّة initSearchFn سوف يمنع حدث النقر واللمس من أن يتفعّلا مع بعضهما في أجهزة اللمس.
</p>

<pre class="javascript ipsCode prettyprint" data-pbcklang="javascript" data-pbcktabsize="4">;( function( window ) {
    // http://stackoverflow.com/a/11381730/989439
    function mobilecheck() {
        var check = false;
        (function(a){if(/(android|ipad|playbook|silk|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4)))check = true})(navigator.userAgent||navigator.vendor||window.opera);
        return check;
    }

    // http://www.jonathantneal.com/blog/polyfills-and-prototypes/
    !String.prototype.trim &amp;&amp; (String.prototype.trim = function() {
         return this.replace(/^\s+|\s+$/g, '');
     });

    function UISearch( el, options ) {
        this.el = el;
        this.inputEl = el.querySelector( 'form &gt; input.sb-search-input' );
        this._initEvents();
    }

    UISearch.prototype = {
        _initEvents : function() {
            var self = this,
            initSearchFn = function( ev ) {
                ev.stopPropagation();
                // trim its value
                self.inputEl.value = self.inputEl.value.trim();
                if( !classie.has( self.el, 'sb-search-open' ) ) {
                    ev.preventDefault();
                    self.open();
                }
                else if( classie.has( self.el, 'sb-search-open' ) &amp;&amp; /^\s*$/.test( self.inputEl.value ) ) {
                    ev.preventDefault();
                    self.close();
                }
            }

            this.el.addEventListener( 'click', initSearchFn );
            this.el.addEventListener( 'touchstart', initSearchFn );
            this.inputEl.addEventListener( 'click', function( ev ) { ev.stopPropagation(); });
            this.inputEl.addEventListener( 'touchstart', function( ev ) { ev.stopPropagation(); } );
        },

        open : function() {
            var self = this;
            classie.add( this.el, 'sb-search-open' );
            // focus the input
            if( !mobilecheck() ) {
                this.inputEl.focus();
            }
            // close the search input if body is clicked
            var bodyFn = function( ev ) {
                self.close();
                this.removeEventListener( 'click', bodyFn );
                this.removeEventListener( 'touchstart', bodyFn );
            };
            document.addEventListener( 'click', bodyFn );
            document.addEventListener( 'touchstart', bodyFn );
        },

        close : function() {
            this.inputEl.blur();
            classie.remove( this.el, 'sb-search-open' );
        }
    }

    window.UISearch = UISearch;

} )( window );</pre>

<p dir="rtl">
	وأخيرًا، للأجهزة التي لا تدعم addEventListener وremoveEventListener فإننا سوف نستعمل <a href="http://github.com/jonathantneal/EventListener" rel="external nofollow">polyfill</a>.
</p>

<pre class="javascript ipsCode prettyprint" data-pbcklang="javascript" data-pbcktabsize="4">// EventListener | @jon_neal | //github.com/jonathantneal/EventListener

!window.addEventListener &amp;&amp; window.Element &amp;&amp; (function () {
    function addToPrototype(name, method) {
         Window.prototype[name] = HTMLDocument.prototype[name] = Element.prototype[name] = method;
    }

    var registry = [];

    addToPrototype("addEventListener", function (type, listener) {
        var target = this;
        registry.unshift({
            __listener: function (event) {
                event.currentTarget = target;
                event.pageX = event.clientX + document.documentElement.scrollLeft;
                event.pageY = event.clientY + document.documentElement.scrollTop;
                event.preventDefault = function () { event.returnValue = false };
                event.relatedTarget = event.fromElement || null;
                event.stopPropagation = function () { event.cancelBubble = true };
                event.relatedTarget = event.fromElement || null;
                event.target = event.srcElement || target;
                event.timeStamp = +new Date;
                listener.call(target, event);
            },

            listener: listener,
            target: target,
            type: type
        });

        this.attachEvent("on" + type, registry[0].__listener);
    });

    addToPrototype("removeEventListener", function (type, listener) {
        for (var index = 0, length = registry.length; index &lt; length; ++index) {
            if (registry[index].target == this &amp;&amp; registry[index].type == type &amp;&amp; registry[index].listener == listener) {
                return this.detachEvent("on" + type, registry.splice(index, 1)[0].__listener);
            }
        }
    });

    addToPrototype("dispatchEvent", function (eventObject) {
        try {
            return this.fireEvent("on" + eventObject.type, eventObject);
        } catch (error) {
            for (var index = 0, length = registry.length; index &lt; length; ++index) {
                if (registry[index].target == this &amp;&amp; registry[index].type == eventObject.type) {
                     registry[index].call(this, eventObject);
                }
            }
        }
    });

})();</pre>

<h2 dir="rtl">
	خاتمة
</h2>

<p dir="rtl">
	هذا كان كل شيء فيما يخص هذا الدرس، أتمنى أن تكون قد استفدت منه وتعلمت منه شيئًا جديدًا.
</p>

<p dir="rtl">
	ترجمة -وبتصرّف- للمقال <a href="http://tympanus.net/codrops/2013/06/26/expanding-search-bar-deconstructed/" rel="external nofollow">Expanding Search Bar Deconstructed</a> لصاحبته Mary Lou.
</p>
]]></description><guid isPermaLink="false">194</guid><pubDate>Fri, 16 Oct 2015 12:21:00 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x625;&#x646;&#x634;&#x627;&#x621; &#x642;&#x627;&#x626;&#x645;&#x629; &#x645;&#x62A;&#x62D;&#x631;&#x643;&#x629; &#x645;&#x646; &#x646;&#x648;&#x639; off-canvas &#x641;&#x64A; CSS</title><link>https://academy.hsoub.com/programming/css/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D9%82%D8%A7%D8%A6%D9%85%D8%A9-%D9%85%D8%AA%D8%AD%D8%B1%D9%83%D8%A9-%D9%85%D9%86-%D9%86%D9%88%D8%B9-off-canvas-%D9%81%D9%8A-css-r192/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_10/off-canvas-menu.png.eb2cbde0110d0094bfb2d5b4a0d09574.png" /></p>

<p dir="rtl">وقعت عيني في أحد الأيام على مبدأ جميل لقائمة في أحد المواقع، وكان أحدهم قد قام ببناء شيء شبيه بها ولكني أردت أن أضيف لها تأثيرات إضافية وأجعلها متناسبة مع متصفحات سطح المكتب. لذلك أردت أن أريك في هذا الدرس كيفية القيام بشيء مشابه.</p><p dir="rtl">سوف نقوم في هذا الدرس ببناء شيء شبيه <a rel="external nofollow" href="http://tympanus.net/Tutorials/AnimatedBorderMenus/">بهذه المعاينة</a> (أنظر إلى Demo2) بحيث تكون الأيقونة التي تفتح القائمة موجودة في أعلى يسار الشاشة والحد (border) يكون أسمك من جهة اليسار.</p><p dir="rtl">ملاحظة: ضع في الحسبان أننا سوف نستعمل تأثيرات التنقل (transitions) والحركة (animation) على عناصر زائفة (pseudo-elements) والتي لن تعمل في بعض المتصفحات (مثل Safari وMobile Safari).</p><h2 dir="rtl">بنية ملف HTML</h2><p dir="rtl">سوف تحتوي بنية HTML الخاصة بالقائمة على عنصر <span style="font-family:courier new,courier,monospace;">nav</span> وعلى عنصر <span style="font-family:courier new,courier,monospace;">a</span> وأيضًا على عنصر <span style="font-family:courier new,courier,monospace;">ul </span>يوجد بداخله مجموعة من عناصر <span style="font-family:courier new,courier,monospace;">li</span> وبداخل كل عنصر من هذه العناصر يوجد أيقونة:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">&lt;nav id="bt-menu" class="bt-menu"&gt;
    &lt;a href="#" class="bt-menu-trigger"&gt;&lt;span&gt;Menu&lt;/span&gt;&lt;/a&gt;
    &lt;ul&gt;
        &lt;li&gt;&lt;a href="#" class="bt-icon icon-zoom"&gt;Zoom&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="#" class="bt-icon icon-refresh"&gt;Refresh&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="#" class="bt-icon icon-lock"&gt;Lock&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="#" class="bt-icon icon-speaker"&gt;Sound&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="#" class="bt-icon icon-star"&gt;Favorite&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
&lt;/nav&gt;</pre><p>لنبدأ الآن بتنسيق العناصر باستخدام CSS.</p><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_10/AnimatedBorderMenu01.png.1b0c4fce21ddacfb0f7184ba139d5a77.png"><img data-fileid="5915" class="ipsImage ipsImage_thumbnailed" alt="AnimatedBorderMenu01.thumb.png.99944b016" src="https://academy.hsoub.com/uploads/monthly_2015_10/AnimatedBorderMenu01.thumb.png.99944b01627754555264425d97e3865b.png"></a></p><h2 dir="rtl">تنسيقات CSS</h2><p dir="rtl">ملاحظة: التنسيقات التي سوف نقوم بكتابتها لن تحتوي على أي بادئات للمتصفحات (vendor prefixies) ولكنك سوف تجدها في <a class="ipsAttachLink" href="https://academy.hsoub.com/applications/core/interface/file/attachment.php?id=5916">الملفات المصدرية</a> لهذا الدرس.</p><p dir="rtl">سوف نقوم في البداية بتطبيق الخاصية <span style="font-family:courier new,courier,monospace;">box-sizing: border-box</span> على جميع العناصر:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">*,
*:after,
*::before {
    box-sizing: border-box;
}</pre><p>ودعنا نقوم أيضًا بإعطاء بعض التنسيقات لجسم الصفحة (العنصر<span style="font-family:courier new,courier,monospace;"> body</span>) والحاوي الرئيسي:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">body {
    background: #04a466;
}

.container {
    padding: 80px;
}</pre><p>سوف تساعد خاصية <span style="font-family:courier new,courier,monospace;">padding: 80px</span> على توفير بعض المساحة حول المحتوى حتى نضمن وجود بعض المساحة عندما تظهر الحدود (border).</p><p dir="rtl">سوف تكون القائمة الرئيسية متموضعة بشكل ثابت في الصفحة (باستخدام <span style="font-family:courier new,courier,monospace;">position: fixed</span>) وسوف تكون الحدود دائمًا موجوة حول مجال الرؤية (viewport). سوف نستخدم تنسيقات مبدئية للحدود والتي سوف تتحول إلى حدود أكبر عند النقر على أيقونة القائمة. لاحظ أننا جعلنا الارتفاع يساوي صفر (<span style="font-family:courier new,courier,monospace;">height: 0</span>) وذلك حتى نضمن بأنّ القائمة لا تُغطّي أي شيء قبل ظهورها على الشاشة، كما أنّه سيكون هناك تأخير بمقدار 0.3s بالنسبة للارتفاع عندما نقوم بإغلاق القائمة:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.bt-menu {
    position: fixed;  
    top: 0;
    left: 0;
    width: 100%;
    height: 0;
    border-width: 0px;
    border-style: solid;
    border-color: #333;
    background-color: rgba(0,0,0,0);
    transition: border-width 0.3s, background-color 0.3s, height 0s 0.3s;
}</pre><p>عندما نقوم بفتح القائمة فإننا نريد أن نجعل الارتفاع يساوي 100% (ولكننا لن نستخدم الخاصية <span style="font-family:courier new,courier,monospace;">transition</span>) وسوف نجعل الحدود تساوي 90px على الجهة اليسرى و30px على الجهات الأخرى، كما أنّ لون الخلفية سوف يكون شبه شفاف وذلك باستخدام RGBA:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.bt-menu.bt-menu-open {
    height: 100%;
    border-width: 30px 30px 30px 90px;
    background-color: rgba(0,0,0,0.3);
    transition: border-width 0.3s, background-color 0.3s;
}</pre><p>سوف نستعمل الآن خدعة بسيطة بحيث سوف نقوم بإضافة عنصر باستخدام الجافاسكربت ليعمل وكأنّه حاوٍ يغطي كافة الصفحة باستثناء الحدود، وهذا سوف يسمح لنا بأن نعرف أين ننقر حتى نقوم بإغلاق القائمة فنحن لا نريد للقائمة أن تغلق عندما ننقر على الحدود وإنما فقط عند النقر على المساحة الأخرى.</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.bt-overlay {
    position: absolute;
    width: 100%;
}</pre><p>وعندما نقوم بفتح القائمة فإنّ هذا العنصر سوف يكون بارتفاع كامل (<span style="font-family:courier new,courier,monospace;">height: 100%</span>):</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.bt-menu-open .bt-overlay {
    height: 100%;
}</pre><p>لنقم الآن بتنسيق الأيقونة التي تفتح القائمة عند النقر عليها. سوف نعطيها تموضعًا ثابتًا (<span style="font-family:courier new,courier,monospace;">position: fixed</span>) وسوف نجعلها تظهر في الجزء العلوي من الجهة اليسار للصفحة:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.bt-menu-trigger {
    position: fixed;
    top: 15px;
    left: 20px;
    display: block;
    width: 50px;
    height: 50px;
    cursor: pointer;
}</pre><p>سوف يعمل العنصر <span style="font-family:courier new,courier,monospace;">a</span> كحاوٍ والعنصر <span style="font-family:courier new,courier,monospace;">span</span> سيكون الخط المتوسط في أيقونة الهامبرجر (تم تسميتها بهذا الاسم لأنّ شكلها يشبه سندويشة الهامبرجر). لذلك سوف نقوم بموضعة العنصر <span style="font-family: 'courier new', courier, monospace; line-height: 22.4px;">span</span> في الوسط وذلك بإعطائه الخاصية <span style="font-family:courier new,courier,monospace;">top: 50%</span> والخاصية <span style="font-family:courier new,courier,monospace;">margin-top: -2px</span> (هذه خدعة قديمة بحيث نقوم بإعطاء العنصر قيمة <span style="font-family:courier new,courier,monospace;">margin</span> سالبة بنصف ارتفاع العنصر حتى نجعله يتوسط كما نريد):</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.bt-menu-trigger span {
    position: absolute;
    top: 50%;
    left: 0;
    display: block;
    width: 100%;
    height: 4px;
    margin-top: -2px;
    background-color: #fff;
    font-size: 0px;
    user-select: none;
    transition: background-color 0.3s;
}</pre><p>وعند فتح القائمة سوف يتغير شكل الأيقونة التي تفتح القائمة وتغلقها إلى حرف "X"، بحيث سوف نستعمل العناصر الزائفة لإنشاء الخطين المتقاطعين على شكل "X" وسوف نقوم بإخفاء الخط الذي في الوسط (والذي قلنا بأنّه هو نفسه العنصر <span style="font-family:courier new,courier,monospace;">span</span>):</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.bt-menu-open .bt-menu-trigger span {
    background-color: transparent;
}</pre><p>لنقم الآن بإنشاء الخطين المتقاطعين كما قلنا باستخدام العناصر الزائفة، بحيث سوف نعطيها الخاصية <span style="font-family:courier new,courier,monospace;">position: absolute</span> وسوف يكون ارتفاعها بنفس ارتفاع العنصر الذي يحتويها (العنصر <span style="font-family:courier new,courier,monospace;">span</span> في هذه الحالة) وذلك عن طريق إعطائها الخاصية <span style="font-family:courier new,courier,monospace;">height: 100%</span>:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">bt-menu-trigger span:before,
.bt-menu-trigger span:after {
    position: absolute;
    left: 0;
    width: 100%;
    height: 100%;
    background: #fff;
    content: '';
    transition: transform 0.3s;
}</pre><p dir="rtl">وسوف نستخدم الخاصية<span style="font-family:courier new,courier,monospace;"> translateY </span>لموضعتها بشكل صحيح:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.bt-menu-trigger span:before {
    transform: translateY(-250%);
}

.bt-menu-trigger span:after {
    transform: translateY(250%);
}

</pre><p dir="rtl">سوف ينتج الشكل "X" عندما نقوم بفتح القائمة وذلك عن طريق الخاصية <span style="font-family:courier new,courier,monospace;">(translateY(0</span> وعن طريق تدوير العناصر الزائفة باستخدام الخاصية <span style="font-family:courier new,courier,monospace;">(rotate(45deg:</span></p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.bt-menu-open .bt-menu-trigger span:before {
     transform: translateY(0) rotate(45deg);
}

.bt-menu-open .bt-menu-trigger span:after {
     transform: translateY(0) rotate(-45deg);
}</pre><p dir="rtl">كما أنّ العنصر <span style="font-family:courier new,courier,monospace;">ul</span> الذي سوف يحتوي على الأيقونات سوف يتم موضعته بشكل ثابت (باستخدام <span style="font-family:courier new,courier,monospace;">position: fixed</span>) وإلى يسار الشاشة:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.bt-menu ul {
    position: fixed;
    top: 75px;
    left: 0;
    margin: 0;
    padding: 0;
    width: 90px;
    list-style: none;
    backface-visibility: hidden;
}</pre><p dir="rtl">لنقم الآن بإعطاء العناصر <span style="font-family:courier new,courier,monospace;">li</span> و <span style="font-family:courier new,courier,monospace;">a</span> الخاصية <span style="font-family:courier new,courier,monospace;">display: block</span> ونجعلها بعرض كامل باستخدام الخاصية <span style="font-family:courier new,courier,monospace;">width: 100%</span>:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.bt-menu ul li,
.bt-menu ul li a {
    display: block;
    width: 100%;
    text-align: center;
}</pre><p dir="rtl">كل عنصر li سوف يكون مخفيًا بشكل مبدئي وبشفافية منعدمة (<span style="font-family:courier new,courier,monospace;">opacity: 0</span>)، كما أنّ التنقل الرجعي (backward transition) لخاصية <span style="font-family:courier new,courier,monospace;">visibility</span> سوف يتم تأخيره حتى تنتهي خاصية التنقل الخاصة بالخاصيتين <span style="font-family:courier new,courier,monospace;">transform</span> و <span style="font-family:courier new,courier,monospace;">opacity</span>:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.bt-menu ul li {
    padding: 16px 0;
    opacity: 0;
    visibility: hidden;
    transition: transform 0.3s, opacity 0.2s, visibility 0s 0.3s;
}</pre><p dir="rtl">سوف نقوم الآن بتحويل جميع عناصر li بشكل مختلف عن بعضها بحيث تكون جميعها موجودة في الوسط وإلى اليسار إلى أن تختفي (وذلك باستعمال القيمة -100% على المحور العمودي):</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.bt-menu ul li:first-child {
    transform: translate3d(-100%,200%,0);
}

.bt-menu ul li:nth-child(2) {
    transform: translate3d(-100%,100%,0);
}

.bt-menu ul li:nth-child(3) {
    transform: translate3d(-100%,0,0);
}

.bt-menu ul li:nth-child(4) {
    transform: translate3d(-100%,-100%,0);
}

.bt-menu ul li:nth-child(5) {
    transform: translate3d(-100%,-200%,0);
}</pre><p dir="rtl">عند فتح القائمة سوف تظهر العناصر li بشكل فوري لأننا لم نقم بإعطائها خاصية <span style="font-family:courier new,courier,monospace;">transition</span>. وسوف يتحركوا أيضًا إلى مواقعهم الرئيسية وذلك عن طريق استخدام الخاصية <span style="font-family:courier new,courier,monospace;">(transform: translate3d(0,0,0</span>:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.bt-menu.bt-menu-open ul li {
    visibility: visible;
    opacity: 1;
    transition: transform 0.3s, opacity 0.3s;
    transform: translate3d(0,0,0);
}</pre><p>لنقم الآن بتنسيق عناصر <span style="font-family:courier new,courier,monospace;">a</span>. سوف نستخدم خط أيقوني (icon font) ونضيف مصدر الخط وفئات الأيقونات (icon classes) الموجودة في ملف CSS آخر والذي توفره خدمة مثل <a rel="external nofollow" href="http://fontastic.me/">Fontastic</a> أو <a rel="external nofollow" href="http://icomoon.io/app/">IcoMoon app</a>.</p><p dir="rtl">سوف نقوم بإخفاء النص الموجود في العناصر وذلك باستعمال الخاصية<span style="font-family:courier new,courier,monospace;"> font-size: 0px</span> ونجعل اللون شفاف باستخدام <span style="font-family:courier new,courier,monospace;">color: transparent</span>:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.bt-menu ul li a {
    display: block;
    outline: none;
    color: transparent;
    text-decoration: none;
    font-size: 0px;
}</pre><p dir="rtl">وحتى نجعل الأيقونات تظهر (لأننا قمنا بإخفائها عن طريق <span style="font-family:courier new,courier,monospace;">font-size: 0</span> و <span style="font-family:courier new,courier,monospace;">color:transparent</span>) فإننا سوف نُعطي العناصر الزائفة الخاصية <span style="font-family:courier new,courier,monospace;">font-size: 48px</span> و<span style="font-family:courier new,courier,monospace;">color: #04a466</span>. لاحظ أننا استعملنا "<strong>px</strong>" بدل "<strong>em</strong>" وذلك لأننا أعطينا العنصر الرئيسي القيمة <span style="font-family:courier new,courier,monospace;">font-size: 0</span> وبالتالي فإنّ "<strong>em</strong>" لن تعمل هنا:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.bt-menu ul li a:before {
    color: #04a466;
    font-size: 48px;
    transition: color 0.2s;
}</pre><p dir="rtl">وعندما يقوم المستخدم بوضع مؤشر الفأرة فوق العنصر (<span style="font-family:courier new,courier,monospace;">hover</span>) فإننا نريد أن يكون لون الخط أبيضًا:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.bt-menu ul li a:hover:before,
.bt-menu ul li a:focus:before {
    color: #fff;
}</pre><p dir="rtl">وأخيرًا وليس آخرًا، نريد أن تظهر الأيقونات بحجم أصغر في شاشات الهواتف المحمولة:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">@media screen and (max-height: 31.125em) {
    .bt-menu ul li a:before {
        font-size: 32px;
    }

}</pre><p dir="rtl">هذا كان كل ما يتعلق بتنسيقات CSS. لننتقل الآن إلى الجافاسكربت.</p><h2 dir="rtl">بعض الجافاسكربت</h2><p dir="rtl">ما نريد فعله بالجافاسكربت بسيط ومباشر، ما نريده هو أنّه عند النقر على أيقونة القائمة فإنّه يتم إضافة/إزالة الفئة (class) التي تحمل الاسم "bt-menu-open" والفئة "bt-menu-close على العنصر nav (إضافة الفئة "bt-menu-close" هي فقط ضرورية إذا كنت سوف تستخدم التحريك (animation) للتأثير الخاص بأيقونة القائمة، تمامًا كما فعلنا في Demo1. وهذا سوف يسمح لنا بتشغيل التحريك الرجعي عندما نقوم بإغلاق القائمة).</p><p dir="rtl">عندما نقوم بالنقر على عنصر الـoverlay الذي تحدثنا عنه سابقًا نريد أن يتم إغلاق القائمة. وسوف نقوم أيضًا بإضافة بعض الدعم للأجهزة التي تعمل باللمس:</p><pre data-pbcklang="javascript" data-pbcktabsize="4" class="javascript ipsCode prettyprint">(function() {

    // http://stackoverflow.com/a/11381730/989439
    function mobilecheck() {
        var check = false;
        (function(a)   {if(/(android|ipad|playbook|silk|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4)))check = true})(navigator.userAgent||navigator.vendor||window.opera);

    return check;
}

function init() {
    var menu = document.getElementById( 'bt-menu' ),
    trigger = menu.querySelector( 'a.bt-menu-trigger' ),
  
    // event type (if mobile, use touch events)
    eventtype = mobilecheck() ? 'touchstart' : 'click',
    
    resetMenu = function() {
        classie.remove( menu, 'bt-menu-open' );
        classie.add( menu, 'bt-menu-close' );
    },

    closeClickFn = function( ev ) {
        resetMenu();
        overlay.removeEventListener( eventtype, closeClickFn );
    };

    var overlay = document.createElement('div');
    overlay.className = 'bt-overlay';
    menu.appendChild( overlay );

    trigger.addEventListener( eventtype, function( ev ) {
        ev.stopPropagation();
        ev.preventDefault();
        if( classie.has( menu, 'bt-menu-open' ) ) {
            resetMenu();
        }
        else {
            classie.remove( menu, 'bt-menu-close' );
            classie.add( menu, 'bt-menu-open' );
            overlay.addEventListener( eventtype, closeClickFn );
        }
    });
}

init();

})();</pre><h2 dir="rtl">خاتمة</h2><p dir="rtl">هذا كان كل شيء. أتمنى أن تكون قد استمتعت بهذا الدرس ووجدته مفيدًا وعمليًا، وتأكد بأن تلقي نظرة على جميع المعاينات (demos) فالمعاينة الأخيرة يوجد بها مبدأ لمشغّل فيديو يأخذ كامل الشاشة.</p><p dir="rtl">ترجمة -وبتصرّف- للمقال <a rel="external nofollow" href="http://tympanus.net/codrops/2013/09/30/animated-border-menus">Animated Border Menus</a> لصاحبته Mary Lou.</p>
]]></description><guid isPermaLink="false">192</guid><pubDate>Wed, 14 Oct 2015 21:58:00 +0000</pubDate></item><item><title>5 &#x641;&#x626;&#x627;&#x62A; &#x632;&#x627;&#x626;&#x641;&#x629; (pseudo-class) &#x64A;&#x62C;&#x628; &#x639;&#x644;&#x64A;&#x643; &#x645;&#x639;&#x631;&#x641;&#x62A;&#x647;&#x627; &#x641;&#x64A; CSS</title><link>https://academy.hsoub.com/programming/css/5-%D9%81%D8%A6%D8%A7%D8%AA-%D8%B2%D8%A7%D8%A6%D9%81%D8%A9-pseudo-class-%D9%8A%D8%AC%D8%A8-%D8%B9%D9%84%D9%8A%D9%83-%D9%85%D8%B9%D8%B1%D9%81%D8%AA%D9%87%D8%A7-%D9%81%D9%8A-css-r189/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_10/css-pseudo-classes.png.93a545d318bc466c2348a2e578fd5603.png" /></p>

<p dir="rtl">لا يخفى على أي مطور ويب أنّ الفئات الزائفة تُعتبر مهمة في تطوير المواقع وأنّه يجب على كل مطور ويب معرفتها ومعرفة كيفية عملها حتى يستطيع استخدامها متى ما احتاج إليها. وأكاد أجزم أنّه لا يوجد موقع لا يستخدم الفئات الزائفة مهما كان حجم هذا الموقع.</p><p dir="rtl" style="text-align: center;"><a href="https://academy.hsoub.com/uploads/monthly_2015_10/css-pseudo-classes.png.49add6d9857275a388855c29f926800d.png" class="ipsAttachLink ipsAttachLink_image"><img data-fileid="5794" src="https://academy.hsoub.com/uploads/monthly_2015_10/css-pseudo-classes.thumb.png.223d03ecc8fdf782b959147a62d38554.png" class="ipsImage ipsImage_thumbnailed" alt="css-pseudo-classes.thumb.png.223d03ecc8f"></a></p><p dir="rtl">لذلك في هذا الدرس سوف نتحدث عن 5 فئات زائفة وكيفية عملها مع طرح بعض الأمثلة للمساعدة على الفهم بشكل أفضل.</p><h2 dir="rtl">:first-child</h2><p dir="rtl">تُعتبر هذه الفئة واحدة من أكثر الفئات الزائفة استخدامًا على الاطلاع، وما تقوم به هذه الفئة هو تحديد واختيار عنصر إبن ولكن بشرط أن يكون هذا العنصر هو الإبن الأول للعنصر الأب.</p><p dir="rtl">دعونا نأخذ مثالًا بسيطًا حتى يتضح الأمر بشكل أفضل. تخيّل معي الشيفرة البرمجية التالية:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">&lt;article&gt;
    &lt;p&gt;
        Lorem Ipsum...
    &lt;/p&gt;
    &lt;p&gt;
        Another Lorem Ipsum...
    &lt;/p&gt;
&lt;/article&gt;</pre><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">p:first-child {
    font-size: 1.5em;
}</pre><p dir="rtl">في هذا المثال سوف يتم تغيير حجم الخط فقط للعنصر <span style="font-family:courier new,courier,monospace;">&lt;p&gt;</span> الأول (الذي يحتوي على النص "Lorem Ipsum...") وذلك لأنه هو العنصر الإبن الأول للعنصر الأب &lt;article&gt;.</p><p dir="rtl">لنأخذ مثالًا آخر:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">&lt;div class="container"&gt;
    &lt;h1&gt;Heading&lt;/h1&gt;
    &lt;p&gt;
        Lorem Ipsum...
    &lt;/p&gt;
&lt;/div&gt;</pre><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">p:first-child {
    font-size: 1.5em;
}</pre><p>في هذا المثال لن يتم تغيير حجم الخط للعنصر <span style="font-family:courier new,courier,monospace;">&lt;p&gt; </span>وذلك لأنه ليس العنصر الإبن الأول، فكما ترون أنّ العنصر الإبن الأول هو <span style="font-family:courier new,courier,monospace;">&lt;h1&gt; </span>وليس<span style="font-family:courier new,courier,monospace;"> &lt;p&gt;.</span></p><h3 dir="rtl">بعض الملاحظات</h3><p dir="rtl">كما رأينا في المثال الأخير أننا لم نستطع تنسيق (تغيير حجم الخط باستخدام font-size) العنصر <span style="font-family:courier new,courier,monospace;">&lt;p&gt;</span> باستخدام العنصر الزائف <strong>:first-child</strong> وذلك لأنّ هذا العنصر لم يكن هو العنصر الإبن الأول، لذلك وحتى نستطيع تنسيق هذا العنصر فإننا سوف نحتاج إلى استعمال فئة زائفة أخرى وهي<strong> :first-of-type</strong>، فهذه الفئة كما يُشير اسمها فإنّها تقوم باختيار عُنصر إبن ولكن بشرط أن يكون هو العنصر الأول من نوعه داخل العنصر الأب. ففي المثال الأول لن يتغير أي شيء لأن تأثير <strong>:first-child </strong>و<strong>:first-of-type</strong> سيكون هو نفسه نظرًا لأنّ العنصر <span style="font-family:courier new,courier,monospace;">&lt;p&gt;</span> هو أول عنصر إبن (وسوف يتم اختياره من قبل <strong>:first-child</strong>) وهو كذلك العنصر الأول من نوعه داخل العنصر الأب (وسوف يتم اختياره من قبل<strong> :first-of-type</strong>). سوف نتحدث عن هذه الفئة الزائفة لاحقًا في هذا الدرس.</p><p dir="rtl">شيء آخر يجب عليك معرفته هو أنّ الفئة الزائفة <strong style="line-height: 22.4px;">:first-child</strong> حالها كحال الفئات الزائفة الأخرى يمكن استخدامها مع محددات (selectors) أخرى مثل <span style="font-family:courier new,courier,monospace;">:hover</span> و<span style="font-family:courier new,courier,monospace;">::before</span> (فمثلًا يمكنك القيام بشيء مشابه لهذا <strong>p:first-child:hover</strong>).</p><h3 dir="rtl">أمثلة إضافية</h3><p dir="rtl">تخيل معي شيفرة HTML التالية:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">&lt;article&gt;
    &lt;h1&gt;Understanding :first-child&lt;/h1&gt;
    &lt;p&gt;
        This is the first paragraph, but it's not the first child of its parent.
    &lt;/p&gt;
    &lt;p&gt;
        This is another paragraph. &lt;span&gt;This is a span inside the paragraph.&lt;/span&gt;
    &lt;/p&gt;
    &lt;ul&gt;
        &lt;li&gt;First list item&lt;/li&gt;
        &lt;li&gt;Second list item&lt;/li&gt;
        &lt;li&gt;Third list item&lt;/li&gt;
    &lt;/ul&gt;
&lt;/article&gt;</pre><p>وتخيل معي تنسيقات CSS التالية:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">span:first-child {
    color: grey;
}</pre><p>هنا سوف يتم تغيير لون الخط الخاص بالعنصر <span style="font-family:courier new,courier,monospace;">&lt;span&gt;</span> والموجود في العنصر <span style="font-family:courier new,courier,monospace;">&lt;p&gt;</span> إلى اللون الرمادي (grey) وذلك لأنّ العنصر <span style="font-family: 'courier new', courier, monospace; line-height: 22.4px;">&lt;span&gt;</span> هو العنصر الإبن الأول للعنصر <span style="font-family: 'courier new', courier, monospace; line-height: 22.4px;">&lt;p&gt;</span>.</p><p dir="rtl">لنأخذ تنسيقات CSS أخرى:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">li:first-child {
    text-decoration: underline;
    color: deepPink;
}</pre><p>هنا سوف يتم تحديد العنصر <span style="font-family:courier new,courier,monospace;">&lt;li&gt;</span> الأول وسوف يتم اعطاؤه التنسيقات <span style="font-family:courier new,courier,monospace;">text-decoration: underline</span> و<span style="font-family:courier new,courier,monospace;">color: deepPink</span>.</p><p dir="rtl">تنسيقات أخرى:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">p:first-child {
    font-size: 1.5em;
}</pre><p>هنا لن يتم تحديد أي عنصر <span style="font-family:courier new,courier,monospace;">&lt;p&gt;</span> وبالتالي لن يتم تطبيق الخاصية <span style="font-family:courier new,courier,monospace;">font-size: 1.5em</span> ويعود السبب في ذلك إلى أننا نملك عنصرين <span style="font-family:courier new,courier,monospace;">&lt;p&gt;</span> ولكن لا عنصر من هذين العنصر هو الإبن الأول للعنصر <span style="font-family:courier new,courier,monospace;">&lt;article&gt;</span> فبالرجوع إلى شيفرة HTML يمكنك ملاحظة أن العنصر الأول هو <span style="font-family:courier new,courier,monospace;">&lt;h1&gt;</span>.</p><p dir="rtl">وأخيرًا وليس آخرًا:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">span:first-child::before {
    content: "(";
    color: deepPink;
}

span:first-child::after {
    content: ")";
    color: deepPink;
}
</pre><p dir="rtl">لاحظ في هذا المثال أننا استخدمنا <strong>::before</strong> و<strong>::after</strong> مع الفئة الزائفة <strong>:first-child</strong> ففي هذا المثال سوف يتم وضع محتويات العنصر <span style="font-family:courier new,courier,monospace;">&lt;span&gt;</span> داخل قوسين لونهما زهري.</p><p dir="rtl"><a rel="external nofollow" href="http://tympanus.net/codrops-playground/SaraSoueidan/zaSPYYp7/editor">يمكنك معاينة جميع الأمثلة السابقة من هنا</a><a rel="external nofollow" href="http://tympanus.net/codrops-playground/SaraSoueidan/zaSPYYp7/editor">.</a></p><h3 dir="rtl">دعم المتصفحات</h3><p dir="rtl">العنصر الزائف <strong>:first-child</strong> مدعوم في كل المتصفحات تقريبًا فهو مدعوم في Chrome، Firefox، Safari، Opera 9.5+، Internet Explorer 7+ وفي متصفحات Android وiOS.</p><p dir="rtl"><strong>ملاحظة</strong>: في متصفح Internet Explorer 8 إذا تم إدخال عنصر ما بشكل ديناميكي عن طريق النقر على رابط ما فإنّ الفئة الزائفة <strong>:first-class</strong> لن يتم تطبيقها حتى يذهب الـfocus عن الرابط.</p><h2 dir="rtl">:last-child</h2><p dir="rtl">جميع ما ذكرناه عن الفئة الزائفة <strong>:first-child</strong> ينطبق على الفئة الزائفة <strong>:last-child</strong> ولكن بدلًا من جملة "الإبن الأول" استخدم "الإبن الأخير"، هكذا بكل بساطة.</p><p dir="rtl">ولكن هل تذكر عندما تحدثنا عن<strong> :first-of-type</strong> وقلنا بأنّ هذه الفئة تقوم باختيار عُنصر إبن ولكن بشرط أن يكون هو العنصر الأول من نوعه داخل العنصر الأب؟ على نفس المنوال هناك الفئة الزائفة <strong>:last-of-type</strong> وهذه الفئة تقوم باختيار عُنصر إبن ولكن بشرط أن يكون هو العنصر الأخير من نوعه داخل العنصر الأب (سوف نتحدث عنها لاحقًا في هذا الدرس).</p><p dir="rtl">دعونا ننتقل الآن مباشرة إلى بعض الأمثلة.</p><h3 dir="rtl">بعض الأمثلة</h3><p dir="rtl">تخيل معي شيفرة HTML التالية:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">&lt;article&gt;
    &lt;h1&gt;Understanding :last-child&lt;/h1&gt;
    &lt;p&gt;
        This is the first paragraph, but it's not the first child of its parent.
    &lt;/p&gt;
    &lt;p&gt;
        This is another paragraph. &lt;span&gt;This is a span inside the paragraph.&lt;/span&gt;
    &lt;/p&gt;
    &lt;ul&gt;
        &lt;li&gt;First list item&lt;/li&gt;
        &lt;li&gt;Second list item&lt;/li&gt;
        &lt;li&gt;Third list item&lt;/li&gt;
    &lt;/ul&gt;
&lt;/article&gt;</pre><p>وتخيل معي تنسيقات CSS التالية:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">span:last-child {
    color: grey;
}</pre><p>هنا سوف يتم تغيير لون الخط الخاص بالعنصر <span style="font-family:courier new,courier,monospace;">&lt;span&gt;</span> والموجود في العنصر<span style="font-family:courier new,courier,monospace;"> &lt;p&gt;</span> إلى اللون الرمادي (grey) وذلك لأنّ العنصر <span style="font-family: 'courier new', courier, monospace; line-height: 22.4px;">&lt;span&gt;</span> هو العنصر الإبن الأخير للعنصر <span style="font-family: 'courier new', courier, monospace; line-height: 22.4px;">&lt;p&gt; </span>(في الحقيقة هذا العنصر هو العنصر الأول والأخير للعنصر &lt;p&gt; لأنه العنصر الإبن الوحيد ولذلك يمكننا استخدام <strong>:first-child</strong> أو<strong>:last-child</strong>).</p><p dir="rtl">لنأخذ تنسيقات CSS أخرى:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">li:last-child {
    text-decoration: underline;
    color: deepPink;
}</pre><p>هنا سوف يتم تحديد العنصر <span style="font-family:courier new,courier,monospace;">&lt;li&gt; </span>الأخير وسوف يتم اعطاؤه التنسيقات <span style="font-family:courier new,courier,monospace;">text-decoration: underline</span> و<span style="font-family:courier new,courier,monospace;">color: deepPink</span>.</p><p dir="rtl">تنسيقات أخرى:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">p:last-child {
    font-size: 1.5em;
}</pre><p>هنا لن يتم تحديد أي عنصر<span style="font-family:courier new,courier,monospace;"> &lt;p&gt;</span> وبالتالي لن يتم تطبيق الخاصية <span style="font-family:courier new,courier,monospace;">font-size: 1.5em</span> ويعود السبب في ذلك إلى أننا نملك عنصرين <span style="font-family: 'courier new', courier, monospace; line-height: 22.4px;">&lt;p&gt;</span> ولكن لا عنصر من هذين العنصر يُعتبر الإبن الأخير للعنصر<span style="font-family:courier new,courier,monospace;"> &lt;article&gt;</span> فبالرجوع إلى شيفرة HTML يمكنك ملاحظة أن العنصر الأخير هو<span style="font-family:courier new,courier,monospace;"> &lt;ul&gt;</span>.</p><p dir="rtl">مثال أخير:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">span:last-child::before {
    content: "(";
    color: deepPink;
}

span:last-child::after {
    content: ")";
    color: deepPink;
}</pre><p>لاحظ في هذا المثال أننا استخدمنا <strong>::before</strong> و<strong>::after </strong>مع الفئة الزائفة<strong> :last-child</strong> ففي هذا المثال سوف يتم وضع محتويات العنصر <span style="font-family:courier new,courier,monospace;">&lt;span&gt;</span> داخل قوسين لونهما زهري.</p><p dir="rtl"><a rel="external nofollow" href="http://tympanus.net/codrops-playground/SaraSoueidan/6VtIhfSn/editor">يمكنك معاينة جميع الأمثلة السابقة من هنا</a><a rel="external nofollow" href="http://tympanus.net/codrops-playground/SaraSoueidan/6VtIhfSn/editor">.</a></p><h3 dir="rtl">دعم المتصفحات</h3><p dir="rtl">إنّ دعم المتصفحات للفئة الزائفة <strong>:last-child</strong> أقل من دعمها للفئة الزائفة <strong>:first-child</strong> فهي مدعومة في متصفحات Chrome، Firefox، Safari، Opera 9.5+، Internet Explorer 9+ وفي متصفحات Android وiOS (لاحظ أنّ الفرق في الدعم هو أنها غير مدعومة في متصفح IE 8 وIE 7).</p><h2 dir="rtl">:first-of-type</h2><p dir="rtl">تقوم هذه الفئة بتحديد أول ظهور لأحد العناصر الإبن الموجودة في عنصر أب، أي أنّه لا يشترط -كما كان الحال في <strong>:first-child</strong>- أن يكون العنصر هو الإبن الأول للعنصر الأب.</p><p dir="rtl">دعونا نأخذ مثالًا بسيطًا:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">&lt;article&gt;
    &lt;h1&gt;Article Title&lt;/h1&gt;
    &lt;p&gt;
        First paragraph.
    &lt;/p&gt;
    &lt;p&gt;
        Second paragraph.
    &lt;/p&gt;
    &lt;!-- .... --&gt;
&lt;/article&gt;</pre><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">p:first-of-type {
   font-size: 1.5em;
}
</pre><p>ففي هذا المثال سوف يتم تحديد العنصر<span style="font-family:comic sans ms,cursive;"> &lt;p&gt;</span> الذي يحتوي على النص "First paragraph" وذلك لأنه هو أول عنصر من نوعه (الظهور الأول) داخل العنصر الأب <span style="font-family:courier new,courier,monospace;">&lt;article&gt;</span>.</p><h3 dir="rtl">بعض الملاحظات</h3><p dir="rtl">إنّ الفئة الزائفة<strong> :first-of-type</strong> تُعتبر مشابهة للفئة الزائفة <strong>:first-child</strong> ولكن مع فرق جوهري واحد وهو أنّه لا يشترط -كما كان الحال في <strong>:first-child </strong>- أن يكون العنصر هو الإبن الأول للعنصر الأب. ففي المثال السابق استطعنا استخدام <strong>:first-of-type</strong> لتحديد العنصر <span style="font-family:courier new,courier,monospace;">&lt;p&gt;</span>، أمّا لو استخدمنا <strong>:first-child</strong> فإننا لن نستطيع تحديد أي من العنصرين <span style="font-family:courier new,courier,monospace;">&lt;p&gt;</span> لأنهما ليسا العنصر الإبن الأول (العنصر الإبن الأول هو<span style="font-family:courier new,courier,monospace;"> &lt;h1&gt;</span>).</p><p dir="rtl">وكما هو الحال بالنسبة للفئات الزائفة السابقة فإنّ الفئة الزائفة <strong>:first-of-type</strong> يمكن استخدامها مع محددات (selectors) أخرى مثل <strong>:hover</strong> و<strong>::before </strong>(فمثلًا يمكنك القيام بشيء مشابه لهذا <strong>p:first-of-type:hover</strong>).</p><h3 dir="rtl">أمثلة إضافية</h3><p dir="rtl">تخيل أنك تملك شيفرة HTML التالية:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">&lt;div class="container"&gt;
    &lt;h1&gt;Title&lt;/h1&gt;
    &lt;nav&gt;
        &lt;ul&gt;
            &lt;li&gt;First Item&lt;/li&gt;
            &lt;li&gt;Second Item&lt;/li&gt;
            &lt;li&gt;Third Item&lt;/li&gt;
            &lt;li&gt;Fourth Item&lt;/li&gt;
        &lt;/ul&gt;
    &lt;/nav&gt;

    &lt;article&gt;
        &lt;h2&gt;Title&lt;/h2&gt;
        &lt;p&gt;
            Lorem Ipsum... &lt;a href="#"&gt;Link&lt;/a&gt;... &lt;a href="#"&gt;another Link&lt;/a&gt;
        &lt;/p&gt;
        &lt;p&gt;
            Lorem Ipsum...
        &lt;/p&gt;
    &lt;/article&gt;

    &lt;article&gt;
        &lt;h2&gt;Title&lt;/h2&gt;
        &lt;p&gt;
            Lorem Ipsum...
        &lt;/p&gt;
        &lt;p&gt;
            Lorem Ipsum
        &lt;/p&gt;
     &lt;/article&gt;
&lt;/div&gt;</pre><p>وتخيل تنسيقات CSS التالية:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">article:first-of-type {
    background-color: #eee;
    border: 1px solid #ddd;
}</pre><p>هنا سوف يتم اختيار العنصر &lt;article&gt; الأول وإعطاؤه الخاصيتين <span style="font-family:courier new,courier,monospace;">background-color: #eee</span> و<span style="font-family:courier new,courier,monospace;">border: 1px solid #ddd</span>.</p><p dir="rtl">لنأخذ تنسيقات CSS أخرى:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">p:first-of-type {
    font-weight: bold;
}</pre><p>هنا سوف يتم تحديد أول عنصر &lt;p&gt; داخل العنصر الأب الذي يحتويه، وبناء على ذلك فإنّه سوف يتم تحديد عنصر <span style="font-family:courier new,courier,monospace;">&lt;p&gt;</span> الأول الموجود في كلا العنصرين<span style="font-family:courier new,courier,monospace;"> &lt;article&gt;</span> وإعطاؤهما الخاصية <span style="font-family:courier new,courier,monospace;">font-weight: bold</span>.</p><p dir="rtl">أنظر إلى تنسيقات CSS الأخيرة هذه:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">a:first-of-type {
    color: deepPink;
}

a:first-of-type::after {
    content: "(" attr(href) ")";
    color: deepPink;
}</pre><p>في هذه التنسيقات سوف يتم تحديد أول ظهور للعنصر<span style="font-family:courier new,courier,monospace;"> &lt;a&gt;</span> داخل أي عنصر آخر وسوف يتم استخدام<strong> ::after</strong> لوضع قيمة href لهذه العناصر إلى جانب العنصر وداخل قوسين.</p><p dir="rtl"><a rel="external nofollow" href="http://tympanus.net/codrops-playground/SaraSoueidan/nh3EEl6x/editor">يمكنك معاينة جميع الأمثلة السابقة من هنا</a><a rel="external nofollow" href="http://tympanus.net/codrops-playground/SaraSoueidan/nh3EEl6x/editor">.</a></p><h3 dir="rtl">دعم المتصفحات</h3><p dir="rtl">هذه الفئة الزائفة مدعومة في متصفحات Chrome، Firefox، Safari، Opera 9.5+، Internet Explorer 9+ وفي متصفحات Android وiOS.</p><h2 dir="rtl">:last-of-type</h2><p dir="rtl">تقوم هذه الفئة بتحديد آخر ظهور لأحد العناصر الإبن الموجودة في عنصر أب، أي أنّه لا يشترط -كما كان الحال في <strong>:last-child-</strong> أن يكون العنصر هو الإبن الأخير للعنصر الأب.</p><p dir="rtl">دعونا نأخذ مثالًا بسيطًا:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">&lt;article&gt;
    &lt;h1&gt;Article Title&lt;/h1&gt;
    &lt;p&gt;
        First paragraph.
    &lt;/p&gt;
    &lt;p&gt;
        Second paragraph.
    &lt;/p&gt;

    &lt;footer&gt; &lt;-- .. --&gt;&lt;/footer&gt;
&lt;/article&gt;</pre><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">p:last-of-type {
    font-style: italic;
}</pre><p>في هذا المثال سوف يتم تحديد العنصر <span style="font-family:courier new,courier,monospace;">&lt;p&gt;</span> الذي يحتوي على النص "Second paragraph" وذلك لأنه هو آخر عنصر من نوعه (الظهور الأخير) داخل العنصر الأب <span style="font-family:courier new,courier,monospace;">&lt;article&gt;</span>.</p><h3 dir="rtl">بعض الملاحظات</h3><p dir="rtl">إنّ الفئة الزائفة <strong>:last-of-type</strong> تُعتبر مشابهة للفئة الزائفة<strong> :last-child</strong> ولكن مع فرق جوهري واحد وهو أنّه لا يشترط -كما كان الحال في<strong> :last-child </strong>- أن يكون العنصر هو الإبن الأخير للعنصر الأب. ففي المثال السابق استطعنا استخدام<strong> :last-of-type</strong> لتحديد العنصر <span style="font-family:courier new,courier,monospace;">&lt;p&gt;</span>، أمّا لو استخدمنا <strong>:last-child</strong> فإننا لن نستطيع تحديد أي من العنصرين <span style="font-family:courier new,courier,monospace;">&lt;p&gt;</span> لأنهما ليسا العنصر الإبن الأخير (العنصر الإبن الأخير هو <span style="font-family:courier new,courier,monospace;">&lt;footer&gt;</span>).</p><p dir="rtl">وكما هو الحال بالنسبة للفئات الزائفة السابقة فإنّ الفئة الزائفة <strong>:last-of-type </strong>يمكن استخدامها مع محددات (selectors) أخرى مثل <strong>:hover</strong> و<strong>::before</strong> (فمثلًا يمكنك القيام بشيء مشابه لهذا <strong>p:last-of-type:hover</strong>).</p><h3 dir="rtl">أمثلة إضافية</h3><p dir="rtl">تخيل أنك تملك شيفرة HTML التالية:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">&lt;div class="container"&gt;
    &lt;h1&gt;Title&lt;/h1&gt;
    &lt;nav&gt;
        &lt;ul&gt;
            &lt;li&gt;First Item&lt;/li&gt;
            &lt;li&gt;Second Item&lt;/li&gt;
            &lt;li&gt;Third Item&lt;/li&gt;
            &lt;li&gt;Fourth Item&lt;/li&gt;
        &lt;/ul&gt;
    &lt;/nav&gt;

    &lt;article&gt;
        &lt;h2&gt;Title&lt;/h2&gt;
        &lt;p&gt;
            Lorem Ipsum... &lt;a href="#"&gt;Link&lt;/a&gt;... &lt;a href="#"&gt;another Link&lt;/a&gt;
        &lt;/p&gt;
        &lt;p&gt;
            Lorem Ipsum...
        &lt;/p&gt;
    &lt;/article&gt;

    &lt;article&gt;
        &lt;h2&gt;Title&lt;/h2&gt;
        &lt;p&gt;
             Lorem Ipsum...
        &lt;/p&gt;
        &lt;p&gt;
             Lorem Ipsum
        &lt;/p&gt;
     &lt;/article&gt;
&lt;/div&gt;</pre><p>وتخيل تنسيقات CSS التالية:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">article:last-of-type {
    background-color: #eee;
    border: 1px solid #ddd;
}</pre><p>هنا سوف يتم اختيار العنصر <span style="font-family:courier new,courier,monospace;">&lt;article&gt;</span> الأخير وإعطاؤه الخاصيتين<span style="font-family:courier new,courier,monospace;"> background-color: #eee</span> و<span style="font-family:courier new,courier,monospace;">border: 1px solid #ddd</span>.</p><p dir="rtl">لنأخذ تنسيقات CSS أخرى:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">p:last-of-type {
    font-weight: bold;
}</pre><p>هنا سوف يتم تحديد آخر عنصر <span style="font-family:courier new,courier,monospace;">&lt;p&gt;</span> داخل العنصر الأب الذي يحتويه، وبناء على ذلك فإنّه سوف يتم تحديد عنصر <span style="font-family:courier new,courier,monospace;">&lt;p&gt;</span> الأخير الموجود في كلا العنصرين <span style="font-family:courier new,courier,monospace;">&lt;article&gt;</span> وإعطاؤهما الخاصية <span style="font-family:courier new,courier,monospace;">font-weight: bold</span>.</p><p dir="rtl">أنظر إلى تنسيقات CSS الأخيرة هذه:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">a:last-of-type {
    color: deepPink;
}

a:last-of-type::after {
    content: "(" attr(href) ")";
    color: deepPink;
}</pre><p>في هذه التنسيقات سوف يتم تحديد آخر ظهور للعنصر <span style="font-family:courier new,courier,monospace;">&lt;a&gt;</span> داخل أي عنصر آخر وسوف يتم استخدام<strong> ::after</strong> لوضع قيمة href لهذه العناصر إلى جانب العنصر وداخل قوسين.</p><p dir="rtl"><a rel="external nofollow" href="http://tympanus.net/codrops-playground/SaraSoueidan/alBiTntE/editor">يمكنك معاينة جميع الأمثلة السابقة من هنا</a><a rel="external nofollow" href="http://tympanus.net/codrops-playground/SaraSoueidan/alBiTntE/editor">.</a></p><h3 dir="rtl">دعم المتصفحات</h3><p dir="rtl">هذه الفئة الزائفة مدعومة في متصفحات Chrome، Firefox، Safari، Opera 9.5+، Internet Explorer 9+ وفي متصفحات Android وiOS.</p><h2 dir="rtl">()nth-child:</h2><p dir="rtl">تسمح لك هذه الفئة الزائفة بتحديد العناصر بناءً على رقمها أو مكان ظهورها في الكود المصدري داخل الحاوي الخاص بها.</p><p dir="rtl">يمكنك أن تُعطي هذه الفئة رقمًا موجبًا وسوف تقوم هذه الفئة بتحديد العنصر الذي يتوافق ترتيبه داخل العنصر الحاوي الخاص به مع الرقم الموجب الذي أعطيته لها. فعلى سبيل المثال، القيمة التالية <span style="font-family:courier new,courier,monospace;">(li:nth-child(3</span> سوف تقوم بتحديد العنصر &lt;li&gt; الذي يكون ترتيبه هو الثالث داخل العنصر الأب الذي يحتويه.</p><p dir="rtl">يمكنك أيضًا أن تُعطيها القيمة "even" أو "odd" بحيث تقوم "even" بتحديد العناصر الزوجية (2، 4، 6، 8 ...الخ) وتقوم "odd" بتحديد العناصر الفردية (1، 3، 5، 7 ...الخ). فمثلًا <span style="font-family:courier new,courier,monospace;">(li:nth-child(even</span> سوف تقوم بتحديد جميع عناصر<span style="font-family:courier new,courier,monospace;"> &lt;li&gt;</span> الزوجية داخل العنصر الذي يحتويها و <span style="font-family:courier new,courier,monospace;">(li:nth-child(odd</span> سوف تقوم بتحديد جميع عناصر <span style="font-family:courier new,courier,monospace;">&lt;li&gt;</span> الفردية داخل العنصر الذي يحتويها.</p><p dir="rtl">تسمح لك هذه الفئة الزائفة أيضًا باختيار العناصر بناءً على معادلة (equation) تعطيها لها وتكون على الشكل :<span style="font-family:courier new,courier,monospace;">(nth-child(an+b</span> بحيث تقوم باستبدال a وb برقمين صحيحن (integers) من اختيارك وn تمثل الأرقام الموجبة (3،2،1،0 وهكذا).</p><p dir="rtl">وعلى سبيل المثال سوف تقوم القيمة :<span style="font-family:courier new,courier,monospace;">(nth-child(3n+1</span> بتحديد العنصر الإبن الأول ( لأنّ 3*0 +1=1) وسوف يقوم أيضًا بتحديد العنصر الإبن الرابع (لأنّ 3*1 +1=4) وأيضًا يتم تحديد العنصر الإبن السابع (لأنّ 3*2 +1=7) وهكذا دواليك.</p><p dir="rtl">ما تقوم به :<span style="font-family:courier new,courier,monospace;">(nth-child(an+b</span> هو أنّها تقوم بتقسيم العناصر الأبناء إلى عدد "a" من العناصر (المجموعة الأخيرة تأخذ الباقي) وبعدها تقوم بتحديد العنصر الذي يكون ترتيبه "b" داخل كل مجموعة. فعلى سبيل المثال سوف تقوم القيمة :<span style="font-family:courier new,courier,monospace;">(nth-child(3n+1</span> بتقسيم العناصر<span style="font-family:courier new,courier,monospace;"> &lt;li&gt;</span> إلى 3 مجموعات وتقوم بوضع الباقي في مجموعة رابعة (هذا في حالة أن عدد العناصر لا يقبل القسمة على 3) وبعدها تقوم بتحديد العنصر الأول من كل مجموعة.</p><p dir="rtl">الصورة التالية تُظهر نتيجة تطبيق <span style="font-family:courier new,courier,monospace;">(li:nth-child(3n+1</span> على 11 عنصر <span style="font-family:courier new,courier,monospace;">&lt;li&gt;</span>، وبما أنّ a=3 فإنّه سوف يتم قسمة العناصر العشرة على 3 وبما أنّ 3/11 يساوي 3 والباقي 2 فإنّه سيتم وضع العنصرين الأخيرين في مجوعة رابعة منفصلة، وبعد ذلك سوف يتم اختيار العنصر الأول من كل مجموعة (لأنّ b=1). العناصر الملونة باللون الأزرق هي التي سوف يتم اختيارها.</p><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_10/nth-child-example.png.98c5f2874fea28939d3d740810ba518a.png"><img data-fileid="5773" class="ipsImage ipsImage_thumbnailed" alt="nth-child-example.thumb.png.5b8bd7f3ac77" src="https://academy.hsoub.com/uploads/monthly_2015_10/nth-child-example.thumb.png.5b8bd7f3ac779976b46b2bd4092ff907.png"></a></p><p dir="rtl">عندما تقوم بتمرير معادلة ما إلى الفئة الزائفة <strong>()nth-child:</strong> فإنّ المتصفح يقوم بالمرور على جميع العناصر الأبناء الموجودة داخل أحد العناصر وبعدها يقوم بتحديد العناصر التي تتوافق مع المعادلة. أيّ أنّ العناصر يتم معاملتها على أنها مصفوفة (array) وكل عنصر لديه رقم خاص به وقد يتطابق أو لا يتطابق مع نتيجة المعادلة.</p><h3 dir="rtl">بعض الملاحظات</h3><p dir="rtl">قد يكون التعامل مع <span style="line-height: 22.4px;"> </span><strong style="line-height: 22.4px;">()nth-child:</strong> شيئًا مربكًا ومشوشًا، ولا شك في أنّ القيام بالحسابات التي تتطلبها هذه الفئة لن يكون أمرًا سهلًا وممتعًا، ولهذا السبب فقد قام البعض بتطوير مجموعة من الأدوات التي تجعل الأمر أسهل وأيسر وهذه بعض منها:</p><ul dir="rtl"><li><a rel="external nofollow" href="http://lea.verou.me/demos/nth.html">CSS3 structural pseudo-class selector tester</a></li><li><a rel="external nofollow" href="http://nth-test.com/">NTH-TEST – nth-child and nth-of-type tester</a></li></ul><p dir="rtl">وكما هو الحال بالنسبة للفئات الزائفة السابقة فإنّ الفئة الزائفة <span style="line-height: 22.4px;"> </span><strong style="line-height: 22.4px;">()nth-child:</strong> يمكن استخدامها مع محددات (selectors) أخرى مثل<strong> :hover </strong>و<strong>::before</strong>. لاحظ في المثال التالي كيف استخدمنا <span style="line-height: 22.4px;"> </span><strong style="line-height: 22.4px;">()nth-child:</strong> مع <strong>:hover</strong>:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">li:nth-child(2n+3)::after {
    /* styles here */
}

tr:nth-child(even):hover {
    background-color: lightblue;
}</pre><p>هناك فئة زائفة أخرى تعمل بشكل مشابه للفئة الزائفة <strong><span style="font-family: 'courier new', courier, monospace; line-height: 22.4px;">()nth-child:</span></strong> وهذه الفئة هي<strong> <span style="font-family:courier new,courier,monospace;">()nth-last-child:</span></strong> والفرق الجوهري بينهما هو أنّ الأخيرة تبدأ من العنصر الأخير بدلًا من العنصر الأول.</p><p>هناك أيضًا الفئة <strong><span style="font-family:courier new,courier,monospace;">()nth-of-type:</span></strong> وهي تشبه الفئة<span style="font-family:courier new,courier,monospace;"> <strong>()nth-child:</strong> </span>إلّا أنّ الأولى تقوم بتحديد العناصر إذا كانت تلك العناصر من نوع محدد.</p><h3 dir="rtl">أمثلة أخرى</h3><p dir="rtl">في المثال التالي سوف يتم تحديد الصفوف الأفقية في الجداول وإعطاؤها لون خلفية رمادي (<strong>#eee</strong>).</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">tr:nth-child(even) {
    background-color: #eee;
}</pre><p>تعتبر الأسطر التالية كلها صالحة:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">li:nth-child(-n+1) {}

p:nth-child(odd) {}

tr:nth-child(2n) {} 

article:nth-child(2n+1) {} 

li:nth-child(4n+1) {}</pre><p><a rel="external nofollow" href="http://tympanus.net/codrops-playground/SaraSoueidan/b0ciDKt5/editor">يمكنك الدخول على هذه المعاينة</a> والتلاعب بالمدخلات والأرقام لترى كيف يتم تحديد العناصر.</p><h3 dir="rtl">3- دعم المتصفحات</h3><p dir="rtl">هذه الفئة الزائفة مدعومة في متصفحات Chrome، Firefox، Safari، Opera 9.5+، Internet Explorer 9+ وفي متصفحات Android وiOS.</p>
]]></description><guid isPermaLink="false">189</guid><pubDate>Sun, 11 Oct 2015 22:41:05 +0000</pubDate></item><item><title>&#x623;&#x633;&#x627;&#x633;&#x64A;&#x627;&#x62A; Flexbox &#x641;&#x64A; CSS &#x645;&#x639; &#x623;&#x645;&#x62B;&#x644;&#x629; &#x639;&#x645;&#x644;&#x64A;&#x629;</title><link>https://academy.hsoub.com/programming/css/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-flexbox-%D9%81%D9%8A-css-%D9%85%D8%B9-%D8%A3%D9%85%D8%AB%D9%84%D8%A9-%D8%B9%D9%85%D9%84%D9%8A%D8%A9-r183/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_10/flexbox.png.411d69cebeddf01f10de9296e75fb6d6.png" /></p>

<div id="preview-contents"><div id="wmd-preview-section-84"><p>تطرقنا في أكاديمية حسوب سابقًا إلى <a href="https://academy.hsoub.com/programming/css/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-css-flexbox-%D9%88%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%87-%D9%84%D9%87%D9%8A%D9%83%D9%84%D8%A9-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r118/">أساسيات الصندوق المرن Flexbox</a> وكيف يُمكن للمطوّر استخدام هذه الخاصية الرائعة في CSS3، وفي هذا المقال سنكمل مع الأساسيات ولكن بتركيز على الأمثلة بعيدًا عن الكلام النظري، وللحصول على الفائدة المطلوبة من هذا الأمثلة من الضروري قراءة المقال الآنف الذكر، وتحديث المتصفح إلى آخر إصدار متوفّر لتطبيق وعرض الأمثلة بالشكل الصحيح.</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_10/flexbox.png.c000518e7906af0327b49a7acd5bd459.png"><img data-fileid="5511" class="ipsImage ipsImage_thumbnailed" alt="flexbox.thumb.png.de36807850514de977a6e1" src="https://academy.hsoub.com/uploads/monthly_2015_10/flexbox.thumb.png.de36807850514de977a6e19919e2fd71.png"></a></p><h2>إنشاء حاوية مرنة Flex Container</h2><p>إن الخطوة الأولى في هيكلة أجزاء الصفحة باستخدام الصندوق المرن flexbox هي إنشاء المستوعبة/الحاوية المرنة flex container، وذلك من خلال إسناد قيمة الخاصية <span style="font-family:courier new,courier,monospace;">display</span> إلى flex، مع الانتباه إلى إضافة البادئة <span style="font-family:courier new,courier,monospace;">webkit-</span> من أجل المتصفح ‹‹سفاري›› Safari.</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.flexcontainer {
   display: -webkit-flex;
   display: flex;
}</pre><h2>توضيع العناصر المرنة Flex Items ضمن صف Row</h2><p>عناصر الصندوق المرن ما هي إلا أبناء (عناصر فرعية) من الحاوية المرنة flex container، وتتموضع على طول محور رئيسي main axis ومحور جانبي cross axis، المحور الرئيسي هو أفقي افتراضيًا، ولذلك العناصر تتموضع ضمن صف، ومن الممكن تغيير اتجاه المحور الرئيسي من خلال إسناد<span style="font-family:courier new,courier,monospace;"> flex-direction</span> إلى القيمة column، والتي هي افتراضيا row.</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.flexcontainer {
   display: -webkit-flex;
   display: flex;
   -webkit-flex-direction: row;
   flex-direction: row;
}
</pre><div class="flexcontainer" style="display:-webkit-flex;display:flex;-webkit-flex-direction:row;flex-direction:row;min-height:300px;max-height:450px;background-color:#dce7f2;border:1px solid #2a4f73;"><div style="height:100px; width:100px; background-color:#e46119; border:1px solid #626262; margin:3px;"> </div><div style="height:100px; width:100px; background-color:#e46119; border:1px solid #626262; margin:3px;"> </div><div style="height:100px; width:100px; background-color:#e46119; border:1px solid #626262; margin:3px;"> </div><div style="height:100px; width:100px; background-color:#e46119; border:1px solid #626262; margin:3px;"> </div></div><h2>توضيع العناصر المرنة Flex Items ضمن عمود Column</h2><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.flexcontainer {
   display: -webkit-flex;
   display: flex;
   -webkit-flex-direction: column;
   flex-direction: column;
}
</pre><div class="flexcontainer column" style="-webkit-flex-direction:column;flex-direction:column;min-height:300px;max-height:450px;background-color:#dce7f2;border:1px solid #2a4f73;"><div style="height:100px; width:100px; background-color:#e46119; border:1px solid #626262; margin:3px;"> </div><div style="height:100px; width:100px; background-color:#e46119; border:1px solid #626262; margin:3px;"> </div><div style="height:100px; width:100px; background-color:#e46119; border:1px solid #626262; margin:3px;"> </div><div style="height:100px; width:100px; background-color:#e46119; border:1px solid #626262; margin:3px;"> </div></div><h2>نقل العناصر المرنة Flex Items إلى الجهة العلوية</h2><p>يَعتمد نقل العناصر المرنة إلى الأعلى على اتجاه المحور الرئيسي main axis، فإن كان عموديًا vertical، يُمكن استخدام الخاصية <span style="font-family:courier new,courier,monospace;">align-items</span>، وإن كان أفقيًا horizontal، فيُمكن استخدام الخاصية <span style="font-family:courier new,courier,monospace;">justify-content</span>.</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.flexcontainer {
   -webkit-flex-direction: column;
   flex-direction: column;
   -webkit-justify-content: flex-start;
   justify-content: flex-start;
}
</pre><div class="flexcontainer column top" style="-webkit-flex-direction: column;flex-direction: column; -webkit-justify-content: flex-start; justify-content: flex-start; min-height:300px; max-height:450px; background-color:#dce7f2; border:1px solid #2a4f73;"><div style="height:100px;width:100px;background-color:#e46119;border:1px solid #626262;margin:3px;"> </div><div style="height:100px;width:100px;background-color:#e46119;border:1px solid #626262;margin:3px;"> </div><div style="height:100px;width:100px;background-color:#e46119;border:1px solid #626262;margin:3px;"> </div><div style="height:100px;width:100px;background-color:#e46119;border:1px solid #626262;margin:3px;"> </div></div></div><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.flexcontainer {
   display: -webkit-flex;
   display: flex;
   -webkit-flex-direction: row; 
   flex-direction: row;
   -webkit-align-items: flex-start;
   align-items: flex-start;
}
</pre><div class="flexcontainer row top" style="display: -webkit-flex; display: flex; -webkit-flex-direction: row; flex-direction: row; -webkit-align-items: flex-start;align-items: flex-start; min-height:300px; max-height:450px; background-color:#dce7f2; border:1px solid #2a4f73;"><div style="height:100px;width:100px;background-color:#e46119;border:1px solid #626262;margin:3px;"> </div><div style="height:100px;width:100px;background-color:#e46119;border:1px solid #626262;margin:3px;"> </div><div style="height:100px;width:100px;background-color:#e46119;border:1px solid #626262;margin:3px;"> </div><div style="height:100px;width:100px;background-color:#e46119;border:1px solid #626262;margin:3px;"> </div></div><h2>نقل العناصر المرنة Flex Items إلى جهة اليمين</h2><p>يَعتمد نقل العناصر إلى جهة اليسار أو جهة اليمين على اتجاه المحور الرئيسي أيضًا، فإن كان<span style="font-family:courier new,courier,monospace;"> flex-direction </span>معينًا إلى row (صف)، عندها يجب استخدام <span style="font-family:courier new,courier,monospace;">justify</span>-content، وإن كان مُعيّنًا إلى column (عمود)، عندها يجب استخدام <span style="font-family:courier new,courier,monospace;">align-items</span>.</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.flexcontainer {
   display: -webkit-flex;
   display: flex;
   -webkit-flex-direction: row; 
   flex-direction: row;
   -webkit-justify-content: flex-start;
   justify-content: flex-start;
}
</pre><div class="flexcontainer row left" style="display: -webkit-flex; display: flex;-webkit-flex-direction: row; flex-direction: row; -webkit-justify-content: flex-start; justify-content: flex-start; min-height:300px; max-height:450px; background-color:#dce7f2; border:1px solid #2a4f73;"><div style="height:100px;width:100px;background-color:#e46119;border:1px solid #626262;margin:3px;"> </div><div style="height:100px;width:100px;background-color:#e46119;border:1px solid #626262;margin:3px;"> </div><div style="height:100px;width:100px;background-color:#e46119;border:1px solid #626262;margin:3px;"> </div><div style="height:100px;width:100px;background-color:#e46119;border:1px solid #626262;margin:3px;"> </div></div><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.flexcontainer {
   display: -webkit-flex;
   display: flex;
   -webkit-flex-direction: column; 
   flex-direction: column;
   -webkit-align-items: flex-start;
   align-items: flex-start;
}
</pre><div class="flexcontainer column left" style="display: -webkit-flex;display: flex;-webkit-flex-direction: column; flex-direction: column;-webkit-align-items: flex-start;align-items: flex-start; min-height:300px; max-height:450px; background-color:#dce7f2; border:1px solid #2a4f73;"><div style="height:100px;width:100px;background-color:#e46119;border:1px solid #626262;margin:3px;"> </div><div style="height:100px;width:100px;background-color:#e46119;border:1px solid #626262;margin:3px;"> </div><div style="height:100px;width:100px;background-color:#e46119;border:1px solid #626262;margin:3px;"> </div><div style="height:100px;width:100px;background-color:#e46119;border:1px solid #626262;margin:3px;"> </div></div><h2>نقل العناصر المرنة Flex Items إلى جهة اليسار</h2><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint"> .flexcontainer {
   display: -webkit-flex;
   display: flex;
   -webkit-flex-direction: row;
   flex-direction: row;
   -webkit-justify-content: flex-end;
   justify-content: flex-end;
}</pre><p> </p><div class="flexcontainer row right" style="display: -webkit-flex;display: flex;-webkit-flex-direction: row;flex-direction: row;-webkit-justify-content: flex-end;justify-content: flex-end;min-height:300px; max-height:450px; background-color:#dce7f2; border:1px solid #2a4f73;"><div style="height:100px;width:100px;background-color:#e46119;border:1px solid #626262;margin:3px;"> </div><div style="height:100px;width:100px;background-color:#e46119;border:1px solid #626262;margin:3px;"> </div><div style="height:100px;width:100px;background-color:#e46119;border:1px solid #626262;margin:3px;"> </div><div style="height:100px;width:100px;background-color:#e46119;border:1px solid #626262;margin:3px;"> </div></div><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.flexcontainer {
   display: -webkit-flex;
   display: flex;
   -webkit-flex-direction: column;
   flex-direction: column;
   -webkit-align-items: flex-end;
   align-items: flex-end;
}
</pre><div class="flexcontainer column right" style="display: -webkit-flex;display: flex;-webkit-flex-direction: column;flex-direction: column;-webkit-align-items: flex-end;align-items: flex-end;min-height:300px; max-height:450px; background-color:#dce7f2; border:1px solid #2a4f73;"><div style="height:100px;width:100px;background-color:#e46119;border:1px solid #626262;margin:3px;"> </div><div style="height:100px;width:100px;background-color:#e46119;border:1px solid #626262;margin:3px;"> </div><div style="height:100px;width:100px;background-color:#e46119;border:1px solid #626262;margin:3px;"> </div><div style="height:100px;width:100px;background-color:#e46119;border:1px solid #626262;margin:3px;"> </div></div><h2>توسيط كافة العناصر باستخدام Flexbox</h2><p>يُعتبر توسيط العناصر في المستوعبة سواء كان عموديًا أو أفقيًا سهلًا للغاية، كل ما يجب فعله هو إسناد<span style="font-family:courier new,courier,monospace;"> justify-content</span> و/أو<span style="font-family:courier new,courier,monospace;"> align-items</span> إلى القيمة center، ويعتمد الأمر دائمًا على اتجاه المحور الأساسي main axis وذلك فيما إذا كان قيمة الخاصية <span style="font-family:courier new,courier,monospace;">flex-direction</span> مسندة إلى القيمة row أو column.</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.flexcontainer {
   display: -webkit-flex;
   display: flex;
   -webkit-flex-direction: row /* works with row or column */
   flex-direction: row;
   -webkit-align-items: center;
   align-items: center;
   -webkit-justify-content: center;
   justify-content: center;
}
</pre><div class="flexcontainer row center" style="display: -webkit-flex;display: flex;-webkit-flex-direction: row;flex-direction: row;-webkit-align-items: center;align-items: center;-webkit-justify-content: center;justify-content: center;min-height:300px; max-height:450px; background-color:#dce7f2; border:1px solid #2a4f73;"><div style="height:100px;width:100px;background-color:#e46119;border:1px solid #626262;margin:3px;"> </div><div style="height:100px;width:100px;background-color:#e46119;border:1px solid #626262;margin:3px;"> </div><div style="height:100px;width:100px;background-color:#e46119;border:1px solid #626262;margin:3px;"> </div> <div style="height:100px;width:100px;background-color:#e46119;border:1px solid #626262;margin:3px;"> </div></div><p> </p><div class="flexcontainer column center" style="display: -webkit-flex;display: flex;-webkit-flex-direction: column;flex-direction: column;-webkit-align-items: center;align-items: center;-webkit-justify-content: center;justify-content: center;min-height:300px; max-height:450px; background-color:#dce7f2; border:1px solid #2a4f73;"><div style="height:100px;width:100px;background-color:#e46119;border:1px solid #626262;margin:3px;"> </div><div style="height:100px;width:100px;background-color:#e46119;border:1px solid #626262;margin:3px;"> </div><div style="height:100px;width:100px;background-color:#e46119;border:1px solid #626262;margin:3px;"> </div><div style="height:100px;width:100px;background-color:#e46119;border:1px solid #626262;margin:3px;"> </div></div><h2>تكبير حجم عنصر مرن Flex Item نسبة إلى العناصر المرنة الأخرى</h2><p>يُمكن تحديد كيف لعنصر مرن أن يزداد أو بنقص بالحجم نسبة إلى باقي العناصر الأخرى في المستوعبة، ولتطبيق ذلك يمكن إسناد القيمة المطلوبة ولكل عنصر ومن خلال الخاصية flex، ففي المثال التّالي، تمّ زيادة حجم أحد العناصر إلى ضعف حجم العنصر الآخر.</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.bigitem {
   -webkit-flex: 2 0 0; 
   flex: 2 0 0; 
}
.smallitem {
   -webkit-flex: 1 0 0;
   flex: 1 0 0;
}
</pre><div class="flexcontainer growshrink" style="-webkit-align-items: center;align-items: center;display: -webkit-flex;display: flex;-webkit-flex-direction: row;flex-direction: row;min-height: 300px;max-height: 450px;background-color: #dce7f2;border: 1px solid #2a4f73;"><div class="bigitem" style="-webkit-flex: 2 0 0; flex: 2 0 0; height:100px;width:100px;background-color:#e46119;border:1px solid #626262;margin:3px;"> </div><div class="smallitem" style="-webkit-flex: 1 0 0;flex: 1 0 0; height:100px;width:100px;background-color:#e46119;border:1px solid #626262;margin:3px;"> </div></div><h2>التفاف العناصر المرنة إلى صفوف Wrap flex items into rows</h2><p>تأخرت بعض المتصفحات في دعم هذه الخاصية مثل متصفح Firefox، على العموم من المفترض أن تعمل هذه الخاصية في الوقت الحالي مع جميع المتصفحات بإصداراتها الأخيرة.</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.flexcontainer {
   display: -webkit-flex;
   display: flex;
   -webkit-align-items: center;
   align-items: center;
   -webkit-justify-content: center;
   justify-content: center;
   /* You can set flex-wrap and flex-direction individually */
   -webkit-flex-direction: row;
   flex-direction: row;
   -webkit-flex-wrap: wrap;
   flex-wrap: wrap;
   /* Or do it all in one line with flex flow */
   -webkit-flex-flow: row wrap;
   flex-flow: row wrap;
   /* tweak the where items line up on the row */
   /* valid values are: flex-start, flex-end, space-between, space-around, stretch */
   -webkit-align-content: flex-end;
   align-content: flex-end;
}
</pre><div class="flexcontainer wrap row" style="-webkit-flex-flow: row wrap;flex-flow: row wrap;-webkit-align-content: flex-end;align-content: flex-end;-webkit-align-items: center;align-items: center;-webkit-justify-content: center;justify-content: center; display: -webkit-flex;display: flex;-webkit-flex-direction: row;flex-direction: row;min-height: 300px;max-height: 450px;background-color: #dce7f2;border: 1px solid #2a4f73;"><div style="height: 100px;width: 100px;background-color: #e46119;border: 1px solid #626262;margin: 3px;"> </div><div style="height: 100px;width: 100px;background-color: #e46119;border: 1px solid #626262;margin: 3px;"> </div><div style="height: 100px;width: 100px;background-color: #e46119;border: 1px solid #626262;margin: 3px;"> </div><div style="height: 100px;width: 100px;background-color: #e46119;border: 1px solid #626262;margin: 3px;"> </div><div style="height: 100px;width: 100px;background-color: #e46119;border: 1px solid #626262;margin: 3px;"> </div><div style="height: 100px;width: 100px;background-color: #e46119;border: 1px solid #626262;margin: 3px;"> </div><div style="height: 100px;width: 100px;background-color: #e46119;border: 1px solid #626262;margin: 3px;"> </div><div style="height: 100px;width: 100px;background-color: #e46119;border: 1px solid #626262;margin: 3px;"> </div><div style="height: 100px;width: 100px;background-color: #e46119;border: 1px solid #626262;margin: 3px;"> </div><div style="height: 100px;width: 100px;background-color: #e46119;border: 1px solid #626262;margin: 3px;"> </div><div style="height: 100px;width: 100px;background-color: #e46119;border: 1px solid #626262;margin: 3px;"> </div><div style="height: 100px;width: 100px;background-color: #e46119;border: 1px solid #626262;margin: 3px;"> </div></div><h2>التفاف العناصر المرنة إلى أعمدة Wrap flex items into columns </h2><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint" style="line-height: 22.4px;">.flexcontainer {
<span style="line-height: 22.4px;">   display: -webkit-flex;</span>
<span style="line-height: 22.4px;">   display: flex;</span>
<span style="line-height: 22.4px;">   -webkit-align-items: center;</span>
<span style="line-height: 22.4px;">   align-items: center;</span>
<span style="line-height: 22.4px;">   -webkit-justify-content: center;</span>
<span style="line-height: 22.4px;">   justify-content: center;</span>
<span style="line-height: 22.4px;">   -webkit-flex-flow: column wrap;</span>
<span style="line-height: 22.4px;">   flex-flow: column wrap;</span>
<span style="line-height: 22.4px;">   -webkit-align-content: stretch;</span>
<span style="line-height: 22.4px;">   align-content: stretch;</span>
<span style="line-height: 22.4px;">}</span>

</pre><div class="flexcontainer wrap column" style="-webkit-flex-flow: column wrap;flex-flow: column wrap;-webkit-align-content: stretch;align-content: stretch;-webkit-align-items: center;align-items: center;-webkit-justify-content: center;justify-content: center; -webkit-flex-direction: column;flex-direction: column;display: -webkit-flex;display: flex; row;min-height: 300px;max-height: 450px;background-color: #dce7f2;border: 1px solid #2a4f73;margin: 2rem auto;max-width: 750px; margin: 2rem auto;max-width: 750px;"><div style="height: 100px;width: 100px;background-color: #e46119;border: 1px solid #626262;margin: 3px;"> </div><div style="height: 100px;width: 100px;background-color: #e46119;border: 1px solid #626262;margin: 3px;"> </div><div style="height: 100px;width: 100px;background-color: #e46119;border: 1px solid #626262;margin: 3px;"> </div><div style="height: 100px;width: 100px;background-color: #e46119;border: 1px solid #626262;margin: 3px;"> </div><div style="height: 100px;width: 100px;background-color: #e46119;border: 1px solid #626262;margin: 3px;"> </div><div style="height: 100px;width: 100px;background-color: #e46119;border: 1px solid #626262;margin: 3px;"> </div><div style="height: 100px;width: 100px;background-color: #e46119;border: 1px solid #626262;margin: 3px;"> </div><div style="height: 100px;width: 100px;background-color: #e46119;border: 1px solid #626262;margin: 3px;"> </div></div><h2>إزالة المساحة بين الأعمدة أو الصفوف الملتفة</h2><p>تُقدّم الخاصية <span style="font-family:courier new,courier,monospace;">align-content</span> للمطوّر إمكانية توزيع المساحة حول الأعمدة والصفوف الملتفة wrapped، وذلك بتقديم الخيارات التالية:</p><ul><li>flex-start</li><li>flex-end</li><li>space-between</li><li>space-around</li><li>stretch</li></ul><p>ولإزالة المساحة حول الأعمدة الملتفة، يمكن إسناد <span style="font-family:courier new,courier,monospace;">align-content</span> إلى center.</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.flexcontainer {
   display: -webkit-flex;
   display: flex;
   -webkit-align-items: center;
   align-items: center;
   -webkit-justify-content: center;
   justify-content: center;
   -webkit-flex-flow: column wrap;
   flex-flow: column wrap;
   -webkit-align-content: center;
   align-content: center;

}
</pre><div class="flexcontainer wrap column nospace" style="display: -webkit-flex;display: flex;-webkit-align-items: center;align-items: center;-webkit-justify-content: center;justify-content: center;-webkit-flex-flow: column wrap;flex-flow: column wrap;-webkit-align-content: stretch;align-content: stretch;-webkit-align-items: center;align-items: center;-webkit-justify-content: center;justify-content: center;-webkit-align-content: center;align-content: center; min-height: 300px;max-height: 450px;background-color: #dce7f2;border: 1px solid #2a4f73;margin: 2rem auto;max-width: 750px; margin: 2rem auto;max-width: 750px;"><div style="height: 100px;width: 100px;background-color: #e46119;border: 1px solid #626262;margin: 3px;"> </div><div style="height: 100px;width: 100px;background-color: #e46119;border: 1px solid #626262;margin: 3px;"> </div><div style="height: 100px;width: 100px;background-color: #e46119;border: 1px solid #626262;margin: 3px;"> </div><div style="height: 100px;width: 100px;background-color: #e46119;border: 1px solid #626262;margin: 3px;"> </div><div style="height: 100px;width: 100px;background-color: #e46119;border: 1px solid #626262;margin: 3px;"> </div><div style="height: 100px;width: 100px;background-color: #e46119;border: 1px solid #626262;margin: 3px;"> </div><div style="height: 100px;width: 100px;background-color: #e46119;border: 1px solid #626262;margin: 3px;"> </div><div style="height: 100px;width: 100px;background-color: #e46119;border: 1px solid #626262;margin: 3px;"> </div></div><h2>تخصيص مكان العنصر في الحاوية</h2><p>يُمكن للمطوّر التحكم بقيمة <span style="font-family:courier new,courier,monospace;">align-items </span>لكل عنصر على حِدة باستخدام<span style="font-family:courier new,courier,monospace;"> align-self</span>، وكما يمكن أيضًا استخدام <span style="font-family:courier new,courier,monospace;">margins</span> لتحريك أي عنصر وفي أي اتجاه من الاتجاهات الأربعة، فمثلًا لتوزيع أعمدة الصّفحة يُمكن تحريك العنصر المرن إلى أقصى يسار مستوعبته من خلال إسناد<span style="font-family:courier new,courier,monospace;"> margin-right</span> إلى القيمة auto.</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.left {
   -webkit-align-self: flex-start;
   align-self: flex-start;
}

.right {
   margin-left: auto;
}
</pre><div class="flexcontainer pin column" style="-webkit-align-items: center;align-items: center;-webkit-flex-direction: column;flex-direction: column;display: -webkit-flex;display: flex;-webkit-flex-direction: column;flex-direction: column;min-height: 300px;max-height: 450px;background-color: #dce7f2;border: 1px solid #2a4f73;"><div style="height: 100px;width: 100px;background-color: #e46119;border: 1px solid #626262;margin: 3px;"> </div><div class="left" style="height: 100px;width: 100px;background-color: #e46119;border: 1px solid #626262;margin: 3px; -webkit-align-self: flex-start;align-self: flex-start;"> </div><div class="right" style="height: 100px;width: 100px;background-color: #e46119;border: 1px solid #626262;margin: 3px;margin-left: auto;"> </div><div style="height: 100px;width: 100px;background-color: #e46119;border: 1px solid #626262;margin: 3px;"> </div></div><h2>خاتمة</h2><p>خاصيّة الصندوق المرن خاصيّة رائعة ومن الضروري على مطوّر الويب إضافتها إلى أدواته في التطوير خاصة وأنها أصبحت مدعومة بشكل جيّد مع المتصفحات.</p><p>ترجمة وبتصرّف للمقال <a rel="external nofollow" href="http://www.sketchingwithcss.com/samplechapter/cheatsheet.html">The Ultimate Flexbox Cheat Sheet</a>.</p></div>
]]></description><guid isPermaLink="false">183</guid><pubDate>Sun, 04 Oct 2015 11:09:00 +0000</pubDate></item><item><title>&#x643;&#x644; &#x645;&#x627; &#x62A;&#x631;&#x64A;&#x62F; &#x645;&#x639;&#x631;&#x641;&#x62A;&#x647; &#x639;&#x646; &#x627;&#x644;&#x639;&#x646;&#x635;&#x631;&#x64A;&#x646; &#x627;&#x644;&#x632;&#x627;&#x626;&#x641;&#x64A;&#x646; after:: &#x648;before::</title><link>https://academy.hsoub.com/programming/css/%D9%83%D9%84-%D9%85%D8%A7-%D8%AA%D8%B1%D9%8A%D8%AF-%D9%85%D8%B9%D8%B1%D9%81%D8%AA%D9%87-%D8%B9%D9%86-%D8%A7%D9%84%D8%B9%D9%86%D8%B5%D8%B1%D9%8A%D9%86-%D8%A7%D9%84%D8%B2%D8%A7%D8%A6%D9%81%D9%8A%D9%86-after-%D9%88before-r182/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_10/css-before-after.png.594e942d918a798d33cc253a83a8dc1e.png" /></p>

<p>يُعتبر هذين العنصرين من العناصر المهمة التي يجب على أيّ مطور ويب أن يعرفها ويعرف كيفية استخدامها في بناء المواقع وفي هذا الدرس سوف تتعرف عليها وعلى كيفية استخدامها وسوف نتطرق للعديد من الأمثلة حتى تكون الفائدة أكبر.</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_10/css-before-after.png.52eb3ad9d44713207a29d8694e55f8b6.png"><img data-fileid="5435" class="ipsImage ipsImage_thumbnailed" alt="css-before-after.thumb.png.6ffe106641334" src="https://academy.hsoub.com/uploads/monthly_2015_10/css-before-after.thumb.png.6ffe106641334dce160d4340d8425873.png"></a></p><h2>تعريف بالعنصرين</h2><p>يُستخدم هذين العنصرين لإدخال محتوى معين (نص، أيقونة...الخ) بعد أو قبل المحتوى الموجود داخل أحد عناصر الصفحة (يمكنك من الاسم معرفة أنّ <span style="font-family:courier new,courier,monospace;">after::</span> تقوم بإدخال المحتوى بعد وأنّ <span style="font-family:courier new,courier,monospace;">before::</span> تقوم بإدخال المحتوى قبل). ويتم إدخال المحتوى باستخدام الخاصية <a rel="external nofollow" href="http://tympanus.net/codrops/css_reference/content"><code>content</code></a> ويتم عرض المحتوى المُدخل بجانب - أي على نفس الخط (inline)- المحتوى الأصلي للعنصر.</p><p>لنأخذ مثالًا بسيطًا حتى يتوضح الأمر. تخيل معي أنّك تريد أن تُضيف أيقونة صغيرة لجميع الروابط الموجودة في موقعك والتي تأخذ الزوار إلى مواقع خارجية بحيث تُفيد هذه الأيقونة بأنّ الرابط الذي يوشك الزائر على النقر عليه هو رابط لموقع خارجي وسوف يأخذه إلى موقع آخر.</p><p>هنا يأتي دور هذين العنصرين، فيمكن باستعمالهما أن نُضيف الأيقونة التي نريدها إمّا في بداية/قبل الروابط (باستعمال <span style="font-family:courier new,courier,monospace;">before::</span>) أو نهاية/بعد (باستعمال <span style="font-family:courier new,courier,monospace;">after::</span>) الروابط، وفي هذا المثال سوف نستعمل <code>after::</code> لإضافة الأيقونة <a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_10/Figure1-external-link-icon.png.441fba57f4e6ada82b69f81647dabac9.png"><img data-fileid="5432" class="ipsImage ipsImage_thumbnailed" alt="Figure1-external-link-icon.thumb.png.8c4" src="https://academy.hsoub.com/uploads/monthly_2015_10/Figure1-external-link-icon.thumb.png.8c463d0d51f1e9e75f11de10e07b71a9.png"></a> في نهاية جميع الروابط التي لها <span style="font-family:courier new,courier,monospace;">class</span> بالاسم <span style="font-family:courier new,courier,monospace;">"external"</span>.</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">Let's &lt;a href="http://movethewebforward.org/" class="external"&gt;Move The Web Forward&lt;/a&gt; together! </pre><p>الكود التالي يوضح كيفية فعل ذلك، بحيث تظهر الأيقونة إلى جانب الرابط على نفس الخط:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.external::after {
  content: url(external-link.png);
  padding-left: 5px; /* create some space between the image and the content before it */
}</pre><p>لاحظ أننا استعملنا الخاصية <span style="font-family:courier new,courier,monospace;">content</span> مع الدالة <span style="font-family:courier new,courier,monospace;">()url</span> لإضافة الصورة. ضع في الحسبان أنّ الصّور التي يتم إدخالها باستخدام العناصر الزائفة لا يمكن إعادة ضبط حجمها لذلك يجب عليك أن تضبط حجمها قبل أن تستعملها.</p><p dir="rtl"><a rel="external nofollow" href="http://tympanus.net/codrops-playground/SaraSoueidan/dYfExU3k/editor">معاينة النتيجة النهائية</a></p><p>لنأخذ مثالًا آخر ولكن هذه المرة باستعمال <span style="font-family:courier new,courier,monospace;">before::</span>. تخيّل أنّ هناك عنصر <span style="font-family:courier new,courier,monospace;">blockquote</span> وبداخله يوجد بعض النصوص، فيمكننا باستعمال <span style="font-family:courier new,courier,monospace;">before::</span> أن نقوم بتزيين هذا العنصر عن طريق إدخال علامة اقتباس قبل النص الموجود بداخله، بحيث سيتم إضافة علامة الاقتباس ولكنها لن تظهر في DOM.</p><blockquote><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">&lt;blockquote&gt;
    Your present circumstances don't determine where you can go; they merely determine where you start.—Nido Qubein
&lt;/blockquote&gt;</pre><p>الكود التالي سيقوم بإضافة علامة الاقتباس إلى عنصر <span style="font-family:courier new,courier,monospace;">blockquote</span> باستعمال <span style="font-family:courier new,courier,monospace;">before::</span>، وسوف تظهر علامة الاقتباس إلى جانب النص.</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">blockquote::before {
    content: "\201C";
    /* style the quote */
    color: deepPink;
    font-size: 3em;
    position: relative;
    top: 20px;
}</pre><p>قمنا باستعمال خاصية <span style="font-family:courier new,courier,monospace;">content</span> ووضعنا داخلها قيمة اليونيكود (Unicode) الخاصة بعلامة الاقتباس (<span style="font-family:courier new,courier,monospace;">201C\</span>). هذه هي الطريقة التي يتم بها عادة إضافة الرموز (glyphs) في CSS.<br><a rel="external nofollow" href="http://tympanus.net/codrops-playground/SaraSoueidan/D4fl7lIS/editor">معاينة النتيجة النهائية.</a></p><p>وبما أنّ المحتوى الذي يتم إدخاله باستخدام الفئات الزائفة لا يتم إدخاله وإظهاره في DOM فإنّك لن تستطيع رؤيته أو التعديل عليه باستخدام أدوات المطورين (Developer tools) الموجودة في المتصفحات. ولكن لحسن الحظ فإنّ متصفحات Google Chrome+32 وإضافة Firebug الخاصة بمتصفح Firefox يسمحون لك برؤية مكان وجود العناصر الزائفة في DOM، وأيضًا يمكنك رؤية تنسيقات CSS الخاصة بتلك العناصر والتعديل عليها.</p><p>ولرؤية ذلك بشكل مباشر يمكنك الدخول على المعاينات الموجودة في الأعلى ووضع مؤشر الفأرة على الأيقونة والنقر عليها بزر الفأرة الأيمن ومن ثم اختيار "<strong>Inspect element</strong>" (يجب أن ترى شيء شبيه بالصورة التالية):</p></blockquote><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_10/Figure2-inspecting-after.png.d9ce2098fbad7609f15c9e3214b889c0.png"><img data-fileid="5433" class="ipsImage ipsImage_thumbnailed" alt="Figure2-inspecting-after.thumb.png.a3aa6" src="https://academy.hsoub.com/uploads/monthly_2015_10/Figure2-inspecting-after.thumb.png.a3aa6432dd32a11ab1147fd53fbbe37f.png"></a></p><p>يمكنك من خلال المعاينة أو الصورة الموجودة في الأعلى ملاحظة أنّ المحتوى المُضاف باستخدام <span style="font-family:courier new,courier,monospace;">after::</span> يظهر/يتموضع بجانب وبعد المحتوى الموجود داخل علامتي الإقتباس.</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_10/Figure3-inspecting-before.png.6e7f99c8e53401bf837c0417b3ca0e29.png"><img data-fileid="5434" class="ipsImage ipsImage_thumbnailed" alt="Figure3-inspecting-before.thumb.png.d171" src="https://academy.hsoub.com/uploads/monthly_2015_10/Figure3-inspecting-before.thumb.png.d1718a59bcad372fa4a5adbe49064a39.png"></a></p><p>يمكنك أيضًا من خلال الصورة الموجودة في الأعلى ملاحظة أنّ المحتوى المُضاف باستخدام <span style="font-family:courier new,courier,monospace;">before::</span> يظهر/يتموضع بجانب وقبل المحتوى الموجود داخل علامتي الإقتباس.</p><p>وبما أنّ محتوى <span style="font-family:courier new,courier,monospace;">after::</span> يتم إدخاله بعد المحتوى الأصلي للعنصر فإنّ هذا يعني أنّ العنصر الزائف نفسه (<span style="font-family:courier new,courier,monospace;">after::</span> في حالتنا هذه) سوف يظهر فوق العناصر الأخرى التي تأتي قبله في DOM. (نقصد بكلمة "فوق" هنا كيفية ظهور/تكدُّس العناصر فوق بعضها البعض بالنسبة للخاصية z-index).</p><p>ونفس الأمر ينطبق على ::before، فالمحتوى المُدخل بواسطته يتم إدخاله بعد المحتوى الأصلي للعنصر وهذا يعني أنّ العنصر الزائف نفسه (::before في حالتنا هذه) سوف يظهر أسفل العناصر الأخرى التي تأتي بعده في الـDOM.</p><p>ضع في الحسبان أنّه يمكنك إدخال أي نوع من المحتوى مع العناصر الزائفة، فيمكنك مثلًا إدخال حروف خاصة (characters)، نصوص أو حتى صور. فعلى سبيل المثال جميع التعريفات/الأكواد التالية صحيحة:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.element::after {
    content: url(path/to/image.png); /* an image, for example, an icon */
}

.element::after {
    content: "(To be continued...)"; /* a string */
}

.element::after {
    content: "\201C"; /* also counts as a string. Escaping the unicode; renders it as a character */
}</pre><p>يمكن أيضًا للخاصية <span style="font-family:courier new,courier,monospace;">content</span> أن تحتوي على <a rel="external nofollow" href="http://tympanus.net/codrops/css_reference/counters/">عدّاد</a> <a rel="external nofollow" href="http://tympanus.net/codrops/css_reference/counters/">(counter)</a> ويمكنك كذلك أن تتركها فارغة إن أردت. فمن أحد استعمالات العناصر الزائفة عندما تكون خاصية <span style="font-family:courier new,courier,monospace;">content</span> الخاصة بها فارغة هو التخلص من floats في عنصر ما. يمكنك أيضًا تنسيق العناصر الزائفة مثلها مثل أي عنصر آخر، فتستطيع مثلًا إعطائها الخصائص <span style="font-family:courier new,courier,monospace;">float </span>،<span style="font-family:courier new,courier,monospace;">position</span> أو حتى <span style="font-family:courier new,courier,monospace;">animation</span> ( ضع في الحسبان أنّ خاصية <span style="font-family:courier new,courier,monospace;">animation</span> لا يمكن استعمالها مع العناصر الزائفة في جميع المتصفحات، فالمتصفحات التي تدعم ذلك هي (Chrome 26+، Firefox 4+، Safari 6.1+، Opera (post Blink وكذلك متصفحات +Internet Explorer 10. إنّ قدرتنا على تنسيق العناصر الزائفة كما لو كانت عنصرًا حقيقيًا في الصفحة أدى إلى استعمال هذه العناصر في معظم الحالات لأغراض تجميلية، فالعناصر الزائفة مستخدمة بكثافة لإنشاء الأشكال الهندسية (<a rel="external nofollow" href="http://www.samuelrossille.com/css-shape/">geometric shapes</a>) في CSS. فيمكننا مثلًا أن نقوم بإنشاء نجمة ثمانية باستخدام عنصر ما والعنصر الزائف الخاص به، وحتى نحصل على هذه النجمة سنقوم بإنشاء مربّعين؛ الأول باستعمال العنصر نفسه والثاني باستعمال العنصر الزائف بحيث نقوم بتنسيق العنصر الزائف ونعطيه عرض (<span style="font-family:courier new,courier,monospace;">width</span>) وارتفاع (<span style="font-family:courier new,courier,monospace;">height</span>) بنفس عرض وارتفاع العنصر الأب/الرئيسي ومن ثم موضعته إلى أعلى العنصر الأب باستعمال <span style="font-family:courier new,courier,monospace;">position: absolute</span> وأخيرًا تدويره بمقدار 45 درجة.</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">/* 
    The element and its pseudo-element are both made translucent using the `opacity` property in order to better visualize how the two are positioned in the demo. 
    By removing the opacity values, you can see a fully opaque eight-point star 
*/
.element {
    width: 250px;
    height: 250px;
    background-color: #009966;
    opacity: .8;
    position: relative;
    margin: 100px auto;
}

.element:after {
    content: "";
    position: absolute;
    display: block;
    width: 250px;
    height: 250px;
    background-color: #009966;
    opacity: .8;
    transform: rotateZ(45deg);
}</pre><p>لاحظ أننا تركنا الخاصية content فارغة وذلك لأننا استخدمنا العنصر الزائف لأغراض تجميلية فقط.</p><p dir="rtl"><a rel="external nofollow" href="http://tympanus.net/codrops-playground/SaraSoueidan/kFTn9yJk/editor">معاينة النتيجة النهائية</a><a rel="external nofollow" href="http://tympanus.net/codrops-playground/SaraSoueidan/kFTn9yJk/editor">.</a></p><p>ضع في الحسبان أنّه يمكننا الحصول على نفس النتيجة السابقة باستعمال <span style="font-family:courier new,courier,monospace;">before::</span> فلن يكون هناك أي اختلاف في النتيجة.</p><h2>بعض الملاحظات</h2><h3>1. هل تستعمل (:) أم (::)</h3><p>قد تكون قد صادفت في أحد المرات وجود العنصر الزائف after بهذا الشكل <code>after:</code> بدلًا من <code>after::</code> (نفس الأمر ينطبق على العنصر الزائف <code>before:</code>).</p><p>في CSS1 وCSS2 كان يتم تعريف العناصر الزائفة باستعمال (<span style="font-family:courier new,courier,monospace;">:</span>) بدل (<span style="font-family:courier new,courier,monospace;">::</span>) كما هو الحال في الفئات الزائفة (<span style="font-family:courier new,courier,monospace;">hover:</span> على سبيل المثال). ولكن الأمر تغيّر في CSS3 فقد أصبح يتم تعريفها باستعمال (<span style="font-family:courier new,courier,monospace;">::</span>) بدل (<span style="font-family:courier new,courier,monospace;">:</span>) وذلك حتى نستطيع التمييز بينها وبين الفئات الزائفة، أي أنّ العناصر الزائفة أصبحت تُكتب باستعمال (<span style="font-family:courier new,courier,monospace;">::</span>) والفئات الزائفة بقيت تُكتب باستعمال (<span style="font-family:courier new,courier,monospace;">:</span>).</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">/* old CSS2 syntax */
.element:after {
    /* content and styles here */
}

/* new CSS3 syntax */
.element::after {
    /* content and styles here */
}</pre><p>جميع المتصفحات التي تدعم (<strong><span style="font-family:courier new,courier,monospace;">::</span></strong>) تقوم أيضًا بدعم (<span style="font-family:courier new,courier,monospace;">:</span>) (أي أنّك إذا كتبت العناصر الزائفة بهذا الشكل: <strong><span style="font-family:courier new,courier,monospace;">after:</span></strong> أو <strong><span style="font-family:courier new,courier,monospace;">after::</span></strong> فلن يكون هناك مشكلة)، ولكن إذا أردت أن تدعم متصفح Internet Explorer 8 فعليك أن تستخدم (<span style="font-family:courier new,courier,monospace;">:</span>) لأنّ هذا المتصفح لا يدعم العناصر الزائفة إذا كُتبت باستعمال (<span style="font-family:courier new,courier,monospace;">::</span>).</p><p>لاحظ أننا استعملنا (<span style="font-family:courier new,courier,monospace;">:</span>) بدل (<span style="font-family:courier new,courier,monospace;">::</span>) في جميع المعاينات والأكواد التي عرضناها سابقًا وذلك حتى نضمن أفضل دعم لجميع المتصفحات وحتى يستطيع مستخدموا Internet Explorer 8 من رؤية المعاينات بدون مشاكل.</p><h3>2. الوصولية (Accessibility)</h3><p>قلنا مسبقًا بأنّ المحتوى المُضاف بواسطة العناصر الزائفة لا يتم إدخاله أو إظهاره في DOM وإنّما يظهر بصريًا فقط (أي يمكنك رؤيتها على الشاشة). وبالتالي فإنّ قارئات الشاشة (screen readers) لن تكون قادرة على رؤية المحتوى المُضاف بواسطة العناصر الزائفة أو الوصول إليه. ولهذا السبب فإنّه يُنصح بعدم استعمال العناصر الزائفة لإدخال أي محتوى تعتقد أنّه مهم في الموقع.</p><p>فالعناصر الزائفة تُستخدم في الغالب لإدخال وتنسيق المحتوى التجميلي ولا يجب عليك استخدامها في إدخال المحتوى المهم والذي قد يكون له صلة بمعنى المحتوى واكتماله في الصفحة.</p><p>وبما أنّ المحتوى المُضاف بواسطة العناصر الزائفة لا يتم إدخالها أو إظهارها في DOM، فهذا يعني أننا لن نستطيع ربطها بمعالجات الأحداث (event handlers) في لغة جافاسكربت.</p><h2>أمثلة إضافية</h2><p>يمكن استعمال العناصر الزائفة مثل <code>::after</code> لفعل الكثير من الأشياء وإنشاء الكثير من التأثيرات، فبالإضافة إلى الأمثلة التي رأيتها سابقًا فيمكنك الإطلاع على المقالات التالية للمزيد من المعلومات عن هذه العناصر.</p><ul><li><a rel="external nofollow" href="http://www.bennadel.com/blog/2445-Using-CSS-Pseudo-Elements-before-And-after.htm">استخدام العناصر الزائفة <code>:after</code> و<code>:before</code>.</a><br>1- استخدام <span style="font-family:courier new,courier,monospace;">after::</span> لتنسيق الروابط الموجودة في تنسيقات الطباعة (print style sheets).<br>أحد أكثر الاستخدامات المفيدة للعنصر الزائف <code>after::</code> يظهر في تنسيقات الطباعة، ففي الأوراق المطبوعة لا يمكننا النقر على الروابط كما هو الحال في الأجهزة الالكترونية كالحواسيب والهواتف، وبالتالي فسوف تحتاج في الغالب بأن تضع عنوان الرابط (URL) بجانب الرابط مباشرة حتى يستطيع القارئ ان يقوم بزيارة الرابط إن أراد ذلك. ولمعرفة كيفية فعل ذلك أنظر إلى الكود التالي:<pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">@media print { a[href]::after { content: " (" attr(href) ")"; } } </pre>يحتوي المثال في الأعلى على عدة مبادئ من مبادئ CSS مثل مُحدّد الصفة <span style="font-family:courier new,courier,monospace;">(a[href</span>]) (<span style="line-height: 22.4px; text-align: right;">attribute selector)</span> وخاصية <code>content</code> وكاذلك الدالة <span style="font-family:courier new,courier,monospace;">()</span><code>attr</code> وهذا شرح لما تفعله كل واحدة منها:</li><li>يقوم مُحدّد الصفة <span style="font-family:courier new,courier,monospace;">([a[href)</span> بتحديد جميع الروابط (وسوم <code>a</code>) الموجودة في الصفحة والتي تملك الصفة <code>href</code>.</li><li>يُخبر العنصر الزائف <code>after::</code> المتصفح بأن يختار الروابط التي تم تحديدها وأن يقوم بإدخال القيمة الموجودة في الخاصية <code>content</code> إلى نهاية المحتوى الموجود في كل رابط.</li><li>يمكن للخاصية <code>content</code> أن تقبل العديد من القيم وأحد هذه القيم هو النصوص/سلسلة محارف (string) ويمكن أن يتم تقسيم سلسلة المحارف إلى عدة أجزاء وكل جزء يجب أن يكون موجودًا داخل علامات اقتباس، وإذا كان هناك مجموعة من هذه السلاسل (multiple strings) فسوف يتم دمجها.</li><li><p>تقوم الدالة <span style="font-family:courier new,courier,monospace;">()<code>attr</code></span> بأخذ ما هو موجود داخل أحد الصفات (<span style="font-family:courier new,courier,monospace;">attribute</span>) وتقوم بإرجاعه على شكل سلسلة محارف للخاصية <code>content</code> الموجودة في العنصر الزائف (<code>after::</code> في حالتنا هذه).<br>إذاً فالشيفرة البرمجية الموجودة في الأعلى تختار جميع الروابط التي لها صفة <code>href</code> (وذلك باستعمال مُحدّد الصفة) ومن ثم تقوم باستخراج القيمة الموجودة في صفة <code>href</code> (باستعمال دالة <span style="font-family:courier new,courier,monospace;">()attr</span>) وبعد ذلك تقوم باستخدام تلك القيمة كقيمة للخاصية <span style="font-family:courier new,courier,monospace;"><code>content</code></span> وأخيرًا تظهر القيمة الموجودة في الخاصية <span style="font-family:courier new,courier,monospace;"><code>content</code></span> في نهاية الروابط كما نريد.<br>لاحظ أيضًا أننا استخدمنا <span style="font-family:courier new,courier,monospace;">media print@</span> وذلك لأننا نريد أن يظهر نص الرابط فقط عندما يقوم أحدهم بطباعة الصفحة على ورقة.<br><a rel="external nofollow" href="http://tympanus.net/codrops-playground/SaraSoueidan/AuXAZ3c8/editor">يمكنك معاينة النتيجة النهائية من هنا</a> (ضع في عين الإعتبار أننا لم نقم باستعمال <span style="font-family:courier new,courier,monospace;">media print@</span> في هذه المعاينة لأننا نريد توضيح الفكرة فقط).</p></li></ul><h2>معاينة مباشرة لبعض الأمثلة</h2><p>المعاينة التالية سوف تستخدم <code>after::</code> لإضافة سهم صغير إلى بعض عناصر القائمة الرئيسية التي تحتوي على قوائم فرعية بداخلها، وعندما يقوم المستخدم بوضع مؤشر الفأرة على أحد تلك العناصر فإنّ القوائم الفرعية تظهر ويتم أيضًا استبدال السهم بسهم آخر وذلك عن طريق تغيير القيمة الموجودة في الخاصية <span style="font-family:courier new,courier,monospace;"><code>content</code></span>.<br><a rel="external nofollow" href="http://tympanus.net/codrops-playground/SaraSoueidan/RETvk1HZ/editor">مشاهدة المعاينة</a><br>إنّ استبدال القيمة الموجودة في الخاصية <code>content</code> (استبدال السهم الذي رأسه لأسفل بسهم آخر رأسه للأعلى) يمكن أن يحدث بسبب أنّه يمكن استخدام العناصر الزائفة والفئات الزائفة مع بعضها، فعلى سبيل المثال يمكن استخدام <span style="font-family:courier new,courier,monospace;"><code>li:hover::after</code></span> بحيث يتم تحديد الفئة الزائفة <code>after::</code> عندما يقوم المستخدم بوضع مؤشر الفأرة فوق أحد عناصر القائمة الرئيسية التي تحتوي عناصر فرعية.<br><a rel="external nofollow" href="http://tympanus.net/codrops-playground/SaraSoueidan/t638YeVe/editor">يمكنك الاطلاع على هذه المعاينة أيضًا لمثال آخر.</a></p><h2>دعم المتصفحات</h2><p>إنّ دعم المتصفحات للعناصر الزائفة <code>after:</code> و<code>before:</code> ممتاز فهو مدعوم في جميع المتصفحات تقريبًا، ولكن كما قلنا سابقًا فإنّ متصفح Internet Explorer 8 لا يدعم استخدام (<span style="font-family:courier new,courier,monospace;">::</span>) في العناصر الزائفة، لذلك إن أردت دعم هذا المتصفح فإن عليك استخدام (<span style="font-family:courier new,courier,monospace;">:</span>) بدلًا من (<span style="font-family:courier new,courier,monospace;">::</span>).</p><p><strong>ملاحظة</strong>: متصفحات Internet Explorer لا تدعم استخدام الخاصية <span style="font-family:courier new,courier,monospace;"><code>z-index</code> </span>مع العناصر الزائفة.</p><p>ترجمة -وبتصرّف- للمقال <a rel="external nofollow" href="http://tympanus.net/codrops/css_reference/after">after</a><a rel="external nofollow" href="http://tympanus.net/codrops/css_reference/after">::</a> لصاحبته Sara Soueidan.</p>
]]></description><guid isPermaLink="false">182</guid><pubDate>Fri, 02 Oct 2015 22:44:00 +0000</pubDate></item><item><title>&#x62A;&#x646;&#x633;&#x64A;&#x642; &#x648;&#x62A;&#x62E;&#x635;&#x64A;&#x635; &#x645;&#x62F;&#x62E;&#x644;&#x627;&#x62A; &#x627;&#x644;&#x645;&#x644;&#x641;&#x627;&#x62A; (file inputs) &#x628;&#x627;&#x644;&#x637;&#x631;&#x64A;&#x642;&#x629; &#x627;&#x644;&#x635;&#x62D;&#x64A;&#x62D;&#x629;</title><link>https://academy.hsoub.com/programming/css/%D8%AA%D9%86%D8%B3%D9%8A%D9%82-%D9%88%D8%AA%D8%AE%D8%B5%D9%8A%D8%B5-%D9%85%D8%AF%D8%AE%D9%84%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-file-inputs-%D8%A8%D8%A7%D9%84%D8%B7%D8%B1%D9%8A%D9%82%D8%A9-%D8%A7%D9%84%D8%B5%D8%AD%D9%8A%D8%AD%D8%A9-r180/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_09/css-file-input.png.4c3b8dfcdd0bfee1baf53b321dc9f82f.png" /></p>

<p dir="rtl">سوف نتطرق في هذا الدرس إلى كيفية تنسيق وتخصيص عناصر <span style="font-family:courier new,courier,monospace;">&lt;"input type="file&gt;</span> بالطريقة الصحيحة والسليمة وباستعمال العنصر<span style="font-family:courier new,courier,monospace;"> &lt;label&gt;</span> وبعض الجافاسكربت.</p><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/css-file-input.png.6bc253b60f2de3119fe2e88d05aa7a52.png"><img data-fileid="5402" class="ipsImage ipsImage_thumbnailed" alt="css-file-input.thumb.png.b606250b62dfec3" src="https://academy.hsoub.com/uploads/monthly_2015_09/css-file-input.thumb.png.b606250b62dfec35e7d321a6c9161861.png"></a></p><p dir="rtl"><a rel="external nofollow" href="http://tympanus.net/Tutorials/CustomFileInputs/">معاينة النتيجة النهائية</a><a rel="external nofollow" href="http://tympanus.net/Tutorials/CustomFileInputs/">.</a></p><p dir="rtl">يمكنك <a class="ipsAttachLink" href="https://academy.hsoub.com/applications/core/interface/file/attachment.php?id=5348">تحميل الشيفرة المصدرية للأمثلة من هنا.</a></p><p dir="rtl">هناك العديد من الطرق لتخصيص العنصر <span style="font-family:courier new,courier,monospace;">&lt;"input type="file&gt;</span> وقد جربت العديد منها ولكنها لم تعجبني ولم تُلبّي متطلباتي. لذلك حاولت البحث في Google ولكني لم أجد مبتغاي. وبعد أن فقدت الأمل وظننت أنني لن أجد ما أبحث عنه وقعت عيني بالصدفة على أحد التعليقات الموجودة في موقع StackOverflow، وكان ذلك التعليق يحتوي على كلمة "<span style="font-family:courier new,courier,monospace;">&lt;label&gt;</span>" وكان ذلك بداية الخيط وأعتقد أنّه ما كنت أبحث عنه.</p><p dir="rtl">وكما تعلمون فالنقر على عنصر <span style="font-family:courier new,courier,monospace;">label</span> يؤدي إلى تفعيل أحد عناصر <span style="font-family:courier new,courier,monospace;">&lt;input&gt; </span>مرتبطة به، ومما يثير الاهتمام أنّه إذا كان ذلك العنصر عبارة عن  <span style="font-family:courier new,courier,monospace;">&lt;"input type="file&gt;</span> فإنّ النقر على الـlabel المرتبطة به يؤدي إلى فتح متصفح الملفات وهذا هو الحل المثالي الذي كنت أبحث عنه.</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">&lt;input type="file" name="file" id="file" class="inputfile" /&gt;

&lt;label for="file"&gt;Choose a file&lt;/label&gt;</pre><p dir="rtl">أي أنّ النقر على أي واحد من هذين العنصرين (<span style="font-family:courier new,courier,monospace;">&lt;label&gt;</span> أو <span style="font-family: 'courier new', courier, monospace; line-height: 22.4px;">&lt;"input type="file&gt;</span>) سوف يعطي نفس النتيجة وهي فتح متصفح الملفات، وهذا يعني أنّ أصعب جزء قد تم حلُّه. لن نحتاج إلى جافاسكربت أو حلول معقدة، كل ما نحتاجه هو السطرين البرمجيين الموجودين في الأعلى. أنظر إلى الصورة في الأسفل.</p><p dir="rtl" style="text-align: center;"><a href="https://academy.hsoub.com/uploads/monthly_2015_09/Figure2-smart-custom-file-input-1.thumb.gif.bbb12dedaf5be71e7ccf3eab057cba28-compressor.gif.71a2307f9bd3e5af399e287dd14efc33.gif" class="ipsAttachLink ipsAttachLink_image"><img data-fileid="5404" src="https://academy.hsoub.com/uploads/monthly_2015_09/Figure2-smart-custom-file-input-1.thumb.gif.bbb12dedaf5be71e7ccf3eab057cba28-compressor.thumb.gif.a925db3229caa364a1124d1ee02f7b39.gif" class="ipsImage ipsImage_thumbnailed" alt="Figure2-smart-custom-file-input-1.thumb."></a></p><p dir="rtl" style="text-align: center;"> </p><p dir="rtl">دعونا الآن نقوم بتنسيق العناصر حتى تبدو وكأنّنا نملك زرا عاديا.</p><h2 dir="rtl">إخفاء عنصر &lt;input&gt;</h2><p dir="rtl">في البداية يجب علينا إخفاء العنصر<span style="font-family:courier new,courier,monospace;"> &lt;input&gt;</span>، وسوف تتكفل الخاصيتين <span style="font-family:courier new,courier,monospace;">display: none</span> أو <span style="font-family:courier new,courier,monospace;">visibility: hidden</span> بذلك. لماذا نريد إخفاءه؟ لأنّ قيمة المُدخل (input) لن يتم ارسالها إلى الخادوم عندما نقوم بعمل تسليم (submit) للنموذج. والسبب الثاني هو أننا لا نريد أن يتم تحديد ذلك العنصر عندما يقوم الزائر بتصفح الموقع باستعمال الزر tab الموجود على لوحة المفاتيح (لأننا نريد لموقعنا أن يكون قابل للوصول accessible). وبناءً على ذلك قمت باستعمال تنسيقات CSS التي تراها في الأسفل التي سوف تعمل على إخفاء العنصر عن أنظارنا ولكنه سيبقى مرئي بالنسبة للمتصفح نفسه:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.inputfile {

    width: 0.1px;
    height: 0.1px;
    opacity: 0;
    overflow: hidden;
    position: absolute;
    z-index: -1;
}</pre><p dir="rtl">قد تتسائل لماذا وضعنا القيمة 0.1px لكل من العرض والارتفاع وليس 0px. يعود السبب في ذلك إلى أنّه إذا أعطينا عنصر ما عرض وارتفاع بقيمة 0px فإنّنا لن نتمكن من استخدام زر tab على تلك العناصر في بعض المتصفحات. وأمّا بالنسبة للخاصية<span style="font-family:courier new,courier,monospace;"> position: absolute</span> فقد استخدمناها حتى نمنع أن يتداخل العنصر مع العناصر الأخرى.</p><h2 dir="rtl">تنسيق العنصر &lt;label&gt;</h2><p dir="rtl">بما أنّ العنصر <span style="font-family:courier new,courier,monospace;">&lt;label&gt;</span> هو الزر افتراضيًا فإننا نستطيع تنسيق هذا العنصر كما نريد. سنقوم بشيء بسيط هنا ولن نجعل التنسيقات معقدة:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.inputfile + label {

    font-size: 1.25em;
    font-weight: 700;
    color: white;
    background-color: black;
    display: inline-block;
}

.inputfile:focus + label,
.inputfile + label:hover {

    background-color: red; 
}</pre><h2 dir="rtl">الوصولية (accessibility)</h2><p dir="rtl">كيف يمكنك أن تعرف بأنّ أحد عناصر الصفحة قابل للنقر عليه؟ هناك شيئان يدلان على ذلك، الأول هو أنّ العنصر يجب أن يظهر عليه ذلك، بحيث يعطيك شعورًا بأنّه يمكنك النقر عليه أو استعمال زر tab، والثاني هو أنّه يجب أن يتغير مؤشر الفأرة إلى شيء مناسب عندما تقوم بوضع مؤشر الفأرة عليه. وبما أننا قمنا بفعل الشيء الأول سابقًا (من خلال التنسيقات الموجودة في الأعلى) فسوف نهتم بالشيء الثاني (تغير مؤشر الفأرة عند وضعه عليه) باستعمال بعض الأكواد البسيطة:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.inputfile + label {

    cursor: pointer; /* "hand" cursor */
}</pre><p dir="rtl">أنظر إلى الصورتين التاليتين ولاحظ أنّ في الصورة الأولى لا يتغير مؤشر الفأرة على عكس الصورة الثانية التي يتغير فيها مؤشر الفأرة عند وضعه على العنصر ليعطي انطباعًا بأنّ هذا العنصر قابل للنقر.</p><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/Figure3-smart-custom-file-input-2.gif.71363fdf18a42040b797d1d94a4df077.gif"><img data-fileid="5351" class="ipsImage ipsImage_thumbnailed" alt="Figure3-smart-custom-file-input-2.thumb." src="https://academy.hsoub.com/uploads/monthly_2015_09/Figure3-smart-custom-file-input-2.thumb.gif.f59cad1f77f28d10e99df913f110c815.gif"></a></p><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/Figure4-smart-custom-file-input-3.gif.6caa3c3ea2696027759b95081c35b8d6.gif"><img data-fileid="5352" class="ipsImage ipsImage_thumbnailed" alt="Figure4-smart-custom-file-input-3.thumb." src="https://academy.hsoub.com/uploads/monthly_2015_09/Figure4-smart-custom-file-input-3.thumb.gif.9d7e5f0053baba0a2f96e0e450473efb.gif"></a></p><h2 dir="rtl">التصفح/التنقل باستخدام لوحة المفاتيح</h2><p dir="rtl">إن كان زوار موقعك لا يستطيعون تصفح موقعك باستخدام لوحة مفاتيح فقط فتأكد حينها أنّك تقوم بشيء خاطئ ويجب عليك اصلاحه. وقد كان إخفاء عنصر <span style="font-family:courier new,courier,monospace;">&lt;input&gt; </span>بطريقة صحيحة هو أحد الأشياء الجيدة لتحسين تجربة المستخدم، وأمّا الشيء الآخر هو أن تُعطي للمستخدم انطباعًا ما بأنّ العنصر قد أصبح في حالة focus (يُصبح العنصر في حالة focus عند التصفح باستخدام زر tab في لوحة المفاتيح، وبالتالي نستطيع استخدام الفئة الزائفة <span style="font-family:courier new,courier,monospace;">focus:</span> على ذلك العنصر):</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.inputfile:focus + label {

    outline: 1px dotted #000;
    outline: -webkit-focus-ring-color auto 5px;
}</pre><p dir="rtl">تُستخدم القيمة <strong>webkit-focus-ring-color auto 5px</strong> من أجل الحصول على المظهر الإفتراضي للخط الخارجي (outline) في متصفحات Chrome، Opera وSafari. وبالنسبة للقيمة <strong>1px dotted #00</strong> فهي موجودة فقط للمتصفحات التي لا تفهم<span style="font-family:courier new,courier,monospace;"> -webkit-</span>.</p><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/Figure5-smart-custom-file-input-4.gif.03443623faa14f39fd5efbe23594a707.gif"><img data-fileid="5353" class="ipsImage ipsImage_thumbnailed" alt="Figure5-smart-custom-file-input-4.thumb." src="https://academy.hsoub.com/uploads/monthly_2015_09/Figure5-smart-custom-file-input-4.thumb.gif.d4afe978c33fc5c66ec887e5623adf4c.gif"></a></p><h2 dir="rtl">مشاكل متعلقة باللمس (touch)</h2><p dir="rtl">إذا كنت تستخدم <a rel="external nofollow" href="https://github.com/ftlabs/fastclick">FastClick</a> (وهي مكتبة للتخلص من الإيقاف المؤقت للنقر والذي مُدته 300ms في الأجهزة التي تعمل باللمس) وكنت تنوي إضافة عناصر إضافية داخل العنصر <span style="font-family:courier new,courier,monospace;">&lt;label&gt;</span>، فإنّ الزر لن يعمل كما يجب إلا إذا استخدمت الخاصية <span style="font-family:courier new,courier,monospace;">pointer-events: none</span>:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">&lt;label for="file"&gt;&lt;strong&gt;Choose a file&lt;/strong&gt;&lt;/label&gt;</pre><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.inputfile + label * {

    pointer-events: none;
}
</pre><h2 dir="rtl">تحسين بعض الأمور باستخدام الجافاسكربت</h2><p dir="rtl">بقي علينا شيء واحد يجب فعله وهو إظهار إذا ما كان هناك ملفات تم اختيارها أم لا. ومع أنّ العنصر <span style="font-family: 'courier new', courier, monospace; line-height: 22.4px;">&lt;"input type="file&gt;</span> يُظهر ذلك عادةً إلا أننا قمنا بإخفائه إن كنت تذكر، ولكن لحسن حظنا فهناك طريقة لفعل ذلك باستخدام الجافاسكربت بحيث نجعل نص الـlabel هو اسم الملف المُختار، وإذا كان هناك عدة ملفات فإنّ نص الـlabel يصبح عدد تلك الملفات:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">&lt;input type="file" name="file" id="file" class="inputfile" data-multiple-caption="{count} files selected" multiple /&gt;</pre><pre data-pbcklang="javascript" data-pbcktabsize="4" class="javascript ipsCode prettyprint">var inputs = document.querySelectorAll( '.inputfile' );

Array.prototype.forEach.call( inputs, function( input )
{

    var label = input.nextElementSibling;
    labelVal = label.innerHTML;

    input.addEventListener( 'change', function( e )
    {
        var fileName = '';

        if( this.files &amp;&amp; this.files.length &gt; 1 )
            fileName = ( this.getAttribute( 'data-multiple-caption' ) || '' ).replace( '{count}', this.files.length );
        else
            fileName = e.target.value.split( '\\' ).pop();

        if( fileName )
            label.querySelector( 'span' ).innerHTML = fileName;
        else
            label.innerHTML = labelVal;
    });
});</pre><p dir="rtl">قمت أيضًا بكتابة أكواد jQuery تقوم بنفس العمل، لذلك تأكد من أن تتصفح الملف المصدري إن كنت تفضل استخدام jQuery.</p><h3 dir="rtl">توضيح بسيط للأكواد الموجودة في الأعلى:</h3><ul dir="rtl"><li>وجود الصفة <strong>multiple</strong> في عنصر <span style="font-family:courier new,courier,monospace;">&lt;input&gt;</span> يسمح للمستخدم بأن يختار أكثر من ملف مرة واحدة. أمّا الصفة <strong>data-multiple-caption</strong> فهي تستخدم للتعبير عن الرسالة التي تريد أن تظهر للمستخدم عندما يقوم باختيار عدة ملفات. وبالنسبة للعبارة { count } فهي اختيارية وسوف يتم استبدالها برقم يُعبّر عن عدد الملفات المُختارة.</li><li>الصفة <strong>multiple</strong> غير مدعومة في متصفح Internet Explorer 9 أو أقل ولا حتى الخاصية files الخاصة بالجافاسكربت، ولذلك سوف نعتمد على value. وبما أنّها عادةً تحتوي على قيمة بالصيغة<span style="font-family:courier new,courier,monospace;"> C:\fakepath\filename.jpg</span> فإنّ <span style="font-family:courier new,courier,monospace;">()split( '\\' ).pop</span> تقوم باستخراج اسم الملف.</li><li>من المثير للاهتمام أنّه يمكنك إلغاء قيمة من المدخلات عن طريق الضغط على زر ESC عندما تكون نافذة تصفح الملفات مفتوحة، وهذا متاح فقط في متصفحي Chrome وOpera. ولهاذ استخدمنا المتغير labelVal لتخزين القيمة الافتراضية للـlabel وإرجاعها عند الحاجة لذلك.</li></ul><p dir="rtl">سوف تكون النتيجة النهائية كما في الصورة:</p><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/Figure6-smart-custom-file-input-5.thumb.gif.ce78677ace47b730df13f3167bd965ed-compressor.gif.d84fe218b14c59f913f5d9206410d352.gif"><img data-fileid="5403" class="ipsImage ipsImage_thumbnailed" alt="Figure6-smart-custom-file-input-5.thumb." src="https://academy.hsoub.com/uploads/monthly_2015_09/Figure6-smart-custom-file-input-5.thumb.gif.ce78677ace47b730df13f3167bd965ed-compressor.thumb.gif.484bfb5563409e31a6ab4d76a802bf2b.gif"></a></p><p dir="rtl" style="text-align: center;"> </p><h3 dir="rtl">ولكن ماذا لو كانت الجافاسكربت غير مفعلة؟</h3><p dir="rtl">بما أنّه لا يوجد طريقة أخرى غير الجافاسكربت لمعرفة إذا ما قام المستخدم باختيار ملف أم لا، فإنّه من الأفضل الاعتماد على المظهر الافتراضي لمُدخِل الملفات من أجل سهولة الاستخدام. لذلك كل ما علينا فعله هو إضافة class باسم "<strong>no-js</strong>" للعنصر <span style="font-family:courier new,courier,monospace;">&lt;html&gt;</span> ومن ثم نستخدم الجافاسكربت لاستبداله بالاسم "<strong>js</strong>" وبهذه الطريقة نعرف إذا كان الجافاسكربت مفعلًا أم لا.</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">&lt;html class="no-js"&gt;

&lt;head&gt;

&lt;!-- remove this if you use Modernizr --&gt;

&lt;script&gt;(function(e,t,n){var r=e.querySelectorAll("html")[0];r.className=r.className.replace(/(^|\s)no-js(\s|$)/,"$1js$2")})(document,window,0);&lt;/script&gt;

&lt;/head&gt;

&lt;/html&gt;</pre><p dir="rtl">وهذه تنسيقات CSS:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.js .inputfile {

    width: 0.1px;
    height: 0.1px;
    opacity: 0;
    overflow: hidden;
    position: absolute;
    z-index: -1;
}

.no-js .inputfile + label {

    display: none;
}</pre><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/Figure7-smart-custom-file-input-6.gif.41aee9e22c2b36d0290b1cd35653bb2b.gif"><img data-fileid="5355" class="ipsImage ipsImage_thumbnailed" alt="Figure7-smart-custom-file-input-6.thumb." src="https://academy.hsoub.com/uploads/monthly_2015_09/Figure7-smart-custom-file-input-6.thumb.gif.395882ab80275630bf345b9f0b614de6.gif"></a></p><h2 dir="rtl">خطأ في متصفح Firefox</h2><p dir="rtl">إنّه لمن المفاجئ معرفة أنّ متصفح Firefox يتجاهل<span style="font-family:courier new,courier,monospace;"> input[type="file"]:focus </span>بينما تعمل <span style="font-family:courier new,courier,monospace;">:hover</span> و<span style="font-family:courier new,courier,monospace;">:active</span> بشكل جيد. ولكن لحسن الحظ فإنّ هذا المتصفح يسمح لنا بالتعرف على حالة focus باستخدام الجافاسكربت، لذلك فإنّ الحل هو إضافة class للعنصر<span style="font-family:courier new,courier,monospace;"> &lt;input&gt;</span> ليسمح لنا بالتحكم بحالة الـfocus:</p><pre data-pbcklang="javascript" data-pbcktabsize="4" class="javascript ipsCode prettyprint">input.addEventListener( 'focus', function(){ input.classList.add( 'has-focus' ); });

input.addEventListener( 'blur', function(){ input.classList.remove( 'has-focus' ); });</pre><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.inputfile:focus + label,
.inputfile.has-focus + label {

    outline: 1px dotted #000;
    outline: -webkit-focus-ring-color auto 5px;
}
</pre><h2 dir="rtl">خاتمة</h2><p dir="rtl">إلى هنا نكون قد وصلنا إلى نهاية هذا الدرس. لذلك تأكد بأن تطلع على الشفرة المصدرية وعلى المعاينات وأن تقوم بالتعديل عليها لتتناسب مع احتياجاتك وذوقك. كما أنّ لديك الحرية الكاملة في استخدام الشفرات الموجودة في هذا الدرس في مشاريعك القادمة.</p><p dir="rtl">ترجمة -وبتصرّف- للمقال <a rel="external nofollow" href="http://tympanus.net/codrops/2015/09/15/styling-customizing-file-inputs-smart-way"> </a><a rel="external nofollow" href="http://tympanus.net/codrops/2015/09/15/styling-customizing-file-inputs-smart-way">Styling &amp; Customizing File Inputs the Smart Way</a> لصاحبته Osvaldas Valutis.</p>
]]></description><guid isPermaLink="false">180</guid><pubDate>Wed, 30 Sep 2015 16:45:00 +0000</pubDate></item><item><title>&#x62A;&#x62E;&#x637;&#x64A;&#x637; &#x635;&#x641;&#x62D;&#x627;&#x62A; &#x627;&#x644;&#x648;&#x64A;&#x628; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x62A;&#x642;&#x646;&#x64A;&#x627;&#x62A; CSS3</title><link>https://academy.hsoub.com/programming/css/%D8%AA%D8%AE%D8%B7%D9%8A%D8%B7-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%AA%D9%82%D9%86%D9%8A%D8%A7%D8%AA-css3-r178/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_09/css-layouts.png.937f3f76ff1651ce876180d93067b114.png" /></p>

<p dir="rtl">كُنّا في درس سابق قد تحدثنا عن <a href="https://academy.hsoub.com/programming/css/%D8%AA%D8%AE%D8%B7%D9%8A%D8%B7-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%AA%D9%82%D9%86%D9%8A%D8%A7%D8%AA-css2-%D8%A7%D9%84%D8%AA%D9%82%D9%84%D9%8A%D8%AF%D9%8A%D8%A9-r177/">كيفية تخطيط صفحات الويب باستعمال CSS2</a> وكيف أنّ ذلك لم يكن بالأمر السهل، لذلك في هذا الدرس سوف نقوم بنفس التخطيط ولكن باستعمال تقنيات CSS3 الجديدة.</p><p dir="rtl">تٌقدّم لنا CSS3 مجموعة من التقنيات والتحسينات لتساعدنا على تخطيط صفحات الويب بشكل أفضل وأسهل ودون الحاجة إلى الكثير من الأكواد كما كان الحال في CSS2. كما أنها مُصممة لتدعم السلوكات المتغيرة/الديناميكية وبالتالي يمكننا القول بأنها " لغة قابلة للبرمجة".</p><p dir="rtl">دعونا إذًا نرى بعض الخصائص والتقنيات الجديدة التي توفرها هذه اللغة ونحاول استخدامها لدعم حالة الاستخدام التي كنّا قد بدأنا بها في الدرس السابق.</p><h2 dir="rtl">دالة ()calc الخاصة بلغة CSS3</h2><p dir="rtl">تُستخدم دالة <span style="font-family:courier new,courier,monospace;">()calc</span> الجديدة لحساب القيم بشكل ديناميكي (ضع في الحسبان أن <a rel="external nofollow" href="http://caniuse.com/#search=calc">دعم هذه الدالة</a> يختلف من متصفح لآخر). وفي داخل هذه الدالة يمكنك كتابة أي معادلة/تعبير (expression) باستخدام المعاملات الحسابية المعروفة (+، -، *، /).</p><p dir="rtl">سوف يساعدنا استخدام هذه الدالة على التخلص من الكثير من الأكواد التي كان لا بد منها في CSS2، وفي حالتنا هذه فإنها سوف تساعدنا في تمدد العناصر بشكل أفضل (سوف يصبح استخدام تقنية CSS Expansion التي ذكرناها سابقًا أكثر سهولة). أنظر للكود الموجود في الأسفل:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">#nav, #subnan {
    position: fixed;
    height: calc(100% - 10em); /* replaces */
    z-index: 20;
}</pre><p dir="rtl">لاحظ أننا استخدمنا الدالة<span style="line-height: 17.92px;"> </span><span style="line-height: 17.92px; font-family: 'courier new', courier, monospace;">()calc</span><span style="line-height: 17.92px;"> </span>في الخاصية <span style="font-family:courier new,courier,monospace;">height</span> وهذا سوف يساعدنا بالحصول على نفس النتيجة التي حصلنا عليها باستخدام CSS2 عندما استخدمنا الخاصيتين <span style="font-family:courier new,courier,monospace;">top: 6em </span>و <span style="font-family:courier new,courier,monospace;">bottom: 4em</span>، وبهذا يمكن للأمور أن تصبح أكثر مرونة وسوف نحتاج إلى خاصية واحدة (<span style="font-family: 'courier new', courier, monospace; line-height: 17.92px;">height</span> مع <span style="font-family: 'courier new', courier, monospace; line-height: 17.92px;">()calc</span>) بدل اثنتين (<span style="font-family:courier new,courier,monospace;">top</span> <span style="font-family:courier new,courier,monospace;">وbottom</span>).</p><h2 dir="rtl">استخدام CSS3 Flexbox في تخطيط الصفحات</h2><p dir="rtl">تُعتبر <strong>Flexbox</strong> من الخصائص والتقنيات الجديدة التي ظهرت في CSS3 وهي تجعل من تخطيط الصفحات وترتيب عناصرها أمرًا سهلًا ومتشابهًا في مختلف أحجام الشاشات والأجهزة، وبالتالي فهي مفيدة جدًا عند القيام بتصميم مواقع متجاوبة.</p><p dir="rtl">وهذه بعض الخصائص والميزات التي تتمع بها Flexbox:</p><ul dir="rtl"><li>تمكننا من موضعة العناصر الأبناء (child elements) بشكل أسهل ويصبح تخطيط الصفحات المعقدة أبسط وأسهل ودون الحاجة إلى الكثير من الأكواد فيصبح لدينا كود أنظف وقابل للقراءة بشكل أفضل.</li><li>يمكن وضع العناصر الأبناء بأي إتجاه نريده وتصبح أبعاد تلك العناصر مرنة أكثر بحيث يمكنها التجاوب مع مساحة العرض.</li><li>تستطيع العناصر الأبناء أن تتمدد وتتقلص تلقائيًا لتشغل المساحة الفارغة.</li></ul><p>كما أنّ Flexbox يقدم مجموعة خاصة به من المفاهيم والمصطلحات، ونذكر بعض منها:</p><ul dir="rtl"><li><strong>Flex container</strong>: العنصر الذي يحتوي على الخاصية <span style="font-family:courier new,courier,monospace;">display</span> بالقيمة <span style="font-family:courier new,courier,monospace;">flex</span> أو <span style="font-family:courier new,courier,monospace;">inline-flex</span> بحيث يصبح هذا العنصر هو العنصر الحاوي (الأب) للعناصر التي نريد التعامل معها.</li><li><strong>Flex item</strong>: هو أي عنصر موجود في الـFlex container. (ملاحظة: أي نص موجود بشكل مباشر داخل الـFlex container سيتم احتواؤه داخل anonymous flex item).</li><li><strong>Axes</strong>: أي flexbox يجب أن يحتوي على الخاصية <a rel="external nofollow" href="https://developer.mozilla.org/en/CSS/flex-direction">flex-direction</a> بحيث تُحدد هذه الخاصية المحور الرئيسي (main axis) الذي سوف تتموضع حوله الـflex items. ويوجد أيضًا المحور العرضي (cross axis) ويكون هذا المحور عموديًا على المحور الرئيسي.</li><li><strong>Lines</strong>: يمكن للـflex items أن تصطف/تتموضع في خط واحد أو خطوط متعددة وذلك ما تحدده الخاصية <span style="font-family:courier new,courier,monospace;">flex-wrap</span>.</li><li><strong>Dimensions</strong>: يحتوي flexbox على main size و cross size كبديل عن <span style="font-family:courier new,courier,monospace;">height</span> <span style="font-family:arial,helvetica,sans-serif;">و</span><span style="font-family:courier new,courier,monospace;">width</span> بحيث تُحدد هاتين القيمتين حجم المحور الرئيسي (main axis) والعرضي (cross axis) على التوالي.</li></ul><p dir="rtl">بعد هذه المقدمة القصيرة عن flexbox يمكننا الآن استخدامها في تخطيط الصفحات.</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">&lt;body class="layout-flexbox"&gt;
    &lt;header id="header"&gt;&lt;/header&gt;

    &lt;div class="content-area"&gt;
        &lt;nav id="nav"&gt;&lt;/nav&gt;
        &lt;aside id="subnav"&gt;&lt;/aside&gt;
        &lt;main id="main"&gt;&lt;/main&gt;
    &lt;/div&gt;

    &lt;footer id="footer"&gt;&lt;/footer&gt;
&lt;/body&gt;</pre><p dir="rtl">نريد في حالة الاستخدام التي نعمل عليها أن تكون العناصر الرئيسية (header ،content ،footer) مصفوفة بشكل عمودي، وبالتالي سوف نستخدم القيمة column في الخاصية <span style="font-family:courier new,courier,monospace;">flex-direction</span> كما يلي:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.layout-flexbox {
    display: flex;
    flex-direction: column;
}</pre><p dir="rtl">ومع أنّ العناصر الرئيسية يجب أن تكون مصفوفة بشكل عمودي إلّا أنّ العناصر في منطقة المحتوى (nav ،subnav ،main) نريدها مصفوفة بشكل أفقي. وبما أنّ كل flex container يمكن أن يحتوي على خاصية <span style="font-family:courier new,courier,monospace;">flex-direction</span> واحدة فقط فإننا سنقوم بتعريف العديد من flex containers داخل بعضها البعض حتى يمكننا التحكم في تخطيط الصفحة كما نشاء (أي حتى يصبح بإمكاننا أن نجعل العناصر تصطف كما نريد وألّا نصبح مقيدين باتجاه واحد فقط).</p><p dir="rtl">ولهذا السبب قمنا بإضافة حاوي (container) آخر (<span style="font-family:courier new,courier,monospace;">&lt;div class="content-area"&gt;</span>) ليحتوي على عناصر <span style="font-family:courier new,courier,monospace;">nav </span>،<span style="font-family:courier new,courier,monospace;">#subnav#</span> و <span style="font-family:courier new,courier,monospace;">main<span style="line-height: 17.92px;">#</span></span>.</p><p dir="rtl">وبهذا يمكن للعناصر الرئيسية أن تصطف بشكل عمودي بينما تصطف عناصر منطقة المحتوى بشكل أفقي.</p><p dir="rtl">نريد الآن أن نقوم بموضعة الـflex items لذلك سوف نستخدم الخاصية <span style="font-family:courier new,courier,monospace;">flex</span> وهي اختصار(shorthand) للخصائص <span style="font-family:courier new,courier,monospace;">flex-grow ،flex-shrink</span> و<span style="font-family:courier new,courier,monospace;">flex-basis</span>. وهذه الخصائص تُحدد كيف تقوم الـflex items بتوزيع المساحة الفارغة المتبقية بينها، وهذا تعريف بسيط بهذه الخصائص:</p><ul dir="rtl"><li><strong>flex-grow</strong>: تُحدد كم يمكن للعنصر (flex item) أن ينمو/يتمدد نسبة للعناصر الأخرى في نفس الحاوي.</li><li><strong>flex-shrink</strong>: تُحدد كم يمكن للعنصر (flex item) أن يتقلص نسبة للعناصر الأخرى في نفس الحاوي.</li><li><strong>flex-basis</strong>: يُحدد الحجم الافتراضي للعنصر (أي حجمه قبل أن ينمو أو يتقلص).</li></ul><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/Figure5.jpg.768abcf3fc3ca4e97e4dea0adcaa53b2.jpg"><img data-fileid="5202" class="ipsImage ipsImage_thumbnailed" alt="Figure5.thumb.jpg.f123a18d94d3d5b36f2fe4" src="https://academy.hsoub.com/uploads/monthly_2015_09/Figure5.thumb.jpg.f123a18d94d3d5b36f2fe4622d8cf03f.jpg"></a></p><p dir="rtl">عندما نقوم بإعطاء الخاصيتين <span style="font-family: 'courier new', courier, monospace; line-height: 17.92px;">flex-grow</span> و<span style="font-family: 'courier new', courier, monospace; line-height: 17.92px;">flex-shrink</span> القيمة "صفر" فإننا نقوم بمنع العنصر من أن يتقلص أو ينمو حتى لو كان هناك مساحة فارغة (أي أنّ حجم العنصر يبقى ثابتًا). وهذا ما سوف نقوم به للترويسة (header) والتذييل (footer) لأننا نريد أن يبقى حجمهما ثابتًا:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">#header {
    flex: 0 0 5em;
}

#footer {
    flex: 0 0 3em;
}</pre><p dir="rtl">وإذا أردنا لعنصر أن يستغل أي مساحة ثابتة فإننا نعطي الخاصيتين <span style="font-family: 'courier new', courier, monospace; line-height: 17.92px;">flex-grow</span> و<span style="font-family: 'courier new', courier, monospace; line-height: 17.92px;">flex-shrink</span> القيمة "1" ونعطي الخاصية <span style="font-family: 'courier new', courier, monospace; line-height: 17.92px;">flex-basis</span> القيمة <span style="font-family:courier new,courier,monospace;">auto</span>. وهذا ما نريده بالنسبة لمنطقة المحتوى (نريدها أن تستغل أي مساحة فارغة).</p><p dir="rtl">وكما ذكرنا سابقًا فإننا نريد للعناصر الموجودة داخل <span style="font-family:courier new,courier,monospace;">&lt;div class="content-area"&gt;</span> أن تصطف بشكل أفقي، لذلك سوف نعطيها الخاصية<span style="font-family:courier new,courier,monospace;"> display: flex</span> حتى يصبح هذا العنصر عبارة عن flex container وسوف نعطيها أيضًا الخاصية <span style="font-family:courier new,courier,monospace;">flex-direction: row</span> حتى نجعل العناصر الموجودة في داخله (<span style="line-height: 17.92px; font-family: 'courier new', courier, monospace;">nav </span><span style="line-height: 17.92px;">،</span><span style="line-height: 17.92px; font-family: 'courier new', courier, monospace;">#subnav#</span><span style="line-height: 17.92px;"> و </span><span style="line-height: 17.92px; font-family: 'courier new', courier, monospace;">main<span style="line-height: 17.92px;">#</span></span>) تصطف بشكل أفقي، وبالتالي نحصل على تنسيقات CSS التالية:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.content-area {
    display: flex;
    flex-direction: row;
    flex: 1 1 auto;
    margin: 1em 0;
    min-height: 0;
}</pre><p dir="rtl">في منطقة المحتوى نريد أن يكون حجم كلا العنصرين<span style="font-family:courier new,courier,monospace;"> nav<span style="line-height: 17.92px;">#</span></span> و<span style="font-family: 'courier new', courier, monospace; line-height: 17.92px;">subnav#</span> ثابت وبالتالي سوف نعطيها الخاصية <strong>flex</strong> بقيم مناسبة:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">#nav {
    flex: 0 0 5em;
    margin-right: 1em;
    overflow-y: auto;
}

#subnav {
    flex: 0 0 13em;
    overflow-y: auto;
    margin-right: 1em;
}</pre><p dir="rtl">لاحظ أنني استعملت الخاصية <span style="font-family:courier new,courier,monospace;">overflow-y: auto</span> وذلك حتى نتعامل مع المحتوى إذا ما تجاوز ارتفاع الحاوي. متصفح Firefox هو من يحتاج لهذه الخاصية.</p><p dir="rtl">سوف يأخذ العنصر <span style="font-family: 'courier new', courier, monospace; line-height: 17.92px;">main</span><span style="font-family: 'courier new', courier, monospace; line-height: 17.92px;">#</span> المساحة الفارغة المتبقية:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">#main {
    flex: 1 1 auto;
    overflow-y: auto;
}</pre><p dir="rtl">كل شيء يبدو جيدًا إلى الآن، لذلك دعونا نقوم بإضافة السلوك المتغير/الديناميكي ونرى ما يحصل.</p><p dir="rtl">سوف تكون أكواد الجافاسكربت مشابهة لما استخدمناه سابقًا باستثناء أن اسم الـclass للعنصر الحاوي سيكون <span style="font-family:courier new,courier,monospace;">layout-flexbox</span> بدلًا من <span style="font-family:courier new,courier,monospace;">layout-classic</span>:</p><pre data-pbcklang="javascript" data-pbcktabsize="4" class="javascript ipsCode prettyprint">$('.layout-flexbox #nav’).on('click', 'li.nav-toggle', function() {
    $('#nav').toggleClass('expanded');
});</pre><p dir="rtl">سوف نضيف "class expanded" إلى تنسيقات CSS كما يلي:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">#nav {
    flex: 0 0 5em; /* collapsed size */
    margin-right: 1em;
    overflow-y: auto;
    &amp;.expanded {
        flex: 0 0 10em; /* expanded size */
    }
}</pre><p dir="rtl">لاحظ أننا هذه المرة لم نحتج إلى أن ندع العناصر الأخرى تعلم بشأن تغير العرض وذلك لأنّ flexbox تعالج الأمر دون تدخل منا.</p><p dir="rtl">الشيء الوحيد المتبقي هو إخفاء القائمة الفرعية، ولكن احزر ماذا؟ لن نحتاج لكتابة أي أكواد إضافية لأن flexbox سيعلم بشأن المساحة الفارغة وسوف يتكفل بجعل كل شيء يعمل كما هو مطلوب.</p><p dir="rtl">يوفر لنا flexbox أيضًا مجموعة من الطرق التي تمكننا من توسيط العناصر في الاتجاهين العمودي والأفقي. يمكننا الآن معرفة أهمية وجود مثل هذه التقنية في لغة CSS وكيف أنّها تساعد على جعل الكود أفضل وله القابلية للتطور والتوسع. ولكن على الناحية الأخرى فإنّ هذه التقنيات تحتاج إلى وقت أكثر لإتقانها مقارنة بخصائص CSS الأخرى.</p><h2 dir="rtl">تخطيط الصفحات باستخدام CSS3 Grid</h2><p dir="rtl">إذا كنت تعتقد أن flexbox شيء جديد فأنت حتمًا لم تسمع عن CSS3 Grid، فهي ما زالت في مرحلة مبكرة (مرحلة draft) <a rel="external nofollow" href="http://caniuse.com/#search=grid">ودعم المتصفحات لها شبه معدوم</a> (يمكنك تفعيلها في متصفح Google Chrome عن طريق الدخول إلى <a rel="external nofollow" href="chrome://flags/">chrome://flags</a> واختيار "experimental Web Platform features").</p><p dir="rtl">وفائدتها هي أنها تعمل في طبقة العرض (presentation layer) وبالتالي لن نحتاج إلى معرفة كيفية ظهور العناصر في التوصيف (markup) الخاص بملفات HTML (أي أنّ كل شيء سيتم باستخدام CSS بعض النظر عن ترتيب العناصر في HTML).</p><p dir="rtl">الفكرة العامة هي أن يكون هناك شبكة تخطيط (grid) مرنة ومُعرّفة بشكل مسبق يمكن أن نستخدمها لموضعة العناصر بداخلها. وكما هو الحال في flexbox فإنها تعمل على مفهوم المساحات الفارغة وتسمح لنا بتعريف إتجاهين (عمودي وأفقي) في نفس العنصر مما يؤدي إلى تقليل حجم الكود وزيادة مرونته.</p><p dir="rtl">يُقدّم لنا Grid Layout نوعين من الـgrids وهما explicit وimplicit، ولجعل الأمور بسيطة سوف نركز على explicit فقط.</p><p dir="rtl">وكما هو الحال مع flexbox فإنّ Grid يقدم مجموعة خاصة به من المفاهيم والمصطلحات، ونذكر بعض منها:</p><ul dir="rtl"><li><strong>Grid container</strong>: هو أي عنصر يملك الخاصية <span style="font-family:courier new,courier,monospace;">display</span> بالقيمة "grid" أو "inline-grid" بحيث تتموضع العناصر داخله ويتم محاذاتها بناءً على grid مُعرّف مسبقًا (explicit mode). والـgrid هو عبارة عن مجموعة من الخطوط العمودية والأفقية المتقاطعة والتي تفصل الـGrid container إلى مجموعة من الخلايا (cells). وهناك مجموعتين من الخطوط؛ الأولى لتعريف الأعمدة (columns) والثانية تكون عمودية على هذه الأعمدة لتعريف الصفوف (rows).</li><li><strong>Grid track</strong>: هي المسافة بين خطّين متجاورين، وكل Grid track يتم إعطاؤه دالة تحجيم (sizing function) للتحكم بكيفية نمو كل عمود أو صف وبالتالي التحكم في البعد بين الخطوط المحيطة بكل خط.</li><li><strong>Grid cell</strong>: هي المسافة بين صفّين متجاورين وعمودين متجاورين من خطوط الـgrid، وهو أصغر وحدة من الـgrid يمكن الرجوع والاستناد إليها عندما نقوم بموضعة عناصر الـgrid.</li><li><strong>Flexible length</strong>: هو بُعد يتم تحديده بوحدة fr وهو يُمثّل جزء من المساحة الفارغة في الـGrid container.</li></ul><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/Figure6.jpg.f52c8e2b93cc149405d7a3c7488cedb5.jpg"><img data-fileid="5203" class="ipsImage ipsImage_thumbnailed" alt="Figure6.thumb.jpg.419044c9a86a38b6735687" src="https://academy.hsoub.com/uploads/monthly_2015_09/Figure6.thumb.jpg.419044c9a86a38b6735687d3bd6ce363.jpg"></a></p><p dir="rtl">إليك عناصر HTML التي سوف نستخدمها:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">&lt;body class="layout-grid"&gt;
    &lt;header id="header"&gt;&lt;/header&gt;
    &lt;nav id="nav"&gt;&lt;/nav&gt;
    &lt;aside id="subnav"&gt;&lt;/aside&gt;
    &lt;main id="main"&gt;&lt;/main&gt;
    &lt;footer id="footer"&gt;&lt;/footer&gt;
&lt;/body&gt;</pre><p dir="rtl">لاحظ بأننا في تخطيط الصفحة هذا لن نحتاج إلى عنصر إضافي يعمل كحاوٍ لمنطقة المحتوى كما كان الحال مع flexbox، وذلك لأنّ هذا النوع من تخطيط الصفحات (Grid layout) يسمح لنا بتعريف مساحة كل عنصر في كلا الإتجاهين وبنفس الـGrid container.</p><p dir="rtl">لنبدأ الآن بإضافة تنسيقات CSS:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.layout-grid {
    display: grid;
    grid-template-columns: auto 0 auto 1em 1fr;
    grid-template-rows: 5em 1em 1fr 1em 3em;
}</pre><p dir="rtl">قمنا باستخدام الخاصية<span style="font-family:courier new,courier,monospace;"> display: grid</span> على الحاوي (Grid container)، وكذلك استخدمنا الخاصيتين <span style="font-family:courier new,courier,monospace;">grid-template-columns </span>و<span style="font-family:courier new,courier,monospace;">grid-template-rows</span> وهما تمثلان المساحة بين الـGrid tracks. بمعنى آخر، فإنّ هاتين القيمتين لا تمثلان مكان تواجد خطوط الـgrid وإنّما تمثلان مقدار المساحة بين الـGrid tracks.</p><p dir="rtl">ضع في الحسبان أنّ وحدات القياس يمكن أن تكون أي واحدة من التالية:</p><ul dir="rtl"><li>وحدة طول (length).</li><li>نسبة مئوية معينة من حجم الحاوي (Grid container).</li><li>مساحة من المحتوى الذي يحتله العمود أو الصف.</li><li>جزء من المساحة الفارغة في الـgrid.</li></ul><p dir="rtl">فعلى سبيل المثال، في الخاصية <span style="font-family:courier new,courier,monospace;">grid-template-column: auto 0 auto 1em 1fr</span> سيكون لدينا التالي:</p><ul dir="rtl"><li>track واحد لتعريف عمودين بعرض <strong>auto</strong> (مساحة القائمة الرئيسية <span style="font-family:courier new,courier,monospace;">nav<span style="line-height: 17.92px; text-align: right;">#</span></span>).</li><li>gutter واحد بقيمة "صفر" (الـmargin الخاص بالعنصر <span style="font-family:courier new,courier,monospace;">subnav<span style="line-height: 17.92px; text-align: right;">#</span></span> موجود في مستوى العنصر، ويمكن أن يكون موجودًا أو لا وبهذه الطريقة نضمن أن لا يكون هناك gutter مزدوج).</li><li>track واحد لتعريف عمودين بعرض <strong style="line-height: 17.92px; text-align: right;">auto</strong> (مساحة القائمة الفرعية <span style="font-family: 'courier new', courier, monospace; line-height: 17.92px; text-align: right;">subnav</span><span style="font-family: 'courier new', courier, monospace; line-height: 17.92px; text-align: right;">#</span>).</li><li>gutter واحد بقيمة <strong>1em</strong>.</li><li>track واحد بقيمة <strong>1fr</strong> للعنصر <span style="font-family:courier new,courier,monospace;">main</span><span style="font-family: 'courier new', courier, monospace; line-height: 17.92px; text-align: right;">#</span> (سوف يأخذ المساحة المتبقية).</li></ul><p dir="rtl">لاحظ أننا استخدمنا القيمة <strong style="line-height: 17.92px; text-align: right;">auto</strong> في الـtrack، وهذا يسمح لنا بالحصول على أعمدة ديناميكية بحيث يتم تعريف مكان وحجم خطوط الـgrid بناءً على المحتوى الخاص بها. (سوف نحتاج أيضًا إلى تعريف حجم العنصرين <span style="font-family: 'courier new', courier, monospace; line-height: 17.92px; text-align: right;">nav</span><span style="font-family: 'courier new', courier, monospace; line-height: 17.92px; text-align: right;">#</span> و<span style="line-height: 17.92px; text-align: right; font-family: 'courier new', courier, monospace;">subnav</span><span style="line-height: 17.92px; text-align: right; font-family: 'courier new', courier, monospace;">#</span> وهذا ما سنفعله بعد قليل).</p><p dir="rtl">وبطريقة مشابهة، سوف تملك الصفوف الخاصية <span style="font-family:courier new,courier,monospace;">grid-template-row: 5em 1em 1fr 1em 3em</span> مما يجعل العنصرين <span style="font-family:courier new,courier,monospace;">header<span style="line-height: 17.92px;">#</span></span> و <span style="font-family:courier new,courier,monospace;">footer<span style="line-height: 17.92px;">#</span></span> ثابتين ويؤدي أيضًا إلى أنّ العناصر الموجودة بين هذين العنصرين سوف تستخدم المساحة الفارغة المتبقية في حين تكون قيمة الـgutters بقيمة <strong>1em</strong>.</p><p dir="rtl">لنرى الآن كيف سنقوم بموضعة العناصر داخل الـgrid الذي قمنا بتعريفه:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">#header {
    grid-column: 1 / 6;
    grid-row: 1 / 2;
}

#footer {
    grid-column: 1 / 6;
    grid-row: 5 / 6;
}

#main {
    grid-column: 5 / 6;
    grid-row: 3 / 4;
    overflow-y: auto;
}</pre><p dir="rtl">إنّ تنسيقات CSS الخاصة بالعنصر <span style="font-family: 'courier new', courier, monospace; line-height: 17.92px;">header</span><span style="font-family: 'courier new', courier, monospace; line-height: 17.92px;">#</span> تُخبرنا بأننا نريد أن تكون الترويسة موجودة بين الخطين 1 و6 (أي العرض كامل) بالنسبة للأعمدة وبين الخطين 1 و2 بالنسبة للصفوف. ونفس الشيء بالنسبة للعنصر <span style="line-height: 17.92px; font-family: 'courier new', courier, monospace;">footer<span style="line-height: 17.92px;">#</span></span><span style="line-height: 17.92px;"> </span>فنريده أن يكون موجودًا بين الخطين 1 و6 (أي العرض كامل) بالنسبة للأعمدة وبين الخطين 5 و6 بالنسبة للصفوف. أمّا بالنسبة لمنطقة المحتوى فقد تمّ إعطاؤها الخصائص المناسبة حتى تشغل المساحة التي يفترض بها أن تشغلها.</p><p dir="rtl">لاحظ أنّ الخاصية <span style="font-family:courier new,courier,monospace;">grid-column</span> هي اختصار (shorthand) للخاصيتين <span style="font-family:courier new,courier,monospace;">grid-column-start</span> و<span style="font-family:courier new,courier,monospace;">grid-column-end</span> و أنّ الخاصية <span style="font-family:courier new,courier,monospace;">grid-row</span> هي اختصار للخاصيتين <span style="font-family:courier new,courier,monospace;">grid-row-start</span> و<span style="font-family:courier new,courier,monospace;">grid-row-end</span>.</p><p dir="rtl">لنعد الآن إلى العنصرين <span style="line-height: 17.92px; font-family: 'courier new', courier, monospace; text-align: right;">nav</span><span style="line-height: 17.92px; font-family: 'courier new', courier, monospace; text-align: right;">#</span><span style="line-height: 17.92px;"> </span>و<span style="line-height: 17.92px; text-align: right; font-family: 'courier new', courier, monospace;">subnav</span><span style="line-height: 17.92px; text-align: right; font-family: 'courier new', courier, monospace;">#</span>. بما أننا قمنا مسبقًا بوضع هذين العنصرين داخل الـtrack بقيم auto فسوف نحتاج إلى تحديد مساحتهما (نفس الشيء سيكون بالنسبة لـ"expanded" فسوف نقوم فقط بتغيير عرضها وسوف يتكفل Grid بالباقي).</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">#nav {
    width: 5em;
    grid-column: 1 / 2;
    grid-row: 3 / 4;
    &amp;.expanded {
        width: 10em;
    }
}

#subnav {
    grid-column: 3 / 4;
    grid-row: 3 / 4;
    width: 13em;
    margin-left: 1em;
}</pre><p dir="rtl">يمكننا الآن أن نقوم بتغيير وضع القائمة الرئيسية <span style="line-height: 17.92px; font-family: 'courier new', courier, monospace; text-align: right;">nav</span><span style="line-height: 17.92px; font-family: 'courier new', courier, monospace; text-align: right;">#</span> وإخفاء أو إظهار القائمة الفرعية <span style="line-height: 17.92px; text-align: right; font-family: 'courier new', courier, monospace;">subnav</span><span style="line-height: 17.92px; text-align: right; font-family: 'courier new', courier, monospace;">#</span> وكل شيء سيعمل بشكل جيد وملائم. كما أنّ Grid Layout تسمح لنا باستعمال أسماء مستعارة لتسمية الخطوط حتى نستطيع أن نُغير في الـgrid كما نريد دون أن يؤدي ذلك إلى خلل في الأكواد لأنّها ستكون مربوطة باسم معين وليس بأحد خطوط الـgrid.</p><h2 dir="rtl">خاتمة</h2><p dir="rtl">حتى باستخدام تقنيات CSS القديمة فإنّ هناك الكثير مما يستطيع مطورو الويب فعله واستغلاله. ومع ذلك فقد يكون ذلك مهمة ليست سهلة وتحتاج إلى الكثير من الأكواد والتي قد تكون مكررة في كثير من الأحيان.</p><p dir="rtl">ولكن كما شاهدنا فإنّ CSS3 بدأت تقدم طرق وتقنيات أفضل لتخطيط صفحات الويب والتي بدورها تُسهّل العمل على مطوري الويب. لذلك أعتقد أنه يجب على أي مطور ويب أن يتقن ويتعلم هذه التقنيات حتى يُحسّن من تجربة المستخدم وحتى يقوم بكتابة كود أنظف وأفضل. وهذه المقالة قدمت جزءًا صغيرًا فقط مما يمكن فعله باستخدام تقنيات CSS3 وهناك الكثير مما يجب عليك تعلمه.</p><p dir="rtl">ترجمة -وبتصرّف- للمقال <a rel="external nofollow" href="http://www.toptal.com/css/css-layout-primer-from-classic-approaches-to-the-latest-techniques">CSS Layout Tutorial: From Classic Approaches to the Latest Techniques</a> لصاحبه Laureano Martin Arcanio.</p>
]]></description><guid isPermaLink="false">178</guid><pubDate>Sun, 27 Sep 2015 23:13:31 +0000</pubDate></item><item><title>&#x62A;&#x62E;&#x637;&#x64A;&#x637; &#x635;&#x641;&#x62D;&#x627;&#x62A; &#x627;&#x644;&#x648;&#x64A;&#x628; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x62A;&#x642;&#x646;&#x64A;&#x627;&#x62A; CSS2 &#x627;&#x644;&#x62A;&#x642;&#x644;&#x64A;&#x62F;&#x64A;&#x629;</title><link>https://academy.hsoub.com/programming/css/%D8%AA%D8%AE%D8%B7%D9%8A%D8%B7-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%AA%D9%82%D9%86%D9%8A%D8%A7%D8%AA-css2-%D8%A7%D9%84%D8%AA%D9%82%D9%84%D9%8A%D8%AF%D9%8A%D8%A9-r177/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_09/css-layouts_(1).png.50fc04c73d6c9c4cfa53557b853a6b09.png" /></p>

<p dir="rtl">إنّ إتقان تخطيط صفحات الويب بدون إتقان لغة CSS سيكون كمن يحاول السباحة على أرضٍ جافة، ولكن على عكس السباحة التي عندما تتقنها تبقى معك طول الحياة فإنّه لا يوجد مرحلة يمكنك عندها التوقف عن التعلم وتقول أنّك أتقنت CSS فهذه اللغة تتطور بسرعة يومًا بعد يوم.</p><p dir="rtl">كما أنّ تعلم وإتقان هذه اللغة سيكون أكثر تحديًا بسبب وجود إختلافات في كيفية تطبيق ودعم هذه اللغة من قبل المتصفحات (حتى بين الإصدارات المختلفة للمتصفح نفسه). ولمدة تناهز العشر سنوات كان مطوّرو الويب يتصارعون ويعانون من <a rel="external nofollow" href="http://www.w3schools.com/cssref/css3_browsersupport.asp">الدعم المتشتت وغير المتناسق لخصائص </a><a rel="external nofollow" href="http://www.w3schools.com/cssref/css3_browsersupport.asp">CSS3</a> في كل إصدار جديد للمتصفحات.</p><p dir="rtl">ولكن لنتفق على شيء ما وهو أنّ إتقان CSS شيء لا بد منه لأي مطور ويب جيد. وفي هذا المقال سوف نأخذكم في جولة لنتعرف على مبادئ CSS في تخطيط الصفحات وسوف نبدأ من التقنيات التي ظهرت في CSS2 وانتهاءً بآخر ما ظهر في CSS3.</p><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/Figure1.jpg.b6e16db2cafb7001b429fb6dd7cfaf10.jpg"><img data-fileid="5196" class="ipsImage ipsImage_thumbnailed" alt="Figure1.thumb.jpg.d5f59bfe09acf5f48c1d6d" src="https://academy.hsoub.com/uploads/monthly_2015_09/Figure1.thumb.jpg.d5f59bfe09acf5f48c1d6dc0cb176e02.jpg"></a></p><p dir="rtl"><strong>ملاحظة</strong>: سوف نستخدم <a rel="external nofollow" href="https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/HTML5">HTML5</a> و<a rel="external nofollow" href="http://sass-lang.com/">Sass</a> في هذا المقال. ويمكنك الحصول على الشيفرات البرمجية كاملة <a rel="external nofollow" href="https://github.com/laureanoarcanio/css-layout-examples">من هنا</a>.</p><h2 dir="rtl">إحدى حالات الاستخدام</h2><p dir="rtl">إنّ من أفضل الطرق لتعلم أي تقنية هو أن يكون هناك حالة استخدام محددة تحاول دعمها أو أنّك تبحث عن حل لمشكلة ما. وحتى نهاية هذا المقال سنركز على حالة استخدام بمجموعة من المتطلبات.</p><p dir="rtl">ستكون حالة الاستخدام التي سنعمل عليها عبارة عن تخطيط لتطبيق ويب (Web App) مع بعض السلوكيات المتغيرة/الديناميكية (dynamic)، بحيث سيكون هناك عناصر ثابتة في الصفحة مثل الترويسة (header) والتذييل (footer) وقائمة رئيسية (navigation) وقائمة فرعية (sub-navigation) وقسم محتوى قابل للتمرير(scrollable content). ستكون المتطلبات الخاصة بتخطيط الصفحة كما يلي:</p><h3 dir="rtl">التخطيط الأساسي:</h3><ul dir="rtl"><li>الترويسة، التذييل، قائمة رئيسية وقائمة فرعية وهذه العناصر ستبقى ثابتة عند التمرير (scroll).</li><li>سوف تشغل القائمة الرئيسية والقائمة الفرعية أي مساحة عمودية فارغة.</li><li>سوف يشغل قسم المحتوى المساحة المتبقية في الصفحة وسوف يحتوي على منطقة قابلة للتمرير.</li></ul><h3 dir="rtl">السلوكيات المتغيرة/الديناميكية:</h3><p dir="rtl">سوف تحتوي القائمة الرئيسية على أيقونات فقط بشكل افتراضي، ولكن يمكن لها أن تتمدد لتحتوي على بعض النصوص (وأيضًا تتقلص/تنطوي لتظهر الأيقونات فقط مرة أخرى).</p><h3 dir="rtl">اختلافات في تخطيط الصفحة:</h3><p dir="rtl">ستحتوي بعض الصفحات على قائمة فرعية بجانب القائمة الرئيسية والبعض الآخر لا.</p><h2 dir="rtl">استخدام تقنيات CSS2</h2><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/Figure2.jpg.51ab686f2fbde43ec492f6188a9a8fe7.jpg"><img data-fileid="5197" class="ipsImage ipsImage_thumbnailed" alt="Figure2.thumb.jpg.5cf5d7aa7b32e9328828a7" src="https://academy.hsoub.com/uploads/monthly_2015_09/Figure2.thumb.jpg.5cf5d7aa7b32e9328828a73566f548c8.jpg"></a></p><p dir="rtl">هذا هو تخطيط HTML5 الذي سوف نستخدمه:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">&lt;body class="layout-classic"&gt;
    &lt;header id="header"&gt;&lt;/header&gt;
    &lt;nav id="nav"&gt;&lt;/nav&gt;
    &lt;aside id="subnav"&gt;&lt;/aside&gt;
    &lt;main id="main"&gt;&lt;/main&gt;
    &lt;footer id="footer"&gt;&lt;/footer&gt;
&lt;/body&gt;
</pre><h3 dir="rtl">1. الموضعة الثابتة (<span style="font-family:courier new,courier,monospace;">position: fixed</span>)</h3><p dir="rtl">في CSS2 يمكنك الحصول على عناصر ثابتة في الصفحة (مثل الترويسة، التذييل...الخ) عن طريق توظيف نموذج تخطيط يَستخدم الموضعة الثابتة (يستخدم <span style="font-family:courier new,courier,monospace;">position: fixed</span>).</p><p dir="rtl">سوف نستخدم أيضًا الخاصية <span style="font-family:courier new,courier,monospace;">z-index</span> لنتأكد بأنّ العناصر الثابتة سوف تظهر فوق جميع العناصر الأخرى في الصفحة، بحيث تقوم هذه الخاصية بتحديد مكان العنصر إمّا أعلى أو أسفل عنصر آخر، فالعناصر التي تحتوي على قيمة<span style="line-height: 17.92px;"> </span><span style="line-height: 17.92px; font-family: 'courier new', courier, monospace;">z-index</span><span style="line-height: 17.92px;"> </span>كبيرة سوف تظهر فوق العناصر التي تحتوي على قيمة<span style="line-height: 17.92px;"> </span><span style="line-height: 17.92px; font-family: 'courier new', courier, monospace;">z-index</span><span style="line-height: 17.92px;"> </span>أقل.</p><p dir="rtl">هناك شيء مهم يجب عليك تذكره وهو أنّ خاصية<span style="line-height: 17.92px;"> </span><span style="line-height: 17.92px; font-family: 'courier new', courier, monospace;">z-index</span><span style="line-height: 17.92px;"> </span>لن تعمل إلا بوجود خاصية <span style="font-family:courier new,courier,monospace;">position</span>، أي أنّك إذا استخدمت خاصية<span style="line-height: 17.92px;"> </span><span style="line-height: 17.92px; font-family: 'courier new', courier, monospace;">z-index</span><span style="line-height: 17.92px;"> </span> على أحد العناصر ولكنك لم تستخدم خاصية <span style="font-family: 'courier new', courier, monospace; line-height: 17.92px;">position </span>على نفس العنصر فإنّ خاصية<span style="line-height: 17.92px;"> </span><span style="line-height: 17.92px; font-family: 'courier new', courier, monospace;">z-index</span><span style="line-height: 17.92px;"> </span>لن تعمل. وبالنسبة لنا، فسوف نستخدم القيمة 20 (وهي أعلى من القيمة الافتراضية) حتى نُبقي العناصر الثابتة فوق العناصر الأخرى في الصفحة.</p><p dir="rtl">وسوف نستخدم خاصية <span style="font-family:courier new,courier,monospace;">width</span> ونعطيها القيمة 100% وهذا سيسمح للعناصر بالتمدد أفقيًا بالقدر الذي تستطيعه.</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">#header, #footer {
    position: fixed;
    width: 100%;
    z-index: 20;
}

#header {
    top: 0;
    height: 5em;
}

#footer {
    bottom: 0;
    height: 3em;
}</pre><p dir="rtl">هذا بالنسبة للترويسة والتذييل، ولكن ماذا بالنسبة للقائمة الرئيسية (<span style="font-family:courier new,courier,monospace;">nav<span style="line-height: 17.92px;">#</span></span>) والفرعية (<span style="font-family:courier new,courier,monospace;">subnav<span style="line-height: 17.92px;">#</span></span>)؟</p><h3 dir="rtl">2. تقنية التوسع/التمدد في CSS</h3><p dir="rtl">بالنسبة للقائمة الرئيسية (<span style="font-family: 'courier new', courier, monospace; line-height: 17.92px;">nav</span><span style="font-family: 'courier new', courier, monospace; line-height: 17.92px;">#</span>) والفرعية (<span style="font-family: 'courier new', courier, monospace; line-height: 17.92px;">subnav</span><span style="font-family: 'courier new', courier, monospace; line-height: 17.92px;">#</span>)، سوف نستخدم تقنية تسمى بتقنية التمدد (CSS Expantion) بحيث تُستخدم هذه التقنية على العناصر التي تحتوي على الخاصية <span style="font-family:courier new,courier,monospace;">position: fixed</span> (بحيث يبقى العنصر ثابت في الصفحة) أو الخاصية <span style="font-family:courier new,courier,monospace;">position: absolute</span> (بحيث يتم موضعة العنصر بناءً على أقرب عنصر حاوي يحتوي على الخاصية <span style="font-family:courier new,courier,monospace;">position</span> بقيمة غير القيمة <span style="font-family:courier new,courier,monospace;">static</span>).</p><p dir="rtl">يمكن الحصول على تمدد رأسي/عمودي (vertical) باستخدام الخاصيتين <span style="font-family:courier new,courier,monospace;">top</span> و <span style="font-family:courier new,courier,monospace;">bottom</span> وإعطائها قيم محددة بحيث يتمدد العنصر عموديًا ليستخدم المساحة العمودية المتبقية وفقًا لتلك القيم، أي أنّ ما نقوم به هو ربط الجزء العلوي للعنصر بمسافة محددة من الجزء العلوي للصفحة وكذلك ربط الجزء السفلي للعنصر بمسافة محددة من الجزء السفلي للصفحة مما سيؤدي إلى تمدد العنصر ليشغل المساحة العمودية بين هاتين النقطتين (العلوية والسفلية).</p><p dir="rtl">ونفس الأمر ينطبق على التمدد الأفقي بحيث نستخدم الخاصيتين <span style="font-family:courier new,courier,monospace;">left</span> و <span style="font-family:courier new,courier,monospace;">right</span> ونعطيها قيم محددة بحيث يتمدد العنصر أفقيًا ليشغل المساحة الأفقية المتبقية وفقًا لتلك القيم.</p><p dir="rtl">وبالنسبة لنا في هذه الحالة فإننا نريد أن نستخدم التمدد العمودي:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">#nav, #subnav {
    position: fixed;
    top: 6em; /* ترك مسافة فوق الترويسة */
    bottom: 4em; /* ترك مسافة تحت التذييلة */  
    z-index: 20;
}

#nav {
    left: 0;
    width: 5em;
}

#subnav {
    left: 6em; /* leave 1em margin to right of nav */
    width: 13em;
}</pre><h3 dir="rtl">3. الموضعة الإفتراضية/الساكنة (static)</h3><p dir="rtl">سوف نستخدم الموضعة الساكنة لموضعة منطقة المحتوى القابلة للتمرير، بحيث تظهر العناصر وتتموضع بالترتيب كما تظهر بالتدفق الطبيعي للمستند (كما تظهر في ملف HTML)، وبما أنّ جميع العناصر الأخرى في الصفحة متموضعة بشكل ثابت فإنّ هذا العنصر سيكون هو العنصر الوحيد الذي يظهر وفقًا للتدفق الطبيعي للمستند. ونتيجة لذلك فكل ما نحتاجه لموضعة العنصر بشكل مناسب هو استخدام الخاصية <span style="font-family:courier new,courier,monospace;">margin</span> حتى لا يحصل تداخل بينه وبين العناصر الأخرى الثابتة (الترويسة، التذييل والقائمتين الرئيسية والفرعية):</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">#main {
    margin: 6em 0 4em 20em;
}</pre><p dir="rtl">وبهذا نكون قد أتممنا متطلبات التخطيط الأساسي باستخدام CSS2 وبقي علينا أن نهتم بأمر المتطلبات الإضافية الخاصة بالسلوكيات المتغيرة/الديناميكية.</p><h3 dir="rtl">4. السلوكيات المتغيرة/الديناميكية باستخدام تقنيات CSS2</h3><p dir="rtl">ذكرنا سابقًا بأنّ القائمة الرئيسية سوف تحتوي على أيقونات فقط بشكل افتراضي، ولكن يمكن لها أن تتمدد لتحتوي على بعض النصوص (وأيضًا تتقلص/تنطوي لتظهر الأيقوانات فقط مرة أخرى).</p><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/Figure3.jpg.7c95ae532f1e91d5d8d6728b6188170f.jpg"><img data-fileid="5198" class="ipsImage ipsImage_thumbnailed" alt="Figure3.thumb.jpg.b9f078c5f601e5dbe4fd13" src="https://academy.hsoub.com/uploads/monthly_2015_09/Figure3.thumb.jpg.b9f078c5f601e5dbe4fd139d8479748d.jpg"></a></p><p dir="rtl">لنبدأ أولًا بإعطاء القائمة الرئيسية عندما تكون متمددة عرضًا (width) بقيمة 5em زيادة على عرضها الرئيسي (أي يصبح عرضها عندما تتمدد 10em)، وسوف نقوم بذلك عن طريق إنشاء class باسم "expanded" بحيث يمكننا ديناميكيًا (باستخدام الجافاسكربت) إضافته أو إزالته من القائمة الرئيسية:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">#nan {
    left: 0;
    width: 5em;
    &amp;.expanded { /* Sass notation */
        width: 10em;
    }
}
</pre><p dir="rtl">يمكنك بالأسفل رؤية كود الجافاسكربت (jQuery في حالتنا هذه) الذي سوف نستخدمه لإضافة أو إزالة الـclass الذي يحمل الاسم "expanded" عندما يقوم المستخدم بالنقر على أيقونة القائمة:</p><pre data-pbcklang="javascript" data-pbcktabsize="4" class="javascript ipsCode prettyprint">$('.layout-classic #nav').on('click', 'li.nav-toggle', function() {
    $('#nav').toggleClass('expanded');
});</pre><p dir="rtl">يمكن الآن للقائمة الرئيسية أن تتمدد أو تتقلص بكل سهولة. ولكن هناك مشكلة صغيرة وهو أنه عندما تتمدد القائمة الرئيسية فإنها سوف تتداخل مع القائمة الفرعية وهو ما لا نريده بكل تأكيد، ولذلك سوف نحتاج إلى تعديل الأمور قليلًا.</p><p dir="rtl">يمكنك الآن رؤية واحدة من المشاكل/القيود في CSS2، فسوف نحتاج الآن إلى كتابة العديد من الأكواد الخاصة بقيم العناصر المتموضعة بشكل ثابت، ونتيجة لذلك فسوف نحتاج إلى تعريف classes باسم "expanded" إضافية حتى نسمح للعناصر الأخرى بأن تتموضع لاستيعاب القائمة الرئيسية عندما تتمدد، وبذلك سوف نحتاج إلى كتابة المزيد والمزيد من الأكواد الإضافية.</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">#subnav {
    left: 6em;
    width: 13em;
    &amp;.expanded {
        left: 11em; /* تحريكها لليمين */
    }
}

#main {
    margin: 6em 0 4em 20;
    z-index: 10;
    &amp;.expanded {
        margin-left: 25em; /* تحريكها لليمين */
    }
}</pre><p dir="rtl">سوف نحتاج أيضًا إلى إضافة أكواد جافاسكربت إضافية لإضافة أو إزالة الـclass "expanded" لتلك العناصر عندما يقوم المستخدم بالنقر على القائمة الرئيسية.</p><pre data-pbcklang="javascript" data-pbcktabsize="4" class="javascript ipsCode prettyprint">$('.layout-classic #nav').on('click', 'li.nav-toggle', function() {
    $('#nav, #subnav, #main').toggleClass('expanded');
});</pre><p dir="rtl">سيكون كل شيء أفضل الآن.</p><h3 dir="rtl">5. اختلافات تخطيط الصفحة باستخدام تقنيات CSS2</h3><p dir="rtl">كنا قد ذكرنا مسبقًا بأنّ بعض الصفحات لن تحتوي على قائمة فرعية. ولنكون أكثر دقة فإننا نريد للقائمة الفرعية أن تختفي عندما يضغط المستخدم على أيقونة "المستخدمين" (users) الموجودة في القائمة الرئيسية.</p><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/Figure4.jpg.0a734b5beb922233640ae007f2218b46.jpg"><img data-fileid="5199" class="ipsImage ipsImage_thumbnailed" alt="Figure4.thumb.jpg.aef8d02f62c733052ab0d2" src="https://academy.hsoub.com/uploads/monthly_2015_09/Figure4.thumb.jpg.aef8d02f62c733052ab0d27a495fc8d0.jpg"></a></p><p dir="rtl">سوف نبدأ أولًا بإنشاء class بالاسم "hidden" وفيه الخاصية <span style="font-family:courier new,courier,monospace;">display: none</span>:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">hidden {
    display: none;
}</pre><p dir="rtl">كما أننا سنستخدم الجافاسكربت لإخفاء القائمة الفرعية وذلك عن طريق تطبيق الفئة "hidden" على هذه القائمة عندما يقوم المستخدم بالنقر على أيقونة "المستخدمين" (users):</p><pre data-pbcklang="javascript" data-pbcktabsize="4" class="javascript ipsCode prettyprint">$('#nav.fa-user').on('click', function() {
    $('#subnav').toggleClass('hidden');
});</pre><p dir="rtl">وبهذا يمكن للعناصر أن تختفي عند النقر على أيقونة "المستخدمين" ولكن المساحة التي كانت تحتلها سوف تبقى غير مستخدمة بدلًا من أن تقوم العناصر الأخرى باستخدام تلك المساحة.</p><p dir="rtl">وحتى نحصل على السلوك المطلوب عندما نقوم بإخفاء القائمة الفرعية فإننا سوف نستخدم المحدد المجاور(adjacent sibling selector) وهو يأتي على شكل إشارة الجمع <strong>+</strong>.</p><h3 dir="rtl">6. المحدد المجاور</h3><p dir="rtl">يُستخدم <a rel="external nofollow" href="https://developer.mozilla.org/en-US/docs/Web/CSS/Adjacent_sibling_selectors">المحدد المجاور</a> لتحديد عنصرين واختيار العنصر الثاني الذي يأتي مباشرة بعد العنصر الأول. فعلى سبيل المثال، سيقوم الكود التالي باختيار العنصر الذي يحمل ID بقيمة <strong>main</strong> والذي يأتي مباشرة بعد العنصر الذي يحمل ID بقيمة <strong>subnav</strong>:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">#subnav + #main {
    margin-left: 20em;
}</pre><p dir="rtl">استخدمنا الكود في الأعلى لإعطاء العنصر <span style="font-family:courier new,courier,monospace;">main<span style="line-height: 17.92px;">#</span></span> الخاصية <span style="font-family:courier new,courier,monospace;">margin-left: 20em</span> فقط إذا كان هذا العنصر يأتي مباشرة بعد العنصر  <span style="font-family:courier new,courier,monospace;">subnav<span style="line-height: 17.92px;">#</span></span>. ولكن عندما يتمدد العنصر <span style="font-family: 'courier new', courier, monospace; line-height: 17.92px;">nav</span><span style="font-family: 'courier new', courier, monospace; line-height: 17.92px;"># </span>(بحيث يتم إضافة الفئة <strong>expanded</strong> إلى العنصر <span style="font-family: 'courier new', courier, monospace; line-height: 17.92px;">main</span><span style="font-family: 'courier new', courier, monospace; line-height: 17.92px;"># </span>بناءً على الكود الذي كتبناه سابقًا) فإننا نريد للخاصية<span style="font-family:courier new,courier,monospace;"> margin-left</span> أن تحتوي على القيمة <strong>25em</strong>.</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">#subnav + #main.expanded {
    margin-left: 25em;
}</pre><p dir="rtl">وأمّا إذا كانت القائمة الفرعية <span style="font-family: 'courier new', courier, monospace; line-height: 17.92px;">subnav</span><span style="font-family: 'courier new', courier, monospace; line-height: 17.92px;"># </span>مخفية فإننا نريد للخاصية<span style="line-height: 17.92px; font-family: 'courier new', courier, monospace;"> margin-left</span><span style="line-height: 17.92px;"> </span>الخاصة بالعنصر <span style="font-family: 'courier new', courier, monospace; line-height: 17.92px;">main</span><span style="font-family: 'courier new', courier, monospace; line-height: 17.92px;">#</span> أن تحتوي على القيمة <strong>6em</strong>:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">#subnav.hidden + #main {
    margin-left: 6em;
}</pre><p dir="rtl"><strong>ملاحظة</strong>: واحدة من مساوئ استخدام المحدد المجاور هو أن الـDOM سوف يحتوي دائمًا على العنصر <span style="line-height: 17.92px; font-family: 'courier new', courier, monospace;">subnav</span><span style="line-height: 17.92px; font-family: 'courier new', courier, monospace;">#</span> حتى لو كان غير ظاهر في الصفحة.</p><p dir="rtl">وأخيرًا، إذا كان العنصر <span style="line-height: 17.92px; font-family: 'courier new', courier, monospace;">subnav</span><span style="line-height: 17.92px; font-family: 'courier new', courier, monospace;">#</span> مخفيًا و<span style="line-height: 17.92px; font-family: 'courier new', courier, monospace;">nav</span><span style="line-height: 17.92px; font-family: 'courier new', courier, monospace;">#</span> متمددًا فإننا نريد الخاصية <span style="font-family: 'courier new', courier, monospace; line-height: 17.92px;">margin-left</span> للعنصر <span style="line-height: 17.92px; font-family: 'courier new', courier, monospace;">main</span><span style="line-height: 17.92px; font-family: 'courier new', courier, monospace;">#</span> بأن تكون بالقيمة <strong>11em</strong>:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">#subnav.hidden + #main.expanded {
    margin-left: 11em;
}</pre><h2 dir="rtl">خاتمة</h2><p dir="rtl">كل شيء إلى الآن يظهر في مكانه الصحيح من دون الحاجة إلى استخدام أكواد جافاسكربت كثيرة، ولكن يمكنك ملاحظة أن الكود يمكن أن يكون كبيرًا ومعقدًا إذا ما أردنا إضافة المزيد من العناصر إلى الصفحة.</p><p dir="rtl">لاحظ أيضًا أنّه باستخدام CSS2 سيكون هناك الكثير من الأكواد لموضعة كل شيء في مكانه المناسب. لذلك سوف نقوم في الدرس القادم باستخدام بعض تقنيات CSS3 الجديدة وإعادة تخطيط الصفحة باستخدام تلك التقنيات.</p><p dir="rtl">ترجمة -وبتصرّف- للمقال <a rel="external nofollow" href="http://www.toptal.com/css/css-layout-primer-from-classic-approaches-to-the-latest-techniques">CSS Layout Tutorial: From Class+ic Approaches to the Latest Techniques</a> لصاحبه Laureano Martin Arcanio.</p>
]]></description><guid isPermaLink="false">177</guid><pubDate>Sun, 27 Sep 2015 21:39:37 +0000</pubDate></item><item><title>&#x625;&#x646;&#x634;&#x627;&#x621; &#x642;&#x627;&#x626;&#x645;&#x629; &#x645;&#x646;&#x633;&#x62F;&#x644;&#x629; (dropdown menu) &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; CSS &#x641;&#x642;&#x637;</title><link>https://academy.hsoub.com/programming/css/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D9%82%D8%A7%D8%A6%D9%85%D8%A9-%D9%85%D9%86%D8%B3%D8%AF%D9%84%D8%A9-dropdown-menu-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-css-%D9%81%D9%82%D8%B7-r168/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_09/dropdown-menu-css.png.c4f9b3a6e97b05222908b9532a1b50c1.png" /></p>

<p dir="rtl">قبل عدة سنوات لم يكن من الممكن إنشاء قائمة منسدلة بدون الاستعانة بالجافاسكربت، أمّا الآن فيمكننا وبمساعدة بعض الخصائص والمُحدّدات (selectors) المتقدمة الخاصة بلغة CSS3 القيام بذلك وبكل سهولة. فإذا أردت إنشاء قائمة منسدلة خاصة بك فعليك بتتبع هذا الدرس.</p><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/Figure1-dropdown-menu.jpg.b284eea373589c57aaef785a67adbf44.jpg"><img data-fileid="4853" class="ipsImage ipsImage_thumbnailed" alt="Figure1-dropdown-menu.thumb.jpg.72fd1553" src="https://academy.hsoub.com/uploads/monthly_2015_09/Figure1-dropdown-menu.thumb.jpg.72fd1553d9932e284fb7176d0ab90211.jpg"></a></p><p dir="rtl">سوف تحتوي القائمة التي سنقوم بإنشائها على قائمتين فرعيتين تظهران عندما يقوم المستخدم بوضع مؤشر الفأرة (hover) فوق الرابط/العنصر الأب (parent link). <a rel="external nofollow" href="http://line25.com/wp-content/uploads/2012/css-menu/demo/index.html">ألقِ نظرة على ما سنقوم بإنشائه في هذا الدرس</a><a rel="external nofollow" href="http://line25.com/wp-content/uploads/2012/css-menu/demo/index.html">.</a></p><h2 dir="rtl">هيكلة ملف HTML</h2><p dir="rtl"><span style="line-height: 17.92px;">سنقوم في البداية بإنشاء ملف HTML يحتوي على الوسوم (tags) الخاصة بالقائمة. سوف نستعمل وسم </span><span style="line-height: 17.92px; font-family: 'courier new', courier, monospace;">&lt;nav&gt;</span><span style="line-height: 17.92px;"> الذي ظهر في HTML5، ثم نضيف روابط القائمة الرئيسية داخل وسم </span><span style="line-height: 17.92px; font-family: 'courier new', courier, monospace;">&lt;ul&gt;</span><span style="line-height: 17.92px;">.</span></p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">&lt;nav&gt;
    &lt;ul&gt;
        &lt;li&gt;&lt;a href="#"&gt;Home&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="#"&gt;Tutorials&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="#"&gt;Articles&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="#"&gt;Inspiration&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
&lt;/nav&gt;</pre><p dir="rtl">بعد ذلك سوف نضيف القوائم الفرعية (قوائم فرعية درجة أولى) أسفل رابطي "Tutorials" و"Articles"، وكل واحدة من هاتين القائمتين ستكون عبارة عن وسم &lt;ul&gt;  موجود داخل وسم &lt;li&gt;. أنظر الشفرة البرمجية في الأعلى.</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">&lt;nav&gt;
    &lt;ul&gt;
        &lt;li&gt;&lt;a href="#"&gt;Home&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="#"&gt;Tutorials&lt;/a&gt;
            &lt;ul&gt;
                &lt;li&gt;&lt;a href="#"&gt;Photoshop&lt;/a&gt;&lt;/li&gt;
                &lt;li&gt;&lt;a href="#"&gt;Illustrator&lt;/a&gt;&lt;/li&gt;
                &lt;li&gt;&lt;a href="#"&gt;Web Design&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
        &lt;/li&gt;
        &lt;li&gt;&lt;a href="#"&gt;Articles&lt;/a&gt;
            &lt;ul&gt;
                &lt;li&gt;&lt;a href="#"&gt;Web Design&lt;/a&gt;&lt;/li&gt;
                &lt;li&gt;&lt;a href="#"&gt;User Experience&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
        &lt;/li&gt;
        &lt;li&gt;&lt;a href="#"&gt;Inspiration&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
&lt;/nav&gt;</pre><p>أمّا روابط القائمة الفرعية الثانية (قائمة فرعية درجة ثانية) فسوف تكون موجودة داخل الخيار "Web Design" من القائمة الفرعية الأولى ذات الدرجة الأولى. أي أنّ هذه الروابط ستكون موجودة داخل وسم &lt;ul&gt; وهذا الوسم سيكون موجودًا داخل الوسم:</p><p> &lt;li&gt;&lt;a href="#"&gt;Web Design&lt;/a&gt;&lt;/li&gt; </p><p>(يمكنك النظر إلى الشفرة البرمجية التالية حتى تتوضح الصورة بشكل أفضل).</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint" style="line-height: 17.92px;">&lt;nav&gt;
    &lt;ul&gt;
        &lt;li&gt;&lt;a href="#"&gt;Home&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="#"&gt;Tutorials&lt;/a&gt;
            &lt;ul&gt;
                &lt;li&gt;&lt;a href="#"&gt;Photoshop&lt;/a&gt;&lt;/li&gt;
                &lt;li&gt;&lt;a href="#"&gt;Illustrator&lt;/a&gt;&lt;/li&gt;
                &lt;li&gt;&lt;a href="#"&gt;Web Design&lt;/a&gt;
                    &lt;ul&gt;
                        &lt;li&gt;&lt;a href="#"&gt;HTML&lt;/a&gt;&lt;/li&gt;
                        &lt;li&gt;&lt;a href="#"&gt;CSS&lt;/a&gt;&lt;/li&gt;
                    &lt;/ul&gt;
                &lt;/li&gt;
            &lt;/ul&gt;
        &lt;/li&gt;
        &lt;li&gt;&lt;a href="#"&gt;Articles&lt;/a&gt;
            &lt;ul&gt;
                &lt;li&gt;&lt;a href="#"&gt;Web Design&lt;/a&gt;&lt;/li&gt;
                &lt;li&gt;&lt;a href="#"&gt;User Experience&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
        &lt;/li&gt;
        &lt;li&gt;&lt;a href="#"&gt;Inspiration&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
&lt;/nav&gt;
</pre><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/Figure2.jpg.6a573e32e10e4d37cb0f9b9e4fd39274.jpg"><img data-fileid="4854" class="ipsImage ipsImage_thumbnailed" alt="Figure2.thumb.jpg.237a18f4982456451e7825" src="https://academy.hsoub.com/uploads/monthly_2015_09/Figure2.thumb.jpg.237a18f4982456451e78250eabef8446.jpg"></a></p><p dir="rtl">لقد حصلنا إلى الآن على قائمة منسدلة بقوائم فرعية واضحة المعالم وسنقوم في الخطوة التالية بإضافة تنسيقات CSS.</p><h2 dir="rtl">إضافة تنسيقات CSS</h2><p dir="rtl"><span style="line-height: 17.92px;">لنبدأ الآن بإضافة بعض تنسيقات CSS الأساسية لنجعل القائمة المنسدلة تعمل. يمكننا باستخدام بعض المحددات المتقدمة أن نستهدف عناصر موجودة بشكل عميق داخل بنية HTML من دون استعمال أي ids أو classes، ففي البداية سنقوم بإخفاء العناصر الفرعية وذلك عن طريق استخدام الخاصية </span><span style="line-height: 17.92px; font-family: 'courier new', courier, monospace;">display:none</span><span style="line-height: 17.92px;"> على عناصر &lt;ul&gt; الموجودة داخل عناصر &lt;ul&gt; أخرى. وحتى نجعل هذه القوائم تظهر مرة أخرى عند وضع مؤشر الفأرة فوقها فإننا سنحتاج إلى إضافة الخاصية </span><span style="line-height: 17.92px; font-family: 'courier new', courier, monospace;">display: block</span><span style="line-height: 17.92px;">. وبالنسبة للمحدد &gt; فسوف نستخدمه حتى نتأكد بأنّ يظهر فقط العنصر الإبن </span><span style="line-height: 17.92px; font-family: 'courier new', courier, monospace;">&lt;ul&gt;</span><span style="line-height: 17.92px;"> الموجود داخل </span><span style="line-height: 17.92px; font-family: 'courier new', courier, monospace;">&lt;li&gt;</span><span style="line-height: 17.92px;"> الذي وضع فوقه مؤشر الفأرة بدلًا من أن تظهر جميع القوائم الفرعية بنفس اللحظة وهو ما لا نريده بكل تأكيد.</span></p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">nav ul ul {
    display: none;
}
nav ul li:hover &gt; ul {
    display: block;
}</pre><p dir="rtl"><span style="line-height: 17.92px;">يمكننا الآن تنسيق القائمة الرئيسية وذلك باستخدام بعض خصائص CSS3 مثل gradients ،box shadows وborder-radius. استخدمنا </span><span style="line-height: 17.92px; font-family: 'courier new', courier, monospace;">position:relative</span><span style="line-height: 17.92px;"> حتى نتمكن من موضعة القوائم الفرعية بالنسبة للقائمة الرئيسية (بعبارة أخرى، حتى نستطيع إعطاء الخاصية </span><span style="line-height: 17.92px; font-family: 'courier new', courier, monospace;">position: absloute</span><span style="line-height: 17.92px;"> للقوائم الفرعية)، واستخدمنا الخاصية </span><span style="line-height: 17.92px; font-family: 'courier new', courier, monospace;">display: inline-table </span><span style="line-height: 17.92px;">حتى نمنع القائمة من التمدد على كامل الصفحة. أمّا بالنسبة للسطرين الأخيرين في الكود الموجود في الأعلى فهذا ما يسمى Clearfix وهو يستخدم لحل مشكلة الـfloats الشائعة وحتى لا نضطر إلى استعمال </span><span style="line-height: 17.92px; font-family: 'courier new', courier, monospace;">overflow: hidden </span><span style="line-height: 17.92px;">لأن ذلك سيؤدي إلى إخفاء القوائم الفرعية ويمنعها من الظهور.</span></p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">nav ul {
    background: #efefef;
    background: linear-gradient(top, #efefef 0%, #bbbbbb 100%);
    background: -moz-linear-gradient(top, #efefef 0%, #bbbbbb 100%);
    background: -webkit-linear-gradient(top, #efefef 0%,#bbbbbb 100%);
    box-shadow: 0px 0px 9px rgba(0,0,0,0.15);
    padding: 0 20px;
    border-radius: 10px;
    list-style: none;
    position: relative;
    display: inline-table;
}

nav ul:after {
    content: ""; clear: both; display: block;
}
</pre><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/Figure3.jpg.445859f763c9df1b2bcca8b697ad9528.jpg"><img data-fileid="4855" class="ipsImage ipsImage_thumbnailed" alt="Figure3.thumb.jpg.609f9d5b27ec18d3bf3692" src="https://academy.hsoub.com/uploads/monthly_2015_09/Figure3.thumb.jpg.609f9d5b27ec18d3bf3692e6a6d50e89.jpg"></a></p><p dir="rtl"><span style="line-height: 17.92px;">قمنا بعد ذلك بتنسيق عناصر القائمة </span><span style="line-height: 17.92px; font-family: 'courier new', courier, monospace;">&lt;li&gt;</span><span style="line-height: 17.92px;"> وما تحتويه من عناصر </span><span style="line-height: 17.92px; font-family: 'courier new', courier, monospace;">&lt;a&gt;</span><span style="line-height: 17.92px;">. وعندما يقوم المستخدم بوضع مؤشر الفأرة فوق العنصر سيتحول لون الخلفية إلى إحدى تدرجات اللون الأزرق وسوف يتغير لون الخط إلى الأبيض.</span></p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">nav ul li {
    float: left;
}

nav ul li:hover {
    background: #4b545f;
    background: linear-gradient(top, #4f5964 0%, #5f6975 40%);
    background: -moz-linear-gradient(top, #4f5964 0%, #5f6975 40%);
    background: -webkit-linear-gradient(top, #4f5964 0%,#5f6975 40%);
}

nav ul li:hover a {
    color: #fff;
}

nav ul li a {
    display: block; padding: 25px 40px;
    color: #757575; text-decoration: none;
}</pre><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/Figure4.jpg.12caeeb2b6191c5f4187209ba3cf958b.jpg"><img data-fileid="4856" class="ipsImage ipsImage_thumbnailed" alt="Figure4.thumb.jpg.f5e22015ef12e676754efd" src="https://academy.hsoub.com/uploads/monthly_2015_09/Figure4.thumb.jpg.f5e22015ef12e676754efdd8863cb153.jpg"></a></p><p dir="rtl"><span style="line-height: 17.92px;">أصبحت القائمة الرئيسية جاهزة الآن ولكن القوائم الفرعية تحتاج إلى بعض العمل الإضافي، فبعض التنسيقات في عناصر القوائم الفرعية سوف ترث تنسيقات العنصر الأب، لذلك سوف نحتاج إلى تغيير لون الخلفية (background) وإزالة border-radius وتعديل قيم padding حتى يظهر كل شيء بأفضل شكل. وحتى نضمن أن تظهر هذه القوائم أسفل القائمة الرئيسية فقد استعملنا الخاصيتين </span><span style="line-height: 17.92px; font-family: 'courier new', courier, monospace;">position: absolute</span><span style="line-height: 17.92px;"> و </span><span style="line-height: 17.92px; font-family: 'courier new', courier, monospace;">top: 100%</span><span style="line-height: 17.92px;">.</span></p><p dir="rtl"><span style="line-height: 17.92px;">إنّ عناصر</span><span style="line-height: 17.92px; font-family: 'courier new', courier, monospace;"> &lt;li&gt;</span><span style="line-height: 17.92px;"> الموجودة داخل </span><span style="line-height: 17.92px; font-family: 'courier new', courier, monospace;">&lt;ul&gt;</span><span style="line-height: 17.92px;"> في القوائم الفرعية لن تحتاج إلى أن تكون بجانب بعضها بشكل أفقي (أي لن نحتاج إلى استعمال خاصية float) وإنما ستكون فوق بعضها البعض بشكل عمودي مع وجود حدود (borders) صغيرة تفصل بينها. وفي الأخير هناك تأثير hover الذي سوف يُغيّر لون الخلفية إلى شيء أدكن.</span></p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">nav ul ul {
    background: #5f6975; 
    border-radius: 0px; 
    padding: 0;
    position: absolute; 
    top: 100%;
}

nav ul ul li {
    float: none;
    border-top: 1px solid #6b727c;
    border-bottom: 1px solid #575f6a;
    position: relative;
}

nav ul ul li a {
    padding: 15px 40px;
    color: #fff;
}

nav ul ul li a:hover {
    background: #4b545f;
}</pre><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/Figure5.jpg.cdef9c78b341da34f8115676176f5cc5.jpg"><img data-fileid="4857" class="ipsImage ipsImage_thumbnailed" alt="Figure5.thumb.jpg.4ffbe8a1604e24a69770b6" src="https://academy.hsoub.com/uploads/monthly_2015_09/Figure5.thumb.jpg.4ffbe8a1604e24a69770b6ce749424a1.jpg"></a></p><p dir="rtl"><span style="line-height: 17.92px;">نأتي الآن للخطوة الأخيرة وهي موضعة القوائم الفرعية من الدرجة الثانية. سوف ترث هذه القوائم التنسيقات الخاصة بالقائمة الفرعية من الدرجة الأولى وبذلك فكل ما سنحتاجه هو موضعة هذه القوائم باستخدام </span><span style="line-height: 17.92px; font-family: 'courier new', courier, monospace;">position: absolute</span><span style="line-height: 17.92px;"> و </span><span style="line-height: 17.92px; font-family: 'courier new', courier, monospace;">left: 100%</span><span style="line-height: 17.92px;"> نسبة إلى العنصر الأب </span><span style="line-height: 17.92px; font-family: 'courier new', courier, monospace;">&lt;li&gt;</span><span style="line-height: 17.92px;"> الذي يحتوي على الخاصية </span><span style="line-height: 17.92px; font-family: 'courier new', courier, monospace;">position: relative</span><span style="line-height: 17.92px;">.</span></p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">nav ul ul ul {
    position: absolute; 
    left: 100%; 
    top:0;
}
</pre><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/Figure6.jpg.1420cc144c5f123e808b8cce8c5e0d43.jpg"><img data-fileid="4858" class="ipsImage ipsImage_thumbnailed" alt="Figure6.thumb.jpg.0b6604320a0481b2c6aad8" src="https://academy.hsoub.com/uploads/monthly_2015_09/Figure6.thumb.jpg.0b6604320a0481b2c6aad8ab790f9bb8.jpg"></a></p><p dir="rtl">وإلى هنا نصل إلى نهاية هذا الدرس ونكون قد حصلنا على قائمة منسدلة جميلة وأنيقة.</p><p dir="rtl"><a rel="external nofollow" href="http://line25.com/wp-content/uploads/2012/css-menu/demo/index.html">يمكنك تصفح النتيجة النهائية من هنا</a><a rel="external nofollow" href="http://line25.com/wp-content/uploads/2012/css-menu/demo/index.html">.</a></p><p dir="rtl">ترجمة -وبتصرف- للمقال <a rel="external nofollow" href="http://line25.com/tutorials/how-to-create-a-pure-css-dropdown-menu">How To Create a Pure CSS Dropdown Menu</a> لصاحبه Iggy.</p>
]]></description><guid isPermaLink="false">168</guid><pubDate>Thu, 17 Sep 2015 00:10:30 +0000</pubDate></item><item><title>&#x625;&#x646;&#x634;&#x627;&#x621; &#x62A;&#x623;&#x62B;&#x64A;&#x631; retro &#x639;&#x644;&#x649; &#x627;&#x644;&#x635;&#x648;&#x631; &#x628;&#x627;&#x633;&#x62A;&#x639;&#x645;&#x627;&#x644; CSS &#x641;&#x642;&#x637;</title><link>https://academy.hsoub.com/programming/css/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D8%AA%D8%A3%D8%AB%D9%8A%D8%B1-retro-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D8%B5%D9%88%D8%B1-%D8%A8%D8%A7%D8%B3%D8%AA%D8%B9%D9%85%D8%A7%D9%84-css-%D9%81%D9%82%D8%B7-r166/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_09/css-retro-effect.png.7b8668d9ab0e71b2d55d0a7c38847e07.png" /></p>

<p dir="rtl">كنت في الماضي قد قمت بإنشاء العديد من مثل هذا التأثير باستخدام الفوتوشوب، ولكن مع ظهور CSS3 وجلبها للكثير من الخصائص المدهشة فقد قررت أن أقوم بدرس حول كيفية إنشاء ذلك التأثير بمساعدة واستخدام التدرجات (gradients) والمرشحات (filters) الموجودة في CSS3.</p><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/Figure1-retro.jpg.928335bf300134b160d041610a6a8d59.jpg"><img data-fileid="4784" class="ipsImage ipsImage_thumbnailed" alt="Figure1-retro.thumb.jpg.80cd6e771c8b604d" src="https://academy.hsoub.com/uploads/monthly_2015_09/Figure1-retro.thumb.jpg.80cd6e771c8b604d929a4622c2e931e0.jpg"></a></p><p dir="rtl">سوف نستخدم التدرجات (gradients) والمرشحات (filters) الخاصة بلغة CSS لدمج العديد من الألوان المتداخلة لإنشاء التأثير المطلوب. إنّ دعم المتصفحات للمرشحات جيد جدًا فهو مدعوم في جميع المتصفحات الحديثة ما عدا متصفحات Internet Explorer ومتصفح Opera mini (<a rel="external nofollow" href="http://caniuse.com/#feat=css-filters">أنقر هنا لمعلومات أكثر عن دعم المتصفحات</a>).</p><h2 dir="rtl">كيف تقوم بإنشاء التأثير باستعمال CSS فقط</h2><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">&lt;div class="retro"&gt;
  &lt;img src="images/retrofy-me.jpg" alt="Retro is cool!" /&gt;
&lt;/div&gt;</pre><p dir="rtl">حتى نقوم بإنشاء التأثير سنحتاج إلى صورة، لذلك قم بإضافة صورة باستخدام وسم `<span style="font-family:courier new,courier,monospace;">&lt;img&gt;</span>`. وبما أنّ بعض تأثيرات CSS تعتمد على وجود عنصر حاوي من نوع block فسوف تكون الصورة موجودة داخل وسم `<span style="font-family:courier new,courier,monospace;">&lt;div&gt;</span>` (يمكنك استخدام `<span style="font-family:courier new,courier,monospace;">&lt;p&gt;</span>` بدلًا من `&lt;div&gt;` فكلاهما من نوع block ولكني أفضل استخدام div).</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.retro {
  -webkit-box-shadow: inset 0px 0px 100px rgba(0,0,20,1);
  box-shadow: inset 0px 0px 100px rgba(0,0,20,1);
  background: -webkit-linear-gradient(top, rgba(255,145,0,0.2) 0%,rgba(255,230,48,0.2) 60%), -webkit-linear-gradient(20deg, rgba(255,0,0,0.5) 0%,rgba(255,0,0,0) 35%);
  background: linear-gradient(top, rgba(255,145,0,0.2) 0%,rgba(255,230,48,0.2) 60%), linear-gradient(20deg, rgba(255,0,0,0.5) 0%,rgba(255,0,0,0) 35%);
  display: table;
}

.retro img {
  -webkit-filter: sepia(20%) brightness(10%) contrast(130%);
  filter: sepia(20%) brightness(10%) contrast(130%);
  position: relative;
  z-index: -1;
}</pre><p dir="rtl">يمكنك استعمال تنسيقات CSS الموجودة في الأعلى لإنشاء تأثير retro على أي صورة.</p><h2 dir="rtl">كيف يعمل كل شيء</h2><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/Figure2.jpg.5756feba477244fdb0b08840fdbf7647.jpg"><img data-fileid="4785" class="ipsImage ipsImage_thumbnailed" alt="Figure2.thumb.jpg.c96bf5c7a173db5d2b349c" src="https://academy.hsoub.com/uploads/monthly_2015_09/Figure2.thumb.jpg.c96bf5c7a173db5d2b349c782064902a.jpg"></a></p><p dir="rtl">نبدأ تنسيقات CSS باستعمال خاصية `<span style="font-family:courier new,courier,monospace;">box-shadow</span>` واعطائها القيمة <strong><span style="font-family:courier new,courier,monospace;">(inset 0px 0px 100px rgba(0,0,20,1</span></strong> مما يخلق توهجًا داخليًا بلون أزرق داكن وذلك لمحاكاة الصورة باهتة الحواف. ولكن هناك مشكلة وهو أن التأثير الذي تصنعه خاصية <strong><span style="font-family:courier new,courier,monospace;">box-shadow</span></strong> لن يظهر لأنه سيكون موجودًا أسفل الصورة وسوف يتمدد على العرض الكامل للصفحة وهو ما لا نريده، ولحل تلك المشكلة سوف نضيف للصورة الخصائص <strong><span style="font-family:courier new,courier,monospace;">position: relative</span></strong> و <strong><span style="font-family:courier new,courier,monospace;">z-index: -1 </span></strong>حتى نجعل التأثير يظهر فوقها، كما أننا سوف نعطي الخاصية <strong><span style="font-family:courier new,courier,monospace;">display: table </span></strong>للعنصر الأب حتى نمنع تمدده على كامل الصفحة ويكتفي فقط بالتمدد على أبعاد الصورة.</p><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/Figure3_(1).jpg.1a5213dc2b69339c4948aed55aa1424b.jpg"><img data-fileid="4786" class="ipsImage ipsImage_thumbnailed" alt="Figure3_(1).thumb.jpg.742565ccd8ea283386" src="https://academy.hsoub.com/uploads/monthly_2015_09/Figure3_(1).thumb.jpg.742565ccd8ea283386f3e2c460c54421.jpg"></a></p><p dir="rtl">لاحظ أننا استعملنا تدرجين؛ الأول <strong><span style="font-family:courier new,courier,monospace;">(linear-gradient(top, rgba(255,145,0,0.2) 0%, rgba(255,230,48,0.2) 60%</span></strong> وسوف يعطي تدرجًا عموديًا من اللون البرتقالي إلى اللون الأصفر، وتسمح لنا قيم <span style="font-family:courier new,courier,monospace;">rgba</span> بتقليل شفافية الألوان حتى نسمح للتدرج بالظهور وكأنه عبارة عن غشاء شفاف فوق الصورة.</p><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/Figure4_(1).jpg.3687fc83ad7a7e9b46a914698d2df002.jpg"><img data-fileid="4787" class="ipsImage ipsImage_thumbnailed" alt="Figure4_(1).thumb.jpg.ec7958b605b520f485" src="https://academy.hsoub.com/uploads/monthly_2015_09/Figure4_(1).thumb.jpg.ec7958b605b520f4856c93a8ca589645.jpg"></a></p><p dir="rtl">أمّا بالنسبة للتدرج الثاني <strong><span style="font-family:courier new,courier,monospace;">(linear-gradient(20deg, rgba(255,0,0,0.5) 0%, rgba(255,0,0,0) 35%</span></strong> فقد أضفناه للعنصر الأب (وسم div) ويتدرج من لون أحمر ذو شفافية 50% إلى نفس اللون ولكن بشفافية 0% وبزاوية 20 درجة لمحاكاة تأثير تسرب الضوء الجميل.</p><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/Figure5_(1).jpg.5ee9c55d2be269706d4a5646940c4342.jpg"><img data-fileid="4788" class="ipsImage ipsImage_thumbnailed" alt="Figure5_(1).thumb.jpg.dde7c077b2706c1edb" src="https://academy.hsoub.com/uploads/monthly_2015_09/Figure5_(1).thumb.jpg.dde7c077b2706c1edb99310b43ab3c0a.jpg"></a></p><p dir="rtl">تعمل التأثيرات حتى الآن بشكل جيد ولكن الصورة تبدو مسطحة كثيرًا، لذلك سوف نستعمل مرشحات CSS  كالتالي: <strong><span style="font-family:courier new,courier,monospace;">(filter: brightness(10%) contrast(130%) sepia(20%</span></strong> للتعديل على الصورة قليلًا حتى تبدو أفضل، فخاصية <span style="font-family:courier new,courier,monospace;">brightness</span> ستزيد سطوع الصورة بمقدار 10%، وخاصية التباين <span style="font-family:courier new,courier,monospace;">contrast</span> تقوم بتدكين المناطق الداكنة وتفتيح المناطق الفاتحة، أمّا خاصية <span style="font-family:courier new,courier,monospace;">sepia</span> فتضيف للصورة درجة من اللون البني المائل للصفار وبقيمة 20% حتى نحافظ على الألوان الأصلية للصورة.</p><h2 dir="rtl">خاتمة</h2><p dir="rtl">كما رأيت، فبدمج خاصية gradient مع خاصية filter يمكننا إنشاء تأثيرات جميلة وعصرية وتشبه بدرجة كبيرة تلك التي يمكننا إنشاؤها باستخدام برنامج الفوتوشوب.</p><p dir="rtl">ترجمة -وبتصرّف- للمقال <a rel="external nofollow" href="http://line25.com/tutorials/create-a-trendy-retro-photo-effect-purely-with-css"> </a><a rel="external nofollow" href="http://line25.com/tutorials/create-a-trendy-retro-photo-effect-purely-with-css">Create a Trendy Retro Photo Effect Purely with CSS</a> لصاحبه Iggy.</p>
]]></description><guid isPermaLink="false">166</guid><pubDate>Mon, 14 Sep 2015 18:24:40 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641; &#x62A;&#x635;&#x645;&#x645; &#x642;&#x627;&#x626;&#x645;&#x629; &#x62A;&#x635;&#x641;&#x651;&#x62D; &#x645;&#x633;&#x637;&#x62D;&#x629; (Flat) &#x628;&#x633;&#x64A;&#x637;&#x629; &#x648;&#x639;&#x635;&#x631;&#x64A;&#x629; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; CSS</title><link>https://academy.hsoub.com/programming/css/%D9%83%D9%8A%D9%81-%D8%AA%D8%B5%D9%85%D9%85-%D9%82%D8%A7%D8%A6%D9%85%D8%A9-%D8%AA%D8%B5%D9%81%D9%91%D8%AD-%D9%85%D8%B3%D8%B7%D8%AD%D8%A9-flat-%D8%A8%D8%B3%D9%8A%D8%B7%D8%A9-%D9%88%D8%B9%D8%B5%D8%B1%D9%8A%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-css-r156/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_09/css-flat-nav-menu.png.4f5b36a4c2e649f87087a4ec793e63d8.png" /></p>

<p>سنقوم اليوم بإذن الله ببناء قائمة أخرى مُطَعَّمة بتأثيرات fancy hover‏. وسأعتمد التصميم ‏المُسطح الشائع مُستخدمًا الألوان الزاهية والأيقونات الرائعة، وأُطبّق تقنيات CSS‏ المتعددة، وبذلك يُصبح هذا الدرسُ ‏مقالةً رائعةً لمصممي الويب.‏</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/1.png.69c35d6483dc71d34abca2714e85b971.png"><img data-fileid="4360" class="ipsImage ipsImage_thumbnailed" alt="1.thumb.png.f27f02dba520b5e9a3012653e62a" src="https://academy.hsoub.com/uploads/monthly_2015_09/1.thumb.png.f27f02dba520b5e9a3012653e62a0647.png"></a></p><h2>مفهوم القائمة</h2><p>قبل أن نبدأ بأي تنسيقات، سنقوم بإنشاء الهيكل الأساسي للقائمة بـ HTML‏. هناك عناصر جديدة في HTML5‎‏ مثل ‏nav‏ مُتاحة هذه الأيام، حتى أنها تعمل على إنترنت إكسبلورر بمساعدة بعض الإضافات مثل ‏ <a rel="external nofollow" href="http://code.google.com/p/html5shiv/">html5shiv</a>.<br>‏</p><pre data-pbcklang="html" data-pbcktabsize="" class="html ipsCode prettyprint">&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset="utf-8" /&gt;
&lt;title&gt;Flat Nav&lt;/title&gt;

&lt;link href="style.css" rel="stylesheet" /&gt;

&lt;link href='http://fonts.googleapis.com/css?family=Dosis' rel='stylesheet' type='text/css'&gt;

&lt;/head&gt;
&lt;body&gt;

&lt;div id="demo"&gt;
    &lt;nav&gt;
        &lt;ul&gt;
            &lt;li&gt;
                &lt;a href="#"&gt;
                    &lt;span&gt;Home&lt;/span&gt;
                &lt;/a&gt;
            &lt;/li&gt;
            &lt;li&gt;
                &lt;a href="#"&gt;
                    &lt;span&gt;About&lt;/span&gt;
                &lt;/a&gt;
            &lt;/li&gt;
            &lt;li&gt;
                &lt;a href="#"&gt;
                    &lt;span&gt;Portfolio&lt;/span&gt;
                &lt;/a&gt;
            &lt;/li&gt;
            &lt;li&gt;
                &lt;a href="#"&gt;
                    &lt;span&gt;Contact&lt;/span&gt;
                &lt;/a&gt;
            &lt;/li&gt;
            
        &lt;/ul&gt;
    &lt;/nav&gt;
&lt;/div&gt;

&lt;/body&gt;
&lt;/html&gt;</pre><p>يبدأ الكود بتعريف ‏HTML5‎‏ كمرجعية للصفحة عن طريق <strong><span style="font-family:courier new,courier,monospace;">&lt;doctype html!&gt;</span></strong>‏، عنوان الصفحة ‏<strong>‏title‏</strong>‏ ورابط ‏ملف CSS‏ ‏الذي سنقوم بإنشائه بعد ذلك ‏<strong>‏link&gt;‎&gt;</strong>. يأتي بعد ذلك ربط صفحة الويب بخط ‏ <a rel="external nofollow" href="https://www.google.com/fonts/specimen/Dosis">‏Dosis‏‏ من ‏‏‏Google Webfonts</a><strong>‏</strong>. تبدأ ‏البُنية الرئيسة في القائمة بعنصر ‏<strong>‏nav‏</strong>، تكون داخله قائمة <strong>‏ul‏</strong>. وكل ‏عنصر داخل <strong>‏ul‏</strong> يحتوي على رابط مرفقًا معه ‏عنصر ‏‎<strong>span</strong>‎‏ لإظهار تسمية الزر على يمين القائمة عند ‏مرور الماوس عليه.‏</p><h2>تنسيقات CSS</h2><pre data-pbcklang="css" data-pbcktabsize="" class="css ipsCode prettyprint">nav ul {
    list-style: none; overflow: hidden; position: relative;
}

nav ul li { 
  float: left; margin: 0 20px 0 0;
}</pre><p>نبدأ بعمل تنسيق ‏CSS‏ بأن نُزيل رمز النقطة من أمام كل عنصر من عناصر القائمة <strong>‏ul‏</strong>، نجعل تلك العناصر ‏‏<strong>‏li‏</strong> بجوار بعضها البعض. نضع تعريف التنسيق <span style="font-family:courier new,courier,monospace;">‏<strong>overflow: hidden</strong></span><em>‏</em> للقائمة <strong>‏ul‏</strong> لتظهر تسميات ‏الأزرار متناسقة وغير متداخلة، من ثم وضع التنسيق الخاص بتسميات الأزرار <strong>‏span‏</strong> حتى تكون كلٌ منها ‏متمركزة في مكانها الصحيح على <strong>‏li‏</strong> الخاص بها ضمن القائمة <strong>‏ul‏</strong> الأب.</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/2.png.f3a6975df05d37d91f2d85f8729e633f.png"><img data-fileid="4361" class="ipsImage ipsImage_thumbnailed" alt="2.thumb.png.12b9ec39ba385179362239269be9" src="https://academy.hsoub.com/uploads/monthly_2015_09/2.thumb.png.12b9ec39ba385179362239269be95e28.png"></a></p><pre data-pbcklang="css" data-pbcktabsize="" class="css ipsCode prettyprint">nav ul li a {
    display: block; width: 120px; height: 120px;
    background-image: url(icons.png); background-repeat: no-repeat;
}
   
nav ul li:nth-child(1) a {
    background-color: #5bb2fc;
    background-position: 28px 28px;
}

nav ul li:nth-child(2) a {
    background-color: #58ebd3;
    background-position: 28px -96px;
}

nav ul li:nth-child(3) a {
    background-color: #ffa659;
    background-position: 28px -222px;
}

nav ul li:nth-child(4) a {
    background-color: #ff7a85;
    background-position: 28px -342px;
}</pre><p>كل نقطة من نقاط القائمة الأربعة يتم تنسيقها لتظهر كمربع بعد إضافة الطول والعرض لها وهو <em>‏‎120px‎‏</em>، قابلة ‏للتحول من تنسيق <strong>‏inline‏</strong> إلى تنسيق <strong>‏block‏</strong> باستخدام <em>‏display: block;‎‏</em>. يتم تصدير جميع الأيقونات ‏من الفوتوشوب في صورة <strong>‏sprite‏</strong> واحدة تحوي خلفيات الصور الأربعة في نفس الملف، لذا فإن ملف ‏‏<strong>‏icons.png‏</strong> يُعتبر صورة خلفية لجميع نقاط القائمة باستخدام مُحدِّد <strong>‏nav ul li‏</strong>. حيث تقوم بتحديد موقع ‏الخلفية من داخل الملف الواحد حسب تموضعها فيه.‏</p><p>يُمكنك إضافة تنسيق مُحدَّد لكل نقطة من النقاط الأربعة على حِدة باستخدام مُحدِّد <strong>‏li :nth-child‏</strong>. حيث تستطيع ‏أن تضيف <em>‏classes‏</em> لكل عنصر لوحده من عناصر القائمة <strong>‏li‏</strong> حسب رقم هذا العنصر. بالضبط كما حددنا لون ‏الخلفية لكل عنصر منفردًا.‏</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/3.png.deba1e901c34c64bc985628644e94520.png"><img data-fileid="4362" class="ipsImage ipsImage_thumbnailed" alt="3.thumb.png.057650cbc6e0e788c87f4712aebb" src="https://academy.hsoub.com/uploads/monthly_2015_09/3.thumb.png.057650cbc6e0e788c87f4712aebb36dd.png"></a></p><pre data-pbcklang="css" data-pbcktabsize="" class="css ipsCode prettyprint">nav ul li a span {
    font: 50px "Dosis", sans-serif; text-transform: uppercase; 
    position: absolute; left: 580px; top: 29px;
    display: none;
}</pre><p>نأتي الآن إلى ضبط موقع تسمية النص لعناصر القائمة، بتطبيق حدث التنسيق <em>‏on hover‏</em> لجميع العناصر مرة ‏واحدة، وذلك على <strong>‏span‏</strong> التي أضفناها لكل عنصر من عناصر القائمة. أولاً: نقوم بإضافة خصائص الخط ‏‏<strong>‏Dosis‏</strong>، وهي حجم الخط، و<em>‏uppercase‏</em> (تحويل الحروف الصغيرة إلى حروف كبيرة) باستخدام خاصية ‏‏<em>‏text-transform‏</em>. ‏</p><p>افتراضيًا، فإن كل تسمية عنصر تتموضع في الزاوية العلوية يسارًا على بلوك عنصر القائمة، ولكننا نريدها أن تكون ‏على يمين القائمة <strong>‏ul‏</strong> خارج إطار العناصر. ببساطة، نضيف خاصية الموضع <em>‏position: absolute;‎‏</em> لعمل ‏ذلك. قمنا قبل ذلك بوضع الخاصية <em>‏position: relative;‎‏</em> إلى <strong>‏nav ul‏</strong> حتى يكون التموضع الحر مرتبطًا ‏بالقائمة <strong>‏ul‏</strong> (الأب)، عدا عن كونها مرتبطة بالعرض الكامل لشاشة المتصفح.‏</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/4.png.bc10a594defcda3027786a89b6a85d5a.png"><img data-fileid="4363" class="ipsImage ipsImage_thumbnailed" alt="4.thumb.png.205aa7460676ed6a0115eb71b426" src="https://academy.hsoub.com/uploads/monthly_2015_09/4.thumb.png.205aa7460676ed6a0115eb71b426efe9.png"></a></p><pre data-pbcklang="css" data-pbcktabsize="" class="css ipsCode prettyprint">nav ul li a:hover span {
    display: block;
}

nav ul li:nth-child(1) a span {
    color: #5bb2fc;
}

nav ul li:nth-child(2) a span {
    color: #58ebd3;
}

nav ul li:nth-child(3) a span {
    color: #ffa659;
}

nav ul li:nth-child(4) a span {
    color: #ff7a85;
}</pre><p>نرى الآن جميع تسميات العناصر ظاهرة فوق بعضها البعض في نفس الوقت، لذا سنقوم بإخفائها باستخدام الخاصية <strong><span style="font-family:courier new,courier,monospace;">‏‏‏display:none;‎</span></strong><em>‏</em> حتى لا تظهر أي من التسميات إلا حين يمر الماوس فوق عنصرها فقط، بإضافة <strong><span style="font-family:courier new,courier,monospace;">‏‏‏display:block;‎</span></strong><em>‏</em> إلى حدث التنسيق <em>‏</em><span style="font-family:courier new,courier,monospace;">on hover</span><em>‏</em> الخاص بكل عنصر. بقي أن نُعطيَ كلَّ تسمية عنصر لونها ‏الخاص بها والمطابق للون خلفية عنصرها، هذا الأمر يتم في مُحدِّد <strong>‏‎:<span style="font-family:courier new,courier,monospace;">nth-child</span>‏</strong> لكل عنصر على حدة.‏</p><p>النص الكامل لملف CSS‏، بعد أن انتهينا من الخطوات جميعها، سوف يصبح لدينا ملف CSS‏ جاهزًا كما يلي، بإمكانك نسخه من هنا:</p><pre data-pbcklang="css" data-pbcktabsize="" class="css ipsCode prettyprint">nav ul {
    list-style: none; overflow: hidden; position: relative;
}

nav ul li {
    float: left; margin: 0 20px 0 0;
}

nav ul li a {
    display: block; width: 120px; height: 120px;
    background-image: url(icons.png); background-repeat: no-repeat;
}

nav ul li:nth-child(1) a {
    background-color: #5bb2fc;
    background-position: 28px 28px;
}

nav ul li:nth-child(2) a {
    background-color: #58ebd3;
    background-position: 28px -96px;
}

nav ul li:nth-child(3) a {
    background-color: #ffa659;
    background-position: 28px -222px;
}

nav ul li:nth-child(4) a {
    background-color: #ff7a85;
    background-position: 28px -342px;
}
        
nav ul li a span {
    font: 50px "Dosis", sans-serif; text-transform: uppercase; 
    position: absolute; left: 580px; top: 29px;
    display: none;
}

nav ul li a:hover span {
    display: block;
}
                
nav ul li:nth-child(1) a span {
    color: #5bb2fc;
}

nav ul li:nth-child(2) a span {
    color: #58ebd3;
}

nav ul li:nth-child(3) a span {
    color: #ffa659;
}

nav ul li:nth-child(4) a span {
    color: #ff7a85;
}
</pre><p>التصميم النهائي لقائمتنا ذات السِمة المسطحة: </p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/5.png.60f86a3371c36923a90bfd4afc7970e3.png"><img data-fileid="4364" class="ipsImage ipsImage_thumbnailed" alt="5.thumb.png.f969ba89c1d559017a095d01e40b" src="https://academy.hsoub.com/uploads/monthly_2015_09/5.thumb.png.f969ba89c1d559017a095d01e40bff18.png"></a></p><blockquote><p>يمكن <a rel="external nofollow" href="http://academy-examples.hsoub.com/examples/CSS%20Flat%20Nav%20Menu/">معاينة مثال حي عن الدرس</a>، أو <a rel="external nofollow" href="https://github.com/HsoubAcademy/HsoubAcademy.github.io/tree/master/examples/CSS%20Flat%20Nav%20Menu">تصفح ملفات العمل الخاصة بالدرس</a>.</p><p>ترجمة وبتصرف للمقال: <a rel="external nofollow" href="http://line25.com/tutorials/how-to-create-a-trendy-flat-style-nav-menu-in-css">How To Create a Trendy Flat Style Nav Menu in CSS</a>.</p></blockquote>
]]></description><guid isPermaLink="false">156</guid><pubDate>Tue, 01 Sep 2015 19:28:00 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641; &#x62A;&#x646;&#x634;&#x626; &#x645;&#x633;&#x627;&#x631; &#x62A;&#x635;&#x641;&#x62D; (Breadcrumb) &#x645;&#x633;&#x637;&#x62D; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; CSS</title><link>https://academy.hsoub.com/programming/css/%D9%83%D9%8A%D9%81-%D8%AA%D9%86%D8%B4%D8%A6-%D9%85%D8%B3%D8%A7%D8%B1-%D8%AA%D8%B5%D9%81%D8%AD-breadcrumb-%D9%85%D8%B3%D8%B7%D8%AD-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-css-r155/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_08/css-breadcrumb.png.1e106d28dfa89ed3ae2205051a950dcc.png" /></p>

<p>
	شجرة مسار الصفحة (سنقوم بتسميتها لاحقًا بـ<strong>المسار</strong>) هي عبارة عن التفريعة الكاملة للصفحة بدءًا من الصفحة ‏الرئيسة للموقع، ثم التصنيف الرئيس للصفحة وأي تصنيفات فرعية لها، ومن ثم اسم الصفحة الحالية، مع وجود ‏روابط للبندين الأولين في الشجرة دون الأخير لأنه مفتوح أمامك حاليًا في المسار.‏<br>
	هناك تقنيات وخصائص في الإصدارات القديمة لـCSS‏ لا تزال تستخدم بكثرة في الوقت الحالي بالرغم من توفر ‏الإصدارات الحديثة ‏CSS3‎‏. سنقوم في هذا الدرس بإنشاء مسار ذي تصميم مُسطح، بدون الحاجة إلى وضع خلفية ‏صورة له.‏
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_08/8.jpg.ee67d2b08f859afbfaca5de7e5876d81.jpg" data-fileid="4286" rel=""><img alt="8.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="4286" src="https://academy.hsoub.com/uploads/monthly_2015_08/8.thumb.jpg.602be39c00f00dd8fd35c2696066aad0.jpg"></a>
</p>

<p>
	ستكون روابط المسار مُنسَّقَة بأشكال الشارات لدعم فكرة التنقل الهرمي في المحتوى. وقد اعتدنا على وضع صورة ‏خلفية من نوع ‏PNG‏ للمسار مشابهة لأشكال الشارات، لكننا اليوم بفضل تقنيات الحدّ الذكي ‏<strong>clever border</strong>‏ سنقوم ‏بإنشاء كامل الخلفية باستخدام CSS‏ فقط.‏
</p>

<p>
	يمكم معاينة مثال حي<a href="http://HsoubAcademy.github.io/examples/CSS%20breadcrumbs/" rel="external nofollow"> لما سيكون عليه المثال بعد نهاية الدرس</a>.
</p>

<p>
	سنبدأ مباشرة بعمل روابط التنقل في المسار على هيئة <span style="font-family:courier new,courier,monospace;">‏‎ul</span>‎‏. سيظهر كل رابط في المسار كـ ‏<span style="font-family:courier new,courier,monospace;">li</span>‏ ضمن نقطة ‏عنصر في المسار:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
‏&lt;div id="crumbs"&gt;
    &lt;ul&gt;
        &lt;li&gt;&lt;a href="#"&gt;Breadcrumb&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
&lt;/div&gt;</pre>

<p>
	نستهلّ كتابة كود CSS‏ بإنشاء كل نقطة عنصر كمربع أزرق اللون. ونقوم بتوسيط النص في المسافة المخصصة ‏للرابط متساوية على الجانبين. نستخدم ‏<span style="font-family:courier new,courier,monospace;">position: relative</span>‎‏ لضبط خاصية التموضع للعناصر بحيث تكون ‏مرتبطة بـ <span style="font-family:courier new,courier,monospace;">‏ul</span>‏ الأب:
</p>

<pre class="css ipsCode prettyprint" data-pbcklang="css" data-pbcktabsize="">
#crumbs ul li a {
    display: block;
    float: left;
    height: 50px;
    background: #3498db;
    text-align: center;
    padding: 30px 40px 0 40px;
    position: relative;
    margin: 0 10px 0 0; 

    font-size: 20px;
    text-decoration: none;
    color: #fff;
}</pre>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_08/1.jpg.f8dfb8ba5e813c59d9cdff94431d6436.jpg" data-fileid="4279" rel=""><img alt="1.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="4279" src="https://academy.hsoub.com/uploads/monthly_2015_08/1.thumb.jpg.e93cf3e15655579c8ba8041737b309c1.jpg"></a>
</p>

<p>
	نقوم بإعادة تشكيل تأثيرات شكل الشارة في CSS‏ كي تصبح مثل خلفية صورة. استخدم مُحدِّد<span style="font-family:courier new,courier,monospace;"> ‏‎:after‎‏</span> لإنشاء ‏عنصر إضافي يكون تنسيقه خاصًا به دون غيره. تشكّل المُثلث من خلال تطبيق العديد من حدود الـCSS، فكما ترى ‏في الصورة السابقة أن المثلث يمكن إنشاؤه بتطبيق الحدّ العلوي والسفلي بحيث تتقاطع بهذا الشكل. لعلك لاحظت ‏وجود المساحات الحمراء، تركتُها لإيضاح الفكرة فقط، حيث سنقوم فيما بعد بتحويل اللون إلى شفاف حتى يظهر ‏المثلث الأزرق جليًا. سنقوم باستخدام تأثيرات الحدود هذه في مكان آخر من خلال التموضع الحر.‏
</p>

<pre class="css ipsCode prettyprint" data-pbcklang="css" data-pbcktabsize="">
#crumbs ul li a:after {
    content: "";  
    border-top: 40px solid red;
    border-bottom: 40px solid red;
    border-left: 40px solid blue;
    position: absolute; right: -40px; top: 0;
}</pre>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_08/2.jpg.3adb1f35e163d6d78cc1b9b174c750f0.jpg" data-fileid="4280" rel=""><img alt="2.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="4280" src="https://academy.hsoub.com/uploads/monthly_2015_08/2.thumb.jpg.2c013b6be9c5162169f7e80540097527.jpg"></a>
</p>

<p>
	سينتج لدينا المثلث المطلوب بعد تطبيقنا لتأثيرات الحدود مع الألوان المُحَدَّدَة لكل حدّ، وبهذا يتكون لدينا شكل الشارة ‏لكل رابط نضعه ضمن المسار:‎ ‎
</p>

<pre class="css ipsCode prettyprint" data-pbcklang="css" data-pbcktabsize="">
border-top: 40px solid transparent‏;‏
border-bottom: 40px solid transparent‏;‏
border-left: 40px solid #3498db‏;‏</pre>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_08/3.jpg.0c6cecea735377be3bb192f1f64cb8de.jpg" data-fileid="4281" rel=""><img alt="3.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="4281" src="https://academy.hsoub.com/uploads/monthly_2015_08/3.thumb.jpg.c503db7f4ccb2a5c58f1f7ac742e488d.jpg"></a>
</p>

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

<pre class="css ipsCode prettyprint" data-pbcklang="css" data-pbcktabsize="4">
#crumbs ul li a:before { 
    content: ""; 
    border-top: 40px solid transparent;     
    border-bottom: 40px solid transparent; 
    border-left: 40px solid #d4f2ff; 
    position: absolute; left: 0; top: 0; 
}</pre>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_08/4.jpg.cd57211505eef81a9c420f52ac116949.jpg" data-fileid="4282" rel=""><img alt="4.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="4282" src="https://academy.hsoub.com/uploads/monthly_2015_08/4.thumb.jpg.9f0c5e9b6406927f92abf0e032e6387d.jpg"></a>
</p>

<p>
	نلاحظ أن المثلث المضاف حديثًا يؤثر على مظهر النص الخاص بوصف الرابط الذي قبله، ولكن يمكننا تدارك الأمر ‏بتعديل بسيط في الـ‎<span style="font-family:courier new,courier,monospace;">padding‎</span>‏:
</p>

<pre class="css ipsCode prettyprint" data-pbcklang="css" data-pbcktabsize="4" style="line-height: 17.9200000762939px;">
<span style="line-height: 17.9200000762939px;">padding: 30px 40px 0 80px‏;‏</span></pre>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_08/5.jpg.e41dcbdfdee24af921e7cdf60bb14f04.jpg" data-fileid="4283" rel=""><img alt="5.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="4283" src="https://academy.hsoub.com/uploads/monthly_2015_08/5.thumb.jpg.9f00cda02661cb763d0b1d26b4d2570e.jpg"></a>
</p>

<p>
	كلما أضفت روابط جديدة للمسار، فإنه يزداد حجمه طولاً. وكل رابط منها مُنسق بشكل الشارة، بفضل تأثيرات حد ‏المثلث في الـCSS‏ واللمسة الجمالية للـ<span style="font-family:courier new,courier,monospace;">‏right margin‏</span>.‏
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
&lt;div id="crumbs"&gt; 
    &lt;ul&gt; 
        &lt;li&gt;&lt;a href="#1"&gt;One&lt;/a&gt;&lt;/li&gt; 
        &lt;li&gt;&lt;a href="#2"&gt;Two&lt;/a&gt;&lt;/li&gt; 
        &lt;li&gt;&lt;a href="#3"&gt;Three&lt;/a&gt;&lt;/li&gt; 
        &lt;li&gt;&lt;a href="#4"&gt;Four&lt;/a&gt;&lt;/li&gt; 
        &lt;li&gt;&lt;a href="#5"&gt;Five&lt;/a&gt;&lt;/li&gt; 
    &lt;/ul&gt; 
&lt;/div&gt;</pre>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_08/6.jpg.c6e8c3b116d43133c98fda1f3eff3644.jpg" data-fileid="4284" rel=""><img alt="6.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="4284" src="https://academy.hsoub.com/uploads/monthly_2015_08/6.thumb.jpg.64235ed296bd67cb83382a2c317547d9.jpg"></a>
</p>

<p>
	يمكن تنسيق قائمة المسار بشيء أجمل، قم بإزالة تأثيرات المثلث عن العنصر الأول والأخير من خلال المُحدِّد ‏‏‏‎<span style="font-family:courier new,courier,monospace;">:first-child</span> ‎‏ و ‏‎<span style="font-family:courier new,courier,monospace;">:last-child</span>‏ باستخدام ‏‎<span style="font-family:courier new,courier,monospace;">border-radius</span>‏، تلاحظ تحول زوايا العنصرين الأول والأخير ‏إلى زوايا مستديرة.‏
</p>

<pre class="css ipsCode prettyprint" data-pbcklang="css" data-pbcktabsize="4">
#crumbs ul li:first-child a {
    border-top-left-radius: 10px; border-bottom-left-radius: 10px;
}
#crumbs ul li:first-child a:before {
    display: none; 
}

#crumbs ul li:last-child a {
    padding-right: 80px;
    border-top-right-radius: 10px; border-bottom-right-radius: 10px;
}
#crumbs ul li:last-child a:after {
    display: none; 
}</pre>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_08/7.jpg.0e2d096228fc709a46bed1804902a029.jpg" data-fileid="4285" rel=""><img alt="7.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="4285" src="https://academy.hsoub.com/uploads/monthly_2015_08/7.thumb.jpg.e5872bb7bb4a5b3a9ce05abec040911d.jpg"></a>
</p>

<p>
	كل ما تبقى علينا هو تطبيق تأثيرات الـ<span style="font-family:courier new,courier,monospace;">‏hover</span>‏ على الروابط. لا تنس تغيير لون الحد اليسار<span style="font-family:courier new,courier,monospace;"> ‏border-left-‎color</span>‏ في حدث التنسيق<span style="font-family:courier new,courier,monospace;"> ‏hover</span>‏ الخاص بتأثيرات المثلث، حتى تضمن أن تتغير الألوان مع مرور الماوس على ‏روابط المسار.‏
</p>

<pre class="css ipsCode prettyprint" data-pbcklang="css" data-pbcktabsize="">
‏#‏crumbs ul li a:hover‏ ‏{
background: #fa5ba5‎‏;‏
‏}‏

‏#‏crumbs ul li a:hover:after‏ {
    border-left-color: #fa5ba5‎‏;‏
‏}‏
</pre>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_08/8.jpg.ee67d2b08f859afbfaca5de7e5876d81.jpg" data-fileid="4286" rel=""><img alt="8.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="4286" src="https://academy.hsoub.com/uploads/monthly_2015_08/8.thumb.jpg.602be39c00f00dd8fd35c2696066aad0.jpg"></a>
</p>

<p>
	<a href="http://HsoubAcademy.github.io/examples/CSS%20breadcrumbs/" rel="external nofollow">يمكن معاينة المثال من هنا</a>، أو تحميل الشفرة المصدرية لكامل المثال من على <a href="https://github.com/HsoubAcademy/HsoubAcademy.github.io/tree/master/examples/CSS%20breadcrumbs" rel="external nofollow">حساب أكاديمية حسوب على github</a>.
</p>

<p>
	ترجمة -وبتصرف- للمقال <span style="font-family: 'Droid Arabic Naskh', 'Open Sans', 'Helvetica Neue', Helvetica, Tahoma, Arial, sans-serif; line-height: 25.7600002288818px;"><a href="http://line25.com/tutorials/how-to-create-flat-style-breadcrumb-links-with-css" rel="external nofollow">How To Create Flat Style Breadcrumb Links with CSS</a> لصاحبه Iggy.</span>
</p>
]]></description><guid isPermaLink="false">155</guid><pubDate>Mon, 31 Aug 2015 19:05:00 +0000</pubDate></item></channel></rss>
