<?xml version="1.0"?>
<rss version="2.0"><channel><title>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;: HTML</title><link>https://academy.hsoub.com/programming/html/page/4/?d=2</link><description>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;: HTML</description><language>ar</language><item><title>&#x62A;&#x62D;&#x62F;&#x64A;&#x62F; &#x627;&#x644;&#x645;&#x648;&#x642;&#x639; &#x627;&#x644;&#x62C;&#x63A;&#x631;&#x627;&#x641;&#x64A; (GeoLocation) &#x641;&#x64A; HTML5</title><link>https://academy.hsoub.com/programming/html/%D8%AA%D8%AD%D8%AF%D9%8A%D8%AF-%D8%A7%D9%84%D9%85%D9%88%D9%82%D8%B9-%D8%A7%D9%84%D8%AC%D8%BA%D8%B1%D8%A7%D9%81%D9%8A-geolocation-%D9%81%D9%8A-html5-r359/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_06/html5-geolocation.png.6c7d01757289a9f52a658ce5deb3b38f.png" /></p>

<p>
	تحديد الموقع الجغرافي هو آلية معرفة مكان وجودك في هذا العالم ومشاركة تلك المعلومات (اختياريًا) مع الأشخاص الذين تثق بهم؛ وهنالك أكثر من طريقة لمعرفة أين أنت: إما باستخدام عنوان IP الخاص بك، وإما عبر اتصال الشبكة اللاسلكية، أو عبر برج التغطية الخلوية الذي يتصل به هاتفك، أو عبر شريحة GPS التي تحسب مكانك نسبةً إلى خطوط الطول (longitude) والعرض (latitude) من المعلومات التي ترسلها الأقمار الاصطناعية من السماء.
</p>

<p style="text-align: center;">
	<img alt="html5-geolocation.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18153" data-unique="ckdgmhg4w" src="https://academy.hsoub.com/uploads/monthly_2016_06/html5-geolocation.png.3754c1d614937535d740218537127fab.png"></p>

<ul>
<li>
		<strong>س</strong>: يبدو لي أنَّ تحديد الموقع الجغرافي مرعبٌ. هل أستطيع تعطيله؟
	</li>
	<li>
		<strong>ج</strong>: يقلق المستخدمون من انتهاك الخصوصية عندما نتحدث عن مشاركة موقعك الفيزيائي مع خادوم ويب بعيد. تقول واجهة تحديد الموقع الجغرافي البرمجية (<abbr title="Application Programming Interface | واجهة برمجية">API</abbr>) "أنَّ على المتصفحات عدم إرسال معلومات الموقع الحالي إلى مواقع الويب دون إذن المستخدم"؛ أي بكلامٍ آخر، السماح بمشاركة الموقع الجغرافي منوطٌ بك، فإن شئتَ سمحتَ بمشاركته، وإلا فلا.
	</li>
</ul>
<h2>
	واجهة تحديد الموقع الجغرافي البرمجية
</h2>

<p>
	تسمح واجهة تحديد الموقع الجغرافي البرمجية (geolocation <abbr title="Application Programming Interface | واجهة برمجية">API</abbr>) لك بمشاركة موقعك الحالي مع مواقع الويب الموثوقة. ستتوفر إحداثيات الطول والعرض للصفحات عبر JavaScript، التي بدورها سترسِل تلك المعلومات إلى خادوم الويب البعيد الذي سيُجري عمليات عجيبة متعلقة بالموقع الجغرافي مثل العثور على شركة محلية أو إظهار موقعك على خريطة.
</p>

<p>
	كما سترى في الجدول الآتي، تُدعَم واجهة تحديد الموقع الجغرافي من أغلبية متصفحات الحاسوب والهواتف المحمولة؛ وهنالك دعمٌ لبعض المتصفحات القديمة باستخدام مكتبات خارجية، التي سنأتي على ذكرها لاحقًا في هذا الدرس.
</p>

<center>
	<table border="1"><tbody>
<tr>
<td style="padding: 5px 10px; text-align: center; background-color: rgb(251, 252, 252);">
					IE
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: rgb(251, 252, 252);">
					Firefox
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: rgb(251, 252, 252);">
					Safari
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: rgb(251, 252, 252);">
					Chrome
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: rgb(251, 252, 252);">
					Opera
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: rgb(251, 252, 252);">
					iPhone
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: rgb(251, 252, 252);">
					Android
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px; text-align: center;">
					9.0+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					3.5+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					5.0+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					5.0+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					10.6+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					3.0+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					2.0+
				</td>
			</tr>
</tbody></table>
</center>

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

<h3>
	أريني الشيفرة
</h3>

<p>
	تتمحور <a href="http://www.w3.org/TR/geolocation-API/" rel="external nofollow">واجهة تحديد الموقع الجغرافي البرمجية</a> حول خاصية جديدة في كائن <span style="font-family:courier new,courier,monospace;">navigator</span> العام: <span style="font-family:courier new,courier,monospace;">navigator.geolocation</span>.
</p>

<p>
	أبسط استخدام لواجهة تحديد الموقع الجغرافي هي كالآتي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8870_7">
<span class="kwd">function</span><span class="pln"> get_location</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
	navigator</span><span class="pun">.</span><span class="pln">geolocation</span><span class="pun">.</span><span class="pln">getCurrentPosition</span><span class="pun">(</span><span class="pln">show_map</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	لكن ليست في الشيفرة السابقة أيّة آليات للتحقق من دعم المتصفح أو التعامل مع الأخطاء أو خياراتٍ أخرى؛ ويجب عادةً أن يتضمن تطبيق الويب اثنين مما سبق.
</p>

<p>
	يمكنك استخدام <span style="font-family:courier new,courier,monospace;"><a href="http://www.modernizr.com/" rel="external nofollow">Modernizr</a></span> للتحقق من دعم واجهة تحديد الموقع الجغرافي البرمجية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8870_9">
<span class="kwd">function</span><span class="pln"> get_location</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
	</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Modernizr</span><span class="pun">.</span><span class="pln">geolocation</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		navigator</span><span class="pun">.</span><span class="pln">geolocation</span><span class="pun">.</span><span class="pln">getCurrentPosition</span><span class="pun">(</span><span class="pln">show_map</span><span class="pun">);</span><span class="pln">
	</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		</span><span class="com">//لا يوجد دعم لتحديد الموقع؛ ربما تجرب استخدام Gears؟ </span><span class="pln">
	</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	ما الذي تريد فعله إن لم يكن تحديد المواقع مدعومًا منوطٌ بك؛ وسأشرح كيفية استخدام مكتبة <span style="font-family:courier new,courier,monospace;">Gears</span> بعد قليل، لكنني سأتحدث أولًا عمّا يحدث أثناء استدعاء الدالة<span style="font-family:courier new,courier,monospace;"> getCurrentPosition()‎</span>. كما ذكرتُ سابقًا في بداية هذا الدرس، لن يُجبِرَك المتصفح على إعطاء موقعك الفيزيائي إلى الخادوم البعيد، ولكن تختلف طريقة فعل ذلك من متصفح إلى آخر؛ فسيؤدي استدعاء الدالة<span style="font-family:courier new,courier,monospace;">getCurrentPosition() ‎</span> في متصفح Firefox إلى إظهار "شريط معلومات" في أعلى نافذة المتصفح، الذي يبدو كالآتي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18152" href="https://academy.hsoub.com/uploads/monthly_2016_06/img1.png.70436199795c94ab0aef71a9c3193f7a.png" rel=""><img alt="img1.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18152" data-unique="yaf25k9fv" src="https://academy.hsoub.com/uploads/monthly_2016_06/img1.thumb.png.8a03cbac021a6f7cbc137378173bcdda.png"></a>
</p>

<p style="text-align: center;">
	<strong>الشكل 1: شريط المعلومات الذي يُظهِره متصفح Firefox عند محاولة الوصول إلى الموقع الفيزيائي.</strong>
</p>

<p>
	هنالك الكثير من الأشياء المضمَّنة في ذاك الشريط؛ أنت كمستخدمٍ للمتصفح:
</p>

<ul>
<li>
		سيتم إخبارك أنَّ موقع ويب يحاول معرفة موقعك الفيزيائي
	</li>
	<li>
		سيتم إخبارك ما هو موقع الويب الذي يحاول معرفة موقعك الفيزيائي
	</li>
	<li>
		ستتمكن من الذهاب إلى صفحة المساعدة "Location-Aware Browsing" التي تشرح لك ما الذي يجري (النسخة المختصرة من القصة هي أنَّ Google ستوفر الموقع وستخزن بياناتك بما يتوافق مع اتفاقية الخصوصية لخدمة تحديد المواقع الخاصة بها)
	</li>
	<li>
		ستستطيع أن تسمح بمشاركة موقعك الجغرافي
	</li>
	<li>
		ستتمكن من عدم السماح بمشاركة موقعك الجغرافي
	</li>
	<li>
		ستتمكن من إخبار متصفح أن يتذكر اختيارك (سواءً كنت تريد مشاركة موقعك الجغرافي أم لا) لكي لا تشاهد شريط المعلومات مرةً أخرى
	</li>
</ul>
<p>
	لكن هنالك المزيد! هذا الشريط:
</p>

<ul>
<li>
		لا يمنعك من التبديل بين ألسنة (tabs) المتصفح أو بين نوافذه
	</li>
	<li>
		خاص بالصفحة وسيختفي بمجرد تبديلك إلى لسان أو نافذة أخرى ثم سيظهر مرةً ثانية عند عودتك إلى اللسان الأصلي.
	</li>
	<li>
		لا يمكن لمواقع الويب تجاوزه أو الالتفاف عليه
	</li>
	<li>
		يمنع مشاركة الموقع الجغرافي مع خادوم الويب أثناء انتظاره لجوابك (إن كنتَ تريد المشاركة أم لا)
	</li>
</ul>
<p>
	لقد رأيتَ شيفرة JavaScript التي تؤدي إلى إظهار شريط المعلومات السابق، وفيها دالة تؤدي إلى استدعاء دالةٍ أخرى (التي سميتُها <span style="font-family:courier new,courier,monospace;">show_map</span>)، وستُنفَّذ الدالة <span style="font-family:courier new,courier,monospace;">getCurrentPosition()</span>‎ مباشرةً لكن هذا لا يعني أنَّك تستطيع الوصول إلى بيانات موقع المستخدم؛ فأول مرة تضمن فيها حصولك على تلك البيانات هي داخل الدالة التي ستُستدَعى؛ التي تبدو كالآتي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8870_13">
<span class="kwd">function</span><span class="pln"> show_map</span><span class="pun">(</span><span class="pln">position</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  
	</span><span class="kwd">var</span><span class="pln"> latitude </span><span class="pun">=</span><span class="pln"> position</span><span class="pun">.</span><span class="pln">coords</span><span class="pun">.</span><span class="pln">latitude</span><span class="pun">;</span><span class="pln">
	</span><span class="kwd">var</span><span class="pln"> longitude </span><span class="pun">=</span><span class="pln"> position</span><span class="pun">.</span><span class="pln">coords</span><span class="pun">.</span><span class="pln">longitude</span><span class="pun">;</span><span class="pln">
	
  	</span><span class="com">// لنُظهِر خريطة أو شيئًا آخر مفيدًا		</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	تأتي الدالة السابقة مع معامل (parameter) وحيد، الذي هو كائنٌ له خاصيتان: <span style="font-family:courier new,courier,monospace;">coords</span> و <span style="font-family:courier new,courier,monospace;">timestamp</span>. خاصية <span style="font-family:courier new,courier,monospace;">timestamp</span> بسيطة، فهي الوقت والتاريخ الذي حُسِبَ فيه الموقع (لا يمكنك توقع متى سيُحسَب الموقع لأن ذلك يحدث بشكلٍ غير متزامن. فربما سيأخذ المستخدم بعض الوقت لقراءة شريط المعلومات والموافقة على مشاركة الموقع الجغرافي، وقد تستغرق الأجهزة ذات شريحة GPS بعض الوقت للاتصال بأقمار GPS الاصطناعية، ...إلخ.).
</p>

<p>
	أما الكائن <span style="font-family:courier new,courier,monospace;">coords</span> فلديه خاصيات مثل <span style="font-family:courier new,courier,monospace;">latitude</span> و <span style="font-family:courier new,courier,monospace;">longitude</span> الواضح من اسمها أنَّها إحداثيات الموقع الفيزيائي للمستخدم.
</p>

<p>
	يوضِّح هذا الجدول خاصيات الكائن <span style="font-family:courier new,courier,monospace;">position</span>:
</p>

<center>
	<table border="1"><tbody>
<tr>
<td style="padding: 5px 10px; text-align: center; background-color: rgb(251, 252, 252);">
					الخاصية
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: rgb(251, 252, 252);">
					النوع
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: rgb(251, 252, 252);">
					ملاحظات
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px;">
					coords.latitude
				</td>
				<td style="padding: 5px 10px;">
					double
				</td>
				<td style="padding: 5px 10px;">
					عدد عشري
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px;">
					coords.longitude
				</td>
				<td style="padding: 5px 10px;">
					double
				</td>
				<td style="padding: 5px 10px;">
					عدد عشري
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px;">
					coords.altitude
				</td>
				<td style="padding: 5px 10px;">
					double أو null
				</td>
				<td style="padding: 5px 10px;">
					مترًا فوق المجسم المرجعي للأرض
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px;">
					coords.accuracy
				</td>
				<td style="padding: 5px 10px;">
					double
				</td>
				<td style="padding: 5px 10px;">
					بواحدة المتر
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px;">
					coords.altitudeAccuracy
				</td>
				<td style="padding: 5px 10px;">
					double أو null
				</td>
				<td style="padding: 5px 10px;">
					بواحدة المتر
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px;">
					coords.heading
				</td>
				<td style="padding: 5px 10px;">
					double أو null
				</td>
				<td style="padding: 5px 10px;">
					درجات باتجاه عقارب الساعة من الشمال الحقيقي
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px;">
					coords.speed
				</td>
				<td style="padding: 5px 10px;">
					double أو null
				</td>
				<td style="padding: 5px 10px;">
					بواحدة متر/ثانية
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px;">
					timestamp
				</td>
				<td style="padding: 5px 10px;">
					DOMTimeStamp
				</td>
				<td style="padding: 5px 10px;">
					مثل الكائن Date()‎
				</td>
			</tr>
</tbody></table>
</center>

<p>
	من المضمون وجود ثلاث خاصيات من الخاصيات السابقة (<span style="font-family:courier new,courier,monospace;">coords.latitude</span> و <span style="font-family:courier new,courier,monospace;">coords.longitude</span> و <span style="font-family:courier new,courier,monospace;">coords.accuracy</span>) أما البقية فيمكن أن يعيدوا القيمة <span style="font-family:courier new,courier,monospace;">null</span> اعتمادًا على قدرات جهازك وعلى قدرات خادوم تحديد المواقع الذي تتعامل معه. ستُحسَب الخاصيتان <span style="font-family:courier new,courier,monospace;">heading</span> و <span style="font-family:courier new,courier,monospace;">speed</span> اعتمادًا على موقع المستخدم السابق إذا كان متوفرًا.
</p>

<h2>
	التعامل مع الأخطاء
</h2>

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

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

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8870_40">
<span class="pln">navigator</span><span class="pun">.</span><span class="pln">geolocation</span><span class="pun">.</span><span class="pln">getCurrentPosition</span><span class="pun">(</span><span class="pln">show_map</span><span class="pun">,</span><span class="pln"> handle_error</span><span class="pun">)</span></pre>

<p>
	إن حدث أيّ خطأٍ فستُستدعى الدالة المُحدَّدة مع تمرير الكائن <span style="font-family:courier new,courier,monospace;">PositionError</span> إليها. يوضِّح الجدول الآتي خاصيات الكائن <span style="font-family:courier new,courier,monospace;">PositionError</span>:
</p>

<center>
	<table border="1"><tbody>
<tr>
<td style="padding: 5px 10px; text-align: center; background-color: rgb(251, 252, 252);">
					الخاصية
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: rgb(251, 252, 252);">
					النوع
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: rgb(251, 252, 252);">
					ملاحظات
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px;">
					code
				</td>
				<td style="padding: 5px 10px;">
					short
				</td>
				<td style="padding: 5px 10px;">
					قيمة عددية
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px;">
					message
				</td>
				<td style="padding: 5px 10px;">
					DOMString
				</td>
				<td style="padding: 5px 10px;">
					الرسالة الموجودة في هذه الخاصية ليست موجهة للمستخدم النهائي.
				</td>
			</tr>
</tbody></table>
</center>

<p>
	ستكون قيمة الخاصية <span style="font-family:courier new,courier,monospace;">code</span> واحدة من القيم الآتية:
</p>

<ul>
<li>
		<span style="font-family:courier new,courier,monospace;">PERMISSION_DENIED</span>: إذا ضغط المستخدم على زر "Don't Share" أو منع وصول الوصول إلى موقعه بطريقةٍ أو بأخرى.
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;">POSITION_UNAVAILABLE</span>: إذا توقفت الشبكة عن العمل أو في حال عدم التمكن من الوصول إلى الأقمار الاصطناعية.
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;">TIMEOUT</span>: إذا كانت الشبكة تعمل لكنها تأخذ وقتًا طويلًا لحساب موقع المستخدم الفيزيائي؛ لكن بكم يُقدَّر "الوقت الطويل"؟ سأريك كيفية تعريف تلك القيمة في القسم التالي.
	</li>
</ul>
<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8870_42">
<span class="kwd">function</span><span class="pln"> handle_error</span><span class="pun">(</span><span class="pln">err</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

	</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">err</span><span class="pun">.</span><span class="pln">code </span><span class="pun">==</span><span class="pln"> </span><span class="lit">1</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		</span><span class="com">// لم يسمح المستخدم بالحصول على الموقع الجغرافي!</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">	
</span><span class="pun">}</span></pre>

<ul>
<li>
		<strong>س</strong>: هل تعمل واجهة تحديد الموقع الجغرافي في المحطة الفضائية الدولية، أو على القمر، أو على الكواكب الأخرى؟
	</li>
	<li>
		<strong>ج</strong>: تقول مواصفات تحديد المواقع أنَّ "نظام الإحداثيات الجغرافية المستخدم في هذا الصدد هو نظام الإحداثيات الجيوديزية العالمي [WGS84]. بقية أنظمة الإحداثيات غير مدعومة". تدور المحطة الفضائية الدولية حول الأرض، لذلك يمكن وصف موقع رواد الفضاء على المحطة بإحداثيات طول وعرض وارتفاع عن الأرض، لكن يتمحور نظام الإحداثيات الجيوديزية العالمي حول الأرض، ولا يمكن استخدامه لتعيين مواقع على القمر أو بقية الكواكب.
	</li>
</ul>
<h3>
	الخيارات المتاحة أمامك
</h3>

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

<p>
	تستعمل الطريقة الثانية شريحة GPS في هاتفك لتبادل المعلومات مع أقمار GPS الاصطناعية التي تدور حول الأرض. يمكن تحديد موقعك عبر GPS بدقة كبيرة (عدِّة أمتار)، لكن من سلبيات هذه الطريقة هي الاستهلاك الكبير للطاقة من شريحة GPS، لذا ستُعطِّل الهواتف المحمولة هذه الشريحة إلى أن يتم الاحتياج إليها؛ وهذا يعني أنَّ هنالك تأخير عند تشغيل الشريحة ريثما يُهيَّأ الاتصال مع أقمار GPS الاصطناعية. إذا سبق لك واستخدمت Google Maps على هاتفٍ ذكيٍ مثل iPhone أو هواتف أندرويد، فستشاهد تطبيقًا لكلا الطريقتين السابقتين: ستشاهد أولًا دائرةً كبيرةً تُحدِّد موقعك تقريبيًا (وذلك بالبحث عن أقرب برج تغطية)، ثم دائرة أصغر (بحساب الموقع بناءً على عدِّة أبراج تغطية)، ثم نقطة وحيدة دقيقة (التي هي إحداثيات موقعك الفيزيائي بناءً على المعلومات الآتية من أقمار GPS الاصطناعية).
</p>

<p>
	السبب وراء ذكري لهذه المعلومات هي أنَّك لا تحتاج دومًا إلى دقة عالية، فإن كنت تبحث عن قائمة بدور عرض الأفلام التي بالجوار، فلا تلزمك إلا معرفة الموقع العام للمستخدم؛ إذ لا توجد دور عرض سينمائية كثيرة حتى في المدن المزدحمة، وستذكر -على أيّة حال- أكثر من دار عرض. أما على الكفة الأخرى، إذا كان تطبيقك يُعطي توجيهات لسائق السيارة في الوقت الحقيقي، فيجب أن تعرف موقع المستخدم الفيزيائي بدقة لكي تستطيع أن تقول "انعطف نحو اليمين بعد 20 مترًا" (أو ما شابه ذلك).
</p>

<p>
	يمكن تمرير وسيط (argument) ثالث اختياري إلى دالة <span style="font-family:courier new,courier,monospace;">getCurrentPosition()</span>‎ هو كائن <span style="font-family:courier new,courier,monospace;">PositionOptions</span>؛ وهنالك ثلاث خاصيات يمكنك ضبطها في كائن <span style="font-family:courier new,courier,monospace;">PositionOptions</span>، وكل تلك الخاصيات اختيارية، إذ تستطيع أن تضبطها جميعًا أو أن لا تضبط أيًّا منها، وهي مبيّنة في الجدول الآتي:
</p>

<center>
	<table border="1"><tbody>
<tr>
<td style="padding: 5px 10px; text-align: center; background-color: rgb(251, 252, 252);">
					الخاصية
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: rgb(251, 252, 252);">
					النوع
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: rgb(251, 252, 252);">
					القيمة الافتراضية
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: rgb(251, 252, 252);">
					ملاحظات
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px;">
					enableHighAccuracy
				</td>
				<td style="padding: 5px 10px;">
					Boolean
				</td>
				<td style="padding: 5px 10px;">
					false
				</td>
				<td style="padding: 5px 10px;">
					قد تُسبِّب القيمة true بطئًا
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px;">
					timeout
				</td>
				<td style="padding: 5px 10px;">
					long
				</td>
				<td style="padding: 5px 10px;">
					(لا توجد قيمة افتراضية)
				</td>
				<td style="padding: 5px 10px;">
					القيمة بواحدة الميلي ثانية
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px;">
					maximumAge
				</td>
				<td style="padding: 5px 10px;">
					long
				</td>
				<td style="padding: 5px 10px;">
					0
				</td>
				<td style="padding: 5px 10px;">
					القيمة بواحدة الميلي ثانية
				</td>
			</tr>
</tbody></table>
</center>

<p>
	وظيفة خاصية <span style="font-family:courier new,courier,monospace;">enableHighAccuracy</span> مماثلة لاسمها، إن كانت قيمتها <span style="font-family:courier new,courier,monospace;">true</span> وكان يدعمها الجهاز ووافق المستخدم على مشاركة موقعه الفيزيائي مع التطبيق، فسيحاول الجهاز توفير الموقع الفيزيائي بدقة. هنالك أذونات منفصلة للتحديد الدقيق وغير الدقيق للموقع الجغرافي في هواتف iPhone وأندرويد؛ لذا من الممكن أن يفشل استدعاء الدالة <span style="font-family:courier new,courier,monospace;">getCurrentPosition()‎</span> مع ضبط الخاصية <span style="font-family:courier new,courier,monospace;">enableHighAccuracy:true</span>، لكن قد ينجح استدعاؤها مع ضبط الخاصية <span style="font-family:courier new,courier,monospace;">enableHighAccuracy:false</span>.
</p>

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

<p>
	تسمح خاصية <span style="font-family:courier new,courier,monospace;">maximumAge</span> للجهاز بأن يُجيب مباشرةً بنسخة محفوظة من الإحداثيات. على سبيل المثال، لنقل أنَّك استَدعيتَ <span style="font-family:courier new,courier,monospace;">getCurrentPosition()</span>‎ لأول مرة، ثم وافق المستخدم على إعطاء موقعه الجغرافي وانتهت عملية حساب الموقع الفيزيائي في الساعة ‎10:00 AM تمامًا؛ وبعد دقيقة واحدة (أي 10:01‎ AM) استدعيتَ الدالة <span style="font-family:courier new,courier,monospace;">getCurrentPosition()</span>‎ مرةً أخرى مع ضبط خاصية <span style="font-family:courier new,courier,monospace;">maximumAge</span> إلى 75000.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8870_38">
<span class="pln">navigator</span><span class="pun">.</span><span class="pln">geolocation</span><span class="pun">.</span><span class="pln">getCurrentPosition</span><span class="pun">(</span><span class="pln">
  success_callback</span><span class="pun">,</span><span class="pln"> error_callback</span><span class="pun">,</span><span class="pln"> </span><span class="pun">{</span><span class="pln">maximumAge</span><span class="pun">:</span><span class="pln"> </span><span class="lit">75000</span><span class="pun">});</span></pre>

<p>
	أنت تقول أنَّه لا يهمك موقع المستخدم في لحظة استدعاء الدالة، وإنما ستقبل بمعرفة أين كان المستخدم منذ 75 ثانية مضت (75000 ميلي ثانية)؛ لكن الجهاز يعرف أين كان المستخدم منذ 60 ثانية (60000 ملي ثانية)، لأنه حسب موقعه في أول مرة استدعيتَ فيها الدالة <span style="font-family:courier new,courier,monospace;">getCurrentPosition()</span>‎؛ وبالتالي لن يحتاج الجهاز إلى إعادة حساب موقع المستخدم الحالي، إذ سيَستخدِم نفس المعلومات التي أرسلها أول مرة: أي نفس إحداثيات الطول والعرض، ونفس الدقة، ونفس بصمة الوقت (<span style="font-family:courier new,courier,monospace;">timestamp</span> أي 10:00‎ AM).
</p>

<p>
	عليك أن تفكِّر في مدى الدقة المطلوبة قبل أن تسأل المستخدم عن موقعه، وتضبط الخاصية <span style="font-family:courier new,courier,monospace;">enableHighAccuracy</span> وفقًا لذلك. وإذا كنت تريد معرفة موقع المستخدم أكثر من مرة، فعليك التفكير في العمر الأقصى للمعلومات التي تستطيع الاستفادة منها، وتضبط الخاصية <span style="font-family:courier new,courier,monospace;">maximumAge</span> وفقًا لذلك. أما إن أردت معرفة موقع المستخدم بشكلٍ دائم، فلن تكون الدالة <span style="font-family:courier new,courier,monospace;">getCurrentPosition()‎</span>‎ مناسبةً لك، وعليك حينها استخدام <span style="font-family:courier new,courier,monospace;">watchPosition()</span>‎.
</p>

<p>
	تملك دالة <span style="font-family:courier new,courier,monospace;">watchPosition()</span> نفس بنية الدالة <span style="font-family:courier new,courier,monospace;">getCurrentPosition()‎</span>، إذ يمكنها استدعاء دالتين، إحداهما ضرورية وتستخدم إن نجحت عملية الحصول على الموقع، وأخرى اختيارية غرضها هو التعامل مع الأخطاء؛ ويمكنها -أي الدالة- أن تقبل تمرير كائن <span style="font-family:courier new,courier,monospace;">PositionOptions</span> اختياريًا الذي يملك الخاصيات ذاتها التي تعلمتها منذ قليل. الاختلاف في أنَّ الدالة التي ستُستدَعى ستُنفَّذ في كل مرة يتغير فيها موقع المستخدم، ولن تحتاج إلى محاولة الحصول على الموقع يدويًا، فسيُحدِّد جهازك الفاصل الزمني الأمثل لتحديث الموقع وسيستدعي الدالة عند كل تغيّر لموقع المستخدم. يمكنك الاستفادة من هذا لتحديث موضع مؤشر على الخريطة، أو توفير تعليمات عن المكان الذي عليك زيارته لاحقًا، أو أيّ شيءٍ تريده.
</p>

<p>
	تُعيد الدالة <span style="font-family:courier new,courier,monospace;">watchPosition()</span>‎ رقمًا عليك تخزينه في مكانٍ ما، فلو أردت إيقاف عملية مراقبة تغيّر موقع المستخدم، فعليك استدعاء الدالة <span style="font-family:courier new,courier,monospace;">clearWatch()‎</span> مُمرِّرًا إليها ذاك الرقم، وسيتوقف الجهاز عن إرسال تحديثات الموقع إلى دالتك. يعمل ما سبق تمامًا كالدالتين <span style="font-family:courier new,courier,monospace;">setInterval()</span>‎ و <span style="font-family:courier new,courier,monospace;">clearInterval()‎</span> في JavaScript إن استخدمتهما من قبل.
</p>

<h2>
	ماذا عن متصفح IE؟
</h2>

<p>
	لم يكن يدعم متصفح Internet Explorer قبل الإصدار التاسع واجهة تحديد المواقع البرمجية من W3C التي شرحتها من قبل، لكن لا تقنط! Gears هي إضافة مفتوحة المصدر للمتصفحات من Google التي تعمل على ويندوز ولينُكس و Mac OS X والهواتف العاملة بنظامَي Windows Phone وأندرويد. حيث مهمتها توفير ميزات للمتصفحات القديمة، وإحدى الميزات التي توفرها Gears هي واجهة برمجية لتحديد المواقع إلا أنَّها ليس مماثلة لواجهة W3C البرمجية، لكنها تخدم نفس الغرض.
</p>

<p>
	لمّا كنّا نتحدث هنا عن المنصات القديمة، فمن الجدير بالذكر أنَّ عددًا من أنظمة الهواتف المحمولة القديمة لها واجهات برمجية خاصة بها لتحديد المواقع، حيث توفر هواتف BlackBerry و Nokia وpalm و OMTP BONDI واجهات برمجية خاصة بها؛ التي تختلف بالطبع عن Gears والتي تختلف بدورها عن W3C.
</p>

<h2>
	مكتبة geo.js
</h2>

<p>
	<span style="font-family:courier new,courier,monospace;">geo.js</span> هي مكتبة JavaScript مفتوحة المصدر مرخَّصة برخصة MIT التي تسهِّل التعامل مع واجهة W3C البرمجية وواجهة Gears البرمجية والواجهات البرمجية التي توفرها أنظمة الهواتف القديمة. عليك أن تُضمِّن عنصرَي &lt;script&gt; في أسفل صفحتك لكي تستخدمها (يمكنك أن تضع العنصرين في أي مكان في الصفحة، لكن وضعهما في عنصر <span style="font-family:courier new,courier,monospace;">&lt;head&gt;</span> سيُبطِّئ من تحميل الصفحة، فلا تفعل ذلك).
</p>

<p>
	أول سكربت هو <span style="font-family:courier new,courier,monospace;"><a href="http://code.google.com/apis/gears/gears_init.js" rel="external nofollow">gears_init.js</a></span> الذي يُهيِّئ إضافة Gears إن وجِدَت، أما السكربت الثاني فهو <span style="font-family:courier new,courier,monospace;">geo.js</span>.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8870_30">
<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">Dive Into HTML5</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;script</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"gears_init.js"</span><span class="tag">&gt;&lt;/script&gt;</span><span class="pln">
		</span><span class="tag">&lt;script</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"geo.js"</span><span class="tag">&gt;&lt;/script&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>

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

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8870_32">
<span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">geo_position_js</span><span class="pun">.</span><span class="pln">init</span><span class="pun">())</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
	geo_position_js</span><span class="pun">.</span><span class="pln">getCurrentPosition</span><span class="pun">(</span><span class="pln">geo_success</span><span class="pun">,</span><span class="pln"> geo_error</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	لنُقسِّم ما سبق ونشرح كل سطرٍ على حدة. ستحتاج أولًا إلى استدعاء دالة<span style="font-family:courier new,courier,monospace;"> init()‎</span>، التي تُعيد <span style="font-family:courier new,courier,monospace;">true</span> إن وجِدَ دعمٌ لإحدى واجهات تحديد المواقع البرمجية.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8870_34">
<span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">geo_position_js</span><span class="pun">.</span><span class="pln">init</span><span class="pun">())</span><span class="pln"> </span><span class="pun">{</span></pre>

<p>
	لن تعثر الدالة <span style="font-family:courier new,courier,monospace;">init()</span>‎ على الموقع الجغرافي، وإنما تتحقق من أنَّ الوصول إلى الموقع ممكنٌ. عليك أن تستدعي الدالة<span style="font-family:courier new,courier,monospace;"> getCurrentPosition()‎</span> للحصول على الموقع.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8870_36">
<span class="pln">geo_position_js</span><span class="pun">.</span><span class="pln">getCurrentPosition</span><span class="pun">(</span><span class="pln">geo_success</span><span class="pun">,</span><span class="pln"> geo_error</span><span class="pun">);</span></pre>

<p>
	ستؤدي الدالة<span style="font-family:courier new,courier,monospace;"> getCurrentPosition()‎</span> إلى جعل المتصفح يطلب من المستخدم إذنه للحصول على موقعه الفيزيائي ومشاركته. إن كان الوصول إلى الموقع الجغرافي موفرًا من إضافة Gears فسيظهر مربع حوار يسألك إن كنت تثق بموقع الويب لكي يحصل على موقعك. أما إذا كان يدعم المتصفح تحديد المواقع داخليًا، فسيظهر مربع حوار ذو شكلٍ مختلف. على سبيل المثال، يدعم Firefox واجهة تحديد الموقع الجغرافي البرمجية داخليًا، فلو حاولت الحصول على الموقع الجغرافي فيه، فسيظهر شريط معلومات في أعلى الصفحة يسأل المستخدم إن كان يريد مشاركة موقعه الجغرافي مع موقع الويب.
</p>

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

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8870_28">
<span class="pln">geo_position_js</span><span class="pun">.</span><span class="pln">getCurrentPosition</span><span class="pun">(</span><span class="pln">geo_success</span><span class="pun">,</span><span class="pln"> geo_error</span><span class="pun">);</span></pre>

<p>
	تأخذ تلك الدالة وسيطًا وحيدًا يحتوي على معلومات الموقع الفيزيائي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8870_26">
<span class="kwd">function</span><span class="pln"> geo_success</span><span class="pun">(</span><span class="pln">p</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
	alert</span><span class="pun">(</span><span class="str">"Found you at latitude "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> p</span><span class="pun">.</span><span class="pln">coords</span><span class="pun">.</span><span class="pln">latitude </span><span class="pun">+</span><span class="pln"> </span><span class="str">", longitude "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> p</span><span class="pun">.</span><span class="pln">coords</span><span class="pun">.</span><span class="pln">longitude</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	وإن لم تستطع الدالة<span style="font-family:courier new,courier,monospace;"> getCurrentPosition()‎</span> معرفة موقع المستخدم -إما أن يكون المستخدم قد رفض إعطاء الإذن، أو لفشل تعيين الموقع من الواجهة البرمجية لسببٍ من الأسباب- فستُستدعى الدالة الثانية، التي تكون في مثالنا <span style="font-family:courier new,courier,monospace;">geo_error</span>.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8870_22">
<span class="pln">geo_position_js</span><span class="pun">.</span><span class="pln">getCurrentPosition</span><span class="pun">(</span><span class="pln">geo_success</span><span class="pun">,</span><span class="pln"> geo_error</span><span class="pun">);</span></pre>

<p>
	لا تأخذ تلك الدالة أيّة وسائط:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8870_24">
<span class="kwd">function</span><span class="pln"> geo_error</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
	alert</span><span class="pun">(</span><span class="str">"Could not find you!"</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	لا تدعم مكتبة <span style="font-family:courier new,courier,monospace;">geo.js</span> الدالة<span style="font-family:courier new,courier,monospace;"> watchPosition()‎</span>، عليك أن تطلب الدالة<span style="font-family:courier new,courier,monospace;"> getCurrentPosition()‎ </span>بشكلٍ متواصل إن أردت الحصول على تحديث فوري لموقع المستخدم.
</p>

<h2>
	مثال متكامل
</h2>

<p>
	سأشرح لك مثالًا يستخدم مكتبة <span style="font-family:courier new,courier,monospace;">geo.js</span> للوصول إلى موقعك وعرض خريطة لما حولك.
</p>

<p>
	ستُستدعى الدالة <span style="font-family:courier new,courier,monospace;">geo_position_js.init()</span>‎ عند تحميل الصفحة لمعرفة فيما إذا كانت تتوفر ميزة تحديد الموقع الجغرافي بأي شكلٍ من الأشكال التي تدعمها <span style="font-family:courier new,courier,monospace;">geo.js</span>. فإن كانت مدعومةً فسيظهر رابط يمكن للمستخدم النقر عليه لإظهار موقعه الجغرافي؛ يستدعي هذه الرابط الدالة <span style="font-family:courier new,courier,monospace;">lookup_location()‎ </span>الظاهرة هنا:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8870_19">
<span class="kwd">function</span><span class="pln"> lookup_location</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
	geo_position_js</span><span class="pun">.</span><span class="pln">getCurrentPosition</span><span class="pun">(</span><span class="pln">show_map</span><span class="pun">,</span><span class="pln"> show_map_error</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	إذا أعطى المستخدم موافقته على تحديد الموقع، وكانت الخدمة الخلفية (backend service) قادرة على تحديد الموقع، فستستدعي مكتبة <span style="font-family:courier new,courier,monospace;">geo.js</span> أول دالة التي هي<span style="font-family:courier new,courier,monospace;"> show_map()‎</span> مع وسيط وحيد الذي هو <span style="font-family:courier new,courier,monospace;">loc</span> حيث يُمثِّل خاصية <span style="font-family:courier new,courier,monospace;">coords</span> التي تحتوي إحداثيات الطول والعرض ودقة القياس (لا يستخدم هذا المثال معلومات دقة القياس). تستعمل بقية الدالة <span style="font-family:courier new,courier,monospace;">show_map()‎</span> واجهة Google Maps البرمجية لإظهار الخريطة.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8870_17">
<span class="kwd">function</span><span class="pln"> show_map</span><span class="pun">(</span><span class="pln">loc</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

	$</span><span class="pun">(</span><span class="str">"#geo-wrapper"</span><span class="pun">).</span><span class="pln">css</span><span class="pun">({</span><span class="str">'width'</span><span class="pun">:</span><span class="str">'320px'</span><span class="pun">,</span><span class="str">'height'</span><span class="pun">:</span><span class="str">'350px'</span><span class="pun">});</span><span class="pln">

	</span><span class="kwd">var</span><span class="pln"> map </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">GMap2</span><span class="pun">(</span><span class="pln">document</span><span class="pun">.</span><span class="pln">getElementById</span><span class="pun">(</span><span class="str">"geo-wrapper"</span><span class="pun">));</span><span class="pln">
	</span><span class="kwd">var</span><span class="pln"> center </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">GLatLng</span><span class="pun">(</span><span class="pln">loc</span><span class="pun">.</span><span class="pln">coords</span><span class="pun">.</span><span class="pln">latitude</span><span class="pun">,</span><span class="pln"> loc</span><span class="pun">.</span><span class="pln">coords</span><span class="pun">.</span><span class="pln">longitude</span><span class="pun">);</span><span class="pln">

	map</span><span class="pun">.</span><span class="pln">setCenter</span><span class="pun">(</span><span class="pln">center</span><span class="pun">,</span><span class="pln"> </span><span class="lit">14</span><span class="pun">);</span><span class="pln">
	map</span><span class="pun">.</span><span class="pln">addControl</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">GSmallMapControl</span><span class="pun">());</span><span class="pln">
	map</span><span class="pun">.</span><span class="pln">addControl</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">GMapTypeControl</span><span class="pun">());</span><span class="pln">
	map</span><span class="pun">.</span><span class="pln">addOverlay</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">GMarker</span><span class="pun">(</span><span class="pln">center</span><span class="pun">,</span><span class="pln"> </span><span class="pun">{</span><span class="pln">draggable</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">,</span><span class="pln"> title</span><span class="pun">:</span><span class="pln"> </span><span class="str">"You are here (more or less)"</span><span class="pun">}));</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	أما لو لم تستطع <span style="font-family:courier new,courier,monospace;">geo.js</span> تحديد موقعك، فستُستدعى الدالة الثانية <span style="font-family:courier new,courier,monospace;">show_map_error()‎</span>.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8870_15">
<span class="kwd">function</span><span class="pln"> show_map_error</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
	$</span><span class="pun">(</span><span class="str">"#live-geolocation"</span><span class="pun">).</span><span class="pln">html</span><span class="pun">(</span><span class="str">'Unable to determine your location.'</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<h2>
	مصادر إضافية
</h2>

<ul>
<li>
		<a href="http://www.w3.org/TR/geolocation-API/" rel="external nofollow">W3C geolocation <abbr title="Application Programming Interface | واجهة برمجية">API</abbr></a>
	</li>
	<li>
		<a href="http://tools.google.com/gears/" rel="external nofollow">مكتبة Gears</a>
	</li>
	<li>
		<a href="http://code.google.com/p/geo-location-javascript/" rel="external nofollow">مكتبة geo.js </a>
	</li>
</ul>
<h2>
	اقرأ أيضًا
</h2>

<ul>
<li>
		المقال التالي: <a href="https://academy.hsoub.com/programming/html/html5/%D8%A7%D9%84%D8%AA%D8%AE%D8%B2%D9%8A%D9%86-%D8%A7%D9%84%D9%85%D8%AD%D9%84%D9%8A-local-storage-%D9%81%D9%8A-html5-r362/" rel="">التخزين المحلي (Local Storage) في HTML5</a>
	</li>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/html/html5/%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D8%A7%D9%84%D8%AA%D8%A3%D8%B1%D9%8A%D8%AE-%D9%81%D9%8A-html5-r443/" rel="">التعامل مع التأريخ في HTML5</a>
	</li>
	<li>
		النسخة العربية الكاملة من كتاب <a href="https://academy.hsoub.com/files/13-%D9%86%D8%AD%D9%88-%D9%81%D9%87%D9%85-%D8%A7%D9%94%D8%B9%D9%85%D9%82-%D9%84%D8%AA%D9%82%D9%86%D9%8A%D8%A7%D8%AA-html5/" rel="">نحو فهم أعمق لتقنيات HTML5 </a>
	</li>
</ul>
]]></description><guid isPermaLink="false">359</guid><pubDate>Sun, 26 Jun 2016 09:35:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x62A;&#x639;&#x627;&#x645;&#x644; &#x645;&#x639; &#x627;&#x644;&#x62A;&#x623;&#x631;&#x64A;&#x62E; &#x641;&#x64A; HTML5</title><link>https://academy.hsoub.com/programming/html/%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D8%A7%D9%84%D8%AA%D8%A3%D8%B1%D9%8A%D8%AE-%D9%81%D9%8A-html5-r443/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_04/main.png.276d8b20b0d55a8ecbbf4816e0ddf20a.png" /></p>

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

<p style="text-align: center;">
	<img alt="main.png" class="ipsImage ipsImage_thumbnailed" data-fileid="22622" data-unique="7yupeiqxr" src="https://academy.hsoub.com/uploads/monthly_2017_04/main.png.ba275ce8193c2b1fde29a1141b2ea02d.png"></p>

<p>
	<a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/history.html" rel="external nofollow">الواجهة البرمجية للتعامل مع التأريخ في HTML5</a> هي طريقةٌ معياريةٌ لتعديل تأريخ (history) المتصفح باستخدام السكربتات. جزءٌ من هذه الواجهة البرمجية (التنقل في التأريخ) موجودٌ في الإصدارات السابقة من HTML؛ أما الأجزاء الجديدة في HTML5 تضمَّنت طرائق لإضافة مدخلات إلى تأريخ المتصفح، ولتغيير رابط URL الظاهر في شريط المتصفح (دون الحاجة إلى تحديث الصفحة)، وإضافة حدث سيُفعَّل عندما تُحذَف تلك المدخلات من المكدس (stack، وهذه هي آلية التعامل الداخلية مع التأريخ) بوساطة المستخدم عند ضغطه لزر الرجوع في المتصفح. وهذا يعني أنَّ رابط URL في شريط العنوان في المتصفح سيستمر بأداء عمله كمُعرِّف فريد للمورد الحالي (current resource)، حتى في التطبيقات التي تعتمد اعتمادًا كبيرًا على السكربتات التي لن تُجري تحديثًا كاملًا للصفحة.
</p>

<h3>
	السبب وراء تعديل التأريخ
</h3>

<p>
	لماذا تريد تعديل تأريخ المتصفح يدويًا؟ بكل بساطة، يمكن لرابطٍ بسيطٍ أن ينقلك إلى URL جديد؛ وهذه هي الطريقة التي عَمِلَ بها الويب لأكثر من 25 سنة، وسيستمر بذلك. هذه الواجهة البرمجية لن تحاول تقويض الويب، وإنما العكس. ففي السنوات الأخيرة، وجَدَ مطورو الويب طرائق جديدة ومثيرة لتخريب الويب دون أي مساعدة من المعايير الناشئة. صُمِّمَت واجهة التأريخ البرمجية في HTML5 للتأكّد من أنَّ روابط URL ستستمر بأداء وظيفتها وأن تبقى مفيدةً حتى في تطبيقات الويب التي تعتمد تمامًا على السكربتات.
</p>

<p>
	بالعودة إلى المفاهيم الأساسية، ما وظيفة رابط URL؟ إنَّه يُعرِّف موردًا فريدًا (unique resource). يمكنك إضافة رابط مباشر إليه، أو وضع علامة مرجعية إليه، ويمكن لمحركات البحث فهرسته، ويمكنك نسخه ولصقه في رسالةٍ عبر البريد الإلكتروني لشخصٍ ما، الذي يستطيع أن يضغط عليه ويرى نفس المورد الذي رأيته أنت. هذه الميزات الرائعة تُريك أهمية روابط URL.
</p>

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

<p>
	أتت الواجهة البرمجية للتعامل مع التأريخ في HTML5 لحل هذه الإشكالية. فبدلًا من تحديث كامل الصفحة، يمكنك أن تستخدم سكربتًا لتنزيل «نصف صفحة». هذه الخدعة صعبة قليلًا وتحتاج إلى قليلٍ من العمل…
</p>

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

<ol>
<li>
		تحميل 10% من الصفحة B المختلفة عن A (ربما باستخدام XMLHttpRequest)، وهذا سيتطلب بعض التعديلات من جهة الخادوم لتطبيق الويب الخاص بك. إذ ستحتاج إلى كتابة شيفرة لكي تُعيد 10% فقط من الصفحة B المختلفة عن A، وربما تفعل ذلك عبر رابط URL مخفي أو عبر تمرير وسيط في الطلبية الذي لا يستطيع المستخدم النهائي رؤيته في الحالات العادية.
	</li>
	<li>
		تبديل المحتوى الذي تغيّر (عبر استخدام innterHTML أو دوال DOM الأخرى)، قد تحتاج أيضًا إلى إعادة ضبط أيّة دوال لمعالجة الأحداث المرتبطة بالعناصر الموجودة في المُحتوى المُبدَّل.
	</li>
	<li>
		تحديث شريط العنوان في المتصفح لكي يحتوي على رابط URL للصفحة B، وذلك عبر دالة خاصة من الواجهة البرمجية للتعامل مع التأريخ في HTML5 التي سأريك إياها بعد قليل.
	</li>
</ol>
<p>
	في نهاية هذه الخدعة (إذا طبّقتها تطبيقًا صحيحًا)، سينتهي الأمر بحصول المتصفح على شجرة DOM مماثلة لتلك التي سيحصل عليها لو انتقل إلى الصفحة B مباشرةً. وسيُصبِح العنوان في شريط المتصفح مساويًا لرابط URL للصفحة B، كما لو أنَّك انتقلت إلى الصفحة B مباشرةً. لكنك في الحقيقة لم تنتقل إلى الصفحة B ولم تُجرِ تحديثًا كاملًا للصفحة. وهذه هي الخدعة التي كنت أتحدث عنها. لأنَّ الصفحة النهاية مماثلةٌ تمامًا للصفحة B ولها نفس رابط URL للصفحة B، لكن المستخدم لم يلاحظ الفرق (ولم يكن ممنونًا لك على جهودك لتحسين تجربته مع التطبيق).
</p>

<h3>
	طريقة تعديل التأريخ
</h3>

<p>
	يوجد في واجهة التأريخ البرمجية عددٌ من الدوال في كائن window.history، بالإضافة إلى حدثٍ وحيد في الكائن window. يمكنك استخدامها لاكتشاف الدعم لواجهة التأريخ البرمجية، وهنالك دعمٌ لا بأس به من أغلبية المتصفحات الحديثة لهذه الواجهة البرمجية.
</p>

<center>
	<table border="1"><tbody>
<tr>
<td style="padding: 5px 10px; text-align: center; background-color: #ecf0f1;">
					IE
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: #ecf0f1;">
					Firefox
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: #ecf0f1;">
					Safari
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: #ecf0f1;">
					Chrome
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: #ecf0f1;">
					Opera
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: #ecf0f1;">
					iPhone
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: #ecf0f1;">
					Android
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px; text-align: center;">
					10+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					4.0+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					5.0+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					8.0+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					11.5+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					4.2.1+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					*4.3+
				</td>
			</tr>
</tbody></table>
</center>

<p>
	* من المفترض أنَّ هنالك دعمٌ لواجهة التأريخ البرمجية في الإصدارات السابقة من متصفح أندرويد، لكن لوجود عدد كبير من العلل البرمجية في تطبيق هذا الدعم في إصدار 4.0.4، فسنعتبر أنَّ الدعم «الحقيقي» لواجهة التأريخ البرمجية قد بدأ منذ الإصدار 4.3.
</p>

<p>
	«<a href="http://diveintohtml5.org/examples/history/fer.html" rel="external nofollow">Dive Into Dogs</a>» هو مثالٌ بسيطٌ وعمليٌ لكيفية الاستفادة من الواجهة البرمجية للتأريخ في HTML5. حيث يُبرِز مشكلةً شائعةً: مقالةٌ طويلةٌ يرتبط بها معرضُ صورٍ. سيؤدي الضغط على رابط «Next» أو «Previous» في معرض الصور إلى تحديث الصورة آنيًا وتحديث رابط URL في شريط العنوان في المتصفح دون الحاجة إلى تحديث كامل الصفحة. أما في المتصفحات التي لا تدعم واجهة التأريخ البرمجية –أو في المتصفحات الداعمة لها، لكن المستخدم عطَّل السكربتات– سيعمل الرابطان «Next» و «Previous» كرابطين اعتياديين، ويأخذانك إلى الصفحة التالية بعد تحديث كامل الصفحة.
</p>

<p>
	وهذا يثير النقطة المهمة الآتية:
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			إذا لم يتمكن تطبيقك من العمل في حال تعطيل المستخدم للسكربتات، فيجب نفيك إلى كوكبٍ آخر على الفور!
		</p>
	</div>
</blockquote>

<p>
	لنتعمّق في مثال «Dive Into Dogs» ونرى كيف يعمل. هذه هي الشيفرة التي تُستعمل لعرض صورة وحيدة:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1190_8">
<span class="tag">&lt;aside</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"gallery"</span><span class="tag">&gt;</span><span class="pln">

</span><span class="tag">&lt;p</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"photonav"</span><span class="tag">&gt;</span><span class="pln">

</span><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"photonext"</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"casey.html"</span><span class="tag">&gt;</span><span class="pln">Next &gt;</span><span class="tag">&lt;/a&gt;</span><span class="pln">

</span><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"photoprev"</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"adagio.html"</span><span class="tag">&gt;</span><span class="pln">&lt; Previous</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;figure</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"photo"</span><span class="tag">&gt;</span><span class="pln">

</span><span class="tag">&lt;img</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"photoimg"</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"gallery/1972-fer-500.jpg"</span><span class="pln">

</span><span class="atn">alt</span><span class="pun">=</span><span class="atv">"Fer"</span><span class="pln"> </span><span class="atn">width</span><span class="pun">=</span><span class="atv">"500"</span><span class="pln"> </span><span class="atn">height</span><span class="pun">=</span><span class="atv">"375"</span><span class="tag">&gt;</span><span class="pln">

</span><span class="tag">&lt;figcaption&gt;</span><span class="pln">Fer, 1972</span><span class="tag">&lt;/figcaption&gt;</span><span class="pln">

</span><span class="tag">&lt;/figure&gt;</span><span class="pln">

</span><span class="tag">&lt;/aside&gt;</span></pre>

<p>
	لا يوجد شيءٌ غير اعتياديٍ فيما سبق. الصورة نفسها هي عنصر &lt;img&gt; موجودٌ ضمن عنصر &lt;figure&gt;، جميع الروابط هي عناصر &lt;a&gt;، وكل شيء محتوىً في عنصر &lt;aside&gt;، من المهم أن نلاحظ أنَّ هذه الروابط العادية تعمل عملًا صحيحًا. جميع الشيفرات التي تتحكم بالتأريخ موجودةٌ بعد سكربت لاكتشاف الدعم، فإن لم يكن متصفح المستخدم داعمًا للواجهة البرمجية للتأريخ، فلا حاجة إلى تنفيذ الشيفرات المتعلقة بها، وكذلك الأمر للمستخدمين الذي عطَّلوا تنفيذ السكربتات بالمجمل.
</p>

<p>
	الدالة الرئيسية تحصل على كل رابط من تلك الروابط وتمرِّره إلى الدالة addClicker()‎، التي عملها هو إعداد دالة خاصة للتعامل مع الحدثclick.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1190_10">
<span class="pln">function setupHistoryClicks() {

addClicker(document.getElementById("photonext"));

addClicker(document.getElementById("photoprev"));

}</span></pre>

<p>
	هذه هي دالة addClicker()‎ التي تأخذ عنصر &lt;a&gt; وتُضيف إليه دالة للتعامل مع الحدث click، التي يحدث فيها أمرٌ مثيرٌ للاهتمام.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1190_12">
<span class="pln">function addClicker(link) {

link.addEventListener("click", function(e) {

swapPhoto(link.href);

history.pushState(null, null, link.href);

e.preventDefault();

}, false);

}</span></pre>

<p>
	الدالة swapPhoto()‎ تقوم بأول خطوتين من الخطوات الثلاث التي تحدثنا عنها. أول قسم من الدالة swapPhoto()‎ يأخذ جزءًا من URL لرابط التنقل –أي casey.html و adegio.html وهكذا…– ويبني رابط URL جديد يُشير إلى صفحةٍ مخفيةٍ التي لا تحتوي إلا على الشيفرة اللازمة لعرض الصورة التالية.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1190_14">
<span class="pln">function swapPhoto(href) {

var req = new XMLHttpRequest();

req.open("GET",

"http://diveintohtml5.org/examples/history/gallery/" +

href.split("/").pop(),

false);

req.send(null);</span></pre>

<p>
	هذا مثالٌ عن <a href="http://diveinto.html5doctor.com/examples/history/gallery/casey.html" rel="external nofollow">الشيفرات التي تُنتِجها تلك الصفحات</a> (يمكنك التأكد من ذلك في متصفحك بزيادة الرابط السابق مباشرةً).
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1190_16">
<span class="tag">&lt;p</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"photonav"</span><span class="tag">&gt;</span><span class="pln">

</span><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"photonext"</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"brandy.html"</span><span class="tag">&gt;</span><span class="pln">Next &gt;</span><span class="tag">&lt;/a&gt;</span><span class="pln">

</span><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"photoprev"</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"fer.html"</span><span class="tag">&gt;</span><span class="pln">&lt; Previous</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;figure</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"photo"</span><span class="tag">&gt;</span><span class="pln">

</span><span class="tag">&lt;img</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"photoimg"</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"gallery/1984-casey-500.jpg"</span><span class="pln">

</span><span class="atn">alt</span><span class="pun">=</span><span class="atv">"Casey"</span><span class="pln"> </span><span class="atn">width</span><span class="pun">=</span><span class="atv">"500"</span><span class="pln"> </span><span class="atn">height</span><span class="pun">=</span><span class="atv">"375"</span><span class="tag">&gt;</span><span class="pln">

</span><span class="tag">&lt;figcaption&gt;</span><span class="pln">Casey, 1984</span><span class="tag">&lt;/figcaption&gt;</span><span class="pln">

</span><span class="tag">&lt;/figure&gt;</span></pre>

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

<p>
	القسم الثاني من دالة swapPhoto()‎ يجري الخطوة الثانية من الخطوات الثلاث التي تحدثنا عنها: وضع الشيفرة الجديدة التي نُزِّلَت في الصفحة الحالية، تذكَّر أنَّ هنالك عنصر &lt;aside&gt; محيطٌ بالصورة والشرح التوضيحي لها، لذلك تكون عملية إضافة شيفرة الصورة الجديدة بسيطةً عبر ضبط خاصية innterHTML لعنصر &lt;aside&gt; إلى خاصية responseText من كائن XMLHttpRequest.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1190_18">
<span class="pln">if (req.status == 200) {

document.getElementById("gallery").innerHTML = req.responseText;

setupHistoryClicks();

return true;

}

return false;

}</span></pre>

<p>
	لاحظ أيضًا استدعاء الدالة setupHistoryClicks()‎، وهذا ضروريٌ لإعادة ضبط دوال التعامل مع الحدث click في روابط التنقل الجديدة، لأن ضبط المحتوى باستخدام innerHTML سيمسح كل آثار الروابط القديمة مع دوال التعامل مع أحداثها.
</p>

<p>
	لنعد الآن إلى الدالة addClicker()‎، فبعد النجاح بتغيير الصورة، هنالك خطوةٌ إضافيةٌ علينا عملها من الخطوات الثلاث: ضبط رابط URL في شريط عنوان المتصفح دون تحديث الصفحة.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1190_20">
<span class="pln">history.pushState(null, null, link.href);</span></pre>

<p>
	تأخذ الدالة history.pushState()‎ ثلاثة وسائط:
</p>

<ol>
<li>
		state: يمكن أن يكون أي بنية من بُنى بيانات JSON، وستُمرَّر إلى الدالة التي تتعامل مع الحدث popstate، الذي ستتعلم المزيد من المعلومات عنه بعد قليل. لا نحتاج إلى تتبع أي حالة في هذا المثال، لذا سأترك القيمة مساويةً إلى null.
	</li>
	<li>
		title: يمكن أن يكون أي سلسلة نصية. لكن هذا الوسيط غير مدعوم من أغلبية المتصفحات الرئيسية، فإذا أردت ضبط عنوان الصفحة، فعليك تخزينه في الوسيط state ثم ضبطه يدويًا في الدالة التي تتعامل مع الحدث popstate.
	</li>
	<li>
		url: يمكن أن يكون أي رابط URL، وهو الرابط الذي سيظهر في شريط العنوان في متصفحك.
	</li>
</ol>
<p>
	استدعاء الدالة history.pushState سيؤدي إلى تغيير رابط URL الظاهر في شريط العنوان في المتصفح على الفور، لكن أليست هذه نهاية القصة؟ ليس تمامًا، بقي علينا أن نتحدث عمّا سيحصل إذا ضغط المستخدم على الزر المهم «الرجوع».
</p>

<p>
	الحالة العادية عندما يزور المستخدم صفحة جديدة (بتحميلها كلها) هي إضافة المتصفح لرابط URL الجديد في «مكدس» التأريخ (history stack) ثم يُنزِّل ويعرض الصفحة الجديدة. وعندما يضغط المستخدم على زر الرجوع إلى الخلف، فسيزيل المتصفح الصفحة الحالية من مكدس التأريخ ويعرض الصفحة التي تسبقها، لكن ماذا سيحدث عندما عبثتَ بهذه الآلية لكي تتفادى تحديثًا لكامل الصفحة؟ حسنًا، لقد زيّفتَ «التقدم إلى الأمام» إلى رابط URL جديد، وحان الوقت الآن لتزييف «الرجوع إلى الخلف» إلى رابط URL السابق. والمفتاح نحو تزييف «الرجوع إلى الخلف» هو الحدث popstate.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1190_22">
<span class="pln">window.addEventListener("popstate", function(e) {

swapPhoto(location.pathname);

}</span></pre>

<p>
	بعد أن استخدمتَ الدالة history.pushState()‎ لإضافة رابط URL مزيّف في مكدس التأريخ الخاص بالمتصفح، سيُطلِق المتصفح الحدث popstate في الكائن window عندما يضغط المستخدم على زر الرجوع. وهذه هي فرصتك لإكمال عملك في إيهام المستخدم أنَّه انتقل فعلًا إلى تلك الصفحة.
</p>

<p>
	في هذا المثال، عملية إعادة الصفحة السابقة بسيطةٌ جدًا، فكل ما عليك فعله هو إعادة الصورة الأصلية، وذلك باستدعاء الدالة swapPhoto()‎ مع تمرير رابط URL الحالي لها. لأنَّه عند استدعاء الدالة التي تُعالِج الحدث popstate، يكون رابط URL الظاهر في المتصفح قد تغيّر إلى رابط URL السابق. وهذا يعني أيضًا أنَّ قيمة الخاصية العامة location قد حُدِّثَت لرابط URL السابق.
</p>

<p>
	لكي أساعدك في تخيل الوضع، دعني أتلو عليك العملية «السحرية» من بدايتها إلى نهايتها:
</p>

<ul>
<li>
		يُحمِّل المستخدم الصفحة <a href="http://diveintohtml5.org/examples/history/fer.html" rel="external nofollow">http://diveintohtml5.org/examples/history/fer.html</a> ويشاهد القصة وصورةً للكلب Fer.
	</li>
	<li>
		يضغط المستخدم على الرابط المُعَنوَن «Next»، الذي هو عنصر &lt;a&gt; تكون قيمة خاصية herf فيه هي <a href="http://diveintohtml5.org/examples/history/casey.html" rel="external nofollow">http://diveintohtml5.org/examples/history/casey.html</a>.
	</li>
	<li>
		بدلًا من الانتقال إلى <a href="http://diveintohtml5.org/examples/history/casey.html" rel="external nofollow">http://diveintohtml5.org/examples/history/casey.html</a> مباشرةً وتحديث الصفحة تحديثًا كاملًا، فستعترض دالة خاصة للحدث click عملية الضغط على عنصر &lt;a&gt; وتُنفِّذ شيفرةً خاصةً بها.
	</li>
	<li>
		تستدعي تلك الدالة التي تُعالِج الحدث click الدالةَ swapPhoto()‎، التي تُنشِئ كائن XMLHttpRequest لكي ينُزِّل جزء HTML الموجود في <a href="http://diveintohtml5.org/examples/history/gallery/casey.html" rel="external nofollow">http://diveintohtml5.org/examples/history/gallery/casey.html</a> بشكل تزامني.
	</li>
	<li>
		الدالة swapPhoto()‎ تضبط الخاصية innerHTML للعنصر الذي يحوي الصورة (عنصر &lt;aside&gt;)، وبهذا ستُبدَّل صورة Casey بصورة Fer.
	</li>
	<li>
		في النهاية، ستستدعي الدالةُ التي تتعامل مع الحدث click الدالةَ history.pushState()‎ لتغيير رابط URL يدويًا في شريط عنوان المتصفح إلى <a href="http://diveintohtml5.org/examples/history/casey.html" rel="external nofollow">http://diveintohtml5.org/examples/history/casey.html</a>.
	</li>
	<li>
		يضغط المستخدم على زر الرجوع في المتصفح.
	</li>
	<li>
		يلاحظ المتصفح أنَّ رابط URL قد تغيّر يدويًا وأُضيف إلى مكدس التأريخ (عبر الدالة history.pushState()‎) وبدلًا من الانتقال إلى رابط URL السابق وإعادة تحديث الصفحة، فسيُحدِّث المتصفح الرابط الموجود في شريط العنوان إلى رابط URL للصفحة السابقة (<a href="http://diveintohtml5.org/examples/history/fer.html" rel="external nofollow">http://diveintohtml5.org/examples/history/fer.html</a>) ثم يُطلِق الحدث popstate.
	</li>
	<li>
		الدالة التي تُعالِج الحدث popstate ستستدعي الدالة swapPhoto()‎ مرةً أخرى، لكن هذه المرة مع تمرير الرابط القديم إليها الذي أصبح موجودًا الآن في شريط عنوان المتصفح.
	</li>
	<li>
		ثم باستخدام XMLHttpRequest مرةً أخرى، ستُنزِّل الدالة swapPhoto()‎ جزءًا من صفحة HTML الموجودة في <a href="http://diveintohtml5.org/examples/history/gallery/fer.html" rel="external nofollow">http://diveintohtml5.org/examples/history/gallery/fer.html</a> ثم ستضبط الخاصية innerHTML للعنصر الذي يحوي الصورة (عنصر &lt;aside&gt;)، وبهذا ستُبدَّل صورةFer بصورة Casey.
	</li>
</ul>
<p>
	اكتملت خدعتنا، جميع الأدلة الظاهرة (محتوى الصفحة، وعنوان URL في المتصفح) تُشير إلى أنَّ المستخدم قد انتقل إلى الأمام صفحةً وإلى الخلف صفحةً. لكن لم يحصل تحديثٌ كاملٌ للصفحة.
</p>

<h3>
	مصادر إضافية
</h3>

<ul>
<li>
		<a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/history.html" rel="external nofollow">Session history and navigation</a> في معيار HTML5
	</li>
	<li>
		<a href="https://developer.mozilla.org/en/DOM/Manipulating_the_browser_history" rel="external nofollow">Manipulating the browser history</a> على Mozilla Developer Center
	</li>
	<li>
		<a href="http://html5demos.com/history" rel="external nofollow">استعراض بسيطة لواجهة التأريخ البرمجية</a>
	</li>
	<li>
		<a href="http://www.facebook.com/note.php?note_id=438532093919" rel="external nofollow">Using HTML5 today</a> التي تشرح كيف يستعمل موقع فيسبوك الواجهة البرمجية للتأريخ
	</li>
	<li>
		<a href="https://github.com/blog/760-the-tree-slider" rel="external nofollow">The Tree Slider</a> التي تشرح استعمال موقع <a href="https://github.com/" rel="external nofollow">GitHub</a> للواجهة البرمجية للتأريخ
	</li>
	<li>
		<a href="https://github.com/balupton/History.js/" rel="external nofollow">History.js</a> هي مكتبةٌ للتعامل مع التأريخ في المتصفحات الحديثة والقديمة
	</li>
</ul>
<p>
	ترجمة -وبتصرّف- لفصل <a href="http://diveinto.html5doctor.com/history.html" rel="external nofollow">History </a>من كتاب Dive Into HTML5 لمؤلفه Mark Pilgrim.
</p>

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

<ul>
<li>
		المقال التالي: <a href="https://academy.hsoub.com/programming/html/html5/%D8%AA%D8%AD%D8%AF%D9%8A%D8%AF-%D8%A7%D9%84%D9%85%D9%88%D9%82%D8%B9-%D8%A7%D9%84%D8%AC%D8%BA%D8%B1%D8%A7%D9%81%D9%8A-geolocation-%D9%81%D9%8A-html5-r359/" rel="">تحديد الموقع الجغرافي (GeoLocation) في HTML5</a>
	</li>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/html/html5/%D8%A5%D8%B6%D8%A7%D9%81%D8%A9-%D9%85%D9%82%D8%A7%D8%B7%D8%B9-%D8%A7%D9%84%D9%81%D9%8A%D8%AF%D9%8A%D9%88-%D8%B9%D8%A8%D8%B1-%D8%A7%D9%84%D8%B9%D9%86%D8%B5%D8%B1-%D9%81%D9%8A-html5-r356/" rel="">إضافة مقاطع الفيديو عبر العنصر &lt;video&gt; في HTML5</a>
	</li>
	<li>
		النسخة العربية الكاملة من كتاب <a href="https://academy.hsoub.com/files/13-%D9%86%D8%AD%D9%88-%D9%81%D9%87%D9%85-%D8%A7%D9%94%D8%B9%D9%85%D9%82-%D9%84%D8%AA%D9%82%D9%86%D9%8A%D8%A7%D8%AA-html5/" rel="">نحو فهم أعمق لتقنيات HTML5 </a>
	</li>
</ul>
]]></description><guid isPermaLink="false">443</guid><pubDate>Sat, 25 Jun 2016 21:00:00 +0000</pubDate></item><item><title><![CDATA[إضافة مقاطع الفيديو عبر العنصر <video> في HTML5]]></title><link>https://academy.hsoub.com/programming/html/%D8%A5%D8%B6%D8%A7%D9%81%D8%A9-%D9%85%D9%82%D8%A7%D8%B7%D8%B9-%D8%A7%D9%84%D9%81%D9%8A%D8%AF%D9%8A%D9%88-%D8%B9%D8%A8%D8%B1-%D8%A7%D9%84%D8%B9%D9%86%D8%B5%D8%B1-%D9%81%D9%8A-html5-r356/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_06/html5-video.png.9e5ffebaf1caa08da0bf8cbefb680540.png" /></p>
<p>
	تعرفنا في الدروس السابقة على <a href="https://academy.hsoub.com/programming/html5/%D8%B5%D9%8A%D8%BA-%D8%AA%D8%B1%D9%85%D9%8A%D8%B2-%D8%A7%D9%84%D9%81%D9%8A%D8%AF%D9%8A%D9%88-%D9%88%D8%A7%D9%84%D8%B5%D9%88%D8%AA-%D9%88%D8%AD%D8%A7%D9%88%D9%8A%D8%A7%D8%AA%D9%87%D8%A7-%D9%88%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%B9%D9%85%D9%84%D9%87%D8%A7-%D9%81%D9%8A-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r350/" rel="">صيغ ترميز الفيديو والصوت</a> و <a href="https://academy.hsoub.com/programming/html5/%D8%AA%D8%B1%D9%85%D9%8A%D8%B2-%D9%85%D9%82%D8%A7%D8%B7%D8%B9-%D8%A7%D9%84%D9%81%D9%8A%D8%AF%D9%8A%D9%88-%D8%A8%D8%B9%D8%AF%D8%A9-%D8%B5%D9%8A%D8%BA-r355/" rel="">كيفية ترميز مقاطع الفيديو باستخدام عدة صيغ</a>. حسنًا، يُفترَض أنَّ هذه السلسلة عن HTML، لذا أين الشيفرات البرمجية؟
</p>

<p style="text-align: center;">
	<img alt="html5-video.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17943" data-unique="bzlbxqro0" src="https://academy.hsoub.com/uploads/monthly_2016_06/html5-video.png.b3d6e51357c9cd0ce5834872b4c283eb.png">
</p>

<p>
	تمنحك HTML5 طريقتين لتضمين الفيديو في صفحة الويب، وكلا الطريقتين تستخدمان العنصر <span style="font-family:courier new,courier,monospace;">&lt;video&gt;</span>. وإذا كان لديك ملف فيديو وحيد، فيمكنك ببساطة إضافة رابط له في خاصية <span style="font-family:courier new,courier,monospace;">src</span>، وهذا شبيه ٌجدًا بطريقة إدراج صورة بالوسم ‎<span style="font-family:courier new,courier,monospace;">&lt;img src="..."&gt;</span>‎.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5583_11"><span class="tag">&lt;video</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"pr6.webm"</span><span class="tag">&gt;&lt;/video&gt;</span></pre>

<p>
	تقنيًا، هذا كل ما تحتاج له؛ ولكن كما في عنصر <span style="font-family:courier new,courier,monospace;">&lt;img&gt;</span> عليك دومًا أن تضيف الخاصيتين <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;">&lt;video&gt;</span>. يمكن أن تكون الخاصيتان <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;">&lt;video&gt;</span>، ولهذا لن يتشوه المقطع.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5583_13"><span class="tag">&lt;video</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"pr6.webm"</span><span class="pln"> </span><span class="atn">width</span><span class="pun">=</span><span class="atv">"320"</span><span class="pln"> </span><span class="atn">height</span><span class="pun">=</span><span class="atv">"240"</span><span class="tag">&gt;&lt;/video&gt;</span></pre>

<p>
	افتراضيًا، لن يُظهِر الوسم <span style="font-family:courier new,courier,monospace;">&lt;video&gt;</span> أي نوع من عناصر التحكم بالتشغيل، يمكنك إنشاء عناصر التحكم الخاصة بك باستخدام HTML و CSS و JavaScript؛ فالعنصر <span style="font-family:courier new,courier,monospace;">&lt;video&gt;</span> يملك دوال مثل<span style="font-family:courier new,courier,monospace;"> play()‎</span> و<span style="font-family:courier new,courier,monospace;"> pause()‎</span> ويمكن القراءة والكتابة إلى خاصيات مثل <span style="font-family:courier new,courier,monospace;">currentTime</span>، وهنالك أيضًا خاصيات أخرى يمكن القراءة منها والكتابة عليها مثل <span style="font-family:courier new,courier,monospace;">volume</span> و <span style="font-family:courier new,courier,monospace;">muted</span>؛ لذا تستطيع أن تبني واجهة عناصر التحكم كيف ما تشاء.
</p>

<p>
	إن لم تُرِد بناء واجهة عناصر التحكم يدويًا، فيمكنك أن تخبر المتصفح أن يُظهِر عناصر التحكم المدمجة فيه؛ وذلك بتضمين الخاصية <span style="font-family:courier new,courier,monospace;">controls</span> في وسم <span style="font-family:courier new,courier,monospace;">&lt;video&gt;</span>.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5583_16"><span class="tag">&lt;video</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"pr6.webm"</span><span class="pln"> </span><span class="atn">width</span><span class="pun">=</span><span class="atv">"320"</span><span class="pln"> </span><span class="atn">height</span><span class="pun">=</span><span class="atv">"240"</span><span class="pln"> </span><span class="atn">controls</span><span class="tag">&gt;&lt;/video&gt;</span></pre>

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

<p>
	هذا مثالٌ عن مقطع فيديو يبدأ بالتنزيل (لكن لن يُشغَّل) بعد انتهاء تنزيل الصفحة:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5583_19"><span class="tag">&lt;video</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"pr6.webm"</span><span class="pln"> </span><span class="atn">width</span><span class="pun">=</span><span class="atv">"320"</span><span class="pln"> </span><span class="atn">height</span><span class="pun">=</span><span class="atv">"240"</span><span class="pln"> </span><span class="atn">preload</span><span class="tag">&gt;&lt;/video&gt;</span></pre>

<p>
	هذا مثالٌ عن مقطع فيديو لن يبدأ بالتنزيل عند انتهاء تحميل الصفحة:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5583_21"><span class="tag">&lt;video</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"pr6.webm"</span><span class="pln"> </span><span class="atn">width</span><span class="pun">=</span><span class="atv">"320"</span><span class="pln"> </span><span class="atn">height</span><span class="pun">=</span><span class="atv">"240"</span><span class="pln"> </span><span class="atn">preload</span><span class="pun">=</span><span class="atv">"none"</span><span class="tag">&gt;&lt;/video&gt;</span></pre>

<p>
	وظيفة الخاصية <span style="font-family:courier new,courier,monospace;">autoplay</span> واضحة من اسمها: تخبر المتصفح أنَّك تحبِّذ تنزيل ملف الفيديو بعد انتهاء تحميل الصفحة، وترغب في أن يبدأ تشغيل المقطع تلقائيًا في أقرب وقتٍ ممكن. بعض الأشخاص يحبون هذا الأمر، وبعضهم يكرهونه؛ لكن دعني أشرح لماذا من المهم وجود هذه الخاصية في HTML5. بعض الأشخاص يريدون بدء تشغيل مقاطع الفيديو في صفحاتهم تلقائيًا حتى لو كان ذلك سيُزعِج زوار موقعهم. إن لم تُعرِّف HTML5 طريقةً معياريةً لبدء تشغيل مقاطع الفيديو فسيلجأ المطورون إلى استخدام JavaScript لفعل ذلك (على سبيل المثال، عبر استدعاء الدالة <span style="font-family:courier new,courier,monospace;">play()‎ </span>أثناء الحدث <span style="font-family:courier new,courier,monospace;">window.load</span>)؛ وهذا يُصعِّب مهمة تعطيل هذه الخاصية على الزوار، إذ يمكن استخدام إضافة إلى المتصفح (أو كتابة واحدة إن لزم الأمر) مهمتها هي تجاهل خاصية <span style="font-family:courier new,courier,monospace;">autoplay</span>، مما يُعطِّل تشغيل الفيديو التلقائي.
</p>

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

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5583_23"><span class="tag">&lt;video</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"pr6.webm"</span><span class="pln"> </span><span class="atn">width</span><span class="pun">=</span><span class="atv">"320"</span><span class="pln"> </span><span class="atn">height</span><span class="pun">=</span><span class="atv">"240"</span><span class="pln"> </span><span class="atn">autoplay</span><span class="tag">&gt;&lt;/video&gt;</span></pre>

<p>
	هذا هو سكربت <span style="font-family:courier new,courier,monospace;"><a href="http://www.greasespot.net/" rel="external nofollow">Greasemonkey</a></span> الذي تستطيع تثبيته على متصفحك ليمنع التشغيل التلقائي لفيديو HTML5؛ حيث يستخدم خاصية <span style="font-family:courier new,courier,monospace;">autoplay</span> في كائن DOM (المكافئة لخاصية <span style="font-family:courier new,courier,monospace;">autoplay</span> في شيفرة HTML) لتعطيل التشغيل (disable_video_autoplay.user.js):
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5583_25"><span class="com">// ==UserScript==</span><span class="pln">
</span><span class="com">// @name Disable video autoplay</span><span class="pln">
</span><span class="com">// @namespace http://diveintomark.org/projects/greasemonkey/</span><span class="pln">
</span><span class="com">// @description Ensures that HTML5 video elements do not autoplay</span><span class="pln">
</span><span class="com">// @include *</span><span class="pln">
</span><span class="com">// ==/UserScript==</span><span class="pln">

</span><span class="kwd">var</span><span class="pln"> arVideos </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">getElementsByTagName</span><span class="pun">(</span><span class="str">'video'</span><span class="pun">);</span><span class="pln">

</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">var</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> arVideos</span><span class="pun">.</span><span class="pln">length </span><span class="pun">-</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&gt;=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">--)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
	</span><span class="kwd">var</span><span class="pln"> elmVideo </span><span class="pun">=</span><span class="pln"> arVideos</span><span class="pun">[</span><span class="pln">i</span><span class="pun">];</span><span class="pln">
	elmVideo</span><span class="pun">.</span><span class="pln">autoplay </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	تمهل قليلًا… إذا كنتَ تتابع معي منذ بداية هذا الفصل، فأنت تعلم أنَّ لدينا ثلاثة ملفات فيديو بدلًا من واحد! هنالك ملف <span style="font-family:courier new,courier,monospace;">‎.ogv</span> الذي <a href="https://academy.hsoub.com/programming/html5/%D8%AA%D8%B1%D9%85%D9%8A%D8%B2-%D9%85%D9%82%D8%A7%D8%B7%D8%B9-%D8%A7%D9%84%D9%81%D9%8A%D8%AF%D9%8A%D9%88-%D8%A8%D8%B9%D8%AF%D8%A9-%D8%B5%D9%8A%D8%BA-r355/" rel="">أنشأته باستخدام Firefogg أو ffmpeg2theora</a>، وهنالك آخر ‎.mp4 أنشأته باستخدام <a href="https://academy.hsoub.com/programming/html5/%D8%AA%D8%B1%D9%85%D9%8A%D8%B2-%D9%85%D9%82%D8%A7%D8%B7%D8%B9-%D8%A7%D9%84%D9%81%D9%8A%D8%AF%D9%8A%D9%88-%D8%A8%D8%B9%D8%AF%D8%A9-%D8%B5%D9%8A%D8%BA-r355/" rel="">HandBrake</a>، والثالث هو ملف ‎.webm الذي أنشأته عبر <a href="https://academy.hsoub.com/programming/html5/%D8%AA%D8%B1%D9%85%D9%8A%D8%B2-%D9%85%D9%82%D8%A7%D8%B7%D8%B9-%D8%A7%D9%84%D9%81%D9%8A%D8%AF%D9%8A%D9%88-%D8%A8%D8%B9%D8%AF%D8%A9-%D8%B5%D9%8A%D8%BA-r355/" rel="">ffmpeg</a>. توفر HTML5 طريقةً لإضافة روابط لجميع الملفات السابقة: العنصر &lt;source&gt;. يمكن أن يحتوي كل عنصر &lt;video&gt; على أكثر من عنصر &lt;source&gt;؛ وسيقرأ المتصفحُ قائمةَ عناصر source بالترتيب وسيُشغِّل أول مقطع يستطيع تشغيله.
</p>

<p>
	وهذا يطرح سؤالًا آخر: كيف يعلم المتصفح أيَّ مقطعٍ يستطيع تشغيله؟ حسنًا، أسوأ الاحتمالات هي تحميل كل مقطع من تلك المقاطع ومحاولة تشغيله؛ وهذا إهدارٌ لتراسل البيانات. تستطيع أن تسهل الأمر على المتصفح (وتوفر قدرًا لا بأس به من تراسل البيانات) إذا أخبرتَ المتصفح معلوماتٍ عن كل مقطع، وذلك باستخدام الخاصية type في عنصر <span style="font-family:courier new,courier,monospace;">&lt;source&gt;</span>.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5583_35"><span class="tag">&lt;video</span><span class="pln"> </span><span class="atn">width</span><span class="pun">=</span><span class="atv">"320"</span><span class="pln"> </span><span class="atn">height</span><span class="pun">=</span><span class="atv">"240"</span><span class="pln"> </span><span class="atn">controls</span><span class="tag">&gt;</span><span class="pln">
	</span><span class="tag">&lt;source</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"pr6.mp4"</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">'video/mp4; codecs="avc1.42E01E, mp4a.40.2"'</span><span class="tag">&gt;</span><span class="pln">
	</span><span class="tag">&lt;source</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"pr6.webm"</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">'video/webm; codecs="vp8, vorbis"'</span><span class="tag">&gt;</span><span class="pln">
	</span><span class="tag">&lt;source</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"pr6.ogv"</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">'video/ogg; codecs="theora, vorbis"'</span><span class="tag">&gt;</span><span class="pln">
</span><span class="tag">&lt;/video&gt;</span></pre>

<p>
	لنُقسِّم الشيفرة السابقة ليسهل فهمها. يُحدِّد العنصر <span style="font-family:courier new,courier,monospace;">&lt;video&gt;</span> عرض وارتفاع مقطع الفيديو، لكنه لا يُحدِّد رابطًا لملف الفيديو؛ أما داخل عنصر <span style="font-family:courier new,courier,monospace;">&lt;video&gt;</span> فهنالك ثلاثة عناصر <span style="font-family:courier new,courier,monospace;">&lt;source&gt;</span>، كل عنصر <span style="font-family:courier new,courier,monospace;">&lt;source&gt;</span> يُشير إلى ملف فيديو وحيد (باستخدام خاصية <span style="font-family:courier new,courier,monospace;">src</span>)، ويُعطي معلومات أيضًا حول صيغة الفيديو (في خاصية <span style="font-family:courier new,courier,monospace;">type</span>).
</p>

<p>
	تبدو خاصية <span style="font-family:courier new,courier,monospace;">type</span> معقدةً، وهي كذلك! فهي مجموعةٌ من ثلاثة أقسام من المعلومات: صيغة الحاوية، ومرماز الفيديو، ومرماز الصوت. لنبدأ من الأسفل إلى الأعلى: لملفات ‎<span style="font-family:courier new,courier,monospace;">.ogv</span> تكون صيغة الحاوية هي Ogg المُمثَّلة هنا بالعبارة<span style="font-family:courier new,courier,monospace;"> video/ogg</span> (بكلامٍ تقني، هذا هو نوع MIME لملفات Ogg)، ومرماز الفيديو هو Theora، ومرماز الصوت هو Vorbis. تبيّن أنَّ خاصية <span style="font-family:courier new,courier,monospace;">type</span> بسيطة، عدا كون شكلها مشوه، لأن القيمة نفسها تتضمن علامات اقتباس، وهذا يعني أنَّ عليك استخدام نوع آخر من علامات الاقتباس لإحاطة القيمة كلها.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5583_37"><span class="tag">&lt;source</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"pr6.ogv"</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">'video/ogg; codecs="theora, vorbis"'</span><span class="tag">&gt;</span></pre>

<p>
	صيغة WebM مشابهة لما سبق، لكن نوع MIME مختلف (<span style="font-family:courier new,courier,monospace;">video/webm</span> بدلًا من <span style="font-family:courier new,courier,monospace;">video/ogg</span>) ومرماز فيديو مختلف (vp8 بدلًا من theora) مذكورٌ ضمن المعامل (parameter) المسمى codecs.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5583_39"><span class="tag">&lt;source</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"pr6.webm"</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">'video/webm; codecs="vp8, vorbis"'</span><span class="tag">&gt;</span></pre>

<p>
	أما فيديو H.264 فهو أكثر تعقيدًا؛ تذكر ما قلته عند <a href="https://academy.hsoub.com/programming/html5/%D8%B5%D9%8A%D8%BA-%D8%AA%D8%B1%D9%85%D9%8A%D8%B2-%D8%A7%D9%84%D9%81%D9%8A%D8%AF%D9%8A%D9%88-%D9%88%D8%A7%D9%84%D8%B5%D9%88%D8%AA-%D9%88%D8%AD%D8%A7%D9%88%D9%8A%D8%A7%D8%AA%D9%87%D8%A7-%D9%88%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%B9%D9%85%D9%84%D9%87%D8%A7-%D9%81%D9%8A-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r350/" rel="">شرح فيديو H.264 وصوت AAC</a> أنها تأتي بأنماط (profiles) مختلفة؟ لقد رمَّزنا الفيديو بنمط "baseline" والصوت بنمط «low-complexity) ثم وضعناهما في حاوية MPEG-4. كل هذه المعلومات موجودة في خاصية <span style="font-family:courier new,courier,monospace;">type</span>.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5583_42"><span class="tag">&lt;source</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"pr6.mp4"</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">'video/mp4; codecs="avc1.42E01E, mp4a.40.2"'</span><span class="tag">&gt;</span></pre>

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

<p>
	إذا كنت تتبع التعليمات الواردة سابقًا في هذا الفصل لترميز مقاطع الفيديو، فيمكنك أن تنسخ وتلصق قيم خاصية <span style="font-family:courier new,courier,monospace;">type</span> من المثال السابق، وإلا فعليك أن تكتبها يدويًا بنفسك.
</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>

<h2>
	أنواع MIME تكشف عن وجهها القبيح
</h2>

<p>
	هنالك قطعٌ كثيرةٌ لأحجية تشغيل الفيديو على الويب، ولقد ترددت كثيرًا في طرح هذا الموضوع، لكنه مهم لأنَّ الضبط الخاطئ لخادوم الويب سيؤدي إلى مشاكل لا تنتهي عندما تحاول معرفة سبب تشغيل مقاطع الفيديو على جهازك المحلي بينما لا تستطيع ذلك على الخادم الإنتاجي. إذا واجهتك هذه المشكلة فاعلم أنَّ المُسبِّب الرئيسي لها هو أنواع MIME في أغلبية الحالات.
</p>

<p>
	ذكرتُ <a href="https://academy.hsoub.com/programming/html5/%D9%86%D8%B8%D8%B1%D8%A9-%D8%B9%D9%84%D9%89-%D8%AA%D8%A7%D8%B1%D9%8A%D8%AE-html-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%A3%D9%88%D9%84-r322/" rel="">أنواع MIME في درس لمحة تاريخية</a>، لكن ربما تخطيت تلك الفقرة ولم تعرها اهتمامك، هذه خلاصة الموضوع:
</p>

<p>
	يجب أن تُخدَّم ملفات الفيديو بنوع MIME الملائم لها.
</p>

<p>
	ما هو "نوع MIME الملائم"؟ لقد رأيته سابقًا: هو جزءٌ من قيمة الخاصية <span style="font-family:courier new,courier,monospace;">type</span> في العنصر <span style="font-family:courier new,courier,monospace;">&lt;soruce&gt;</span>، لكن ضبط الخاصية <span style="font-family:courier new,courier,monospace;">type</span> في شيفرات HTML ليس كافيًا، فعليك أيضًا أن تتأكد أنَّ خادم الويب يُضمِّن نوع MIME المناسب في ترويسة <span style="font-family:courier new,courier,monospace;">Content-Type</span> في HTTP.
</p>

<p>
	إذا كنتَ تستخدم خادم ويب أباتشي (Apache) أو أي خادم آخر مُشتَق منه، فيمكنك استخدام تعليمة <span style="font-family:courier new,courier,monospace;"><a href="http://httpd.apache.org/docs/2.0/mod/mod_mime.html#addtype" rel="external nofollow">AddType</a></span> في ملف <span style="font-family:courier new,courier,monospace;">httpd.conf</span> (أو <span style="font-family:courier new,courier,monospace;">apache2.conf</span> في الإصدارات الحديثة منه) الذي يُعدِّل الضبط لكل الموقع، أو في ملف ‎<span style="font-family:courier new,courier,monospace;">.htaccess</span> الذي يُعدِّل الضبط للمجلد الذي تُخزِّن فيه مقاطع الفيديو (إذا كنتَ تستخدم خادم ويب آخر فانظر إلى توثيق ذاك الخادم لترى كيف يمكنك ضبط ترويسة <span style="font-family:courier new,courier,monospace;">Content-Type</span> في HTTP لأنواع ملفات معيّنة).
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5583_47"><span class="pln">AddType video/ogg .ogv
AddType video/mp4 .mp4
AddType video/webm .webm</span></pre>

<p>
	أول سطر مما سبق لمقاطع الفيديو في حاوية Ogg، والسطر الثاني لمقاطع الفيديو في حاوية MPEG-4، والسطر الثالث لمقاطع الفيديو في WebM. اضبطها مرةً ودعها تعمل عملها؛ لكن إن نسيت ضبطها فلن تعمل جميع مقاطع الفيديو المُحدَّدة في بعض المتصفحات، حتى لو وضعتَ نوع MIME في خاصية type في شيفرات HTML.
</p>

<h2>
	ماذا عن متصفح IE؟
</h2>

<p>
	يدعم متصفح Internet Explorer عنصر<span style="font-family:courier new,courier,monospace;"> &lt;video&gt;</span> في HTML5، ويدعم فيديو H.264 وصوت AAC في حاوية MPEG-4، مثل متصفح Safari وهاتف iPhone.
</p>

<p>
	لكن ماذا عن الإصدارات القديمة من Internet Explorer؟ مثل IE8 وما دونه؟ أغلبية الأشخاص الذين يستخدمون Internet Explorer لديهم إضافة Adobe Flash مثبتةً على جهازهم. الإصدارات الحديثة من Adobe Flash (بدءًا من الإصدار 9.0.60.184) تدعم فيديو H.264 وصوت AAC في حاوية MPEG-4، مثل متصفح Safari و iPhone. فبمجرد ترميزك لمقطع الفيديو بمرماز H.264 لمتصفح Safari، ستستطيع تشغيله في مشغل فيديو يعتمد على تقنية Flash، وذلك في حال اكتشفت أنَّ أحد زوارك لا يملك متصفحًا متوافقًا مع فيديو HTML5.
</p>

<p>
	<a href="http://flowplayer.org/" rel="external nofollow">FlowPlayer</a> هو مشغِّل فيديو مبني على تقنية Flash مفتوح المصدر ومرخَّص برخصة GPL (تتوفر رخص تجارية له). لا يَعرِف مشغِّل FlowPlayer أيّ شيءٍ عن عنصر <span style="font-family:courier new,courier,monospace;">&lt;video&gt;</span>، ولن يحوِّل وسم <span style="font-family:courier new,courier,monospace;">&lt;video&gt;</span> بشكلٍ سحري إلى كائن Flash، لكن HTML5 مصممة تصميمًا جيدًا لكي تتعامل مع هذه الحالات، لأنك تستطيع تضمن عنصر <span style="font-family:courier new,courier,monospace;">&lt;object&gt;</span> ضمن عنصر <span style="font-family:courier new,courier,monospace;">&lt;video&gt;</span>؛ وستتجاهل المتصفحات التي لا تدعم الفيديو في HTML5 العنصر <span style="font-family:courier new,courier,monospace;">&lt;video&gt;</span> وستُحمِّل العنصر <span style="font-family:courier new,courier,monospace;">&lt;object&gt;</span> الموجود ضمنه بدلًا عنه؛ الذي سيُشغِّل مقطع الفيديو باستخدام FlowPlayer؛ أما المتصفحات التي تدعم الفيديو في HTML5 فستعثر على مقطع فيديو (عبر العنصر <span style="font-family:courier new,courier,monospace;">soruce</span>) تستطيع تشغيله، ثم ستتجاهل العنصر <span style="font-family:courier new,courier,monospace;">&lt;object&gt;</span> تمامًا.
</p>

<p>
	آخر جزء من مفتاح حل الأحجية هو أنَّ HTML5 تقول بوجوب تجاهل جميع العناصر (ما عدا عناصر <span style="font-family:courier new,courier,monospace;">&lt;source&gt;</span>) التي تكون "أبناءً" (children) للعنصر <span style="font-family:courier new,courier,monospace;">&lt;video&gt;</span> تمامًا، وهذا يسمح لك باستخدام عنصر <span style="font-family:courier new,courier,monospace;">video</span> في HTML5 في المتصفحات الحديثة مع توفير حل للمتصفحات القديمة عبر تقنية Flash دون الحاجة إلى كتابة سكربتات JavaScript معقدة.
</p>

<h2>
	مثال متكامل
</h2>

<p>
	هذا تطبيقٌ للتقنيات التي تعلمناها سابقًا في الدرس السابق حول <a href="https://academy.hsoub.com/programming/html5/%D8%AA%D8%B1%D9%85%D9%8A%D8%B2-%D9%85%D9%82%D8%A7%D8%B7%D8%B9-%D8%A7%D9%84%D9%81%D9%8A%D8%AF%D9%8A%D9%88-%D8%A8%D8%B9%D8%AF%D8%A9-%D8%B5%D9%8A%D8%BA-r355/" rel="">ترميز مقاطع الفيديو</a>؛ قمت بتضمين فيديو WebM، ولقد رمَّزتُ الفيديو المصدري إلى ثلاث صيغ باستخدام هذه الأوامر:
</p>

<pre class="ipsCode" id="ips_uid_5583_50">## Theora/Vorbis/Ogg
you@localhost$ ffmpeg2theora --videobitrate 200 --max_size 320x240 --output pr6.ogv pr6.dv

## H.264/AAC/MP4
you@localhost$ HandBrakeCLI --preset "iPhone &amp; iPod Touch" --vb 200 --width 320 --two-pass --turbo --optimize --input pr6.dv --output pr6.mp4

## VP8/Vorbis/WebM
you@localhost$ ffmpeg -pass 1 -passlogfile pr6.dv -threads 16 -keyint_min 0 -g 250 -skip_threshold 0 -qmin 1 -qmax 51 -i pr6.dv -vcodec libvpx -b 204800 -s 320x240 -aspect 4:3 -an -f webm -y NUL

you@localhost$ ffmpeg -pass 2 -passlogfile pr6.dv -threads 16 -keyint_min 0 -g 250 -skip_threshold 0 -qmin 1 -qmax 51 -i pr6.dv -vcodec libvpx -b 204800 -s 320x240 -aspect 4:3 -acodec libvorbis -ac 2 -y pr6.webm</pre>

<p>
	سنستخدم العنصر <span style="font-family:courier new,courier,monospace;">&lt;video&gt;</span> في الشيفرة النهائية، مع وجود عنصر <span style="font-family:courier new,courier,monospace;">&lt;object&gt;</span> لمشغل Flash إن لم يدعم المتصفح العنصر<span style="font-family:courier new,courier,monospace;"> &lt;video&gt;</span>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9483_7"><span class="tag">&lt;video</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"movie"</span><span class="pln"> </span><span class="atn">width</span><span class="pun">=</span><span class="atv">"320"</span><span class="pln"> </span><span class="atn">height</span><span class="pun">=</span><span class="atv">"240"</span><span class="pln"> </span><span class="atn">preload</span><span class="pln"> </span><span class="atn">controls</span><span class="tag">&gt;</span><span class="pln">
	</span><span class="tag">&lt;source</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"pr6.webm"</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">'video/webm; codecs="vp8, vorbis"'</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
	</span><span class="tag">&lt;source</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"pr6.ogv"</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">'video/ogg; codecs="theora, vorbis"'</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
	</span><span class="tag">&lt;source</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"pr6.mp4"</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">

	</span><span class="tag">&lt;object</span><span class="pln"> </span><span class="atn">width</span><span class="pun">=</span><span class="atv">"320"</span><span class="pln"> </span><span class="atn">height</span><span class="pun">=</span><span class="atv">"240"</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"application/x-shockwave-flash"</span><span class="pln"> </span><span class="atn">data</span><span class="pun">=</span><span class="atv">"flowplayer-3.2.1.swf"</span><span class="tag">&gt;</span><span class="pln">
		</span><span class="tag">&lt;param</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"movie"</span><span class="pln"> </span><span class="atn">value</span><span class="pun">=</span><span class="atv">"flowplayer-3.2.1.swf"</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
		</span><span class="tag">&lt;param</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"allowfullscreen"</span><span class="pln"> </span><span class="atn">value</span><span class="pun">=</span><span class="atv">"true"</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
		</span><span class="tag">&lt;param</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"flashvars"</span><span class="pln"> </span><span class="atn">value</span><span class="pun">=</span><span class="atv">'config={"clip": {"url": "http://wearehugh.com/dih5/pr6.mp4", "autoPlay":false, "autoBuffering":true}}'</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
		</span><span class="tag">&lt;p&gt;</span><span class="pln">Download video as </span><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"pr6.mp4"</span><span class="tag">&gt;</span><span class="pln">MP4</span><span class="tag">&lt;/a&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">"pr6.webm"</span><span class="tag">&gt;</span><span class="pln">WebM</span><span class="tag">&lt;/a&gt;</span><span class="pln">, or </span><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"pr6.ogv"</span><span class="tag">&gt;</span><span class="pln">Ogg</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;/object&gt;</span><span class="pln">
</span><span class="tag">&lt;/video&gt;</span></pre>

<p>
	ستتمكن من تشغيل مقطع الفيديو السابق على أي متصفح أو جهاز بدمج شيفرات HTML5 مع مشغل Flash كما في المثال السابق.
</p>

<h2>
	عناصر تحكم بتشغيل الفيديو معدة مسبقا:
</h2>

<ul>
	<li>
		<a href="http://videojs.com/" rel="external nofollow">VideoJS</a>
	</li>
	<li>
		<a href="http://mediaelementjs.com/" rel="external nofollow">MediaElement.js</a>
	</li>
	<li>
		<a href="http://www.kaltura.org/project/HTML5_Video_Media_JavaScript_Library" rel="external nofollow">Kaltura HTML5 Video &amp; Media JavaScript Library</a>
	</li>
</ul>

<p>
	ترجمة -وبتصرّف- لفصل "<a href="http://diveinto.html5doctor.com/video.html" rel="external nofollow">Video</a>" من كتاب <a href="http://diveinto.html5doctor.com/index.html" rel="external nofollow">Dive Into HTML5</a> لمؤلفه Mark Pilgrim.
</p>

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

<ul>
	<li>
		المقال التالي: <a href="https://academy.hsoub.com/programming/html/html5/%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D8%A7%D9%84%D8%AA%D8%A3%D8%B1%D9%8A%D8%AE-%D9%81%D9%8A-html5-r443/" rel="">التعامل مع التأريخ في HTML5</a>
	</li>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/html/html5/%D8%AA%D8%B1%D9%85%D9%8A%D8%B2-%D9%85%D9%82%D8%A7%D8%B7%D8%B9-%D8%A7%D9%84%D9%81%D9%8A%D8%AF%D9%8A%D9%88-%D8%A8%D8%B9%D8%AF%D8%A9-%D8%B5%D9%8A%D8%BA-r355/" rel="">ترميز مقاطع الفيديو بعدة صيغ</a>
	</li>
	<li>
		النسخة العربية الكاملة من كتاب <a href="https://academy.hsoub.com/files/13-%D9%86%D8%AD%D9%88-%D9%81%D9%87%D9%85-%D8%A7%D9%94%D8%B9%D9%85%D9%82-%D9%84%D8%AA%D9%82%D9%86%D9%8A%D8%A7%D8%AA-html5/" rel="">نحو فهم أعمق لتقنيات HTML5 </a>
	</li>
</ul>
]]></description><guid isPermaLink="false">356</guid><pubDate>Tue, 21 Jun 2016 08:33:00 +0000</pubDate></item><item><title>&#x62A;&#x631;&#x645;&#x64A;&#x632; &#x645;&#x642;&#x627;&#x637;&#x639; &#x627;&#x644;&#x641;&#x64A;&#x62F;&#x64A;&#x648; &#x628;&#x639;&#x62F;&#x629; &#x635;&#x64A;&#x63A;</title><link>https://academy.hsoub.com/programming/html/%D8%AA%D8%B1%D9%85%D9%8A%D8%B2-%D9%85%D9%82%D8%A7%D8%B7%D8%B9-%D8%A7%D9%84%D9%81%D9%8A%D8%AF%D9%8A%D9%88-%D8%A8%D8%B9%D8%AF%D8%A9-%D8%B5%D9%8A%D8%BA-r355/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_06/html5-video-encoding.png.c7847956a65179c1d14597235952f862.png" /></p>

<p>
	هنالك أدواتٌ عديدةٌ لترميز الفيديو، وهنالك خياراتٌ كثيرةٌ للترميز تؤثر على جودة الفيديو؛ فإن لم تكن تريد فهم كل شيءٍ متعلقٍ بترميز الفيديو فعليك بهذا المقال.
</p>

<p style="text-align: center;">
	<img alt="html5-video-encoding.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17941" data-unique="1srv1l989" src="https://academy.hsoub.com/uploads/monthly_2016_06/html5-video-encoding.png.fe278d72cbdf2b59bada51027898c8e0.png"></p>

<h2>
	ترميز الفيديو باستخدام Miro Video Converter
</h2>

<p>
	Miro Video Converter هو برنامج مفتوح المصدر مُرخَّص برخصة GPL لترميز الفيديو بعدِّة صيغ، يمكنك <a href="http://www.mirovideoconverter.com/" rel="external nofollow">تنزيله لنظامَي Mac OS X أو ويندوز</a>. وهو يدعم التحويل إلى جميع الصيغ التي ذكرناها سابقًا في الدرس السابق، لكنه لا يوفر خيارات سوى اختيار ملف الفيديو والصيغة التي سيحوَّل إليها. يمكنه نظريًا قبول أي صيغة من صيغ الفيديو كملف مصدري، بما في ذلك فيديو DV الذي تُنتِجه كاميرات الفيديو الرقمية من فئة المستهلكين. يُنتِج البرنامج مقاطع فيديو ذات جودة مقبولة؛ ولأن هذا البرنامج لا يوفر لك خياراتٍ كثيرة، فليس عندك حل سوى تغيير البرنامج إن لم تعجبك مقاطع الفيديو الناتجة من البرنامج.
</p>

<p>
	عليك أولًا تشغيل برنامج Miro Video Converter:
</p>

<p style="text-align: center;">
	<img alt="1.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17906" data-unique="2grrar2i8" src="https://academy.hsoub.com/uploads/monthly_2016_06/1.png.4695be7ac99fe3632f7c450a4358f62f.png"></p>

<p style="text-align: center;">
	<strong>الشكل 1: واجهة برنامج Miro Video Converter الرئيسية</strong>
</p>

<p>
	انقر فوق <strong>Choose file</strong> واختر ملف الفيديو المصدري الذي تريد ترميزه.
</p>

<p style="text-align: center;">
	<img alt="2.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17907" data-unique="y25rx9n4l" src="https://academy.hsoub.com/uploads/monthly_2016_06/2.png.f597e20e4cbc30f3cf2cbac267cc9fe3.png"></p>

<p style="text-align: center;">
	<strong>الشكل 2: اختيار مقطع فيديو</strong>
</p>

<p>
	اضغط فوق القائمة المنسدلة <strong>Pick a Device or Video Format</strong> التي فيها قائمة بـ<a href="https://academy.hsoub.com/programming/html5/%D8%B5%D9%8A%D8%BA-%D8%AA%D8%B1%D9%85%D9%8A%D8%B2-%D8%A7%D9%84%D9%81%D9%8A%D8%AF%D9%8A%D9%88-%D9%88%D8%A7%D9%84%D8%B5%D9%88%D8%AA-%D9%88%D8%AD%D8%A7%D9%88%D9%8A%D8%A7%D8%AA%D9%87%D8%A7-%D9%88%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%B9%D9%85%D9%84%D9%87%D8%A7-%D9%81%D9%8A-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r350/" rel="">مختلف الأجهزة والصيغ</a>. لكننا مهتمين بثلاثةٍ من تلك العناصر:
</p>

<ul>
<li>
		(WebM (vp8 هو فيديو WebM (أي فيديو VP8 وصوت Vorbis في حاوية WebM).
	</li>
	<li>
		Theora هو فيديو Theora وصوت Vorbis في حاوية Ogg.
	</li>
	<li>
		iPhone هو فيديو H.264 ذو النمط Baseline وصوت AAC ذو النمط low-complexity في حاوية MP4.
	</li>
</ul>
<p>
	اختر WebM أولًا.
</p>

<p style="text-align: center;">
	<img alt="3.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17908" data-unique="jpqu9j770" src="https://academy.hsoub.com/uploads/monthly_2016_06/3.png.505f5ea1891c25e5a2937dfd67c86ac2.png"></p>

<p style="text-align: center;">
	<strong>الشكل 3: اختيار صيغة WebM</strong>
</p>

<p>
	اضغط فوق زر <span style="font-family:courier new,courier,monospace;">Convert </span>وسيبدأ برنامج Miro Video Converter بترميز الفيديو مباشرةً. سيُسمى الملف الناتج باسم <span style="font-family:courier new,courier,monospace;">SOURCEFILE.webm</span> وسيُحفَظ في نفس مجلد ملف الفيديو المصدري.
</p>

<p style="text-align: center;">
	<img alt="4.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17909" data-unique="olmpoohoo" src="https://academy.hsoub.com/uploads/monthly_2016_06/4.png.25b7ccd6dcac4ca8f30307480360e670.png"></p>

<p style="text-align: center;">
	<strong>الشكل 4: ستُحدِّق في هذه الشاشة لفترةٍ طويلة</strong>
</p>

<p>
	سترجع إلى الشاشة الرئيسية بعد أن ينتهي الترميز، اختر Theora في هذه المرة من قائمة الأجهزة والصيغ.
</p>

<p style="text-align: center;">
	<img alt="5.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17910" data-unique="dwocor0iv" src="https://academy.hsoub.com/uploads/monthly_2016_06/5.png.16139e8f27ab7fb614e28841d5542615.png"></p>

<p style="text-align: center;">
	<strong>الشكل 5: حان الوقت لترميز Theora</strong>
</p>

<p>
	اضغط على زر <strong>Convert</strong> مرةً أخرى لترميز الفيديو بصيغة Theora؛ وسيُسمَّى الملف الناتج باسم <span style="font-family:courier new,courier,monospace;">SOURCEFILE.theora.ogv</span> وسيُحفَظ في نفس مجلد المقطع الأصلي.
</p>

<p style="text-align: center;">
	<img alt="6.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17911" data-unique="rso8vs8kr" src="https://academy.hsoub.com/uploads/monthly_2016_06/6.png.e6220b90f1cf16628e0a3c4b095258c2.png"></p>

<p style="text-align: center;">
	الشكل 6: اذهب واشرب كوبًا من القهوة
</p>

<p>
	في النهاية، عليك ترميز المقطع بمرماز H.264 المتوافق مع iPhone وذلك باختيار iPhone من قائمة الأجهزة والصيغ.
</p>

<p style="text-align: center;">
	<img alt="7.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17912" data-unique="gbwf1f0lr" src="https://academy.hsoub.com/uploads/monthly_2016_06/7.png.f517051b06679f39dd6208457860bee4.png"></p>

<p style="text-align: center;">
	<strong>الشكل 7: اختر iPhone وليس iPhone 4</strong>
</p>

<p>
	سيعطيك برنامج Miro Video Converter خيارًا عند ترميز فيديو متوافق مع هواتف iPhone هو إرسال المقطع المُرمَّز إلى مكتبتك في iTunes. القرار عائدٌ إليك هنا، لكنه ليس ضروريًا لنشره على الويب.
</p>

<p style="text-align: center;">
	<img alt="8.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17913" data-unique="993b76kmm" src="https://academy.hsoub.com/uploads/monthly_2016_06/8.png.8d2e543a4f2543836f886bd7ea44ddaf.png"></p>

<p style="text-align: center;">
	<strong>الشكل 8: لا ترسل الملف إلى iTunes</strong>
</p>

<p>
	اضغط على زر<strong> Convert</strong> السحري وانتظر، سيُسمَّى الناتج باسم <span style="font-family:courier new,courier,monospace;">SOURCENAME.iphone.mp4</span> وسيُحفَظ بنفس مجلد الملف المصدر.
</p>

<p style="text-align: center;">
	<img alt="9.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17914" data-unique="6zpmyce8l" src="https://academy.hsoub.com/uploads/monthly_2016_06/9.png.e9f084f9f10d496caaacdce37c1bdf38.png"></p>

<p style="text-align: center;">
	<strong>الشكل 9: تصفح موقع فيسبوك قليلًا أو افعل شيئًا مفيدًا</strong>
</p>

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

<h2>
	ترميز الفيديو باستخدام Firefogg
</h2>

<p>
	<strong>ملاحظة</strong>: سأستخدم المصطلح "فيديو Ogg" في هذا القسم اختصارًا للعبارة "فيديو Theora مع صوت Vorbis في حاوية Ogg"، وهذه تجميعة من المرمازات + حاوية التي تعمل دون إضافات في متصفحَي Firefox و Google Chrome.
</p>

<p>
	Firefogg هي إضافة مفتوحة المصدر مرخَّصة برخصة GPL لمتصفح Firefox لترميز فيديو Ogg. يجب أن يكون لديك إصدار Firefox 3.5 أو ما بعده لتثبيت هذه الإضافة، وذلك بزيادة موقعها الرسمي <a href="http://firefogg.org/" rel="external nofollow">firefogg.org</a>.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="17915" href="https://academy.hsoub.com/uploads/monthly_2016_06/10.png.58e7134c149bc68a0ff67dece647a8a2.png" rel=""><img alt="10.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17915" data-unique="zxv871asu" src="https://academy.hsoub.com/uploads/monthly_2016_06/10.thumb.png.b9ecc4c574a084ef4a925cedc26c64fd.png"></a>
</p>

<p style="text-align: center;">
	<strong>الشكل 10: صفحة Firefogg الرئيسية</strong>
</p>

<p>
	اضغط على زر "Install Firefogg"، وسيسألك Firefox إذا كنت تريد السماح لهذه الموقع بتثبيت إضافة (extension). اضغط على "Allow" للمتابعة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="17916" href="https://academy.hsoub.com/uploads/monthly_2016_06/11.png.4e9b6db8524c944a4d354a9c00b02b0f.png" rel=""><img alt="11.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17916" data-unique="yw19cf7f2" src="https://academy.hsoub.com/uploads/monthly_2016_06/11.thumb.png.00902063a5571faa9ea310a443509d01.png"></a>
</p>

<p style="text-align: center;">
	<strong>الشكل 11: السماح بتثبيت Firefogg</strong>
</p>

<p>
	سيُظهِر لك Firefox نافذة تثبيت الإضافات الاعتيادية. اضغط على "Install Now" للمتابعة.
</p>

<p style="text-align: center;">
	<img alt="12.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17917" data-unique="ilt9633ry" src="https://academy.hsoub.com/uploads/monthly_2016_06/12.png.021026f35249aae146bc375fa88d2896.png"></p>

<p style="text-align: center;">
	<strong>الشكل 12: تثبيت Firefogg</strong>
</p>

<p>
	اضغط على "Restart Firefox" لإكمال التثبيت.
</p>

<p style="text-align: center;">
	<img alt="13.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17918" data-unique="jidnw0vhl" src="https://academy.hsoub.com/uploads/monthly_2016_06/13.png.be0e065dc0c09d130ba907e157ef265d.png"></p>

<p style="text-align: center;">
	<strong>الشكل 13: أعد تشغيل Firefox</strong>
</p>

<p>
	سيؤكد لك موقع firefogg.org أنَّك ثبتت Firefogg تثبيتًا سليمًا بعد إعادة تشغيل Firefox.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="17919" href="https://academy.hsoub.com/uploads/monthly_2016_06/14.png.ba3d30c495e9736464b8064178d5ab8b.png" rel=""><img alt="14.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17919" data-unique="v3urjyojn" src="https://academy.hsoub.com/uploads/monthly_2016_06/14.thumb.png.df03ade2097b30569c1ce2eeb610c8b5.png"></a>
</p>

<p style="text-align: center;">
	<strong>الشكل 14: نجاح عملية تثبيت Firefogg</strong>
</p>

<p>
	اضغط على "Make Ogg Video" لبدء عملية الترميز.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="17920" href="https://academy.hsoub.com/uploads/monthly_2016_06/15.png.edcee4de1d1e31e84aeb75a84e60b475.png" rel=""><img alt="15.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17920" data-unique="t0u1ysrcy" src="https://academy.hsoub.com/uploads/monthly_2016_06/15.thumb.png.c21cdd5208973aa2730b8786a3912dfd.png"></a>
</p>

<p style="text-align: center;">
	<strong>الشكل 15: البدء في ترميز مقاطع الفيديو</strong>
</p>

<p>
	اضغط على "Select file" لتحديد ملف الفيديو المصدري.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="17921" href="https://academy.hsoub.com/uploads/monthly_2016_06/16.png.d627f46f144564fb0868c1bca42ff45c.png" rel=""><img alt="16.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17921" data-unique="vjtd1n6i5" src="https://academy.hsoub.com/uploads/monthly_2016_06/16.thumb.png.b3b98b1b4a444f296f158e4f0c010160.png"></a>
</p>

<p style="text-align: center;">
	<strong>الشكل 16: اختيار ملف الفيديو الذي تريد تحويله</strong>
</p>

<p>
	هنالك ستة أقسام في Firefogg:
</p>

<ul>
<li>
		<strong>Presets (إعدادات الضبط المسبقة)</strong>: الخيار الافتراضي هو "web video"، وهو جيدٌ لأغراضنا.
	</li>
	<li>
		<strong>Encoding range (مجال الترميز)</strong>: قد يستغرق ترميز مقطع فيديو وقتًا طويلًا. وقد ترغب في البداية أن تُرمِّز جزءًا من الفيديو (لنقل، أول 30 ثانية) حتى تجد تركيبة الإعدادات التي تعجبك.
	</li>
	<li>
		<strong>Basic quality and resolution control (التحكم الأساسي بالجودة والدقة)</strong>: يحتوي هذا القسم على أغلبية الخيارات المهمة.
	</li>
	<li>
		<strong>Metadata (البيانات الوصفية)</strong>: لن أشرحها هنا، لكنك تستطيع إضافة البيانات الوصفية إلى مقاطع الفيديو التي تُرمِّزها مثل العنوان (title) والمؤلف (author). ربما أضفتَ من قبل البيانات الوصفية إلى مجموعتك الموسيقية المُفضَّلة عبر iTunes أو مدير موسيقي آخر. هذا القسم يُجسِّد هذه الفكرة.
	</li>
	<li>
		<strong>Advanced video encoding controls (خيارات ترميز الفيديو المتقدمة)</strong>: لا تعبث بهذه الخيارات إلا إن كنت تعلم ما الذي تفعله (يوفِّر Firefogg مساعدةً تفاعليةً لأغلبية هذه الخيارات؛ اضغط على رمز "i" بجوار كل خيار لكي تتعلم المزيد عنه).
	</li>
	<li>
		<strong>Advanced audio encoding controls (خيارات ترميز الصوت المتقدمة)</strong>: أكرر مرةً أخرى، لا تعبث بهذه الخيارات إلا إذا كنت تعلم ما الذي تفعل.
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="17922" href="https://academy.hsoub.com/uploads/monthly_2016_06/17.png.b314b49cca7aa3b097fbd26c630cc4ae.png" rel=""><img alt="17.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17922" data-unique="98wma4psy" src="https://academy.hsoub.com/uploads/monthly_2016_06/17.thumb.png.5fcceb9d9ae876a2c1a5ef8c7e61b092.png"></a>
</p>

<p style="text-align: center;">
	الشكل 17: مختلف أقسم Firefogg
</p>

<p>
	الخيارات التي سأشرحها موجودةٌ في قسم "Basic quality and resolution control". وهي تحتوي على كل الخيارات المهمة:
</p>

<ul>
<li>
		<strong>Video Quality (جودة الفيديو)</strong>: تُقاس الجودة هنا بمقياس من 0 (الجودة الأدنى) إلى 10 (أعلى جودة). كلما ازدادت جودة الفيديو كلما كبرت المساحة التخزينية للملف الناتج، لذلك عليك أن تجرب قليلًا لكي تُحدِّد ما هي نسبة المساحة التخزينية/الجودة التي تلائم احتياجاتك.
	</li>
	<li>
		<strong>Audio Quality (جودة الصوت)</strong>: تُقاس بمقياس من -1 (أقل جودة) إلى 10 (أعلى جودة). وكلما ازدادت جودة الفيديو كلما كبرت المساحة التخزينية للملف الناتج مثل خيار جودة الفيديو السابق.
	</li>
	<li>
		<strong>Video Codec (مرماز الفيديو)</strong>: يجب أن تكون قيمة هذا الخيار هي "theora" دائمًا.
	</li>
	<li>
		<strong>Audio Codec (مرماز الصوت)</strong>: يجب أن تكون قيمة هذا الخيار هي "vorbis" دائمًا.
	</li>
	<li>
		<strong>Video Width and Video Height (عرض الفيديو وارتفاعه)</strong>: تكون قيمها الافتراضية هي العرض والارتفاع الحقيقي للمقطع المصدري الذي تُرمِّزه. إذا أردت إعادة تحجيم الفيديو أثناء ترميزه، فتستطيع تعديل قيمة العرض (أو الارتفاع) في هذا الخيار؛ ثم سيُعدِّل Firefogg البُعد الآخر للحفاظ على نسبة البُعدَين الأصلية (لكي لا تتشوه صورة مقطع الفيديو).
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="17923" href="https://academy.hsoub.com/uploads/monthly_2016_06/18.png.ab7f6fb6fd544ef17e3a93255ff360c4.png" rel=""><img alt="18.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17923" data-unique="0i0vth96w" src="https://academy.hsoub.com/uploads/monthly_2016_06/18.thumb.png.8054d99b9fbeaa0500b3f283b5a641fc.png"></a>
</p>

<p style="text-align: center;">
	<strong>الشكل 18: التحكم الأساسي بالجودة والدقة</strong>
</p>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="17925" href="https://academy.hsoub.com/uploads/monthly_2016_06/19.png.1571fc77d6de7e676e77eda717079fdb.png" rel=""><img alt="19.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17925" data-unique="qe99mdc43" src="https://academy.hsoub.com/uploads/monthly_2016_06/19.thumb.png.1417a0ff2b6bd7f03399c4369a00eae8.png"></a>
</p>

<p style="text-align: center;">
	<strong>الشكل 19: تعديل عرض وارتفاع مقطع الفيديو</strong>
</p>

<p>
	بعد أن تأخذ وقتك بتعديل الخيارات السابق، فاضغط على "Save Ogg" لبدء عملية الترميز؛ وسيسألك Firefogg عن اسم الملف الناتج.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="17926" href="https://academy.hsoub.com/uploads/monthly_2016_06/20.png.c8c55288fb0ee228ced78c86d4bd0790.png" rel=""><img alt="20.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17926" data-unique="9xlqi9uwu" src="https://academy.hsoub.com/uploads/monthly_2016_06/20.thumb.png.5a09437cd873e94748361e0baab27b68.png"></a>
</p>

<p style="text-align: center;">
	<strong>الشكل 20: حفظ الفيديو الناتج</strong>
</p>

<p>
	سيُظهِر لك Firefogg شريطًا لكي تعرف مقدار تقدم عملية الترميز؛ كل ما عليك فعله هو الانتظار (ثم الانتظار، ثم الانتظار).
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="17927" href="https://academy.hsoub.com/uploads/monthly_2016_06/21.png.1ef5887c6cbb222679c94be87386cceb.png" rel=""><img alt="21.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17927" data-unique="pplalfclb" src="https://academy.hsoub.com/uploads/monthly_2016_06/21.thumb.png.9e7d9a5f842b5d2100ac2aa5aecfc8af.png"></a>
</p>

<p style="text-align: center;">
	<strong>الشكل 21: شريط يُظهِر تقدم عملية الترميز</strong>
</p>

<h2>
	ترميز عدة مقاطع إلى Ogg دفعة واحدة باستخدام ffmpeg2theora
</h2>

<p>
	<strong>ملاحظة</strong>: كما في القسم السابق، سأستخدم المصطلح "فيديو Ogg" في هذا القسم اختصارًا للعبارة "فيديو Theora مع صوت Vorbis في حاوية Ogg"، وهذه تجميعة من المرمازات + حاوية التي تعمل دون إضافات في متصفحَي Firefox و Google Chrome.
</p>

<p>
	إذا كنتَ تتطلع نحو ترميز الكثير من ملفات فيديو Ogg وتريد أتمتة العملية، فعليك حكمًا أن تلقي نظرةً إلى <a href="http://v2v.cc/~j/ffmpeg2theora/" rel="external nofollow">ffmpeg2theora</a>.
</p>

<p>
	ffmpeg2theora هو برنامج مفتوح المصدر مرخَّص برخصة GPL لترميز الفيديو بصيغة Ogg. هنالك <a href="http://v2v.cc/~j/ffmpeg2theora/download.html" rel="external nofollow">ملفات تنفيذية متوفرة لأنظمة Mac OS X وويندوز وتوزيعات لينكس الحديثة</a>؛ ويقبل ffmpeg2theora ترميز مقاطع الفيديو بأي صيغة تقريبًا، بما في ذلك فيديو DV الذي تُنتِجه كاميرات الفيديو الرقمية من فئة المستهلكين.
</p>

<p>
	عليك أن تستدعي ffmpeg2theora من سطر الأوامر لتستعمله (في نظام Mac OS X افتح "<strong>Applications &gt; Utilities &gt; Terminal</strong>"، أما في ويندوز، فافتح "<strong>Start Menu &gt; Programs &gt; Accessories &gt; Command Prompt</strong>" أو بالضغط على مفتاح ويندوز+R ثم كتابة "cmd").
</p>

<p>
	يقبل ffmpeg2theora عددًا كبيرًا من خيارات سطر الأوامر (جرب كتابة <span style="font-family:courier new,courier,monospace;">ffmpeg2theora --help</span> لتعلم المزيد عنها)، لكنني سأركِّز على ثلاثةٍ منها:
</p>

<ul>
<li>
		<span style="font-family:courier new,courier,monospace;"><strong>‎--video-quality Q</strong></span>: حيث "Q" يمثل رقم من 0 إلى10.
	</li>
	<li>
		‎<span style="font-family:courier new,courier,monospace;"><strong>--audio-quality Q</strong></span>: حيث "Q" يمثل رقم من -2 إلى 10.
	</li>
	<li>
		‎<strong><span style="font-family:courier new,courier,monospace;">--max_size=WxH</span></strong>: حيث "W" و "H" هما العرض والارتفاع الأقصى للمقطع الناتج. (الرمز "x" بينهما هو الحرف "x" العادي وليس إشارة الضرب "×").
	</li>
</ul>
<p>
	سيُعيد ffmpeg2theora تحجيم مقطع الفيديو بحيث يكون بُعداه متناسبين لكي يتسع ضمن الأبعاد المُحدَّدة، لذا قد تكون أبعاد المقطع النهائي أصغر من WxH. على سبيل المثال، ترميز فيديو بأبعاد ‎720×480 مع الخيار <span style="font-family:courier new,courier,monospace;">‎--max_size 320x240 </span>سيُنتج مقطعًا أبعاده 320‎×213.
</p>

<p>
	إذًا، هذه هي طريقة ترميز مقطع فيديو بنفس الإعدادات التي استخدمناها في القسم السابق:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8672_12">
<span class="pln">you@localhost$ ffmpeg2theora --videoquality 5
                             --audioquality 1
                             --max_size 320x240
                             pr6.dv</span></pre>

<p>
	سيُحفَظ مقطع الفيديو الناتج في نفس مجلد مقطع الفيديو الأصلي بعد إضافة اللاحقة ‎.ogv له. يمكنك اختيار مسار أو اسم ملف مختلف بتمرير الخيار ‎--output=/path/to/encoded/video إلى ffmpeg2theora.
</p>

<h2>
	ترميز فيديو H.264 باستخدام HandBrake
</h2>

<p>
	<strong>ملاحظة</strong>: سأستخدم المصطلح "فيديو H.264" في هذا القسم اختصارًا للعبارة "فيديو H.264 بنمط (profile) ‏Baseline مع صوت AAC بنمط low-complexity في حاوية MPEG-4"، وهذه تجميعة من المرمازات+حاوية التي تعمل دون إضافات في Safari، و Adobe Flash، وفي هواتف iPhone، والهواتف العاملة بنظام أندرويد.
</p>

<p>
	إذا غضضنا النظر عن المشاكل في الترخيص فإن أسهل طريقة لترميز فيديو H.264 هي استخدام <a href="http://handbrake.fr/" rel="external nofollow">HandBrake</a>. ‏HandBrake هو برمجية مفتوحة المصدر مرخصة برخصة GPL لترميز فيديو H.264 (كان تستطيع ترميز صيغ فيديو أخرى فيما سبق، لكن المطورين أسقطوا الدعم عن الصيغ الأخرى لتركيز جهودهم على صيغة H.264). تتوفر <a href="http://handbrake.fr/downloads.php" rel="external nofollow">ملفات تنفيذية لويندوز و Mac OS X وتوزيعات لينكس الحديثة</a>.
</p>

<p>
	يأتي برنامج HandBrake بنسختين: رسومية، وسطرية (أي تعمل من سطر الأوامر). سأشرح لك الواجهة الرسومية أولًا، ثم سأريك كيف يمكن تحويل الإعدادات إلى نسخة سطر الأوامر.
</p>

<p>
	أول شيءٍ ستفعله بعد أن تبدأ برنامج HandBrake هو اختيار ملف الفيديو المصدري. اضغط على زر "Source" ثم "Video File" لكي تختار ملفًا. يمكن أن يقبل HandBrake نظريًا أي صيغة من صيغ الفيديو، بما في ذلك فيديو DV الذي تُنتِجه كاميرات الفيديو الرقمية من فئة المستهلكين.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="17928" href="https://academy.hsoub.com/uploads/monthly_2016_06/22.png.aad0e547b78a26cb4a65791c12171295.png" rel=""><img alt="22.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17928" data-unique="h9givr68n" src="https://academy.hsoub.com/uploads/monthly_2016_06/22.thumb.png.3f4978f37165bfee6a4120cb0a3625a4.png"></a>
</p>

<p style="text-align: center;">
	<strong>الشكل 22: اختر ملف الفيديو الذي تريد ترميزه</strong>
</p>

<p>
	سيشتكي HandBrake من أنَّك لم تضبط مجلدًا افتراضيًا لتحفظ فيه نواتج ترميز ملف الفيديو. يمكنك أن تتجاهل ذاك التحذير، أو أن تفتح نافذة الخيارات ("options") الواقعة تحت قائمة "Tools" ثم تضبط المجلد الافتراضي.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="17929" href="https://academy.hsoub.com/uploads/monthly_2016_06/23.png.2d12f09db24c2e440e8c2890e4d94ebf.png" rel=""><img alt="23.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17929" data-unique="77l1jrgrc" src="https://academy.hsoub.com/uploads/monthly_2016_06/23.thumb.png.f18de3ac5e7940cc7636e867aaa27b7b.png"></a>
</p>

<p style="text-align: center;">
	<strong>الشكل 23: تجاهل رسالة التحذير الظاهرة</strong>
</p>

<p>
	هنالك قائمة بأنماط الضبط المسبق (presets) على الجانب الأيمن من البرنامج، اختر منها نمط "iPhone &amp; iPod Touch" الذي سيضبط أغلبية الخيارات التي ستحتاج لها.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="17930" href="https://academy.hsoub.com/uploads/monthly_2016_06/24.png.908f63709428275889255bbe8bfeda7c.png" rel=""><img alt="24.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17930" data-unique="1gorh4xg3" src="https://academy.hsoub.com/uploads/monthly_2016_06/24.thumb.png.49a4c58a826137d9c2cc1f0bf33ed6c1.png"></a>
</p>

<p style="text-align: center;">
	<strong>الشكل 24: اختر نمط iPhone</strong>
</p>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="17931" href="https://academy.hsoub.com/uploads/monthly_2016_06/25.png.e1cf14f290220e55a30cec8dac961d39.png" rel=""><img alt="25.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17931" data-unique="26kqswkr6" src="https://academy.hsoub.com/uploads/monthly_2016_06/25.thumb.png.794fbbb46a18fd00456dc89d4d789e5e.png"></a>
</p>

<p style="text-align: center;">
	<strong>الشكل 25: فعِّل الخيار "Web optimized" دومًا</strong>
</p>

<p>
	يمكنك أن تضبط العرض والارتفاع الأقصى لمقطع الفيديو المُرمَّز في لسان "Picture"؛ ويجب عليك دومًا تفعيل الخيار "Keep Aspect Ratio" (أي المحافظة على تناسب الأبعاد) لضمان أنَّ HandBrake لن يشوه مقطع الفيديو عند إعادة تحجيمه.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="17932" href="https://academy.hsoub.com/uploads/monthly_2016_06/26.png.cb0b3bef7bfee14ae069121f6c326716.png" rel=""><img alt="26.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17932" data-unique="1rxs1x7yd" src="https://academy.hsoub.com/uploads/monthly_2016_06/26.thumb.png.001547fe09226e92ace0dd1157019609.png"></a>
</p>

<p style="text-align: center;">
	<strong>الشكل 26: اضبط العرض والارتفاع</strong>
</p>

<p>
	يمكنك أن تضبط أربعة خيارات مهمة في لسان "Video":
</p>

<ul>
<li>
		<strong>Video Codec</strong>: تأكد أنَّ قيمة هذا الخيار هي (H.264 (x264.
	</li>
	<li>
		‎<strong>2-Pass Encoding</strong>: إذا فعَّلت هذا الخيار، فسيُشغِّل HandBrake مُرمِّزَ الفيديو مرتين؛ سيحلِّل الفيديو في أول مرة فقط باحثًا عن أشياء مثل تركيبات الألوان، والحركة، ومكان انتهاء المشاهد. وفي المرة الثانية سيُرمِّز الفيديو فعليًا مستخدمًا المعلومات التي جمعها في أول مرة. وكما توقعت، سيستغرق ذلك ضعف المدة الزمنية، لكنه يؤدي إلى دقة أفضل دون زيادة في مساحة الملف التخزينية. أُفعِّل هذا الخيار دومًا عند ترميز H.264. وعليك فعل ذلك ما لم تكن ترمِّز مقاطع الفيديو 24 ساعة في اليوم.
	</li>
	<li>
		<strong>Turbo First Pass</strong>: بعد أن تُفعِّل "‎2-Pass Encoding" فيمكنك توفير بعض الوقت بتفعيل الخيار "Turbo First Pass"؛ الذي يقلل حجم العمل المُنجَز في أول مرور على الفيديو (أي مرحلة تحليل المقطع)، في حين أنَّه يقلل الجودة بشكل بسيط جدًا. أُفعِّل هذا الخيار عادةً، لكن إن كانت جودة الفيديو مهمةً جدًا لك، فعليك إبقاؤه معطلًا.
	</li>
	<li>
		<strong>Quality</strong>: هنالك عدِّة طرق لتحديد "جودة" مقاطع الفيديو: يمكنك تحديد المساحة التخزينية التي تتوقعها للملف الناتج، وسيحاول HandBrake جاهدًا أن يضمن أنَّ الملف الناتج ليس أكبر من المساحة المُحدَّدة. أو يمكنك أن تُحدِّد معدل "البث" (bitrate) الوسطي، الذي هو عدد البتات اللازمة لتخزين ثانية واحدة من الفيديو (ولقد سمي معدل البث "الوسطي" لأن بعض الثواني تحتاج إلى بتات أكثر من غيرها). أو يمكنك أن تُحدِّد جودةً ثابتةً على مقياسٍ من 0 إلى 100%. كلما ازدادت النسبة ستزداد الجودة لكن الملفات ستستهلك مساحة تخزينية أكبر. لا يمكن أن أعطيك جوابًا واحدًا عن ضبط الجودة الذي عليك استخدامه.
	</li>
</ul>
<p>
	<strong>س: هل يمكنني المرور مرتين (two-pass) في فيديو Ogg أيضًا؟</strong>
</p>

<p>
	<strong>ج</strong>: نعم، لكن بسبب الاختلافات الجوهرية في طريقة عمل المُرمِّز، فمن المرجح أنَّك لن تحتاج إلى فعل ذلك. المرور مرتين عند الترميز بمرماز H.264 يضمن لك (في الغالبية العظمى من الحالات) زيادة في جودة مقطع الفيديو. أما المرور مرتين في فيديو Ogg مفيدٌ فقط إذا كنت تحاول أن يكون المقطع الناتج ذو مساحةٍ تخزينيةٍ محدَّدة (ربما سيثير هذا الأمر اهتمامك، لكن ذلك ليس غرض الأمثلة المذكورة هنا، ولا أرى أنَّ ذلك مفيدٌ جدًا لمقاطع الفيديو التي ستُنشَر على الويب). لأفضل جودة لفيديو Ogg، استخدم خيارات جودة الفيديو، ولا تعبأ بتقنية المرور مرتين.
</p>

<p>
	لقد اخترت في هذا المثال معدل بث وسطي هو 600 كيلوبت/ثانية، الذي يُعتبَر مرتفعًا بالنسبة إلى فيديو بأبعاد 320x240، واخترت أيضًا ترميز مع المرور مرتين، ويكون أول مرور "سريعًا" (turbo).
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="17933" href="https://academy.hsoub.com/uploads/monthly_2016_06/27.png.173e3c97d7cde23be4b32e2e9c3a2f36.png" rel=""><img alt="27.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17933" data-unique="klkbvdbwf" src="https://academy.hsoub.com/uploads/monthly_2016_06/27.thumb.png.066cca5e86249e429705206a4702d9fd.png"></a>
</p>

<p style="text-align: center;">
	<strong>الشكل 27: خيارات جودة الفيديو</strong>
</p>

<p>
	لا يفترض عليك تعديل أي شيء في لسان "Audio"؛ أما لو كان لمقطع الفيديو المصدري أكثر من مسار صوتي، فربما تريد اختيار أيُّ المسارات تريدها في الفيديو الناتج. إذا كان محتوى الفيديو في مجمله عن شخصٍ يتحدث (على النقيض من الموسيقى أو الأصوات العامة)، فيمكنك تخفيض معدل البث للصوت إلى 96 كيلوبت/ثانية أو ما شابهه. فيما عدا الحالتين السابقتين، تكون القيم الافتراضية المأخوذة من نمط "iPhone" جيدةً عمومًا.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="17934" href="https://academy.hsoub.com/uploads/monthly_2016_06/28.png.12257052fabf713952f0fa2ad415bb79.png" rel=""><img alt="28.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17934" data-unique="da47wb6rv" src="https://academy.hsoub.com/uploads/monthly_2016_06/28.thumb.png.f40b8439beb619746ac711e11fa041aa.png"></a>
</p>

<p style="text-align: center;">
	<strong>الشكل 28: خيارات جودة الصوت</strong>
</p>

<p>
	ثم اضغط على زر "Browse" واختر مجلدًا واسم ملف لتحفظ فيه مقطع الفيديو الناتج.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="17935" href="https://academy.hsoub.com/uploads/monthly_2016_06/29.png.a06b47a5f0038b3f19281468ab272bb3.png" rel=""><img alt="29.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17935" data-unique="c36nt2y29" src="https://academy.hsoub.com/uploads/monthly_2016_06/29.thumb.png.652066017f649eef5332acc96d1ff68c.png"></a>
</p>

<p style="text-align: center;">
	<strong>الشكل 29: اختر اسم الملف الناتج</strong>
</p>

<p>
	في النهاية اضغط على "Start" لبدء ترميز الفيديو.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="17936" href="https://academy.hsoub.com/uploads/monthly_2016_06/30.png.410e7acfde36800813ff5af50b3c6c0b.png" rel=""><img alt="30.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17936" data-unique="51yvlmlhs" src="https://academy.hsoub.com/uploads/monthly_2016_06/30.thumb.png.003116905fdb81a2ca54e6d0897e9a7d.png"></a>
</p>

<p style="text-align: center;">
	<strong>الشكل 30: بدء عملية ترميز الفيديو</strong>
</p>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="17937" href="https://academy.hsoub.com/uploads/monthly_2016_06/31.png.eaacf4e711e90d9c6294ec21333a0067.png" rel=""><img alt="31.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17937" data-unique="61yw6jgw5" src="https://academy.hsoub.com/uploads/monthly_2016_06/31.thumb.png.cd16226df852ce67770b8ba754df8183.png"></a>
</p>

<p style="text-align: center;">
	<strong>الشكل 31: "إنَّ غدًا لناظره قريب"</strong>
</p>

<h2>
	ترميز عدة مقاطع إلى H.264 دفعة واحدة باستخدام HandBrake
</h2>

<p>
	<strong>ملاحظة</strong>: كما في القسم السابق، سأستخدم المصطلح "فيديو H.264" في هذا القسم اختصارًا للعبارة "فيديو H.264 بنمط (profile) ‏Baseline مع صوت AAC بنمط low-complexity في حاوية MPEG-4"، وهذه تجميعة من المرمازات+حاوية التي تعمل دون إضافات في Safari، و Adobe Flash، وفي هواتف iPhone، والهواتف العاملة بنظام أندرويد.
</p>

<p>
	يأتي <a href="http://www.handbrake.fr/" rel="external nofollow">HandBrake</a> بنسخة سطرية (أي تعمل من سطر الأوامر) كما هو الحال في <a href="http://diveinto.html5doctor.com/video.html#ffmpeg2theora" rel="external nofollow">ffmpeg2theora</a>، نسخة سطر الأوامر من HandBrake توفر عددًا هائلًا من الخيارات (اكتب HandBrakeCLI --help لتقرأ المزيد عنها)، لكنني سأركِّز على بعضها:
</p>

<ul>
<li>
		<strong><span style="font-family:courier new,courier,monospace;">‎--preset "X"</span></strong>‎: حيث "X" هو اسم نمط (preset) من أنماط ضبط HandBrake. النمط الذي تريد استخدامه لفيديو H.264 المُخصَّص للويب هو "iPhone &amp; iPod Touch"، ومن المهم أن تضع الاسم بأكمله ضمن علامتَي اقتباس.
	</li>
	<li>
		‎<strong><span style="font-family:courier new,courier,monospace;">--width W</span></strong>: حيث "W" هو عرض الفيديو الذي تريد ترميزه، وسيُعدِّل HandBrake الارتفاع تلقائيًا ليُحافِظ على تناسب أبعاد المقطع الأصلي.
	</li>
	<li>
		‎<strong><span style="font-family:courier new,courier,monospace;">--vb Q</span></strong>: حيث "Q" هو معدَّل البث الوسطي (مُقاسًا بواحدة الكيلوبت/ثانية).
	</li>
	<li>
		‎<strong><span style="font-family:courier new,courier,monospace;">--two-pass</span></strong>: تفعيل المرور مرتين (‎2-pass) أثناء الترميز.
	</li>
	<li>
		‎<strong><span style="font-family:courier new,courier,monospace;">--turbo</span></strong>: تسريع المرور الأول عند تفعيل ميزة المرور مرتين أثناء الترميز.
	</li>
	<li>
		‎<strong><span style="font-family:courier new,courier,monospace;">--input F</span></strong>: حيث "F" هو مسار ملف الفيديو المصدري.
	</li>
	<li>
		‎<strong><span style="font-family:courier new,courier,monospace;">--output E</span></strong>: حيث "E" هو مسار ملف الفيديو الناتج.
	</li>
</ul>
<p>
	هذا مثالٌ عن كيفية استدعاء HandBrake من سطر الأوامر، مع استخدام خيارات تُطابِق الإعدادات التي اخترناها في الواجهة الرسومية سابقًا.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8672_18">
<span class="pln">you@localhost$ HandBrakeCLI --preset "iPhone &amp; iPod Touch"
                            --width 320
                            --vb 600
                            --two-pass
                            --turbo
                            --input pr6.dv
                            --output pr6.mp4</span></pre>

<p>
	شرح الأمر السابق من الأعلى إلى الأسفل: تشغيل HandBrake مع نمط "iPhone &amp; iPod Touch"، وإعادة تحجيم المقطع إلى 320x240، وضبط معدل البث الوسطي إلى 600 كيلوبت/ثانية، وتفعيل خيار المرور مرتين مع تسريع أول مرور، وقراءة الملف المصدري pr6.dv وترميزه وإخراج الملف النهائي إلى pr6.mp4.
</p>

<h2>
	ترميز فيديو WebM باستخدام FFMPEG
</h2>

<p>
	دُعِمَت صيغة WebM دعمًا كاملًا في <a href="http://www.ffmpeg.org/" rel="external nofollow">ffmpeg 6.0</a> وما بعده. نفِّذ الأمر ffmpeg في سطر الأوامر دون وسائط وتحقق أنَّه مبنيٌ مع دعم مرماز VP8:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8672_21">
<span class="pln">you@localhost$ ffmpeg
FFmpeg version SVN-r23197, Copyright (c) 2000-2010 the FFmpeg developers
  built on May 19 2010 22:32:20 with gcc 4.4.3
  configuration: --enable-gpl --enable-version3 --enable-nonfree --enable-postproc --enable-pthreads --enable-libfaac --enable-libfaad --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-libx264 --enable-libxvid --enable-x11grab --enable-libvorbis --enable-libvpx</span></pre>

<p>
	إن لم تشاهد الكلمتين السحريتين <span style="font-family:courier new,courier,monospace;">‎--enable-libvorbis </span>و<span style="font-family:courier new,courier,monospace;"> ‎--enable-libvpx</span> فلا يدعم إصدار ffmpeg المثبت لديك WebM (إذا بَنَيتَ ffmpeg من المصدر بنفسك، فتحقق إذا كانت لديك نسختين منه. لا بأس في ذلك، فلن يتعارضا مع بعضهما، لكن عليك استخدام المسار الكامل لنسخة ffmpeg التي تدعم مرماز VP8).
</p>

<p>
	سأستخدم ميزة المرور مرتين، سيمسح (scan) المرور الأول ملف الدخل (‎-i pr6.dv) وسيكتب بعض الإحصائيات إلى السجل (الذي سيُسمَّى تلقائيًا باسم <span style="font-family:courier new,courier,monospace;">pr6.dv-0.log</span>). وسأُحدِّد مرماز الفيديو باستخدام الخيار ‎-<span style="font-family:courier new,courier,monospace;">vcodec</span>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8672_23">
<span class="pln">you@localhost$ ffmpeg -pass 1 -passlogfile pr6.dv -threads 16  -keyint_min 0 -g 250 -skip_threshold 0 -qmin 1 -qmax 51 -i pr6.dv -vcodec libvpx -b 614400 -s 320x240 -aspect 4:3 -an -y NUL</span></pre>

<p>
	غالبية خيارات الأمر ffmpeg السابق ليس لها علاقة بمرماز VP8 أو صيغة WebM. تدعم مكتبة libvpx عددًا من الخيارات الخاصة بمرماز VP8 التي يمكنك تمريرها إلى ffmpeg، لكنني لم أفعل ذلك في الأمر السابق.
</p>

<p>
	وعند المرور مرةً أخرى على الملف، فسيقرأ ffmpeg الإحصائيات التي كتبها أثناء المرور الأول وسيبدأ بترميز الفيديو والصوت، ثم سيكتب ملف ‎<span style="font-family:courier new,courier,monospace;">.webm</span>.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8672_25">
<span class="pln">you@localhost$ ffmpeg -pass 2 -passlogfile pr6.dv -threads 16  -keyint_min 0 -g 250 -skip_threshold 0 -qmin 1 -qmax 51 -i pr6.dv -vcodec libvpx -b 614400 -s 320x240 -aspect 4:3 -acodec libvorbis -y pr6.webm</span></pre>

<p>
	هنالك خمسة خيارات مهمة للأمر السابق:
</p>

<ul>
<li>
		‎<strong><span style="font-family:courier new,courier,monospace;">-vcodec libvpx</span></strong>: يُحدِّد أننا نريد ترميز المقطع بمرماز VP8. تستخدم صيغة WebM مرماز VP8 للفيديو دومًا.
	</li>
	<li>
		‎<strong><span style="font-family:courier new,courier,monospace;">-b 614400</span></strong>: تحديد معدل البث (bitrate). وعلى النقيض من بقية الصيغ، تتوقع مكتبة libvpx أن يُعطى معدل البث بالبتات، وليس بالكيلوبت. فإذا أردت ترميز مقطع فيديو بمعدل بث 600 كيلوبت/ثانية، فعليك ضرب 6000 بالعدد 1024 لتحصل على 614400.
	</li>
	<li>
		<strong><span style="font-family:courier new,courier,monospace;">‎-s 320x240</span></strong>: تحديد أبعاد الفيديو الناتج، العرض ثم الارتفاع.
	</li>
	<li>
		<strong><span style="font-family:courier new,courier,monospace;">‎-aspect 4:3</span></strong>: تحديد نسبة أبعاد الفيديو. مقاطع الفيديو ذات الجودة العالية تكون نسبة أبعادها 4:3 عادةً، أما أغلبية مقاطع الفيديو عالية الجودة (HD) فتكون نسبة أبعادها 16:9 أو 16:10. أثناء تجاربي واختباراتي، وجدتُ أنَّ عليّ تحديد هذه القيمة بوضوح في سطر الأوامر، بدلًا من الاعتماد على ffmpeg لكي يكتشفها بنفسه.
	</li>
	<li>
		<strong><span style="font-family:courier new,courier,monospace;">‎-acodec libvorbis</span></strong>: تحديد أننا نريد ترميز الصوت بمرماز Vorbis. تستخدم صيغة WebM مرماز Vorbis للصوت دومًا.
	</li>
</ul>
<p>
	ترجمة -وبتصرّف- لفصل "<a href="http://diveinto.html5doctor.com/video.html" rel="external nofollow">Video</a>" من كتاب <a href="http://diveinto.html5doctor.com/index.html" rel="external nofollow">Dive Into HTML5</a> لمؤلفه Mark Pilgrim.
</p>

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

<ul>
<li>
		المقال التالي: <a href="https://academy.hsoub.com/programming/html/html5/%D8%A5%D8%B6%D8%A7%D9%81%D8%A9-%D9%85%D9%82%D8%A7%D8%B7%D8%B9-%D8%A7%D9%84%D9%81%D9%8A%D8%AF%D9%8A%D9%88-%D8%B9%D8%A8%D8%B1-%D8%A7%D9%84%D8%B9%D9%86%D8%B5%D8%B1-%D9%81%D9%8A-html5-r356/" rel="">إضافة مقاطع الفيديو عبر العنصر &lt;video&gt; في HTML5</a>
	</li>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/html/html5/%D8%B5%D9%8A%D8%BA-%D8%AA%D8%B1%D9%85%D9%8A%D8%B2-%D8%A7%D9%84%D9%81%D9%8A%D8%AF%D9%8A%D9%88-%D9%88%D8%A7%D9%84%D8%B5%D9%88%D8%AA-%D9%88%D8%AD%D8%A7%D9%88%D9%8A%D8%A7%D8%AA%D9%87%D8%A7-%D9%88%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%B9%D9%85%D9%84%D9%87%D8%A7-%D9%81%D9%8A-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r350/" rel="">صيغ ترميز الفيديو والصوت وحاوياتها وكيفية عملها في الويب</a>
	</li>
	<li>
		النسخة العربية الكاملة من كتاب <a href="https://academy.hsoub.com/files/13-%D9%86%D8%AD%D9%88-%D9%81%D9%87%D9%85-%D8%A7%D9%94%D8%B9%D9%85%D9%82-%D9%84%D8%AA%D9%82%D9%86%D9%8A%D8%A7%D8%AA-html5/" rel="">نحو فهم أعمق لتقنيات HTML5</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">355</guid><pubDate>Sun, 19 Jun 2016 18:23:00 +0000</pubDate></item><item><title>&#x635;&#x64A;&#x63A; &#x62A;&#x631;&#x645;&#x64A;&#x632; &#x627;&#x644;&#x641;&#x64A;&#x62F;&#x64A;&#x648; &#x648;&#x627;&#x644;&#x635;&#x648;&#x62A; &#x648;&#x62D;&#x627;&#x648;&#x64A;&#x627;&#x62A;&#x647;&#x627; &#x648;&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x639;&#x645;&#x644;&#x647;&#x627; &#x641;&#x64A; &#x627;&#x644;&#x648;&#x64A;&#x628;</title><link>https://academy.hsoub.com/programming/html/%D8%B5%D9%8A%D8%BA-%D8%AA%D8%B1%D9%85%D9%8A%D8%B2-%D8%A7%D9%84%D9%81%D9%8A%D8%AF%D9%8A%D9%88-%D9%88%D8%A7%D9%84%D8%B5%D9%88%D8%AA-%D9%88%D8%AD%D8%A7%D9%88%D9%8A%D8%A7%D8%AA%D9%87%D8%A7-%D9%88%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%B9%D9%85%D9%84%D9%87%D8%A7-%D9%81%D9%8A-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r350/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_06/html5-video-audio-codecs.png.d5200dd56a957233538c0442d921cde7.png" /></p>

<p>
	أي شخصٍ زار موقع YouTube في الأعوام الماضية يعلم تمام العلم أنَّ بالإمكان تضمين مقاطع الفيديو في صفحات الويب؛ لكن لم تكن هنالك طريقةٌ معياريةٌ لفعل ذلك قبل وجود HTML5. نظريًا كل مقاطع الفيديو التي سبق وأن شاهدتها على "الويب" تمَّ تشغيلها عبر إضافة خارجية (ربما QuickTime أو RealPlayer أو Flash ‏-YouTube يستخدم تقنية Flash-). تتكامل تلك الإضافات مع متصفحك بشكلٍ ممتاز إلى درجة أنَّك لن تلاحظ استخدامها إلى أن تحاول مشاهدة مقطع فيديو على منصة (أو جهاز) لا تدعم تلك الإضافة.
</p>

<p>
	تُعرِّف HTML5 طريقةً معياريةً لتضمين مقاطع الفيديو في صفحة الويب وذلك باستخدام العنصر <span style="font-family:courier new,courier,monospace;">&lt;video&gt;</span>، ما يزال دعم العنصر <span style="font-family:courier new,courier,monospace;">&lt;video&gt;</span> قيد التطوير، وهذه طريقةٌ مهذبةٌ للتصريح أنَّه لا يعمل بعد، أو على الأقل لا يعمل في كل مكان؛ لكن لا تقنط ولا تقلق، هنالك بدائل وخيارات أخرى كثيرة نستطيع اللجوء إليها.
</p>

<p style="text-align: center;">
	<img alt="html5-video-audio-codecs.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17693" data-unique="vp36niq90" src="https://academy.hsoub.com/uploads/monthly_2016_06/html5-video-audio-codecs.png.27082208b0a947e70bec7f06360dd0a6.png"></p>

<p>
	يبيّن الجدول الآتي إصدارات مختلف المتصفحات التي تدعم العنصر <span style="font-family:courier new,courier,monospace;">&lt;video&gt;</span>:
</p>

<center>
	<table border="1"><tbody>
<tr>
<td style="padding: 5px 10px; text-align: center; background-color: rgb(236, 240, 241);">
					IE
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: rgb(236, 240, 241);">
					Firefox
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: rgb(236, 240, 241);">
					Safari
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: rgb(236, 240, 241);">
					Chrome
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: rgb(236, 240, 241);">
					Opera
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: rgb(236, 240, 241);">
					iPhone
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: rgb(236, 240, 241);">
					Android
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px; text-align: center;">
					9.0+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					3.5+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					3.0+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					3.0+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					10.5+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					1.0+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					2.0+
				</td>
			</tr>
</tbody></table>
</center>

<p>
	لكن الدعم لعنصر <span style="font-family:courier new,courier,monospace;">&lt;video&gt;</span> نفسه ليس كافيًا بل هو جزءٌ صغيرٌ من الحكاية. لكن قبل أن نتحدث عن دعم الفيديو في HTML5، علينا أن نفهم بعض المعلومات حول مقاطع الفيديو نفسها (إن كنت تعرف تلك المعلومات، فيمكنك تخطي الفقرات الآتية والبدء من فقرة "ما الصيغ التي تعمل في الويب").
</p>

<h2>
	حاويات الفيديو
</h2>

<p>
	قد تتخيل ملفات الفيديو على أنها ملفات "AVI" أو "MP4". لكن "AVI" و "MP4" في الواقع ما هي إلا صيغ حاوية للفيديو. فهي تُشبِه ملفات ZIP التي يمكنها احتواء أي نوع من الملفات ضمنها، فصيغ حاويات الفيديو (video container formats) تُعرِّف طريقة تخزين الأشياء ضمنها فقط، ولا تُحدِّد ما هي أنواع البيانات المُخزَّنة (الأمر أكثر تعقيدًا من هذا، لعدم توافق جميع أنواع مسارات (أو دفق) الفيديو (video streams) مع جميع صيغ الحاويات، لكن اغضض الطرف عنها الآن).
</p>

<p>
	يحتوي ملف الفيديو عادةً على عدِّة "مسارات" (tracks)، التي هي مسار الفيديو (دون صوت) بالإضافة إلى مسار صوتي أو أكثر (دون فيديو). تكون المسارات مترابطةً عادةً، فيحتوي مسار الصوت على مؤشرات أو علامات ضمنه للمساعدة في مزامنة الصوت مع الفيديو. يمكن لكل مسار أن يملك بيانات وصفية (metadata)، مثل نسبة العرض إلى الارتفاع في مسار الفيديو، أو لغة مسار الصوت. يمكن للحاويات أيضًا امتلاك بيانات وصفية، مثل عنوان (title) الفيديو نفسه، وغلاف (cover) للفيديو، وأرقام الحلقات (للمسلسلات)، وهلمَّ جرًا.
</p>

<p>
	هنالك العديد والعديد من صيغ حاويات الفيديو، هذه أشهرها:
</p>

<ul>
<li>
		<strong>MPEG 4</strong>، التي تأتي عادةً مع اللاحقة ‎.mp4 أو ‎.m4v، حاوية MPEG 4 مبنية على حاوية QuickTime القديمة (من Apple) ‎.mov، ما تزال تستخدم "الأفلام القصيرة" في موقع Apple حاوية QuickTime القديمة، لكن الأفلام التي تأخذها من iTunes مبنية على حاوية MPEG 4.
	</li>
	<li>
		<strong>Flash Video</strong>، تأتي عادةً مع اللاحقة ‎.flv، صيغة Flash Video (بدهيًا) تُستعمَل من Adobe Flash؛ وكانت هذه هي صيغة الحاويات الوحيدة التي كان يدعمها Flash قبل الإصدار 9.0.60.184 (أي مُشغِّل Flash الإصدار 9 التحديث 3). الإصدارات الحديثة من Flash تدعم حاوية MPEG 4 أيضًا.
	</li>
	<li>
		<strong>Ogg</strong>، تأتي عادةً مع اللاحقة ‎.ogv؛ صيغة Ogg معيارها مفتوح المصدر، وغير مرتبطة بأيّة براءات اختراع. متصفحات Firefox 3.5 و Chrome 4 و Opera 10.5 تدعم -داخليًا، دون إضافات خاصة- الحاوية Ogg، ومسار فيديو Ogg (المُسمى "Theora")، ومسار صوت Ogg (المُسمى "Vorbis"). صيغة Ogg مدعومة تلقائيًا في جميع توزيعات لينُكس المشهورة، ويمكنك استخدامها على Mac وويندوز بتثبيت "QuickTime components" أو "DirectShow filters" على التوالي وبالترتيب. من الممكن أيضًا تشغيل هذه الصيغة ببرنامج VLC على جميع المنصات.
	</li>
	<li>
		<strong>WebM</strong>، هي صيغة حاويات جديدة، وهي -تقنيًا- شبيهة بصيغة أخرى تُسمى Matroska. أُعلِنَ عن WebM في أيار/مايو من عام 2010، وهي مصمَّمة لكي تُستخدم حصريًا مع مرماز الفيديو VP8 ومرماز الصوت Vorbis (سنأتي على ذكرهما بعد قليل)، وهذه الصيغة مدعومةٌ داخليًا -دون إضافات خاصة- في آخر إصدار من Chromium و Google Chrome و Mozilla Firefox و Opera، وأعلنت Adobe أنَّ Flash 10.1 سيدعم صيغة WebM.
	</li>
	<li>
		<strong>Audio Video Interleave</strong>، التي تأتي عادةً مع اللاحقة ‎.avi تم ابتكار صيغة AVI من مايكروسوفت منذ وقتٍ طويل، حين كانت إمكانية تشغيل الحواسيب لمقاطع الفيديو أمرًا عظيمًا. لا تدعم هذه الصيغة –رسميًا– ميزات صيغ الحاويات الأحدث منها مثل البيانات الوصفية المدمجة، ولا تدعم أيضًا -رسميًا- أغلبية ترميزات الفيديو والصوت المُستعمَلة حاليًا. وقد حاولت الشركات مع مرور الوقت توسعة هذه الصيغة بطرق غير متوافقة مع بعضها بعضًا لدعم بعض الميزات، ولكنها مع ذلك بقيت صيغة الحاوية الافتراضية لبعض المُرمِّزات (encoders) مثل MEncoder.
	</li>
</ul>
<h2>
	مرمزات الفيديو
</h2>

<p>
	عندما تتحدث عن "مشاهدة مقطع فيديو" فغالبًا ستقصد مشاهدة تجميعة من مسار للفيديو ومسار للصوت؛ لكن ليس عندك ملفان منفصلان، فكل ما لديك هو ملف "فيديو" واحد، وربما يكون ملف AVI أو MP4؛ تلك هي صيغ الحاويات، مثل ملف ZIP الذي يحتوي على عدِّة أنواع من الملفات داخله. تُعرِّف صيغة الحاوية آلية تخزين مسارات الفيديو والصوت في ملفٍ وحيد.
</p>

<p>
	سيقوم مُشغِّل الفيديو بثلاثة أشياء على الأقل عندما "تشاهد مقطع فيديو":
</p>

<ul>
<li>
		محاولة تفسير صيغة الحاوية لمعرفة ما هي مسارات الفيديو والصوت المتوفرة، وطريقة تخزينها ضمن الملف كي يعرف أين سيعثر على البيانات التي يجب عليه فك ترميزها لاحقًا
	</li>
	<li>
		فك ترميز مسار الفيديو وعرض سلسلة من الصور على الشاشة
	</li>
	<li>
		فك ترميز مسار الصوت وإرسال الأصوات إلى مكبرات الصوت في جهازك
	</li>
</ul>
<p>
	مرماز الفيديو (video codec) هو الخوارزمية التي يُرمَّز (encode) فيها مقطع الفيديو، أي أنَّه يُحدِّد طريقة القيام بالخطوة رقم 2 مما سبق (الكلمة "codec" آتية من دمج الكلمتين "coder" و "decoder"). يفك مُشغِّل الفيديو ترميز (decode) مسار الفيديو وفقًا لمرماز الفيديو المستخدم، ثم سيعرض سلسلة من الصور أو "الإطارات" على الشاشة، أغلبية مرمزات الفيديو الحديثة تستخدم حيلًا عديدة لتقليل حجم المعلومات اللازمة لعرض الإطار تلو الإطار. على سبيل المثال، بدلًا من تخزين كل إطار على حدة (كأنه لقطة شاشة)، فسيتم تخزين الاختلافات بين الإطارين. لا يحدث في أغلبية مقاطع الفيديو تغيرات كبيرة بين الإطارات المتتالية، مما يسمح بضغطها بدرجة أكبر، مما يؤدي إلى تقليل المساحة التخزينية للملف.
</p>

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

<p>
	هنالك الكثير من مرمازات الفيديو، لكن أهم ثلاثة منها هي H.264، و Theora، و VP8.
</p>

<h3>
	H.264
</h3>

<p>
	H.264 معروفٌ أيضًا باسم "MPEG-4 part 10" أو "MPEG-4 AVC" أو "MPEG-4 Advanced Video Coding". طوِّرَ مرماز H.264 من MPEG group وتم جعله معيارًا قياسيًا في 2003، ويهدف إلى توفير مرماز واحد للأجهزة ذات التراسل الشبكي المحدود وقدرة المعالجة المحدودة (أي الهواتف المحمولة)، وللأجهزة التي يتوفر لها تراسلٌ شبكيٌ كبير وقدرة معالجة ممتازة (مثل الحواسيب الحديثة)، وأي شيء يقع بينهما. ولكي يتم تحقيق ذلك، قُسِّم معيار H.264 إلى "أنماط" (profiles) التي يُحدِّد كلٌ منها مجموعة من الميزات الاختيارية التي توازن بين تعقيد ترميز الملف ومساحته التخزينية. الأنماط العليا (Higher profiles) تستخدم ميزات اختيارية أكثر، وتوفر جودةً أكبر بمساحة تخزينية أقل، لكنها تأخذ وقتًا أطول لتُرمَّز، وتستهلك طاقة معالجة أكبر لفك الترميز في الوقت الحقيقي.
</p>

<p>
	لإعطائك فكرةً عامةً عن تنوع الأنماط: يدعم iPhone ‏نمط "Baseline"، ويدعم AppleTV نمطي ‏"Baseline" و "Main"، بينما يدعم Adobe Flash على الحواسيب أنماط "Baseline" و "Main" و "High". ويستعمل YouTube الآن مرماز H.264 لترميز مقاطع الفيديو عالية الدقة (HD) التي يمكن تشغليها عبر Adobe Flash؛ ويدعم YouTube أيضًا إرسال مقاطع الفيديو المرمزة بمرماز H.264 إلى الهواتف المحمولة، بما في ذلك هواتف iPhone والهواتف العاملة بنظام أندرويد. إضافةً إلى ما سبق، مرماز H.264 هو المرماز الذي تستعمله مواصفة Blu-Ray، إذ تستخدم أقراص Bul-Ray ‏نمط "High" في العموم.
</p>

<p>
	أغلبية الأجهزة التي تُشغِّل فيديو H.264 عدا الحواسيب (بما في ذلك هواتف iPhone وقارئات Blu-Ray) تستعمل شريحة منفصلة لفك ترميز الفيديو، لأن معالجاتها المركزية ضعيفة نسبيًا لفك ترميز الفيديو في الوقت الحقيقة. وأصبحت في هذه الأيام بطاقات العرض الرخيصة للحواسيب المكتبية تدعم فك ترميز فيديو H.264 عتاديًّا. وهنالك أيضًا تنافس بين مرمزات H.264، بما في ذلك المكتبة مفتوحة المصدر x264. معيار H.264 محمي ببراءات اختراع؛ ويتم الترخيص عبر MPEG LA group. يمكن تضمين فيديو H.264 في أغلبية الحاويات الحديثة، بما في ذلك MP4 (تستعملها Apple بشكلٍ أساسي في متجر iTunes) و MKV (التي تُستعمَل بشكلٍ أساسي من هواة الفيديو الذين ليس لهم هدف تجاري).
</p>

<h3>
	Theora
</h3>

<p>
	تم تطوير Theora من مرماز VP3 ثم طوِّرَ من مؤسسة Xiph.org.‏ Theora مرماز مجاني الاستخدام (royalty-free) وليس محميًا بأيّة براءات اختراع عدا براءات اختراع مرماز VP3 الأصلي، الذي رُخِّص على أنَّه مجانيُ الاستخدام أيضًا. على الرغم من أنَّ المعيار قد "جُمِّدَ" (frozen) منذ عام 2004، إلا أنَّ Theora project (الذي يتضمن مكتبات ترميز وفك ترميز مفتوحة المصدر) قد أصدر النسخة 1.0 في تشرين الثاني/نوفمبر عام 2008، والإصدار 1.1 في أيلول/سبتمبر عام 2009.
</p>

<p>
	يمكن تضمين الفيديو المرمَّز بمرماز Theora في أيّة صيغة من صيغ الحاويات، لكن من الشائع أن نراه في حاوية Ogg. تدعم جميع توزيعات لينكس Theora، ويتضمن متصفح Mozilla Firefox 3.5 دعمًا داخليًا للفيديو المرمز بمرماز Theora؛ وأقصد بكلمة "داخليًا" أنَّه متوفرٌ على جميع الأنظمة دون إضافات خاصة. يمكنك أيضًا تشغيل الفيديو المرمز بمرماز Theora على ويندوز أو على Mac OS X بعد تثبيت برمجية فك الترميز المفتوحة المصدر من Xiph.org.
</p>

<h3>
	VP8
</h3>

<p>
	VP8 هو مرماز فيديو آخر من On2، نفس الشركة التي طوَّرت VP3 (الذي أصبح لاحقًا Theora). بكلامٍ تقني، يُنتِج هذا المرماز فيديو بنفس جودة النمط "High" في H.264، في حين يحاول تقليل تعقيد عملية فك الترميز كما في نمط "Baseline" في H.264.
</p>

<p>
	في عام 2010، اشترت Google شركة On2 ونشرت مواصفات مرماز الفيديو وأصدرت برمجية ترميز وفك ترميز مفتوحة المصدر. وكان جزءًا من هذه العملية هو "فتح" Google لجميع براءات الاختراع التي سجلتها شركة On2 لمرماز VP8، وذلك بجعلها مجانية الاستخدام أي royalty-free (وهذا أفضل ما يمكن فعله مع براءات الاختراع، فلا يمكنك حقًا "التخلي" عنها أو حذفها بعد تسجيلها. لكن لجعلها متوافقة مع البرمجيات مفتوحة المصدر فيمكن ترخيص للاستخدام مجانًا، وبهذا يستطيع أي شخصٍ استخدام التقنيات المُغطاة من براءة الاختراع دون دفع أي شيء أو دون محاولة الحصول على ترخيص خاص). وبهذا أصبح VP8 مرماز عصري مجاني الاستخدام ليس محميًا بأيّة براءات اختراع عدا تلك التي سجلتها شركة On2 (وتملكها Google حاليًا) والتي يمكن استعمالها مجانًا.
</p>

<h2>
	مرمزات الصوت
</h2>

<p>
	ستحتاج إلى تضمين مسار صوتي في مقاطع الفيديو إلا إذا كنتَ ستنشر الأفلام قبل عام 1927 فقط. ومثل مرمزات الفيديو، مرمازات الصوت هي خوارزميات التي يُرمَّز (encode) بها مسار الصوت. وأيضًا مثل مرمازات الفيديو، هنالك مرمازات صوت ليس فيها ضياعٌ في البيانات (lossless) وأخرى تضيع فيها بعض البيانات (lossy). وكما هو حال الفيديو الذي لا يوجد فيه ضياعٌ في البيانات، ستكون المساحة التخزينية لمسارات الصوت التي ليس فيها ضياعٌ في البيانات كبيرةً جدًا لكي نستفيد منها على الويب؛ لذلك سنركِّز على مرمازات الصوت التي تسبب فقدانًا لبعض البيانات.
</p>

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

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

<ul>
<li>
		محاولة تفسير صيغة الحاوية
	</li>
	<li>
		فك ترميز مسار الفيديو
	</li>
	<li>
		فك ترميز مسار الصوت وإرسال الأصوات إلى مكبرات الصوت في جهازك
	</li>
</ul>
<p>
	يُحدِّد مرماز الصوت طريقة القيام بالخطوة رقم 3 مما سبق: فك ترميز مسار الصوت وتحويله إلى موجات رقمية يمكن لمكبرات الصوت عندك تحويلها إلى صوت. وكما في مرمازات الفيديو، هنالك حيلٌ عدِّة تُستعمَل لتقليل حجم البيانات المُخزَّنة في مسار الصوت. ولمّا كنّا نتحدث عن مرمازات الصوت التي تُسبِّب ضياعًا في بعض البيانات، فسنفقد بعض المعلومات أثناء عملية "التسجيل ← الترميز ← فك الترميز ← الاستماع". تحذف مختلف مرمزات الصوت أشياءً مختلفة، لكنها كلها تخدم نفس الغرض: ألّا تشعر بضياعِ أيِّ شيءٍ عندما تستمع إلى المسار.
</p>

<p>
	هنالك مفهومٌ في مسارات الصوت ليس موجودًا في مسارات الفيديو ألا وهو "القنوات" (channels). نحن نرسل الصوت إلى مكبرات الصوت، صحيح؟ حسنًا، ما عدد مكبرات الصوت عندك؟ إذا كنت تجلس أمام حاسوبٍ محمول فربما يكون عندك مكبران: أحدهما على اليمين والآخر على اليسار. لكن حاسوبي المكتبي يملك ثلاثة مكبرات: واحد على اليمين وآخر على اليسار وثالث على الأرض. أنظمة "الصوت المحيطي" (surround sound) السمعية تملك ستة مكبرات أو أكثر متوزعة توزيعًا مدروسًا في أنحاء الغرفة. مهمة كل مكبر أن يُخرِج قناة (channel) معيّنة من التسجيل الأصلي. الفكرة النظرية وراء ذاك النظام هي أنَّك ستجلس في منتصف المسافة الفاصلة بين تلك المكبرات محاطًا بست قنوات منفصلة من الصوت، وسيدرك مخك الصوت وستشعر كما لو أنك في منتصف الأحداث التي تسمع صوتها. لكن هل تعمل فعلًا كما شرحنا أعلاه؟ تقول الشركات ذوات رؤوس الأموال الكبيرة أنها تعمل.
</p>

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

<p>
	هنالك الكثير من مرمازات الصوت، هل ذكرتُ لك سابقًا أنَّ هنالك الكثير من مرمازات الفيديو؟ انسَ ذلك! هنالك الكثير والكثير من مرمازات الصوت، لكن يهمنا في الويب ثلاثةٌ منها: MP3 و ACC و Vorbis.
</p>

<h3>
	MPEG-1 Audio Layer 3
</h3>

<p>
	MPEG-1 Audio Layer 3 معروفة بالعامية على أنها "MP3"؛ لا أعرف من أي كوكبٍ أتيت إن لم تسمع من قبل عن MP3. تبيع شركة Walmart مشغِّلات موسيقى محمولة وتسميها "MP3 players". وهي منتشرة انتشارًا كبيرًا.
</p>

<p>
	يمكن أن تحتوي ملفات MP3 على قناتين صوتيتين على الأكثر، ويمكن ترميزها بمختلف معدلات البث (أي bitrates): 64 كيلوبت/ثانية، أو 128 كيلوبت/ثانية، أو192 كيلوبت/ثانية، أو غيرها التي تتراوح قيمها من 32 إلى 320. قيم معدلات البث (bitrates) الأعلى تعني أنَّ مساحة الملفات أكبر وجودة الصوت أدق، لكن العلاقة بين جودة الصوت ومعدل البث ليست خطيّة (linear، أي أنَّ جودة الأصوات المرمزة بمعدل بث 64 كيلوبت/ثانية أفضل بالضعفين من 64 كيلوبت/ثانية، لكن 256 كيلوبت/ثانية ليس أكثر جودة بمقدار الضعفين من 128 كيلوبت/ثانية). تسمح صيغة MP3 بالترميز ذي معدل البث المتغير (variable bitrate encoding، الذي يعني أنَّ أجزاءً من المسار مضغوطةٌ أكثر من غيرها). على سبيل المثال، يمكن ترميز السكت بين النوتات الموسيقية بمعدل بث منخفض، ثم سيرتفع معدل البث عندما يُعزَف لحنٌ معقَّدٌ على عدِّة آلات موسيقية. يمكن أيضًا ترميز MP3 بمعدل بث ثابت، ولا غرابة أن يُسمى ذلك بالترميز ذي معدل البث الثابت (constant bitrate encoding).
</p>

<p>
	لا يُعرِّف معيار MP3 كيفية الترميز باستخدام MP3 تمامًا (على الرغم من أنَّه يُعرِّف تمامًا كيفية فك الترميز)؛ تستخدم مختلف المُرمِّزات آلياتٍ مختلفة تُنتِج نتائج متنوعة كثيرًا، لكن يمكن قراءتها جميعًا من نفس المشغِّلات. مشروع LAME المفتوح المصدر هو أفضل مرمِّز حر، ويمكن القول أنَّه أفضل المرمِّزات لجميع معدلات البث إلا المنخفضة منها.
</p>

<p>
	صيغة MP3 (التي وُضِعَ معيارها عام 1991) هي صيغة محمية ببراءة اختراع، وهذا هو السبب وراء عدم إمكانية تشغيل نظام لينكس لملفات MP3 مباشرةً. وبشكل عام، تدعم جميع مشغلات الموسيقى المحمولة ملفات MP3، ويمكن تضمين مسارات MP3 ضمن أيّ حاوية فيديو. ويمكن أن يُشغِّل Adobe Flash ملفات MP3 لوحدها أو مسارات MP3 الموجودة ضمن حاوية MP4.
</p>

<h3>
	Advanced Audio Coding
</h3>

<p>
	Advanced Audio Coding المعروفة أيضًا باسم "AAC" التي وضِعَ معيارها عام 1997، والتي أنتشر صيتها عندما اختارتها Apple صيغةً افتراضيةً لمتجر iTunes. كانت جميع ملفات AAC التي تم "شراؤها" من متجر iTunes مشفرةً بحقوق رقمية مملوكة لشركة Apple ‏(أي DRM) التي كانت تدعى FairPlay؛ أصبحت بعض الأغنيات متاحةً في متجر iTunes كملفات AAC غير محمية، التي تدعوها Apple ‏"iTunes Plus" لأن ذلك أفضل من تسمية جميع الأشياء الأخرى باسم "iTunes Minus". صيغة AAC محمية ببراءات اختراع؛ وأسعار الترخيص متوفرة على الإنترنت.
</p>

<p>
	صُمِّمَت AAC لتوفير صوت بجودة أعلى من MP3 بنفس معدل البث (bitrate)، ويمكن ترميز الصوت بأي معدل بث (صيغة MP3 محدودة بعدد ثابت من معدلات البث، حدّها الأقصى هو 320 كيلوبت/ثانية). يمكن لصيغة AAC ترميز 48 قناة صوتية كحد أقصى، على الرغم من عدم وجود حالة لتطبيق ذلك عمليًا. تختلف صيغة AAC عن MP3 في أنها تُعرِّف أنماطًا (profiles) بطريقة مشابهة لمرمز H.264 ولنفس الأسباب. فهنالك "نمط" بسيط مُصمَّم لكي يُشغَّل في الوقت الحقيقي على الأجهزة ذات قدرة المعالجة المحدودة، بينما توجد "أنماط" توفر صوتًا أكثر جودةً بنفس معدل البث لكن ذلك على حساب البطء في الترميز وفك الترميز.
</p>

<p>
	جميع منتجات Apple الحالية بما فيها iPod و AppleTV و QuickTime تدعم بعض "profiles" صيغة AAC في ملفات الصوت المنفصلة وفي مسارات الصوت المدمجة في حاوية MP4. يدعم Adobe Flash جميع "أنماط" صيغة AAC في MP4، وكذلك المشغلات الحرة مثل MPlayer و VLC. أما للترميز، فمكتبة FAAC هي مكتبةٌ مفتوحة المصدر؛ وهنالك خيارٌ في وقت البناء (compile-time) في برمجية mencoder و ffmpeg لدعم ترميز AAC.
</p>

<h3>
	Vorbis
</h3>

<p>
	Vorbis تُسمى عادةً "Ogg Vorbis" (على الرغم من أنَّ هذا خاطئ تقنيًا، لأن "Ogg" هي صيغة حاويات ويمكن لمسارات صوت Vorbis أن تُضمَّن في حاويات أخرى). صيغة Vorbis ليست محمية بأيّة براءات اخترع ولهذا ستجدها مدعومةً في توزيعات لينكس مباشرةً وفي جميع الأجهزة المحمولة التي تُشغِّل نظام Rockbox. يدعم Mozilla Firefox 3.5 مسارات صوت Vorbis في حاوية Ogg، أو فيديو Ogg مع مسار صوتي بصيغة Vorbis، ويمكن أيضًا للهواتف العاملة بنظام أندرويد أن تُشغِّل ملفات Vorbis الصوتية المستقلة. عادة ما تُضمَّن مسارات Vorbis الصوتية في حاوية Ogg أو WebM، لكن يمكن أيضًا تضمينها في حاوية MP4 أو MKV (أو بعد تطبيق بعض الحيل: في حاوية AVI). تدعم صيغة Vorbis الصوتية أي عدد من القنوات الصوتية.
</p>

<p>
	هنالك عددٌ من برمجيات ترميز وفك ترميز صوت Vorbis المفتوحة المصدر، بما في ذلك OggConvert (للترميز)، و ffmpeg (فك ترميز)، و aoTuV (للترميز)، و libvorbis (لفك الترميز). وهنالك إضافات لبرمجية QuickTime لنظام Mac OS X و DirectShow لنظام ويندوز.
</p>

<h2>
	ما الصيغ التي تعمل في الويب
</h2>

<p>
	إن لم يؤلمك رأسك إلى الآن فأنت تبلي بلاءً حسنًا. يمكنك أن تستنتج بسهولة أنَّ الفيديو (والصوت) هو موضوعٌ معقدٌ، وما أوردناه سابقًا هو النسخة المختصرة من القصة! أنا متأكد أنك تتساءل عن ارتباط HTML5 بما سبق. حسنًا، يوجد في HTML5 عنصرٌ اسمه &lt;video&gt; لتضمين مقاطع الفيديو في صفحة ويب، ولا توجد هنالك أيّة قيود على المرماز المستخدم لترميز الفيديو أو الصوت أو حتى صيغة الحاوية التي يمكنك استخدامها لمقاطع الفيديو. يمكن لعنصر &lt;video&gt; وحيد أن يُشير إلى عدِّة ملفات فيديو، وسيختار المتصفح أول ملف فيديو يستطيع تشغيله. كل ما عليك فعله هو معرفة ما هي الحاويات والمرمازات التي تدعمها المتصفحات.
</p>

<p>
	هذا هو حال دعم صيغ الفيديو في HTML5 في الوقت الراهن:
</p>

<ul>
<li>
		متصفح Mozilla Firefox ‏(3.5 أو ما بعده) يدعم فيديو Theora وصوت Vorbis في حاوية Ogg. ويدعم Firefox 4 صيغة WebM.
	</li>
	<li>
		متصفح Opera ‏(10.5 وما بعده) يدعم فيديو Theora وصوت Vorbis في حاوية Ogg. يدعم Opera 10.60 صيغة WebM.
	</li>
	<li>
		متصفح Google Chrome ‏(3.0 وما بعده) يدعم فيديو Theora وصوت Vorbis في حاوية Ogg. يدعم Google Chrome 6.0 صيغة WebM.
	</li>
	<li>
		متصفح Safari على نظامي Mac وويندوز (3.0 وما بعده) سيدعم أي شيء يدعمه QuickTime. نظريًا، هذا يعني أنَّك قد تطلب من مستخدميك تثبيت إضافات خارجية إلى مُشغِّل QuickTime؛ لكن عمليًا لن يفعل ذلك إلا القليل. لذلك عليك أن تستعمل الصيغ التي يدعمها QuickTime مباشرةً. وهذه قائمة طويلة إلا أنها لا تحتوي WebM، أو Theora، أو Vorbis، أو حاوية Ogg. لكن QuickTime فيه دعمٌ مدمج لفيديو H.264‏ (نمط main) وصوت AAC في حاوية MP4.
	</li>
	<li>
		الهواتف المحمولة متل iPhone والهواتف التي تعمل بنظام أندرويد تدعم فيديو H.264 ‏(نمط baseline) وصوت AAC ‏(‎نمط ‎"low complexity"‎) في حاوية MP4.
	</li>
	<li>
		يدعم Adobe Flash (الإصدار 9.0.60.184 وما بعده) فيديو H.264 وصوت AAC في حاوية MP4.
	</li>
	<li>
		يدعم Internet Explorer جميع "أنماط" فيديو H.264 وصوت AAC أو MP3 في حاوية MP4. ويمكنه أيضًا تشغيل فيديو WebM إن ثبتتَ مرمازًا خارجي، الذي لا يكون مثبتًا افتراضيًا في أي إصدار من ويندوز. لا يدعم IE9 المرمازات الخارجية الأخرى (على عكس Safari، الذي سيُشغِّل ما يستطيع QuickTime تشغيله).
	</li>
	<li>
		لا يدعم متصفح Internet Explorer 8 عنصر video في HTML5 إطلاقًا، لكن تقريبًا جميع مستخدمي Internet Explorer يملكون إضافة Adobe Flash. وسأريك لاحقًا في هذا الفصل كيف يمكنك استخدام عنصر video في HTML5 لكن مع خيارٍ احتياطي هو استخدام Flash.
	</li>
</ul>
<p>
	ربما من الأسهل تلخيص ما سبق في جدول.
</p>

<center>
	<table border="1"><tbody>
<tr>
<td style="padding: 5px 10px; text-align: center; background-color: rgb(236, 240, 241);">
					الترميز/الحاوية
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: rgb(236, 240, 241);">
					IE
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: rgb(236, 240, 241);">
					Firefox
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: rgb(236, 240, 241);">
					Safari
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: rgb(236, 240, 241);">
					Chrome
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: rgb(236, 240, 241);">
					Opera
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: rgb(236, 240, 241);">
					iPhone
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: rgb(236, 240, 241);">
					Android
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px; text-align: center; background-color: rgb(236, 240, 241);">
					Theora+Vorbis+Ogg
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					.
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					3.5+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					*
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					3.0+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					10.5+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					.
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					2.3+
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px; text-align: center; background-color: rgb(236, 240, 241);">
					H.264+AAC+MP4
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					9.0+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					21+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					3.2+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					3.0+****
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					25+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					3.2+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					2.0+
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px; text-align: center; background-color: rgb(236, 240, 241);">
					WebM
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					9.0+**
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					4.0+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					*
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					6.0+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					10.6+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					.
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					2.3***
				</td>
			</tr>
</tbody></table>
</center>

<p>
	 
</p>

<ul>
<li>
		* متصفح Safari سيُشغِّل أي شيء يستطيع QuickTime تشغيله، لكن QuickTime لا يأتي مع دعمٍ مسبق إلا لصيغ H.264/AAC/MP4.
	</li>
	<li>
		** متصفح Internet Explorer 9 سيدعم WebM "فقط إذا ثبَّت المستخدم مرماز VP8"، الذي يعني ضمنيًا أنَّ مايكروسوفت لن تضيف المرماز بنفسها.
	</li>
	<li>
		*** على الرغم من أنَّ متصفح أندرويد 2.3 يدعم WebM، لكن لا توجد إمكانية لفك الترميز عتاديًا، وهذا يقلل من عمر البطارية.
	</li>
	<li>
		**** قد أعلِنَ أنَّ Google Chrome سيسقط الدعم عن H.264 قريبًا، وقد تم تبرير ذاك القرار؛ لكنه لم يُطبَّق إلى الآن.
	</li>
</ul>
<p>
	ولكن هذه هي الطامة الكبرى: لا توجد تجميعة واحدة من الحاويات والمرمازات التي تعمل في جميع متصفحات HTML5، ومن غير المحتمل أن يتغير هذا في المستقبل القريب.
</p>

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

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

<ol>
<li>
		أنشِئ نسخةً تستعمل WebM ‏(VP8 + Vorbis).
	</li>
	<li>
		أنشِئ نسخةً أخرى تستعمل فيديو H.264 بنمط baseline مع صوت AAC‏ بنمط low complexity‎ في حاوية MP4.
	</li>
	<li>
		أنشِئ نسخةً أخرى تستعمل فيديو Theora وصوت Vorbis في حاوية Ogg.
	</li>
	<li>
		اربط ملفات الفيديو الثلاثة السابقة إلى عنصر <span style="font-family:courier new,courier,monospace;">&lt;video&gt;</span> وحيد، واترك مجالًا لاستعمال مشغِّل يعتمد على تقنية Flash إن لم يدعم المتصفح العنصر <span style="font-family:courier new,courier,monospace;">video</span>.
	</li>
</ol>
<h2>
	مشاكل الترخيص مع فيديو H.264
</h2>

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

<p>
	هل تتذكر عندما شرحتُ H.264 أول مرة، وذكرت بسرعة أنَّ ذاك الترميز خاضع لبراءات اختراع ويمكن أخذ ترخيص بالاستخدام من MPEG LA؟ قد تبيّن أنَّ ما سبق مهم، ولكن لتفهم لماذا، سأحيلك إلى مقتطف من مقالة "The H.264 Licensing Labyrinth":
</p>

<p>
	تُقسِّم MPEG LA رخصة H.264 إلى رخصتين فرعيتين: واحدة لمصنعي برمجيات الترميز وفك الترميز، وأخرى لموزعي المحتوى.
</p>

<p>
	الرخصة الفرعية المتعلقة بتوزيع المحتوى تُقسَّم بدورها إلى أربعة تصنيفات أساسية، اثنان منها (الاشتراك subscription و "title-by-title" أي لكل مقطع على حدة) مرتبطان فيما إذا كان المستخدم النهائي سيدفع مباشرةً لقاء خدمة بث الفيديو، واثنان منها (البث "المجاني" للتلفاز وللإنترنت) مرتبطان بالربح القادم من مصادر أخرى بخلاف المشاهد.
</p>

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

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

<ul>
<li>
		‎2500‏‎$‎ في كل سنة لكل سوق من أسواق البث (broadcast markets) لعدد الأسر التي تشاهد البث بين 100,000–499,999
	</li>
	<li>
		5000‏$‏ في كل سنة لكل سوق من أسواق البث (broadcast markets) لعدد الأسر التي تشاهد البث بين 500,000–999,999
	</li>
	<li>
		10,000‏$‏ في كل سنة لكل سوق من أسواق البث (broadcast markets) لعدد الأسر التي تشاهد البث الأكبر من 1,000,000
	</li>
</ul>
<p>
	بعد استعراض جميع المشاكل التي تحف البث "المجاني" للتلفاز، لماذا يجب أن يهتم بها شخصٌ لا يبث الفيديو؟ كما ذكرتُ سابقًا، تكلفة الاشتراك تنطبق على أيّ عملية توصيل للمحتوى، لكن تعريف البث "المجاني" للتلفاز يعني أكثر من البث عبر الهوائيات (over-the-air). أضافت MPEG LA أجور اشتراك لبث الفيديو عبر الإنترنت التي لن يدفع المستخدم النهائي أيّة تكاليف لمشاهدة المقطع، أي بكلامٍ آخر: أي بث عام لفيديو سواءً كان عبر الهوائيات أو خدمة "الكيبل" أو الأقمار الاصطناعية أو عبر الإنترنت… سيخضع إلى أجور الاشتراك.
</p>

<p>
	لكن MPEG-LA أعلنوا أنَّهم لن يأخذوا أجورًا على البث عبر الإنترنت، لكن هذا لا يعني أنَّ مرماز H.264 مجاني الاستخدام لجميع المستخدمين؛ وبشكل خاص برمجيات الترميز (كالتي تُعالِج الفيديو المرفوع على موقع YouTube) وبرمجيات فك الترميز (مثل البرمجية الموجودة في متصفح Microsoft Internet Explorer 9) التي ما زالت تخضع لأجور الترخيص.
</p>

<p>
	ترجمة -وبتصرّف- لفصل "<a href="http://diveinto.html5doctor.com/video.html" rel="external nofollow">Video</a>" من كتاب <a href="http://diveinto.html5doctor.com/index.html" rel="external nofollow">Dive Into HTML5</a> لمؤلفه Mark Pilgrim.
</p>

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

<ul>
<li>
		المقال التالي: <a href="https://academy.hsoub.com/programming/html/html5/%D8%AA%D8%B1%D9%85%D9%8A%D8%B2-%D9%85%D9%82%D8%A7%D8%B7%D8%B9-%D8%A7%D9%84%D9%81%D9%8A%D8%AF%D9%8A%D9%88-%D8%A8%D8%B9%D8%AF%D8%A9-%D8%B5%D9%8A%D8%BA-r355/" rel="">ترميز مقاطع الفيديو بعدة صيغ</a>
	</li>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/html/html5/%D8%A7%D9%84%D8%B1%D8%B3%D9%85-%D8%B9%D8%A8%D8%B1-%D8%B9%D9%86%D8%B5%D8%B1-canvas-%D9%81%D9%8A-html5-r345/" rel="">الرسم عبر عنصر canvas في HTML5</a>
	</li>
	<li>
		النسخة العربية الكاملة من كتاب <a href="https://academy.hsoub.com/files/13-%D9%86%D8%AD%D9%88-%D9%81%D9%87%D9%85-%D8%A7%D9%94%D8%B9%D9%85%D9%82-%D9%84%D8%AA%D9%82%D9%86%D9%8A%D8%A7%D8%AA-html5/" rel="">نحو فهم أعمق لتقنيات HTML5 </a><span style="display: none;"> </span>
	</li>
</ul>
]]></description><guid isPermaLink="false">350</guid><pubDate>Sun, 12 Jun 2016 07:22:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x631;&#x633;&#x645; &#x639;&#x628;&#x631; &#x639;&#x646;&#x635;&#x631; canvas &#x641;&#x64A; HTML5</title><link>https://academy.hsoub.com/programming/html/%D8%A7%D9%84%D8%B1%D8%B3%D9%85-%D8%B9%D8%A8%D8%B1-%D8%B9%D9%86%D8%B5%D8%B1-canvas-%D9%81%D9%8A-html5-r345/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_06/html5-canvas.png.1243b85a7e2e231359592d4982248868.png" /></p>

<p>
	تُعرِّف HTML العنصر<span style="font-family:courier new,courier,monospace;"> &lt;canvas&gt;</span> على أنه "لوحة نقطية ذات أبعاد معينة يمكن استخدامها لعرض المخططات ورسومات الألعاب وغيرها من الصور المرئية برمجيًا". ويُمثِّل مستطيلًا في صفحتك حيث تستخدم JavaScript لرسم أي شيء تريده فيه.
</p>

<p style="text-align: center;">
	<img alt="html5-canvas.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17629" data-unique="75fgy2bpu" src="https://academy.hsoub.com/uploads/monthly_2016_06/html5-canvas.png.70fbc6ac2938d7b597887c230bdff27e.png"></p>

<h2>
	الدعم الأساسي للعنصر canvas
</h2>

<center>
	<table border="1"><tbody>
<tr>
<td style="padding: 5px 10px; text-align: center; background-color: #ecf0f1;">
					IE
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: #ecf0f1;">
					Firefox
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: #ecf0f1;">
					Safari
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: #ecf0f1;">
					Chrome
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: #ecf0f1;">
					Opera
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: #ecf0f1;">
					iPhone
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: #ecf0f1;">
					Android
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px; text-align: center;">
					7.0+*
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					3.0+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					3.0+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					3.0+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					10.0+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					1.0+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					1.0+
				</td>
			</tr>
</tbody></table>
</center>

<p>
	* يتطلب IE ‏7 و 8 مكتبة خارجية هي <span style="font-family:courier new,courier,monospace;">explorercanvas</span>، أما IE 9 فهو يدعم العنصر <span style="font-family:courier new,courier,monospace;">&lt;canvas&gt; </span>داخليًا.
</p>

<p>
	كيف يبدو عنصر <span style="font-family:courier new,courier,monospace;">canvas</span>؟ ليس له شكل، حقًا! ليس في عنصر <span style="font-family:courier new,courier,monospace;">&lt;canvas&gt;</span> أي محتوى وليس له إطارٌ حتى. يُضاف عنصر <span style="font-family:courier new,courier,monospace;">canvas</span> كالآتي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2004_9">
<span class="tag">&lt;canvas</span><span class="pln"> </span><span class="atn">width</span><span class="pun">=</span><span class="atv">"300"</span><span class="pln"> </span><span class="atn">height</span><span class="pun">=</span><span class="atv">"225"</span><span class="tag">&gt;&lt;/canvas&gt;</span></pre>

<p>
	لنضف إطارًا منقطًا لكي نستطيع أن نرى ما الذي نتعامل معه:
</p>

<p style="text-align: center;">
	<img alt="001.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17396" data-unique="x0kqovobl" src="https://academy.hsoub.com/uploads/monthly_2016_06/001.png.057001bed80eaae63fd9eeae4de570e8.png"></p>

<p style="text-align: center;">
	<strong>الشكل 1: عنصر canvas مع إطار</strong>
</p>

<p>
	يمكن أن يكون لديك أكثر من عنصر <span style="font-family:courier new,courier,monospace;">&lt;canvas&gt;</span> في نفس الصفحة، وسيظهر كل عنصر على حدة في شجرة DOM، ويحافظ كل عنصر <span style="font-family:courier new,courier,monospace;">canvas</span> على خاصياته؛ فإن أعطيت كل عنصر <span style="font-family:courier new,courier,monospace;">canvas</span> خاصية <span style="font-family:courier new,courier,monospace;">id</span>، فيمكنك الوصول إليه كما تفعل مع أي عنصر آخر.
</p>

<p>
	لنوسِّع الشيفرة السابقة لكي تتضمن خاصية <span style="font-family:courier new,courier,monospace;">id</span>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2004_11">
<span class="tag">&lt;canvas</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"a"</span><span class="pln"> </span><span class="atn">width</span><span class="pun">=</span><span class="atv">"300"</span><span class="pln"> </span><span class="atn">height</span><span class="pun">=</span><span class="atv">"225"</span><span class="tag">&gt;&lt;/canvas&gt;</span></pre>

<p>
	أصبح بإمكاننا بسهولة العثور على عنصر <span style="font-family:courier new,courier,monospace;">&lt;canvas&gt;</span> السابق في شجرة DOM.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2004_13">
<span class="kwd">var</span><span class="pln"> a_canvas </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">getElementById</span><span class="pun">(</span><span class="str">"a"</span><span class="pun">);</span></pre>

<h2>
	الأشكال البسيطة
</h2>

<center>
	<table border="1"><tbody>
<tr>
<td style="padding: 5px 10px; text-align: center; background-color: #ecf0f1;">
					IE
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: #ecf0f1;">
					Firefox
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: #ecf0f1;">
					Safari
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: #ecf0f1;">
					Chrome
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: #ecf0f1;">
					Opera
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: #ecf0f1;">
					iPhone
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: #ecf0f1;">
					Android
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px; text-align: center;">
					7.0+*
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					3.0+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					3.0+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					3.0+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					10.0+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					1.0+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					1.0+
				</td>
			</tr>
</tbody></table>
</center>

<p>
	* يتطلب IE ‏7 و 8 مكتبة خارجية هي explorercanvas، أما IE 9 فهو يدعم رسم الأشكال البسيطة في العنصر &lt;canvas&gt; داخليًا.
</p>

<p>
	يبدأ كل عنصر <span style="font-family:courier new,courier,monospace;">canvas</span> فارغًاـ ثم علينا الرسم فيه. لنبدأ ببعض الأشكال.
</p>

<p>
	يمكن استخدام الحدث (action)<span style="font-family:courier new,courier,monospace;"> ‏onclick</span> لاستدعاء الدالة الآتية عندما يضغط المستخدم على زرٍ ما:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9725_7">
<span class="kwd">function</span><span class="pln"> draw_b</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">var</span><span class="pln"> b_canvas </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">getElementById</span><span class="pun">(</span><span class="str">"b"</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">var</span><span class="pln"> b_context </span><span class="pun">=</span><span class="pln"> b_canvas</span><span class="pun">.</span><span class="pln">getContext</span><span class="pun">(</span><span class="str">"2d"</span><span class="pun">);</span><span class="pln">
  
  b_context</span><span class="pun">.</span><span class="pln">fillRect</span><span class="pun">(</span><span class="lit">50</span><span class="pun">,</span><span class="pln"> </span><span class="lit">25</span><span class="pun">,</span><span class="pln"> </span><span class="lit">150</span><span class="pun">,</span><span class="pln"> </span><span class="lit">100</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	لا يوجد شيءٌ مميزٌ في أول سطر من الدالة، إذ أنَّ مهمته هي العثور على عنصر <span style="font-family:courier new,courier,monospace;">&lt;canvas&gt;</span> الموجود في شجرة DOM.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9725_9">
<span class="kwd">function</span><span class="pln"> draw_b</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">var</span><span class="pln"> b_canvas </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">getElementById</span><span class="pun">(</span><span class="str">"b"</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">var</span><span class="pln"> b_context </span><span class="pun">=</span><span class="pln"> b_canvas</span><span class="pun">.</span><span class="pln">getContext</span><span class="pun">(</span><span class="str">"2d"</span><span class="pun">);</span><span class="pln">

  b_context</span><span class="pun">.</span><span class="pln">fillRect</span><span class="pun">(</span><span class="lit">50</span><span class="pun">,</span><span class="pln"> </span><span class="lit">25</span><span class="pun">,</span><span class="pln"> </span><span class="lit">150</span><span class="pun">,</span><span class="pln"> </span><span class="lit">100</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	لدى كل عنصر <span style="font-family:courier new,courier,monospace;">canvas</span> ما نسميه "إطار الرسم" (drawing context)، الذي يحدث فيه كل الأمور المسلية. فبعد أن تعثر على عنصر <span style="font-family:courier new,courier,monospace;">&lt;canvas&gt;</span> في شجرة DOM (باستخدام<span style="font-family:courier new,courier,monospace;"> document.getElementById()‎</span> أو أيّة طريقة أخرى) ستستطيع أن تستدعي الدالة <span style="font-family:courier new,courier,monospace;">getContext()‎</span>، يجب عليك تمرير السلسلة النصية "2d" دومًا إلى الدالة <span style="font-family:courier new,courier,monospace;">getContext()‎</span>.
</p>

<ul>
<li>
		<strong>س</strong>: هل يمكن رسم رسوميات 3D في canvas؟
	</li>
	<li>
		<strong>ج</strong>: نعم، عبر تقنية WebGL التي يمكنها رسم الأشكال ثلاثية الأبعاد في المتصفحات دون إضافات. تدعم أغلبية المتصفحات الحديثة هذه التقنية (Firefox الإصدار الرابع وما بعده، و Chrome الإصدار التاسع وما بعده، و Opera 12 وما بعده، و Safari 5.1 وما بعده، و IE 11)؛ يتم العمل على تطوير هذه التقنية في مجموعة عمل WebGL.
	</li>
</ul>
<p>
	إذًا، أصبح لديك عنصر <span style="font-family:courier new,courier,monospace;">&lt;canvas&gt;</span> ولديك إطار الرسم (drawing context) الخاص به. إطار الرسم هو المكان الذي ستُعرَّف فيه جميع دوال وخاصيات الرسم. هنالك مجموعةٌ كاملةٌ من الخاصيات والدوال المُكرَّسة لرسم المستطيلات:
</p>

<p>
	يمكن أن تكون الخاصية <span style="font-family:courier new,courier,monospace;">fillStyle</span> لونًا من ألوان CSS، أو نقشًا (pattern)، أو تدرجًا لونيًا (gradient) (سنذكر مزيدًا من المعلومات عن التدرجات اللونية بعد قليل). القيمة الافتراضية لهذه الخاصية هي اللون الأسود، لكنك تستطيع أن تضبطها لما تشاء. سيتذكر كل إطار رسم (drawing context) خاصياته لطالما بقيت الصفحة مفتوحةً إلا إن فعلت شيئًا لإعادة ضبطه.
</p>

<ol>
<li>
		الدالة <span style="font-family:courier new,courier,monospace;">(fillRect(x, y, width, height</span> ترسم مستطيلًا مملوءًا باللون أو النقش الموجود في <span style="font-family:courier new,courier,monospace;">fillStyle</span>.
	</li>
	<li>
		الخاصية <span style="font-family:courier new,courier,monospace;">strokeStyle</span> شبيهة بخاصية <span style="font-family:courier new,courier,monospace;">fillStyle</span>، فيمكن أن تكون لون CSS أو نقشًا أو تدرجًا لونيًا.
	</li>
	<li>
		الدالة<span style="font-family:courier new,courier,monospace;"> (strokeRect(x, y, width, height</span> ترسم مستطيلًا دون ملئه، إذ ترسم حوافه وإطاره الخارجي فحسب، وتَستعمل الخاصية <span style="font-family:courier new,courier,monospace;">strokeStyle</span> لذلك.
	</li>
	<li>
		الدالة <span style="font-family:courier new,courier,monospace;">(clearRect(x, y, width, height</span> تسمح كل البكسلات الموجودة في المستطيل المُحدَّد.
	</li>
</ol>
<p>
	<strong>س</strong>: هل يمكنني أن أعيد ضبط لوحة الرسم في عنصر <span style="font-family:courier new,courier,monospace;">canvas</span>؟
</p>

<p>
	<strong>ج</strong>: نعم، فسيؤدي تحديد عرض أو ارتفاع عنصر <span style="font-family:courier new,courier,monospace;">&lt;canvas&gt;</span> إلى إعادة ضبط (reset) كل الخاصيات في إطار الرسم إلى قيمها الافتراضية. لاحظ أنَّه ليس من الضروري تغيير العرض، إذ يمكنك أن تضبطه إلى قيمته الحالية كما يلي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9725_11">
<span class="kwd">var</span><span class="pln"> b_canvas </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">getElementById</span><span class="pun">(</span><span class="str">"b"</span><span class="pun">);</span><span class="pln">
b_canvas</span><span class="pun">.</span><span class="pln">width </span><span class="pun">=</span><span class="pln"> b_canvas</span><span class="pun">.</span><span class="pln">width</span><span class="pun">;</span></pre>

<p>
	بالعودة إلى الشيفرة في المثال السابق:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9725_13">
<span class="kwd">var</span><span class="pln"> b_canvas </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">getElementById</span><span class="pun">(</span><span class="str">"b"</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">var</span><span class="pln"> b_context </span><span class="pun">=</span><span class="pln"> b_canvas</span><span class="pun">.</span><span class="pln">getContext</span><span class="pun">(</span><span class="str">"2d"</span><span class="pun">);</span><span class="pln">

b_context</span><span class="pun">.</span><span class="pln">fillRect</span><span class="pun">(</span><span class="lit">50</span><span class="pun">,</span><span class="pln"> </span><span class="lit">25</span><span class="pun">,</span><span class="pln"> </span><span class="lit">150</span><span class="pun">,</span><span class="pln"> </span><span class="lit">100</span><span class="pun">);</span></pre>

<p>
	سترسم الدالة <span style="font-family:courier new,courier,monospace;">fillRect()‎ </span>عند استدعائها مستطيلًا وتملؤه بنمط الملء الحالي الذي هو اللون الأسود (إلا إذا غيرتَه). يُعرَّف المستطيل عبر زاويته العليا اليسرى (50، 25)، وعرضه (150)، وارتفاعه (100). لكي نفهم ذلك فهمًا جيدًا، فلنلقِ نظرةً إلى نظام الإحداثيات في <span style="font-family:courier new,courier,monospace;">canvas</span>.
</p>

<h2>
	الإحداثيات في عنصر canvas
</h2>

<p>
	يمكننا تخيل لوحة الرسم في عنصر <span style="font-family:courier new,courier,monospace;">canvas</span> على أنها شبكة ثنائية البعد، ويكون مبدأ الإحداثيات فيها (‎0, 0) في الزاوية العليا اليسرى من لوحة الرسم.
</p>

<p>
	تزداد القيم على المحور X عند الانتقال نحو الحافة اليمنى من لوحة الرسم، وتزداد القيم على المحور Y بالانتقال نحو الحافة السفلية من لوحة الرسم.
</p>

<p style="text-align: center;">
	<img alt="002.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17397" data-unique="x0haoti4f" src="https://academy.hsoub.com/uploads/monthly_2016_06/002.png.e9582a653d3ac4554721bacdc48d2aba.png"></p>

<p style="text-align: center;">
	<strong>الشكل 2: توضيح لنظام الإحداثيات في عنصر canvas</strong>
</p>

<p>
	رُسِمَ الشكل السابق عبر عنصر &lt;<span style="font-family:courier new,courier,monospace;">canvas&gt; </span>الذي يحتوي على:
</p>

<ul>
<li>
		مجموعة من الخطوط الأفقية
	</li>
	<li>
		مجموعة من الخطوط الشاقولية
	</li>
	<li>
		خطين أفقيين سوداوين
	</li>
	<li>
		خطين صغيرين سوداوين مائلين يشكلان سهمًا
	</li>
	<li>
		خطين شاقوليين سوداوين
	</li>
	<li>
		خطين صغيرين سوداوين مائلين يشكلان السهم الآخر
	</li>
	<li>
		الحرف "x"
	</li>
	<li>
		الحرف "y"
	</li>
	<li>
		النص "(‎(0, 0" قرب الزاوية العليا اليسرى
	</li>
	<li>
		النص "(‎500, 375)" قرب الزاوية السفلى اليمنى
	</li>
	<li>
		نقطة في الزاوية العليا اليسرى، وأخرى في الزاوية السفلى اليمنى
	</li>
</ul>
<p>
	علينا أولًا تعريف العنصر <span style="font-family:courier new,courier,monospace;">&lt;canvas&gt;</span> نفسه، حيث يُحدِّد العنصر <span style="font-family:courier new,courier,monospace;">&lt;canvas&gt;</span> خاصية العرض <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;">id</span> كي نستطيع العثور عليه بسهولة لاحقًا.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5835_7">
<span class="tag">&lt;canvas</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"c"</span><span class="pln"> </span><span class="atn">width</span><span class="pun">=</span><span class="atv">"500"</span><span class="pln"> </span><span class="atn">height</span><span class="pun">=</span><span class="atv">"375"</span><span class="tag">&gt;&lt;/canvas&gt;</span></pre>

<p>
	ثم علينا كتابة سكربت لكي نجد عنصر <span style="font-family:courier new,courier,monospace;">&lt;canvas&gt;</span> في شجرة DOM ونحصل على إطار الرسم الخاص به.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5835_9">
<span class="kwd">var</span><span class="pln"> c_canvas </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">getElementById</span><span class="pun">(</span><span class="str">"c"</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">var</span><span class="pln"> context </span><span class="pun">=</span><span class="pln"> c_canvas</span><span class="pun">.</span><span class="pln">getContext</span><span class="pun">(</span><span class="str">"2d"</span><span class="pun">);</span></pre>

<p>
	نستطيع الآن البدء في رسم الخطوط.
</p>

<h2>
	المسارات
</h2>

<center>
	<table border="1"><tbody>
<tr>
<td style="padding: 5px 10px; text-align: center; background-color: #ecf0f1;">
					IE
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: #ecf0f1;">
					Firefox
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: #ecf0f1;">
					Safari
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: #ecf0f1;">
					Chrome
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: #ecf0f1;">
					Opera
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: #ecf0f1;">
					iPhone
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: #ecf0f1;">
					Android
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px; text-align: center;">
					7.0+*
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					3.0+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					3.0+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					3.0+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					10.0+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					1.0+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					1.0+
				</td>
			</tr>
</tbody></table>
</center>

<p>
	* يتطلب IE ‏7 و 8 مكتبة خارجية هي explorercanvas، أما IE 9 فهو يدعم المسارات في العنصر &lt;canvas&gt; داخليًا.
</p>

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

<p>
	هنالك ما نسميه "المسارات" (paths) في عناصر <span style="font-family:courier new,courier,monospace;">canvas</span>، وتعريف المسار يُشبِه تمامًا الرسم بقلم الرصاص؛ يمكنك رسم ما تشاء لكنه لن يكون جزءًا من اللوحة النهائية إلا إن أمسكت أقلام التحبير ومررتها فوق المسار الذي رسمتَه.
</p>

<p>
	استعمل الدالتين الآتيتين لرسم المستقيمات "بقلم الرصاص":
</p>

<ul>
<li>
		<span style="font-family:courier new,courier,monospace;">(moveTo(x, y</span> تحريك قلم الرصاص إلى نقطة البداية المُحدَّدة.
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;">(lineTo(x, y</span> رسم خط إلى نقطة النهاية المُحدَّدة.
	</li>
</ul>
<p>
	سيزداد حجم المسار كلما استدعيت الدالتين<span style="font-family:courier new,courier,monospace;"> moveTo()‎</span> و <span style="font-family:courier new,courier,monospace;">lineTo()</span>‎. ترسم الدالتان السابقتان "بقلم الرصاص" (يمكنك أن تسمي هذه العملية ما تشاء)، أي أنَّك لن ترَ شيئًا على لوحة الرسم إلى أن تستدعي إحدى دوال "التحبير".
</p>

<p>
	لنبدأ برسم الشبكة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9725_15">
<span class="com">//رسم المستقيمات الشاقولية</span><span class="pln">

</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">var</span><span class="pln"> x </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.5</span><span class="pun">;</span><span class="pln"> x </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">500</span><span class="pun">;</span><span class="pln"> x </span><span class="pun">+=</span><span class="pln"> </span><span class="lit">10</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  context</span><span class="pun">.</span><span class="pln">moveTo</span><span class="pun">(</span><span class="pln">x</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
  context</span><span class="pun">.</span><span class="pln">lineTo</span><span class="pun">(</span><span class="pln">x</span><span class="pun">,</span><span class="pln"> </span><span class="lit">375</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">//رسم المستقيمات الأفقية</span><span class="pln">

</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">var</span><span class="pln"> y </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.5</span><span class="pun">;</span><span class="pln"> y </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">375</span><span class="pun">;</span><span class="pln"> y </span><span class="pun">+=</span><span class="pln"> </span><span class="lit">10</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  context</span><span class="pun">.</span><span class="pln">moveTo</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> y</span><span class="pun">);</span><span class="pln">
  context</span><span class="pun">.</span><span class="pln">lineTo</span><span class="pun">(</span><span class="lit">500</span><span class="pun">,</span><span class="pln"> y</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	تلك الدوال "رصاصية"، أي لن يظهر شيءٌ على لوحة الرسم بعد؛ إذ سنحتاج إلى دالة "تحبير" لإظهار تلك الخطوط.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9725_19">
<span class="pln">context</span><span class="pun">.</span><span class="pln">strokeStyle </span><span class="pun">=</span><span class="pln"> </span><span class="str">"#eee"</span><span class="pun">;</span><span class="pln">
context</span><span class="pun">.</span><span class="pln">stroke</span><span class="pun">();</span></pre>

<p>
	الدالة<span style="font-family:courier new,courier,monospace;"> storke()‎</span> هي إحدى دوال "التحبير"، وهي تُحبِّر المسار المعقد الذي عرَّفتَه بدوال<span style="font-family:courier new,courier,monospace;"> moveTo()‎</span> و <span style="font-family:courier new,courier,monospace;">lineTo()</span>‎ السابقة. خاصية <span style="font-family:courier new,courier,monospace;">strokeStyle</span> تتحكم بلون تلك الخطوط. هذه هي النتيجة:
</p>

<p style="text-align: center;">
	<img alt="003.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17398" data-unique="fbhh7lymx" src="https://academy.hsoub.com/uploads/monthly_2016_06/003.png.209299ec74802d3c27d78a489e73b63b.png"></p>

<p style="text-align: center;">
	<strong>الشكل 3: شبكة مرسومة داخل عنصر canvas</strong>
</p>

<ul>
<li>
		<strong>س</strong>: لماذا بدأت x و y من 0.5 وليس من 0؟
	</li>
	<li>
		<strong>ج</strong>: تخيل أنَّ كل بكسل هو مربع كبير، وأنَّ الإحداثيات ذات الرقم الكامل (0، 1، 2…) هي حواف تلك المربعات؛ فإذا أردت أن ترسم خطًا عرضُه واحدة الأطوال (one-unit-wide) بين الإحداثيات ذات الرقم الكامل، فسوف يمتد إلى أن يصل إلى طرفَي المربع (انظر الشكل الآتي للإيضاح)، وسيكون الخط الناتج مرسومًا بعرض بكسلين. أما لرسم خط عرضه بكسل واحد، فعليك أن تُزيح الإحداثيات بمقدار 0.5 عموديًا على منحى (أو اتجاه) الخط.
	</li>
</ul>
<p style="margin-right: 40px;">
	على سبيل المثال، إذا كنت تحاول رسم خط من (‎1, 0) إلى (‎1, 3)، فسيرسم المتصفح خطًا يغطي 0.5 بكسل على جانبَيّ x=1، ولكن الشاشة غير قادرة على عرض نصف بكسل، لذلك سيمتد الخط لكي يُغطي بكسلين:
</p>

<p style="margin-right: 40px; text-align: center;">
	<img alt="004.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17399" data-unique="tayj2h7a8" src="https://academy.hsoub.com/uploads/monthly_2016_06/004.png.1ce0b9fdc184ae694721288d46033764.png"></p>

<p style="margin-right: 40px;">
	أما لو أردت أن ترسم خطًا من (1.5, 0) إلى (1.5, 3)، فسيرسم المتصفح خطأ يغطي 0.5 بكسل على طرفَي x=1.5، الذي يؤدي إلى رسم خط بعرض 1 بكسل:
</p>

<p style="margin-right: 40px; text-align: center;">
	<img alt="005.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17400" data-unique="iuyd6ceus" src="https://academy.hsoub.com/uploads/monthly_2016_06/005.png.950e87e470c3f2939083af6573e7b83b.png"></p>

<p>
	لنرسم الآن السهم الأفقي. جميع الخطوط والمنحنيات الموجودة على نفس المسار ستُرسَم بنفس اللون (أو التدرج اللوني، وسنأتي لذكر ذلك لاحقًا). لكننا نريد أن نرسم السهم بلون مختلف (الأسود)، لذلك نحتاج إلى البدء بمسار (path) جديد.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9725_21">
<span class="com">//مسار جديد</span><span class="pln">

context</span><span class="pun">.</span><span class="pln">beginPath</span><span class="pun">();</span><span class="pln">

context</span><span class="pun">.</span><span class="pln">moveTo</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">40</span><span class="pun">);</span><span class="pln">
context</span><span class="pun">.</span><span class="pln">lineTo</span><span class="pun">(</span><span class="lit">240</span><span class="pun">,</span><span class="pln"> </span><span class="lit">40</span><span class="pun">);</span><span class="pln">

context</span><span class="pun">.</span><span class="pln">moveTo</span><span class="pun">(</span><span class="lit">260</span><span class="pun">,</span><span class="pln"> </span><span class="lit">40</span><span class="pun">);</span><span class="pln">
context</span><span class="pun">.</span><span class="pln">lineTo</span><span class="pun">(</span><span class="lit">500</span><span class="pun">,</span><span class="pln"> </span><span class="lit">40</span><span class="pun">);</span><span class="pln">

context</span><span class="pun">.</span><span class="pln">moveTo</span><span class="pun">(</span><span class="lit">495</span><span class="pun">,</span><span class="pln"> </span><span class="lit">35</span><span class="pun">);</span><span class="pln">
context</span><span class="pun">.</span><span class="pln">lineTo</span><span class="pun">(</span><span class="lit">500</span><span class="pun">,</span><span class="pln"> </span><span class="lit">40</span><span class="pun">);</span><span class="pln">

context</span><span class="pun">.</span><span class="pln">lineTo</span><span class="pun">(</span><span class="lit">495</span><span class="pun">,</span><span class="pln"> </span><span class="lit">45</span><span class="pun">);</span></pre>

<p>
	وبنفس الطريقة نرسم السهم الشاقولي؛ ولمّا كان السهم الشاقولي بنفس لون السهم الأفقي، فلا حاجة إلى إنشاء مسار جديد، إذ سيُشكِّل السهمان مسارًا واحدًا.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9725_23">
<span class="com">//لا حاجة إلى إنشاء مسار جديد</span><span class="pln">

context</span><span class="pun">.</span><span class="pln">moveTo</span><span class="pun">(</span><span class="lit">60</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
context</span><span class="pun">.</span><span class="pln">lineTo</span><span class="pun">(</span><span class="lit">60</span><span class="pun">,</span><span class="pln"> </span><span class="lit">153</span><span class="pun">);</span><span class="pln">

context</span><span class="pun">.</span><span class="pln">moveTo</span><span class="pun">(</span><span class="lit">60</span><span class="pun">,</span><span class="pln"> </span><span class="lit">173</span><span class="pun">);</span><span class="pln">
context</span><span class="pun">.</span><span class="pln">lineTo</span><span class="pun">(</span><span class="lit">60</span><span class="pun">,</span><span class="pln"> </span><span class="lit">375</span><span class="pun">);</span><span class="pln">

context</span><span class="pun">.</span><span class="pln">moveTo</span><span class="pun">(</span><span class="lit">65</span><span class="pun">,</span><span class="pln"> </span><span class="lit">370</span><span class="pun">);</span><span class="pln">
context</span><span class="pun">.</span><span class="pln">lineTo</span><span class="pun">(</span><span class="lit">60</span><span class="pun">,</span><span class="pln"> </span><span class="lit">375</span><span class="pun">);</span><span class="pln">

context</span><span class="pun">.</span><span class="pln">lineTo</span><span class="pun">(</span><span class="lit">55</span><span class="pun">,</span><span class="pln"> </span><span class="lit">370</span><span class="pun">);</span></pre>

<p>
	لقد قلتُ أنَّ هذين السهمين يجب أن يُرسما باللون الأسود، لكن لون <span style="font-family:courier new,courier,monospace;">strokeStyle</span> ما يزال "الفضي الفاتح" (لا تتم عملية إعادة تعيين قيم <span style="font-family:courier new,courier,monospace;">fillStyle</span> و <span style="font-family:courier new,courier,monospace;">strokeStyle</span> عندما تبدأ مسارًا جديدًا). لا بأس، لأننا رسمنا إلى الآن "بالرصاص" ولم "نُحبِّر" بعد، علينا الآن أن نضبط قيمة <span style="font-family:courier new,courier,monospace;">strokeStyle</span> إلى اللون الأسود؛ وإلا سيُرسم هاذين السهمين بالفضي الفاتح وسيصعب علينا رؤيتهما. سيُغيّر السطران الآتيان اللون إلى الأسود ويرسمان الخطوط في لوحة الرسم:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9725_25">
<span class="pln">context</span><span class="pun">.</span><span class="pln">strokeStyle </span><span class="pun">=</span><span class="pln"> </span><span class="str">"#000"</span><span class="pun">;</span><span class="pln">
context</span><span class="pun">.</span><span class="pln">stroke</span><span class="pun">();</span></pre>

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

<p style="text-align: center;">
	<img alt="006.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17401" data-unique="9m12mb5dx" src="https://academy.hsoub.com/uploads/monthly_2016_06/006.png.57165dfdb80d3949539a1483267d1180.png"></p>

<p style="text-align: center;">
	<strong>الشكل 4: المحوران مرسومان دون تسمية على لوحة الرسم</strong>
</p>

<h2>
	النص
</h2>

<center>
	<table border="1"><tbody>
<tr>
<td style="padding: 5px 10px; text-align: center; background-color: #ecf0f1;">
					IE
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: #ecf0f1;">
					Firefox
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: #ecf0f1;">
					Safari
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: #ecf0f1;">
					Chrome
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: #ecf0f1;">
					Opera
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: #ecf0f1;">
					iPhone
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: #ecf0f1;">
					Android
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px; text-align: center;">
					7.0+*
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					3.0+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					3.0+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					3.0+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					10.0+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					1.0+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					1.0+
				</td>
			</tr>
</tbody></table>
</center>

<p>
	* يتطلب IE ‏7 و 8 مكتبة خارجية هي explorercanvas، أما IE 9 فهو يدعم طباعة النصوص في العنصر &lt;canvas&gt; داخليًا.
</p>

<p>
	** يتطلب Firefox 3.0 مكتبة للتوافقية.
</p>

<p>
	بالإضافة إلى القدرة على رسم خطوط في لوحة الرسم، يمكنك أيضًا "رسم" الجمل النصية. وعلى عكس النصوص في الصفحة المحيطة بلوحة الرسم، لا يوجد هنالك أيّة خاصيات CSS تتعلق بالتخطيط (layout) مثل <span style="font-family:courier new,courier,monospace;">floats</span> و <span style="font-family:courier new,courier,monospace;">margins</span> و <span style="font-family:courier new,courier,monospace;">padding</span> و <span style="font-family:courier new,courier,monospace;">word wrapping</span>. تستطيع ضبط بعض خاصيات الخط، ثم اختيار نقطة على لوحة الرسم و"رسم" نصك هناك.
</p>

<p>
	تتوفر خاصيات الخطوط الآتية في لوحة الرسم:
</p>

<ul>
<li>
		الخاصية <span style="font-family:courier new,courier,monospace;">font</span> التي يمكن أن تُضبَط إلى أي شيءٍ تستطيع ضبطه في خاصية <span style="font-family:courier new,courier,monospace;">font</span> في CSS. وهذا يتضمن نمط الخط، ونوع الخط، وسماكة الخط، وحجم الخط، وارتفاع السطر، واسم "عائلة" الخط.
	</li>
	<li>
		الخاصية <span style="font-family:courier new,courier,monospace;">textAlign</span> تتحكم بمحاذاة النص، وهي شبيهة (لكن ليس مماثلة تمامًا) بخاصية <span style="font-family:courier new,courier,monospace;">text-align </span>في CSS. القيم المحتملة هي start و end و left و right و center.
	</li>
	<li>
		الخاصية <span style="font-family:courier new,courier,monospace;">textBaseline</span> تتحكم في مكان "رسم" النص نسبةً إلى نقطة البداية. القيم المحتملة هي top أو hanging أو middle أو alphabetic أو ideographic أو bottom.
	</li>
	<li>
		الخاصية <span style="font-family:courier new,courier,monospace;">textBaseline</span> معقدة ودقيقة، لأن طريقة كتابة النصوص معقدة (لا أقصد هنا الإنكليزية، لكنك تستطيع رسم أي محرف يونيكود في عنصر <span style="font-family:courier new,courier,monospace;">canvas</span>، وكتابة نصوص يونيكود معقدة)،
	</li>
</ul>
<p>
	تشرح مواصفات HTML5 مختلف خطوط الأساس (baselines):
</p>

<p>
	أعلى مربع em هو تقريبًا على مستوى أعلى المحارف في الخط (font)، أما "hanging baseline" فهو مكان ارتكاز بعض المحارف مثل आ، أما خطmiddle فهو يقع في منتصف المسافة بين أعلى مربع em وأسفل مربع em. أما خط alphabetic فهو مكان ارتكاز الأحرف مثل Á و ÿ و f و Ω، وخط ideographic هو مكان ارتكاز المحارف مثل 私 و 達، وأسفل مربع em هو تقريبًا أسفل المحارف الموجودة في خطٍ (font) ما. قد يكون أعلى وأسفل الصندوق المحيط (bounding box) بعيدًا عن خطوط الأساس السابقة نتيجةً لامتداد بعض المحارف خارج مربع em.
</p>

<p style="text-align: center;">
	<img alt="007.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17402" data-unique="a4yfsiygn" src="https://academy.hsoub.com/uploads/monthly_2016_06/007.png.9c9a570623f793008f8cdcad4d9ba0a6.png"></p>

<p style="text-align: center;">
	<strong>الشكل 5: خطوط الأساس</strong>
</p>

<p>
	تستطيع استخدام top أو middle أو bottom لخاصية <span style="font-family:courier new,courier,monospace;">textBaseline</span> للأبجديات البسيطة مثل الإنكليزية دون أن تكترث للبقية.
</p>

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

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9725_27">
<span class="com">//تغيير نمط الخط</span><span class="pln">

context</span><span class="pun">.</span><span class="pln">font </span><span class="pun">=</span><span class="pln"> </span><span class="str">"bold 12px sans-serif"</span><span class="pun">;</span><span class="pln">

context</span><span class="pun">.</span><span class="pln">fillText</span><span class="pun">(</span><span class="str">"x"</span><span class="pun">,</span><span class="pln"> </span><span class="lit">248</span><span class="pun">,</span><span class="pln"> </span><span class="lit">43</span><span class="pun">);</span><span class="pln">
context</span><span class="pun">.</span><span class="pln">fillText</span><span class="pun">(</span><span class="str">"y"</span><span class="pun">,</span><span class="pln"> </span><span class="lit">58</span><span class="pun">,</span><span class="pln"> </span><span class="lit">165</span><span class="pun">);</span></pre>

<p>
	ترسم الخاصية<span style="font-family:courier new,courier,monospace;"> fillText()‎</span> النص.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9725_29">
<span class="pln">context</span><span class="pun">.</span><span class="pln">font </span><span class="pun">=</span><span class="pln"> </span><span class="str">"bold 12px sans-serif"</span><span class="pun">;</span><span class="pln">

</span><span class="com">//رسم النص</span><span class="pln">

context</span><span class="pun">.</span><span class="pln">fillText</span><span class="pun">(</span><span class="str">"x"</span><span class="pun">,</span><span class="pln"> </span><span class="lit">248</span><span class="pun">,</span><span class="pln"> </span><span class="lit">43</span><span class="pun">);</span><span class="pln">
context</span><span class="pun">.</span><span class="pln">fillText</span><span class="pun">(</span><span class="str">"y"</span><span class="pun">,</span><span class="pln"> </span><span class="lit">58</span><span class="pun">,</span><span class="pln"> </span><span class="lit">165</span><span class="pun">);</span></pre>

<ul>
<li>
		<strong>س</strong>: هل أستطيع استخدام مقاسات الخطوط النسبية لرسم النصوص في عنصر <span style="font-family:courier new,courier,monospace;">canvas</span>؟
	</li>
	<li>
		<strong>ج</strong>: نعم. مثل أي عنصر HTML آخر في صفحتك، يحسب العنصر <span style="font-family:courier new,courier,monospace;">&lt;canvas&gt;</span> مقاس الخط بناءً على قواعد CSS في صفحتك. فإذا ضبطت خاصية <span style="font-family:courier new,courier,monospace;">context.font</span> إلى مقاس خط نسبي مثل 1.5em أو ‎150%، فسيضرب متصفحك هذا الرقم بحجم الخط المحسوب لعنصر <span style="font-family:courier new,courier,monospace;">&lt;canvas&gt;</span> نفسه.
	</li>
</ul>
<p>
	أريد أن يكون أعلى النص الموجود في الزاوية العليا اليسرى على بعد y=5 من الحافة العلوية، لكنني كسول ولا أريد قياس ارتفاع النص وحساب بعد خط الأساس (baseline)، وإنما سأضبط <span style="font-family:courier new,courier,monospace;">textBaseline</span> إلى <span style="font-family:courier new,courier,monospace;">top</span> وسأمرر إحداثيات الزاوية العليا اليسرى من مربع النص.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5835_12">
<span class="pln">context</span><span class="pun">.</span><span class="pln">textBaseline </span><span class="pun">=</span><span class="pln"> </span><span class="str">"top"</span><span class="pun">;</span><span class="pln">
context</span><span class="pun">.</span><span class="pln">fillText</span><span class="pun">(</span><span class="str">"( 0 , 0 )"</span><span class="pun">,</span><span class="pln"> </span><span class="lit">8</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">);</span></pre>

<p>
	أما للنص في الزاوية السفلى اليمنى، فسأرسم الزاوية السفلى اليمنى للنص في الإحداثيات (492,370)، أي بضعة بكسلات من الزاوية السفلى اليمنى من لوحة الرسم؛ لكنني لا أريد قياس عرض أو ارتفاع النص، لهذا أضبط الخاصية <span style="font-family:courier new,courier,monospace;">textAlign</span> إلى right والخاصية <span style="font-family:courier new,courier,monospace;">textBaseline</span> إلى botton، ثم استدعي الدالة <span style="font-family:courier new,courier,monospace;">fillText()</span>‎ مُمرِّرًا إليها إحداثيات الزاوية السفلى اليمنى من مربع النص.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5835_14">
<span class="pln">context</span><span class="pun">.</span><span class="pln">textAlign </span><span class="pun">=</span><span class="pln"> </span><span class="str">"right"</span><span class="pun">;</span><span class="pln">
context</span><span class="pun">.</span><span class="pln">textBaseline </span><span class="pun">=</span><span class="pln"> </span><span class="str">"bottom"</span><span class="pun">;</span><span class="pln">
context</span><span class="pun">.</span><span class="pln">fillText</span><span class="pun">(</span><span class="str">"( 500 , 375 )"</span><span class="pun">,</span><span class="pln"> </span><span class="lit">492</span><span class="pun">,</span><span class="pln"> </span><span class="lit">370</span><span class="pun">);</span></pre>

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

<p style="text-align: center;">
	<img alt="008.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17403" data-unique="lmsjabug9" src="https://academy.hsoub.com/uploads/monthly_2016_06/008.png.887331b43611f81e30369d5670a4883f.png"></p>

<p style="text-align: center;">
	<strong>الشكل 6: تسمية المحاور</strong>
</p>

<p>
	لقد نسينا النقاط الموجودة على الزوايا! سنتعلم كيف نرسم الدوائر لاحقًا، أما الآن، فسأغش قليلًا وأرسمها كمستطيلات.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2004_15">
<span class="pln">context</span><span class="pun">.</span><span class="pln">fillRect</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">);</span><span class="pln">
context</span><span class="pun">.</span><span class="pln">fillRect</span><span class="pun">(</span><span class="lit">497</span><span class="pun">,</span><span class="pln"> </span><span class="lit">372</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">);</span></pre>

<p>
	هذا كل ما في الأمر! هذه هي النتيجة النهائية:
</p>

<p style="text-align: center;">
	<img alt="009.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17404" data-unique="xvcy5z4mz" src="https://academy.hsoub.com/uploads/monthly_2016_06/009.png.6a1f33a52f6e47420b4c0871739126ad.png"></p>

<p style="text-align: center;">
	<strong>الشكل 7: الرسم النهائي للإحداثيات عبر عنصر canvas</strong>
</p>

<h2>
	التدرجات اللونية
</h2>

<center>
	<table border="1"><tbody>
<tr>
<td style="padding: 5px 10px; text-align: center; background-color: #ecf0f1;">
					 
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: #ecf0f1;">
					IE
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: #ecf0f1;">
					Firefox
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: #ecf0f1;">
					Safari
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: #ecf0f1;">
					Chrome
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: #ecf0f1;">
					Opera
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: #ecf0f1;">
					iPhone
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: #ecf0f1;">
					Android
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px; text-align: center; background-color: #ecf0f1;">
					التدرجات اللونية الخطية
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					7.0+*
				</td>
				<td padding:="" style="padding: 5px 10px; text-align: center;">
					3.0+
				</td>
				<td padding:="" style="padding: 5px 10px; text-align: center;">
					3.0+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					3.0+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					10.0+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					1.0+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					1.0+
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px; text-align: center; background-color: #ecf0f1;">
					التدرجات اللونية الشعاعية
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					9.0+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					3.0+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					3.0+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					3.0+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					10.0+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					1.0+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					1.0+
				</td>
			</tr>
</tbody></table>
</center>

<p>
	* يتطلب IE ‏7 و 8 مكتبة خارجية هي <span style="font-family:courier new,courier,monospace;">explorercanvas</span>، أما IE 9 فهو يدعم التدرجات اللونية في العنصر <span style="font-family:courier new,courier,monospace;">&lt;canvas&gt;</span> داخليًا.
</p>

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

<p style="text-align: center;">
	<img alt="0010.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17405" data-unique="3uhoul2ti" src="https://academy.hsoub.com/uploads/monthly_2016_06/0010.png.7f1838b77c894f5ff249d23217855c55.png"></p>

<p style="text-align: center;">
	<strong>الشكل 8: تدرج لوني من اليسار إلى اليمين</strong>
</p>

<p>
	سيبدو وسم <span style="font-family:courier new,courier,monospace;">canvas</span> كغيره من الوسوم:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4368_7">
<span class="tag">&lt;canvas</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"d"</span><span class="pln"> </span><span class="atn">width</span><span class="pun">=</span><span class="atv">"300"</span><span class="pln"> </span><span class="atn">height</span><span class="pun">=</span><span class="atv">"225"</span><span class="tag">&gt;&lt;/canvas&gt;</span></pre>

<p>
	علينا أولًا أن نعثر على عنصر <span style="font-family:courier new,courier,monospace;">&lt;canvas&gt;</span> ثم نحصل على إطار الرسم:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4368_9">
<span class="kwd">var</span><span class="pln"> d_canvas </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">getElementById</span><span class="pun">(</span><span class="str">"d"</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">var</span><span class="pln"> context </span><span class="pun">=</span><span class="pln"> d_canvas</span><span class="pun">.</span><span class="pln">getContext</span><span class="pun">(</span><span class="str">"2d"</span><span class="pun">);</span></pre>

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

<ul>
<li>
		الدالة <span style="font-family:courier new,courier,monospace;">(createLinearGradient(x0, y0, x1, y1</span> ترسم تدرجًا لونيًا عبر قطعة مستقيمة من النقطة (x0, y0) إلى (x1, y1).
	</li>
	<li>
		الدالة <span style="font-family:courier new,courier,monospace;">(createRadialGradient(x0, y0, r0, x1, y1, r1</span> ترسم تدرجًا لونيًا عبر مخروط (cone) بين دائرتين. وتُمثِّل أول ثلاثة معاملات (parameters) دائرة البداية ذات المركز (x0, y0) ونصف القطر r0. أما آخر ثلاثة معاملات فهي تمثل دائرة النهاية ذات المركز (x1, y1) ونصف القطر r1.
	</li>
</ul>
<p>
	لنُنشِئ تدرجًا لونيًا خطيًّا (linear)؛ يمكن أن تكون التدرجات اللونية بأي قياس، لكننا سنجعل هذا التدرج بعرض 300 بكسل، مثل لوحة الرسم.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4368_11">
<span class="kwd">var</span><span class="pln"> my_gradient </span><span class="pun">=</span><span class="pln"> context</span><span class="pun">.</span><span class="pln">createLinearGradient</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">300</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span></pre>

<p>
	لما كانت قيم y (الوسيط الثاني والرابع) تساوي 0، فسيكون اتجاه التدرج اللوني من اليسار إلى اليمين.
</p>

<p>
	يمكنك تعريف ألوان التدرج بعد أن تحصل على كائن التدرج اللوني. يمكن أن يكون للتدرج محطتَي توقف لوني أو أكثر. التوقف اللوني (color stop) يمكن أن يكون في أي مكان في التدرج. ولإضافة توقف لوني، عليك تحديد مكانه ضمن التدرج اللوني، يمكن أن تكون تلك القيم بين 0 و 1.
</p>

<p>
	لنُعرِّف تدرجًا لونيًا من الأسود إلى الأبيض.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4368_13">
<span class="pln">my_gradient</span><span class="pun">.</span><span class="pln">addColorStop</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="str">"black"</span><span class="pun">);</span><span class="pln">
my_gradient</span><span class="pun">.</span><span class="pln">addColorStop</span><span class="pun">(</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="str">"white"</span><span class="pun">);</span></pre>

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

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4368_15">
<span class="pln">context</span><span class="pun">.</span><span class="pln">fillStyle </span><span class="pun">=</span><span class="pln"> my_gradient</span><span class="pun">;</span><span class="pln">
context</span><span class="pun">.</span><span class="pln">fillRect</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">300</span><span class="pun">,</span><span class="pln"> </span><span class="lit">225</span><span class="pun">);</span></pre>

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

<p style="text-align: center;">
	<img alt="011.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17406" data-unique="6mupl8oih" src="https://academy.hsoub.com/uploads/monthly_2016_06/011.png.cecfa1ba1c687b98bc8bfd4d22f54bae.png"></p>

<p style="text-align: center;">
	<strong>الشكل 9: تدرج لوني من اليسار إلى اليمين</strong>
</p>

<p>
	لنفترض أنَّك تريد تدرجًا لونيًا من الأعلى إلى الأسفل؛ فسيكون عليك إنشاء كائن للتدرج اللوني تكون فيه قيمة x ثابتة (الوسيطين الأول والثالث)، وتجعل قيم y (الوسطين الثاني والرابع) تتراوح بين 0 إلى ارتفاع لوحة الرسم.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4368_17">
<span class="kwd">var</span><span class="pln"> my_gradient </span><span class="pun">=</span><span class="pln"> context</span><span class="pun">.</span><span class="pln">createLinearGradient</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">225</span><span class="pun">);</span><span class="pln">

my_gradient</span><span class="pun">.</span><span class="pln">addColorStop</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="str">"black"</span><span class="pun">);</span><span class="pln">
my_gradient</span><span class="pun">.</span><span class="pln">addColorStop</span><span class="pun">(</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="str">"white"</span><span class="pun">);</span><span class="pln">

context</span><span class="pun">.</span><span class="pln">fillStyle </span><span class="pun">=</span><span class="pln"> my_gradient</span><span class="pun">;</span><span class="pln">
context</span><span class="pun">.</span><span class="pln">fillRect</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">300</span><span class="pun">,</span><span class="pln"> </span><span class="lit">225</span><span class="pun">);</span></pre>

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

<p style="text-align: center;">
	<img alt="012.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17407" data-unique="445g386hz" src="https://academy.hsoub.com/uploads/monthly_2016_06/012.png.5b114f76fd3a67782dec15c896d1d6f8.png"></p>

<p style="text-align: center;">
	<strong>الشكل 10: تدرج لوني من الأعلى إلى الأسفل</strong>
</p>

<p>
	وتستطيع أيضًا أن تجعل التدرجات اللونية قطرية.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4368_19">
<span class="com">//قيم x و y متغيرة</span><span class="pln">

</span><span class="kwd">var</span><span class="pln"> my_gradient </span><span class="pun">=</span><span class="pln"> context</span><span class="pun">.</span><span class="pln">createLinearGradient</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">300</span><span class="pun">,</span><span class="pln"> </span><span class="lit">225</span><span class="pun">);</span><span class="pln">

my_gradient</span><span class="pun">.</span><span class="pln">addColorStop</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="str">"black"</span><span class="pun">);</span><span class="pln">
my_gradient</span><span class="pun">.</span><span class="pln">addColorStop</span><span class="pun">(</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="str">"white"</span><span class="pun">);</span><span class="pln">

context</span><span class="pun">.</span><span class="pln">fillStyle </span><span class="pun">=</span><span class="pln"> my_gradient</span><span class="pun">;</span><span class="pln">
context</span><span class="pun">.</span><span class="pln">fillRect</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">300</span><span class="pun">,</span><span class="pln"> </span><span class="lit">225</span><span class="pun">);</span></pre>

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

<p style="text-align: center;">
	<img alt="013.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17408" data-unique="6o1maojws" src="https://academy.hsoub.com/uploads/monthly_2016_06/013.png.450781d6ded505597570f520028088c3.png"></p>

<p style="text-align: center;">
	<strong>الشكل 11: تدرج لوني قطري</strong>
</p>

<h2>
	الصور
</h2>

<center>
	<table border="1"><tbody>
<tr>
<td style="padding: 5px 10px; text-align: center; background-color: #ecf0f1;">
					IE
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: #ecf0f1;">
					Firefox
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: #ecf0f1;">
					Safari
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: #ecf0f1;">
					Chrome
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: #ecf0f1;">
					Opera
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: #ecf0f1;">
					iPhone
				</td>
				<td style="padding: 5px 10px; text-align: center; background-color: #ecf0f1;">
					Android
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px; text-align: center;">
					7.0+*
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					3.0+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					3.0+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					3.0+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					10.0+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					1.0+
				</td>
				<td style="padding: 5px 10px; text-align: center;">
					1.0+
				</td>
			</tr>
</tbody></table>
</center>

<p>
	* يتطلب IE ‏7 و 8 مكتبة خارجية هي explorercanvas، أما IE 9 فهو يدعم تضمين الصور في العنصر &lt;canvas&gt; داخليًا.
</p>

<p>
	يُظهِر الشكل الآتي قطةً معروضةٌ عبر عنصر <span style="font-family:courier new,courier,monospace;">&lt;img&gt;</span>:
</p>

<p style="text-align: center;">
	<img alt="cat.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17627" data-unique="fq876fmuk" src="https://academy.hsoub.com/uploads/monthly_2016_06/cat.png.ee6d428e84afc75ba5f112bc97fb3dee.png"></p>

<p style="text-align: center;">
	<strong>الشكل 12: قطة معروضة عبر عنصر img</strong>
</p>

<p>
	أما هذه فهي نفس القطة لكن مرسومة في عنصر <span style="font-family:courier new,courier,monospace;">canvas</span>:
</p>

<p style="text-align: center;">
	<img alt="cat2.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17628" data-unique="uu3u6wjzh" src="https://academy.hsoub.com/uploads/monthly_2016_06/cat2.png.0fb7a906c23ab78e11f51c9f33f48e55.png"></p>

<p style="text-align: center;">
	<strong>الشكل 13: قطة معروضة ضمن عنصر canvas</strong>
</p>

<p>
	هنالك دالة اسمها<span style="font-family:courier new,courier,monospace;"> drawImage()‎ </span>في إطار الرسم تُستعمل لتضمين صورة في عنصر <span style="font-family:courier new,courier,monospace;">canvas</span>. تأخذ هذه الدالة ثلاثة، أو خمسة، أو تسعة وسائط:
</p>

<ul>
<li>
		<span style="font-family:courier new,courier,monospace;">(drawImage(image, dx, dy</span> تأخذ صورةً وترسمها في لوحة الرسم، والإحداثيات المعطية (dx, dy) هي إحداثيات الزاوية العليا اليسرى من الصورة. فلو مررنا الإحداثيات (‎(0, 0 فستُرسَم الصورة في الزاوية العليا اليسرى من لوحة الرسم.
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;">(drawImage(image, dx, dy, dw, dh</span> تأخذ صورةً وتغير عرضها إلى dw وارتفاعها إلى dh، ثم ترسمها على لوحة الرسم في الإحداثيات (dx, dy).
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;">(drawImage(image, sx, sy, sw, sh, dx, dy, dw, dh</span> تأخذ صورةً وتقتطعها لتصبح مساويةً إلى المستطيل (sx, sy, sw, sh) ثم تغير أبعادها إلى (dw, dh) ثم ترسمها على لوحة الرسم في الإحداثيات (dx, dy).
	</li>
</ul>
<p>
	توضِّح مواصفات HTML5 معاملات (parameters) الدالة <span style="font-family:courier new,courier,monospace;">drawImage()</span>‎:
</p>

<ul>
<li>
		المستطيل المصدر هو المستطيل (ضمن حدود الصورة المصدرية) الذي تكون رؤوس أضلاعه هي (sx, sy)، و (sx+sw, sy)، و (sx+sw, sy+sh)، و (sx, sy+sh).
	</li>
	<li>
		أما المستطيل الوجهة، فهو المستطيل (ضمن حدود لوحة الرسم) الذي تكون رؤوس أضلاعه هي النقاط (dx, dy)، و (dx+dw, dy)، و (dx+dw, dy+dh)، و (dx, dy+dh).
	</li>
</ul>
<p style="text-align: center;">
	<img alt="014.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17409" data-unique="58d0sh2sb" src="https://academy.hsoub.com/uploads/monthly_2016_06/014.png.7a457ea5932b17d99d74d361fb4e35d5.png"></p>

<p style="text-align: center;">
	<strong>الشكل 14: تمثيل رسومي لمعاملات الدالة drawImage</strong>
</p>

<p>
	لرسم صورة داخل لوحة الرسم، فستحتاج إلى صورة! يمكن أن تكون الصورة عنصر <span style="font-family:courier new,courier,monospace;">&lt;img&gt;</span> موجود مسبقًا، أو بإمكانك إنشاء كائن<span style="font-family:courier new,courier,monospace;"> Image()‎</span> باستخدام JavaScript. وفي كلا الحالتين عليك أن تتأكد أنَّ الصورة محمَّلة تحميلًا كاملًا قبل أن ترسمها في لوحة الرسم.
</p>

<p>
	إذا كنت تستخدم عنصر <span style="font-family:courier new,courier,monospace;">&lt;img&gt; </span>موجود مسبقًا، فيمكنك رسم الصورة في لوحة الرسم أثناء الحدث <span style="font-family:courier new,courier,monospace;">window.onload</span>.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4368_35">
<span class="tag">&lt;img</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"cat"</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"images/cat.png"</span><span class="pln"> </span><span class="atn">alt</span><span class="pun">=</span><span class="atv">"sleeping cat"</span><span class="pln"> </span><span class="atn">width</span><span class="pun">=</span><span class="atv">"177"</span><span class="pln"> </span><span class="atn">height</span><span class="pun">=</span><span class="atv">"113"</span><span class="tag">&gt;</span><span class="pln">
</span><span class="tag">&lt;canvas</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"e"</span><span class="pln"> </span><span class="atn">width</span><span class="pun">=</span><span class="atv">"177"</span><span class="pln"> </span><span class="atn">height</span><span class="pun">=</span><span class="atv">"113"</span><span class="tag">&gt;&lt;/canvas&gt;</span><span class="pln">

</span><span class="tag">&lt;script&gt;</span><span class="pln">
  window</span><span class="pun">.</span><span class="pln">onload </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">var</span><span class="pln"> canvas </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">getElementById</span><span class="pun">(</span><span class="str">"e"</span><span class="pun">);</span><span class="pln">
    </span><span class="kwd">var</span><span class="pln"> context </span><span class="pun">=</span><span class="pln"> canvas</span><span class="pun">.</span><span class="pln">getContext</span><span class="pun">(</span><span class="str">"2d"</span><span class="pun">);</span><span class="pln">
    </span><span class="kwd">var</span><span class="pln"> cat </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">getElementById</span><span class="pun">(</span><span class="str">"cat"</span><span class="pun">);</span><span class="pln">
    context</span><span class="pun">.</span><span class="pln">drawImage</span><span class="pun">(</span><span class="pln">cat</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">};</span><span class="pln">
</span><span class="tag">&lt;/script&gt;</span></pre>

<p>
	أما لو كنتَ تُنشِئ كائن الصورة عبر JavaScript، فيمكنك رسم الصورة داخل لوحة الرسم أثناء الحدث <span style="font-family:courier new,courier,monospace;">Image.onload</span>.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4368_37">
<span class="tag">&lt;canvas</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"e"</span><span class="pln"> </span><span class="atn">width</span><span class="pun">=</span><span class="atv">"177"</span><span class="pln"> </span><span class="atn">height</span><span class="pun">=</span><span class="atv">"113"</span><span class="tag">&gt;&lt;/canvas&gt;</span><span class="pln">

</span><span class="tag">&lt;script&gt;</span><span class="pln">
  </span><span class="kwd">var</span><span class="pln"> canvas </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">getElementById</span><span class="pun">(</span><span class="str">"e"</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">var</span><span class="pln"> context </span><span class="pun">=</span><span class="pln"> canvas</span><span class="pun">.</span><span class="pln">getContext</span><span class="pun">(</span><span class="str">"2d"</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">var</span><span class="pln"> cat </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Image</span><span class="pun">();</span><span class="pln">

  cat</span><span class="pun">.</span><span class="pln">src </span><span class="pun">=</span><span class="pln"> </span><span class="str">"images/cat.png"</span><span class="pun">;</span><span class="pln">
  cat</span><span class="pun">.</span><span class="pln">onload </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    context</span><span class="pun">.</span><span class="pln">drawImage</span><span class="pun">(</span><span class="pln">cat</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">};</span><span class="pln">
</span><span class="tag">&lt;/script&gt;</span></pre>

<p>
	المعاملان الاختياريان الثالث والرابع في دالة <span style="font-family:courier new,courier,monospace;">drawImage()</span>‎ يتحكمان في تغيير أبعاد الصورة.
</p>

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

<p style="text-align: center;">
	<img alt="015.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17410" data-unique="w3guz7ux4" src="https://academy.hsoub.com/uploads/monthly_2016_06/015.png.2af518e6d2b4aca39189b68ca03f3213.png"></p>

<p style="text-align: center;">
	<strong>الشكل 15: الكثير من القطط!</strong>
</p>

<p>
	هذا هو السكربت الذي يؤدي إلى رسم الشكل السابق:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4368_21">
<span class="pln">cat</span><span class="pun">.</span><span class="pln">onload </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  
  </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">var</span><span class="pln"> x </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> y </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
    x </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">500</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> y </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">375</span><span class="pun">;</span><span class="pln">
    x </span><span class="pun">+=</span><span class="pln"> </span><span class="lit">50</span><span class="pun">,</span><span class="pln"> y </span><span class="pun">+=</span><span class="pln"> </span><span class="lit">37</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

    </span><span class="com">//تغيير أبعاد الصورة</span><span class="pln">
    context</span><span class="pun">.</span><span class="pln">drawImage</span><span class="pun">(</span><span class="pln">cat</span><span class="pun">,</span><span class="pln"> x</span><span class="pun">,</span><span class="pln"> y</span><span class="pun">,</span><span class="pln"> </span><span class="lit">88</span><span class="pun">,</span><span class="pln"> </span><span class="lit">56</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">};</span></pre>

<p>
	ربما تتساءل سؤالًا منطقيًا: لماذا تريد رسم صورة في لوحة الرسم أصلًا؟ بماذا ستستفيد من التعقيد الناتج عن رسم صورة داخل لوحة الرسم عوضًا عن استخدام عنصر <span style="font-family:courier new,courier,monospace;">&lt;img&gt;</span> وبعض خاصيات CSS؟ حتى التأثير السابق (تكرار صورة القطة) يمكن أن يتم باستخدام 10 عناصر <span style="font-family:courier new,courier,monospace;">&lt;img&gt; </span>متداخلة.
</p>

<p>
	<strong>الجواب المبسط هو</strong>: لنفس سبب حاجتك إلى رسم النصوص في لوحة الرسم. لاحظ كيف تُضمَّن مخطط إحداثيات <span style="font-family:courier new,courier,monospace;">canvas</span> نصًا ومستقيماتٍ وأشكالًا. فوضع النص ضمن لوحة الرسم هو جزءٌ من عملٍ أكبر. والمخططات الأكثر تعقيدًا ستستفيد كثيرًا من الدالة <span style="font-family:courier new,courier,monospace;">drawImage()</span>‎ لتضمين الأيقونات والرسوميات وغيرها.
</p>

<h2>
	ماذا عن متصفح IE؟
</h2>

<p>
	لم تكن الإصدارات الأقدم من الإصدار التاسع من متصفح Internet Explorer تدعم الواجهة البرمجية (<abbr title="Application Programming Interface | واجهة برمجية">API</abbr>) لعنصر canvas (يدعم IE9 واجهة canvas البرمجية بالكامل). لكن الإصدارات القديمة من Internet Explorer تدعم تقنية مملوكة من مايكروسوفت اسمها VML، التي تفعل العديد من الأشياء التي يفعلها العنصر<span style="font-family:courier new,courier,monospace;"> &lt;canvas&gt;</span>، وبهذا وُلِدَت المكتبة <span style="font-family:courier new,courier,monospace;">excanvas.js</span>.
</p>

<p>
	Explorercanvas ‏(excanvas.js) هي مكتبة JavaScript مفتوحة المصدر مُرخَّصة برخصة Apache التي تجعل من الممكن استعمال واجهة canvas البرمجية في متصفح Internet Explorer. عليك تضمين وسم<span style="font-family:courier new,courier,monospace;"> &lt;script&gt;</span> الآتي في أعلى صفحتك لكي تستخدمها.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4368_23">
<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">Dive Into HTML5</span><span class="tag">&lt;/title&gt;</span><span class="pln">
    </span><span class="com">&lt;!--[if lt IE 9]&gt;
    &lt;script src="excanvas.js"&gt;&lt;/script&gt;
    &lt;![endif]--&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;/body&gt;</span><span class="pln">
</span><span class="tag">&lt;/html&gt;</span></pre>

<p>
	الأسطر ‎<span style="font-family:courier new,courier,monospace;">&lt;!--[if lt IE 9]&gt;</span>‎ و <span style="font-family:courier new,courier,monospace;">‎&lt;![endif]--&gt;</span>‎ تسمى التعليقات الشرطية. حيث يعاملها Internet Explorer كأنها عبارة <span style="font-family:courier new,courier,monospace;">if</span> الشرطية: "إن كان الإصدار الحالي من متصفح Internet Explorer أقل من الإصدار 9، فنفِّذ الشيفرة الآتية."، وستعامل بقية المتصفحات تلك الشيفرة على أنها تعليقات HTML.
</p>

<p>
	فالخلاصة هي أنَّ متصفح Internet Explorer (الإصدار الثامن والسابع) سيُنزِّل السكربت ثم سيُنفِّذه، لكن ستتجاهله بقية المتصفحات تمامًا، وهذا يجعل صفحتك تُحمَّل بشكلٍ أسرع في المتصفحات التي تدعم واجهة canvas البرمجية داخليًا (أي أنها لن تُنزِّل السكربت، ولن تنفذه، ولن تفعل أيّ شيءٍ معه).
</p>

<p>
	ليس عليك فعل أي شيءٍ إضافي بعد تضمين <span style="font-family:courier new,courier,monospace;">excanvas.js</span> في ترويسة صفحتك. ضمِّن عناصر <span style="font-family:courier new,courier,monospace;">&lt;canvas&gt; </span>في شيفرتك أو أنشِأها ديناميكيًا باستخدام JavaScript، واتبع التعليمات الواردة في هذا الفصل للحصول على لوحة رسم عنصر &lt;canvas&gt;، ثم تستطيع البدء برسم الأشكال والنصوص والنقوش.
</p>

<p>
	ليس تمامًا… هنالك بعض المحدوديات:
</p>

<ul>
<li>
		يمكن أن تكون التدرجات اللونية خطيةً فقط. التدرجات اللونية الشعاعية غير مدعومة.
	</li>
	<li>
		يجب تكرار النقوش (patterns) في كلا الاتجاهين.
	</li>
	<li>
		ميزة Clipping regions غير مدعومة.
	</li>
	<li>
		تغيير الأبعاد غير المنتظم لا يستطيع تغيير أبعاد حدود الأشكال (strokes) بشكلٍ صحيح.
	</li>
</ul>
<p>
	إنها بطيئة؛ ولا أظن أنَّ ذلك صادمٌ لأي شخص، فمن المعلوم أنَّ مُفسِّر JavaScript في متصفح Internet Explorer أبطأ من غيره من المتصفحات؛ فما بالك برسم أشكال معقدة عبر مكتبة JavaScript ستحول الدوال والأوامر إلى تقنيةٍ مختلفة تمامًا؟ لن تلاحظ بطئًا في الأداء في الأمثلة البسيطة مثل رسم بعض الخطوط وإجراء بعض العمليات على صورة، لكنك سترى ذلك بوضوح بعد أن تحاول إنشاء تأثيرات حركية باستخدام تقنية canvas.
</p>

<p>
	هنالك تحذيرٌ آخر حول استخدام <span style="font-family:courier new,courier,monospace;">excanvas.js</span>، وهذه مشكلة واجهتني أثناء إنشاء أمثلة هذا الفصل. يُهيّئ <span style="font-family:courier new,courier,monospace;">ExplorerCanvas</span> واجهته البرمجية لعنصر canvas في مكان تضمينك لسكربت <span style="font-family:courier new,courier,monospace;">excanvas.js</span> في صفحة HTML. لكن ذلك لا يعني أنَّ Internet Explorer جاهزٌ لاستخدامها مباشرةً، وفي بعض الحالات ستواجه حالة خاصة تكون فيها واجهة canvas جاهزة "تقريبًا" (لكن ليس تمامًا) للاستعمال. الأعراض الظاهرة لهذه المشكلة هي أنَّ Internet Explorer سيشتكي من أنَّ "object doesn’t support this property or method" في كل مرة تحاول فيها فعل أي شيء مع عنصر<span style="font-family:courier new,courier,monospace;"> &lt;canvas&gt;</span> مثل الحصول على لوحة الرسم الخاصة به.
</p>

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

<h2>
	مثال متكامل
</h2>

<p>
	"الضامة" هي لعبةٌ قديمةٌ جدًا، وهنالك عدِّة نسخ منها؛ أنشأتُ في هذا المثال نسخة السوليتر (أي التي يلعبها شخصٌ واحد فقط) من الضامة ذات تسعِ قطعٍ في رقعةٍ مقاسها 9×9. تتواجد القطع في بداية اللعبة في مربع 3×3 في الركن الأسفل الأيسر من الرقعة. هدف اللعبة هو نقل جميع القطع كي تُشكِّل مربع 3×3 في الركن الأعلى الأيمن من الرقعة بأقل عدد من الحركات.
</p>

<p>
	هنالك نوعان من الحركات المسموحة في الضامة:
</p>

<p>
	خذ قطعةً وحركها إلى أي مربع فارغ مجاور. المربع "الفارغ" يعني أنَّه لا يحتوي على قطعةٍ فيه حاليًا. أما "مجاور" فهي تعني المربع الذي يقع مباشرةً في شمال أو جنوب أو شرق أو غرب أو الشمال الغربي أو الشمال الشرقي أو الجنوب الغربي أو الجنوب الشرقي من موقع القطعة الحالي (لا يمكن الالتفاف في الرقعة من طرفٍ آخر لآخر، فلو كانت قطعتك في العمود الأيسر من الرقعة، فلا يمكنك أن تحركها نحو الغرب أو الشمال الغربي أو الجنوب الغربي. وإذا كانت قطعتك في السطر الأدنى من الرقعة، فلا تستطيع تحريكها نحو الجنوب أو الجنوب الشرقي أو الجنوب الغربي).
</p>

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

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="17411" href="https://academy.hsoub.com/uploads/monthly_2016_06/016.png.0f8721894d0219b0a92f2654dcd7237f.png" rel=""><img alt="016.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17411" data-unique="2una178n7" src="https://academy.hsoub.com/uploads/monthly_2016_06/016.thumb.png.a984ded713d428046877294bd76d258a.png"></a>
</p>

<p style="text-align: center;">
	<strong>الشكل 16: لقطة شاشة للعبة الضامة</strong>
</p>

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

<p>
	سنُهيّئ اللعبة أثناء تحميل الصفحة بضبط أبعاد عنصر <span style="font-family:courier new,courier,monospace;">&lt;canvas&gt;</span> ثم تخزين مرجع (reference) متعلق بلوحة الرسم.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4368_39">
<span class="pln">gCanvasElement</span><span class="pun">.</span><span class="pln">width </span><span class="pun">=</span><span class="pln"> kPixelWidth</span><span class="pun">;</span><span class="pln">
gCanvasElement</span><span class="pun">.</span><span class="pln">height </span><span class="pun">=</span><span class="pln"> kPixelHeight</span><span class="pun">;</span><span class="pln">
gDrawingContext </span><span class="pun">=</span><span class="pln"> gCanvasElement</span><span class="pun">.</span><span class="pln">getContext</span><span class="pun">(</span><span class="str">"2d"</span><span class="pun">);</span></pre>

<p>
	ثم سنفعل شيئًا لم نفعله من قبل قط: سنضيف متتبع أحداث إلى العنصر <span style="font-family:courier new,courier,monospace;">&lt;canvas&gt;</span> لكي يتتبع حدث النقر على العنصر.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4368_41">
<span class="pln">gCanvasElement</span><span class="pun">.</span><span class="pln">addEventListener</span><span class="pun">(</span><span class="str">"click"</span><span class="pun">,</span><span class="pln"> halmaOnClick</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">);</span></pre>

<p>
	ستُستدَعى الدالة <span style="font-family:courier new,courier,monospace;">halmaOnClick()‎ </span>عندما ينقر المستخدم في أي مكان ضمن العنصر <span style="font-family:courier new,courier,monospace;">canvas</span>، والوسيط الذي يُمرَّر إليها هو كائن <span style="font-family:courier new,courier,monospace;">MouseEvent</span> الذي يحتوي على معلومات حول مكان نقر المستخدم.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4368_43">
<span class="kwd">function</span><span class="pln"> halmaOnClick</span><span class="pun">(</span><span class="pln">e</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

  </span><span class="kwd">var</span><span class="pln"> cell </span><span class="pun">=</span><span class="pln"> getCursorPosition</span><span class="pun">(</span><span class="pln">e</span><span class="pun">);</span><span class="pln">

  </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">var</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;</span><span class="pln"> gNumPieces</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">((</span><span class="pln">gPieces</span><span class="pun">.</span><span class="pln">row </span><span class="pun">==</span><span class="pln"> cell</span><span class="pun">.</span><span class="pln">row</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln">
    </span><span class="pun">(</span><span class="pln">gPieces</span><span class="pun">.</span><span class="pln">column </span><span class="pun">==</span><span class="pln"> cell</span><span class="pun">.</span><span class="pln">column</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      clickOnPiece</span><span class="pun">(</span><span class="pln">i</span><span class="pun">);</span><span class="pln">
      </span><span class="kwd">return</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
  clickOnEmptyCell</span><span class="pun">(</span><span class="pln">cell</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	الخطوة الآتية هي أخذ الكائن <span style="font-family:courier new,courier,monospace;">MouseEvent</span> وحساب في أي مربع في رقعة الضامة قد تم النقر. تحتل رقعة الضامة كامل عنصر <span style="font-family:courier new,courier,monospace;">canvas</span>، ولهذا تكون كل نقرة هي نقرة في مكانٍ ما على الرقعة، وكل ما علينا هو معرفة المكان. هذا أمرٌ معقدٌ بعض الشيء، لأن الأحداث المولدة من الفأرة تختلف بشكلٍ أو بآخر بين المتصفحات.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4368_45">
<span class="kwd">function</span><span class="pln"> getCursorPosition</span><span class="pun">(</span><span class="pln">e</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">var</span><span class="pln"> x</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">var</span><span class="pln"> y</span><span class="pun">;</span><span class="pln">

  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">e</span><span class="pun">.</span><span class="pln">pageX </span><span class="pun">!=</span><span class="pln"> </span><span class="kwd">undefined</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> e</span><span class="pun">.</span><span class="pln">pageY </span><span class="pun">!=</span><span class="pln"> </span><span class="kwd">undefined</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    x </span><span class="pun">=</span><span class="pln"> e</span><span class="pun">.</span><span class="pln">pageX</span><span class="pun">;</span><span class="pln">
    y </span><span class="pun">=</span><span class="pln"> e</span><span class="pun">.</span><span class="pln">pageY</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
  </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    x </span><span class="pun">=</span><span class="pln"> e</span><span class="pun">.</span><span class="pln">clientX </span><span class="pun">+</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">body</span><span class="pun">.</span><span class="pln">scrollLeft </span><span class="pun">+</span><span class="pln">
    document</span><span class="pun">.</span><span class="pln">documentElement</span><span class="pun">.</span><span class="pln">scrollLeft</span><span class="pun">;</span><span class="pln">

    y </span><span class="pun">=</span><span class="pln"> e</span><span class="pun">.</span><span class="pln">clientY </span><span class="pun">+</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">body</span><span class="pun">.</span><span class="pln">scrollTop </span><span class="pun">+</span><span class="pln">
    document</span><span class="pun">.</span><span class="pln">documentElement</span><span class="pun">.</span><span class="pln">scrollTop</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	أصبح لدينا في هذه المرحلة إحداثيات x و y نسبةً إلى المستند (أي صفحة HTML كلها)، أي أنها ليس مفيدةً بعد؛ حيث نريد أن تكون الإحداثيات منسوبةً إلى لوحة الرسم.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4368_47">
<span class="pln">x </span><span class="pun">-=</span><span class="pln"> gCanvasElement</span><span class="pun">.</span><span class="pln">offsetLeft</span><span class="pun">;</span><span class="pln">
y </span><span class="pun">-=</span><span class="pln"> gCanvasElement</span><span class="pun">.</span><span class="pln">offsetTop</span><span class="pun">;</span></pre>

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

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

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4368_49">
<span class="kwd">var</span><span class="pln"> cell </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Cell</span><span class="pun">(</span><span class="typ">Math</span><span class="pun">.</span><span class="pln">floor</span><span class="pun">(</span><span class="pln">y</span><span class="pun">/</span><span class="pln">kPieceHeight</span><span class="pun">),</span><span class="pln">

</span><span class="typ">Math</span><span class="pun">.</span><span class="pln">floor</span><span class="pun">(</span><span class="pln">x</span><span class="pun">/</span><span class="pln">kPieceWidth</span><span class="pun">));</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> cell</span><span class="pun">;</span></pre>

<p>
	أوه! أمرُ الأحداث المرتبطة بالفأرة معقدٌ. لكنك يمكنك استخدام نفس التسلسل المنطقي (أو بالأحرى، يمكنك استخدام نفس الشيفرة) في جميع البرمجيات التي تعتمد على عنصر canvas. تذكر: نقرة بالفأرة ← إحداثيات منسوبة إلى المستند كله ← إحداثيات منسوبة إلى لوحة الرسم ← شيفرة خاصة بالتطبيق.
</p>

<p>
	حسنًا، لنلقِ نظرةً على آلية الرسم الرئيسية. لمّا كانت الرسوميات بسيطةً جدًا، فقررت مسح محتويات لوحة الرسم وإعادة رسم الرقعة في كل مرة يحصل فيها تغييرٌ في اللعبة ولكن هذا ليس ضروريًا. سيحتفظ إطار الرسم في عنصر canvas بمحتواه الذي رسمته عليه حتى لو تخطاه المستخدم بتمريره في الصفحة، أو إذا غيّر إلى لسانٍ (tab) آخر ثم عاد إليه لاحقًا. إذا كنتَ تُطوِّر تطبيقًا مبنيًا على عنصر canvas فيه رسوميات معقدة (مثل ألعاب الورق) فيمكنك تحسين الأداء بتتبع المناطق التي يجب مسحها من لوحة الرسم وإعادة الرسم داخل تلك المناطق فقط. لكن هذا خارجٌ عن نطاق هذا الكتاب.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4368_51">
<span class="pln">gDrawingContext</span><span class="pun">.</span><span class="pln">clearRect</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> kPixelWidth</span><span class="pun">,</span><span class="pln"> kPixelHeight</span><span class="pun">);</span></pre>

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

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6891_7">
<span class="pln">gDrawingContext</span><span class="pun">.</span><span class="pln">beginPath</span><span class="pun">();</span><span class="pln">

</span><span class="com">// الخطوط الشاقولية</span><span class="pln">
</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">var</span><span class="pln"> x </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> x </span><span class="pun">&lt;=</span><span class="pln"> kPixelWidth</span><span class="pun">;</span><span class="pln"> x </span><span class="pun">+=</span><span class="pln"> kPieceWidth</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    gDrawingContext</span><span class="pun">.</span><span class="pln">moveTo</span><span class="pun">(</span><span class="lit">0.5</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> x</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
    gDrawingContext</span><span class="pun">.</span><span class="pln">lineTo</span><span class="pun">(</span><span class="lit">0.5</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> x</span><span class="pun">,</span><span class="pln"> kPixelHeight</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// الخطوط الأفقية</span><span class="pln">
</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">var</span><span class="pln"> y </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> y </span><span class="pun">&lt;=</span><span class="pln"> kPixelHeight</span><span class="pun">;</span><span class="pln"> y </span><span class="pun">+=</span><span class="pln"> kPieceHeight</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    gDrawingContext</span><span class="pun">.</span><span class="pln">moveTo</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0.5</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> y</span><span class="pun">);</span><span class="pln">
    gDrawingContext</span><span class="pun">.</span><span class="pln">lineTo</span><span class="pun">(</span><span class="pln">kPixelWidth</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0.5</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> y</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// لنرسم الرسمة</span><span class="pln">
gDrawingContext</span><span class="pun">.</span><span class="pln">strokeStyle </span><span class="pun">=</span><span class="pln"> </span><span class="str">"#ccc"</span><span class="pun">;</span><span class="pln">
gDrawingContext</span><span class="pun">.</span><span class="pln">stroke</span><span class="pun">();</span></pre>

<p>
	المتعة الحقيقة تبدأ عندما نهم برسم القطع. القطعة هي دائرة، لكننا لم نرسم الدوائر من قبل، وعلاوةً على ذلك، لو اختار المستخدم قطعةً لكي يحركها، فسنحتاج إلى رسم تلك القطعة كدائرة مملوءة. يُمثِّل المعامل p هنا قطعة، التي لها خاصيات row (سطر) و column (عمود) التي تُحدِّد المكان الحالي للقطعة. سنستخدم آلية لتحويل (column, row) إلى إحداثيات منسوبة إلى لوحة الرسم (x, y)، ثم سنرسم دائرة، ثم -إن كانت القطعة مُحدَّدةً من المستخدم- سنملأ الدائرة بلونٍ معين.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4368_32">
<span class="kwd">function</span><span class="pln"> drawPiece</span><span class="pun">(</span><span class="pln">p</span><span class="pun">,</span><span class="pln"> selected</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">var</span><span class="pln"> column </span><span class="pun">=</span><span class="pln"> p</span><span class="pun">.</span><span class="pln">column</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">var</span><span class="pln"> row </span><span class="pun">=</span><span class="pln"> p</span><span class="pun">.</span><span class="pln">row</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">var</span><span class="pln"> x </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">column </span><span class="pun">*</span><span class="pln"> kPieceWidth</span><span class="pun">)</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="pun">(</span><span class="pln">kPieceWidth</span><span class="pun">/</span><span class="lit">2</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">var</span><span class="pln"> y </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">row </span><span class="pun">*</span><span class="pln"> kPieceHeight</span><span class="pun">)</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="pun">(</span><span class="pln">kPieceHeight</span><span class="pun">/</span><span class="lit">2</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">var</span><span class="pln"> radius </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">kPieceWidth</span><span class="pun">/</span><span class="lit">2</span><span class="pun">)</span><span class="pln"> </span><span class="pun">–</span><span class="pln"> </span><span class="pun">(</span><span class="pln">kPieceWidth</span><span class="pun">/</span><span class="lit">10</span><span class="pun">);</span></pre>

<p>
	أصبح لدينا الآن إحداثيات (x, y) منسوبة إلى لوحة الرسم لمركز الدائرة التي نريد رسمها. للأسف لا توجد دالة باسم <span style="font-family:courier new,courier,monospace;">circle()‎</span> في واجهة <span style="font-family:courier new,courier,monospace;">canvas</span> البرمجية، لكن هنالك الدالة <span style="font-family:courier new,courier,monospace;">arc()</span>‎؛ لكن الدائرة ما هي إلا قوسٌ تتصل بدايته مع نهايته. هل تتذكر أساسيات الهندسة؟ تأخذ الدالة <span style="font-family:courier new,courier,monospace;">arc()</span>‎ نقطة المركز (x, y)، ونصف قطر، وزاوية البداية والنهاية (بالردايان)، ورايةً (flag) لتحدد اتجاه الدوران (false لاتجاه دوران عقارب الساعة، و true لعكس جهة دوران عقارب الساعة). يمكنك استخدام وحدة <span style="font-family:courier new,courier,monospace;">Math</span> المبنية في لغة JavaScript لحساب الزوايا بالردايان.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4368_30">
<span class="pln">gDrawingContext</span><span class="pun">.</span><span class="pln">beginPath</span><span class="pun">();</span><span class="pln">
gDrawingContext</span><span class="pun">.</span><span class="pln">arc</span><span class="pun">(</span><span class="pln">x</span><span class="pun">,</span><span class="pln"> y</span><span class="pun">,</span><span class="pln"> radius</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Math</span><span class="pun">.</span><span class="pln">PI </span><span class="pun">*</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">);</span><span class="pln">
gDrawingContext</span><span class="pun">.</span><span class="pln">closePath</span><span class="pun">();</span></pre>

<p>
	انتظر برهة! لم يُرسَم شيء. الدالة <span style="font-family:courier new,courier,monospace;">arc()</span>‎ تشبه عمل <span style="font-family:courier new,courier,monospace;">moveTo()‎</span> و <span style="font-family:courier new,courier,monospace;">lineTo()</span>‎. حيث ترسم "بقلم الرصاص". ولرسم الدائرة فعليًا، علينا ضبط خاصية <span style="font-family:courier new,courier,monospace;">strokeStyle</span> ثم استدعاء الدالة<span style="font-family:courier new,courier,monospace;"> stroke()‎</span> "لتحبيرها".
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4368_28">
<span class="pln">gDrawingContext</span><span class="pun">.</span><span class="pln">strokeStyle </span><span class="pun">=</span><span class="pln"> </span><span class="str">"#000"</span><span class="pun">;</span><span class="pln">
gDrawingContext</span><span class="pun">.</span><span class="pln">stroke</span><span class="pun">();</span></pre>

<p>
	ماذا لو كانت القطعة مُحدَّدةً؟ يمكننا إعادة استخدام نفس المسار الذي أنشأناه لرسم حدود القطعة لملئها بلونٍ معيّن.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4368_26">
<span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">selected</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  gDrawingContext</span><span class="pun">.</span><span class="pln">fillStyle </span><span class="pun">=</span><span class="pln"> </span><span class="str">"#000"</span><span class="pun">;</span><span class="pln">
  gDrawingContext</span><span class="pun">.</span><span class="pln">fill</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span></pre>

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

<p>
	مرحى! لقد أنشأنا لعبةً عبر عنصر <span style="font-family:courier new,courier,monospace;">canvas</span> برسم 9 دوائر وبعض المستقيمات ودالة وحيدة مرتبطة بالحدث <span style="font-family:courier new,courier,monospace;">onclick</span>.
</p>

<p>
	لمزيد من المعلومات حول عنصر canvas يمكنك الإطلاع على سلسلة <a href="https://academy.hsoub.com/search/?tags=js+canvas+101" rel="">التعامل مع العنصر canvas باستخدام جافاسكربت</a>.
</p>

<p>
	ترجمة -وبتصرّف- لفصل "<a href="http://diveinto.html5doctor.com/canvas.html" rel="external nofollow">Canvas</a>" من كتاب <a href="http://diveinto.html5doctor.com/index.html" rel="external nofollow">Dive Into HTML5</a> لمؤلفه Mark Pilgrim.
</p>

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

<ul>
<li>
		المقال التالي: <a href="https://academy.hsoub.com/programming/html/html5/%D8%B5%D9%8A%D8%BA-%D8%AA%D8%B1%D9%85%D9%8A%D8%B2-%D8%A7%D9%84%D9%81%D9%8A%D8%AF%D9%8A%D9%88-%D9%88%D8%A7%D9%84%D8%B5%D9%88%D8%AA-%D9%88%D8%AD%D8%A7%D9%88%D9%8A%D8%A7%D8%AA%D9%87%D8%A7-%D9%88%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%B9%D9%85%D9%84%D9%87%D8%A7-%D9%81%D9%8A-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r350/" rel="">صيغ ترميز الفيديو والصوت وحاوياتها وكيفية عملها في الويب</a>
	</li>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/html/html5/%D8%A7%D9%83%D8%AA%D8%B4%D8%A7%D9%81-%D8%AF%D8%B9%D9%85-%D8%A7%D9%84%D9%85%D8%AA%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D9%84%D9%85%D9%8A%D8%B2%D8%A7%D8%AA-html5-r340/" rel="">اكتشاف دعم المتصفحات لميزات HTML5</a>
	</li>
	<li>
		النسخة العربية الكاملة من كتاب <a href="https://academy.hsoub.com/files/13-%D9%86%D8%AD%D9%88-%D9%81%D9%87%D9%85-%D8%A7%D9%94%D8%B9%D9%85%D9%82-%D9%84%D8%AA%D9%82%D9%86%D9%8A%D8%A7%D8%AA-html5/" rel="">نحو فهم أعمق لتقنيات HTML5 </a>
	</li>
</ul>
]]></description><guid isPermaLink="false">345</guid><pubDate>Thu, 09 Jun 2016 18:34:00 +0000</pubDate></item><item><title>&#x627;&#x643;&#x62A;&#x634;&#x627;&#x641; &#x62F;&#x639;&#x645; &#x627;&#x644;&#x645;&#x62A;&#x635;&#x641;&#x62D;&#x627;&#x62A; &#x644;&#x645;&#x64A;&#x632;&#x627;&#x62A; HTML5</title><link>https://academy.hsoub.com/programming/html/%D8%A7%D9%83%D8%AA%D8%B4%D8%A7%D9%81-%D8%AF%D8%B9%D9%85-%D8%A7%D9%84%D9%85%D8%AA%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D9%84%D9%85%D9%8A%D8%B2%D8%A7%D8%AA-html5-r340/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_05/html5-support.png.a21b283065b5688b8f426344306cd870.png" /></p>

<p dir="rtl">
	ربما تتساءل: "كيف أستطيع البدء باستخدام HTML5 إن لم تكن تدعمها المتصفحات القديمة؟" لكن السؤال نفسه مُضلِّل، فليست HTML5 شيئًا واحدًا كبيرًا، وإنما هي مجموعة من الميزات المتفرقة، فلا يمكنك الكشف عن "دعم HTML5" لأن هذا غير منطقي، وإنما يمكنك الكشف عن دعم الميزات المتفرقة مثل canvas أو تشغيل الفيديو أو تحديد الموقع الجغرافي.
</p>

<p dir="rtl" style="text-align: center;">
	<img alt="html5-support.png" class="ipsImage ipsImage_thumbnailed" data-fileid="16778" data-unique="h22qe3xks" src="https://academy.hsoub.com/uploads/monthly_2016_05/html5-support.png.ee7a042064bff097de7513345cd92978.png"></p>

<h2 dir="rtl">
	تقنيات الاكتشاف
</h2>

<p dir="rtl">
	عندما يُحمِّل متصفحك صفحة ويب، فإنه يُنشِئ ما نسميه "Document Object Model" (اختصارًا DOM)، الذي هو مجموعة من الكائنات التي تُمثِّل عناصر HTML الموجودة في الصفحة، فكل عنصر -كل وسم <span style="font-family:courier new,courier,monospace;">&lt;p&gt; </span>أو <span style="font-family:courier new,courier,monospace;">&lt;div&gt;</span> أو <span style="font-family:courier new,courier,monospace;">&lt;span&gt;</span>- يُمثَّل في DOM بكائن مختلف (هنالك كائنات عامة مثل <span style="font-family:courier new,courier,monospace;">window</span> و <span style="font-family:courier new,courier,monospace;">document</span>، التي لا ترتبط بعناصر محددة).
</p>

<p dir="rtl">
	تتشارك جميع كائنات DOM بمجموعةٍ من الخاصيات المشتركة، لكن لبعض الكائنات خاصيات أكثر من بعضها الآخر. ويكون لدى بعض الكائنات خاصيات فريدة في المتصفحات التي تدعم ميزات HTML5؛ لذلك يكون من الكافي عادةً إلقاء نظرة على DOM لتعرف ما هي الميزات المدعومة.
</p>

<p dir="rtl">
	هنالك أربع تقنيات أساسية لاكتشاف دعم المتصفح لميزة مُحدَّدة، هذه هي بالترتيب من الأبسط إلى الأكثر تعقيدًا:
</p>

<ol dir="rtl">
<li>
		التحقق من وجود خاصية معينة في كائن عام (مثل <span style="font-family:courier new,courier,monospace;">window</span> أو <span style="font-family:courier new,courier,monospace;">navigator</span>)، مثلما هو عليه الحال مع دعم تحديد الموقع الجغرافي.
	</li>
	<li>
		إنشاء عنصر، ثم التحقق من وجود خاصية معيّنة في ذاك العنصر، مثلما هو عليه الحال مع تحديد دعم canvas.
	</li>
	<li>
		إنشاء عنصر، ثم التحقق من وجود دالة (method) معينة في ذاك العنصر، ثم استدعاء تلك الدالة والتحقق من القيمة التي تُعيدها. مثلما هو عليه الحال مع معرفة صيغ الفيديو المدعومة.
	</li>
	<li>
		إنشاء عنصر، وضبط خاصية فيه إلى قيمةٍ معيّنة، ثم التحقق من أنَّ تلك الخاصية قد احتفظت بقيمتها. مثل ما هو عليه الحال مع معرفة أنواع حقول <span style="font-family:courier new,courier,monospace;">&lt;input&gt;</span> المدعومة.
	</li>
</ol>
<h2 dir="rtl">
	Modernizr: مكتبة اكتشاف دعم ميزات HTML5
</h2>

<p dir="rtl">
	<a href="http://www.modernizr.com/" rel="external nofollow">Modernizr</a> هي مكتبة JavaScript مفتوحة المصدر مُرخَّصة برخصة MIT مهمتها اكتشاف الدعم للعديد من ميزات HTML5 و CSS3، وأنصحك باستعمال آخر إصدار منها دومًا. عليك -لاستعمالها- تضمينها عبر عنصر <span style="font-family:courier new,courier,monospace;">&lt;script&gt;</span> في ترويسة (header) صفحتك كما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_122_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">Dive Into HTML5</span><span class="tag">&lt;/title&gt;</span><span class="pln">
    </span><span class="tag">&lt;script</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"modernizr.min.js"</span><span class="tag">&gt;&lt;/script&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;/body&gt;</span><span class="pln">
</span><span class="tag">&lt;/html&gt;</span></pre>

<p dir="rtl">
	سيعمل Modernizr تلقائيًا، فلا توجد هنالك دالة <span style="font-family:courier new,courier,monospace;">modernizr_init()‎</span> لكي تستدعيها. فعندما يُشغَّل السكربت، فإنه يُنشِئ كائنًا عامًا اسمه <span style="font-family:courier new,courier,monospace;">Modernizr</span> يحتوي على مجموعة من الخاصيات المنطقية (أي <span style="font-family:courier new,courier,monospace;">True</span> أو <span style="font-family:courier new,courier,monospace;">False</span>) لكل خاصية يمكنه الكشف عن دعمها. فعلى سبيل المثال، إن كان متصفحك يدعم استخدام canvas، فإن قيمة الخاصية <span style="font-family:courier new,courier,monospace;">Modernizr.canvas</span> ستكون <span style="font-family:courier new,courier,monospace;">True</span>، وإن لم يكن متصفحك يدعمها، فستكون قيمة الخاصية <span style="font-family:courier new,courier,monospace;">Modernizr.canvas</span> مساويةً إلى <span style="font-family:courier new,courier,monospace;">False</span>.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_122_9">
<span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Modernizr</span><span class="pun">.</span><span class="pln">canvas</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// لنرسم بعض  الأشكال</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// لا يوجد دعم لخاصية canvas</span><span class="pln">
</span><span class="pun">}</span></pre>

<h2 dir="rtl">
	الكشف عن دعم Canvas
</h2>

<p dir="rtl">
	تُعرِّف HTML العنصر <span style="font-family:courier new,courier,monospace;">&lt;canvas&gt;</span> على أنه "لوحة نقطية ذات أبعاد معينة يمكن استخدامها لعرض المخططات ورسومات الألعاب وغيرها من الصور المرئية برمجيًا". ويُمثِّل مستطيلًا في صفحتك حيث تستخدم JavaScript لرسم أي شيء تريده فيه، وتُعرِّف HTML5 مجموعةً من الدوال (تدعى "canvas <abbr title="Application Programming Interface | واجهة برمجية">API</abbr>") لرسم الأشكال (shapes) وتعريف المسارات (paths) وإنشاء التدرجات اللونية وتطبيقات التحويلات (transformations) على العناصر.
</p>

<p dir="rtl">
	سنستخدم تقنية الكشف عن الدعم الثانية للتحقق من دعم المتصفح للعنصر canvas، فإن دعم متصفحك واجهة canvas البرمجية (<abbr title="Application Programming Interface | واجهة برمجية">API</abbr>) فهذا يعني أن الكائن في DOM الذي يُمثِّل عنصر<span style="font-family:courier new,courier,monospace;"> &lt;canvas&gt;</span> سيملك الدالة <span style="font-family:courier new,courier,monospace;">getContext()</span>‎، وإن لم يكن يدعم متصفحك واجهة canvas البرمجية، فسيملك الكائن المُنشَأ لعنصر <span style="font-family:courier new,courier,monospace;">&lt;canvas&gt;</span> الخاصيات العامة لكل العناصر، وليس من بينها أي شيءٍ متعلقٍ بتقنية canvas.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_122_14">
<span class="kwd">function</span><span class="pln"> supports_canvas</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> </span><span class="pun">!!</span><span class="pln">document</span><span class="pun">.</span><span class="pln">createElement</span><span class="pun">(</span><span class="str">'canvas'</span><span class="pun">).</span><span class="pln">getContext</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

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

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_122_16">
<span class="kwd">return</span><span class="pln"> </span><span class="pun">!!</span><span class="pln">document</span><span class="pun">.</span><span class="pln">createElement</span><span class="pun">(</span><span class="str">'canvas'</span><span class="pun">).</span><span class="pln">getContext</span><span class="pun">;</span></pre>

<p dir="rtl">
	وبعد إنشاء عنصر <span style="font-family:courier new,courier,monospace;">&lt;canvas&gt;</span>، ستختبر وجود الدالة<span style="font-family:courier new,courier,monospace;"> getContext()‎</span>، فستكون هذه الدالة موجودةً إذا كان المتصفح يدعم واجهة canvas البرمجية.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_122_18">
<span class="kwd">return</span><span class="pln"> </span><span class="pun">!!</span><span class="pln">document</span><span class="pun">.</span><span class="pln">createElement</span><span class="pun">(</span><span class="str">'canvas'</span><span class="pun">).</span><span class="pln">getContext</span><span class="pun">;</span></pre>

<p dir="rtl">
	وفي النهاية، استعملنا علامة النفي المزدوجة (!!) كي تكون النتيجة قيمةً منطقية (أي true أو false).
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_122_20">
<span class="kwd">return</span><span class="pln"> </span><span class="pun">!!</span><span class="pln">document</span><span class="pun">.</span><span class="pln">createElement</span><span class="pun">(</span><span class="str">'canvas'</span><span class="pun">).</span><span class="pln">getContext</span><span class="pun">;</span></pre>

<p dir="rtl">
	تكتشف هذه الدالة الدعم لأغلبية مكونات واجهة canvas البرمجية، بما في ذلك الأشكال، والمسارات، والتدرجات اللونية والأنماط. لكنها لا تكتشف وجود المكتبة الخارجية explorercanvas التي تسمح باستخدام واجهة canvas البرمجية في متصفح Internet Explorer.
</p>

<p dir="rtl">
	وبدلًا من كتابة الدالة السابقة بنفسك، تستطيع استعمال Modernizr للكشف عن دعم واجهة canvas البرمجية.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_122_22">
<span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Modernizr</span><span class="pun">.</span><span class="pln">canvas</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// لنرسم بعض الأشكال</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// لا يوجد دعم لخاصية canvas :(</span><span class="pln">
</span><span class="pun">}</span></pre>

<p dir="rtl">
	هنالك اختبارٌ منفصلٌ للتحقق من دعم واجهة canvas text البرمجية، وذلك في الفقرة الآتية.
</p>

<h3 dir="rtl">
	الكشف عن دعم النصوص في عنصر Canvas
</h3>

<p dir="rtl">
	حتى لو كان يدعم متصفحك واجهة canvas البرمجية، فقد لا يدعم واجهة canvas text البرمجية، فنَمَتْ واجهة canvas البرمجية على مر الزمن، وأُضيفت دوال النصوص في فترةٍ لاحقة، لهذا هنالك بعض المتصفحات التي تدعم canvas لكن قبل أن يكتمل العمل على دوال النصوص.
</p>

<p dir="rtl">
	سنستخدم تقنية الكشف عن الدعم الثانية للتحقق من دعم المتصفح للعنصر canvas، فإن دعم متصفحك واجهة canvas البرمجية (<abbr title="Application Programming Interface | واجهة برمجية">API</abbr>) فهذا يعني أن الكائن في DOM الذي يُمثِّل عنصر &lt;canvas&gt; سيملك الدالة getContext()‎، وإن لم يكن يدعم متصفحك واجهة canvas البرمجية، فسيملك الكائن المُنشَأ لعنصر &lt;canvas&gt; الخاصيات العامة لكل العناصر، وليس من بينها أي شيءٍ متعلقٍ بتقنية canvas.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_122_49">
<span class="kwd">function</span><span class="pln"> supports_canvas_text</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">supports_canvas</span><span class="pun">())</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
  </span><span class="kwd">var</span><span class="pln"> dummy_canvas </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">createElement</span><span class="pun">(</span><span class="str">'canvas'</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">var</span><span class="pln"> context </span><span class="pun">=</span><span class="pln"> dummy_canvas</span><span class="pun">.</span><span class="pln">getContext</span><span class="pun">(</span><span class="str">'2d'</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">typeof</span><span class="pln"> context</span><span class="pun">.</span><span class="pln">fillText </span><span class="pun">==</span><span class="pln"> </span><span class="str">'function'</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p dir="rtl">
	تبدأ الدالة السابقة بالتحقق من دعم canvas باستخدام دالة <span style="font-family:courier new,courier,monospace;">supports_canvas()‎</span> التي رأيتها في القسم السابق، فإن لم يكن يدعم متصفحك واجهة canvas البرمجية، فهو بالتأكيد لن يدعم إضافة النصوص إلى عناصر canvas.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_122_51">
<span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">supports_canvas</span><span class="pun">())</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span></pre>

<p dir="rtl">
	ثم ستُنشِئ عنصر <span style="font-family:courier new,courier,monospace;">&lt;canvas&gt;</span> جديد ثم تحاول الوصول إلى "لوحة الرسم" (drawing context)، ومن المؤكد أن ما سبق سيعمل دون مشاكل لأن الدالة <span style="font-family:courier new,courier,monospace;">supports_canvas()‎</span> قد تحققت من وجود الدالة<span style="font-family:courier new,courier,monospace;"> getContext()‎</span> في جميع عناصر canvas.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_122_53">
<span class="kwd">var</span><span class="pln"> dummy_canvas </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">createElement</span><span class="pun">(</span><span class="str">'canvas'</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">var</span><span class="pln"> context </span><span class="pun">=</span><span class="pln"> dummy_canvas</span><span class="pun">.</span><span class="pln">getContext</span><span class="pun">(</span><span class="str">'2d'</span><span class="pun">);</span></pre>

<p dir="rtl">
	وفي النهاية، ستتحقق إن كان لدى لوحة الرسم الدالة <span style="font-family:courier new,courier,monospace;">fillText()</span>‎، فإن كانت تملكها، فهنالك دعمٌ للنصوص في canvas.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_122_55">
<span class="kwd">return</span><span class="pln"> </span><span class="kwd">typeof</span><span class="pln"> context</span><span class="pun">.</span><span class="pln">fillText </span><span class="pun">==</span><span class="pln"> </span><span class="str">'function'</span><span class="pun">;</span></pre>

<p dir="rtl">
	وبدلًا من كتابة الدالة السابقة بنفسك، تستطيع استعمال Modernizr للكشف عن دعم واجهة canvas text البرمجية.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_122_57">
<span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Modernizr</span><span class="pun">.</span><span class="pln">canvastext</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// لنضع بعض النصوص</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// لا يوجد دعم لخاصية canvas text</span><span class="pln">
</span><span class="pun">}</span></pre>

<h2 dir="rtl">
	الكشف عن دعم الفيديو
</h2>

<p dir="rtl">
	أضافت HTML5 عنصرًا جديدًا هو <span style="font-family:courier new,courier,monospace;">&lt;video&gt;</span> لتضمين مقاطع الفيديو في صفحات الويب، كان تضمين الفيديو في السابق من المستحيلات دون استخدام إضافات خارجية مثل Apple QuickTime®‎ أو Adobe Flash®‎.
</p>

<p dir="rtl">
	صُمِّمَ عنصر <span style="font-family:courier new,courier,monospace;">&lt;video&gt;</span> ليُستعمَل دون الحاجة إلى أيّة سكربتات للكشف عن الدعم، فيمكنك تحديد عدِّة مسارات لمقاطع الفيديو، وستختار المتصفحات التي تدعم HTML5 video أحدها بناءً على الصيغ التي تدعمها.
</p>

<p dir="rtl">
	المتصفحات التي لا تدعم HTML5 video ستتجاهل وسم <span style="font-family:courier new,courier,monospace;">&lt;video&gt; </span>تمامًا. لكنك تستطيع استخدام ذلك لصالحك بإخبارها أن تُشغِّل المقطع باستخدام إضافة خارجية. برمَج Kroc Camen حلًا اسمه <a href="http://camendesign.com/code/video_for_everybody" rel="external nofollow">Video for Everybody!</a>‎ الذي يستخدم دعم الفيديو في HTML5 عند توفره، لكنه سيعود إلى استخدام QuickTime أو Flash في المتصفحات القديمة. لا يستعمل هذا الحل JavaScript مطلقًا، ويعمل نظريًا على أي متصفح، بما في ذلك متصفحات الهواتف المحمولة.
</p>

<p dir="rtl">
	إذا أردت القيام بأكثر من مجرد وضع الفيديو في صفحتك وتشغيله، فستحتاج إلى استخدام JavaScript، نستخدم التقنية الثانية للتحقق من دعم الفيديو. فإذا كان متصفحك يدعم HTML5 video، فإن كائن DOM الذي سيُنشئه المتصفح لتمثيل عنصر<span style="font-family:courier new,courier,monospace;"> &lt;video&gt;</span> سيملك الخاصية <span style="font-family:courier new,courier,monospace;">canPlayType()</span>‎. وإن لم يكن يدعم متصفحك HTML5 video، فإن كائن DOM المُنشَأ لعنصر <span style="font-family:courier new,courier,monospace;">&lt;video&gt;</span> سيملك الخاصيات العامة لأي عنصر. يمكنك التحقق من دعم الفيديو عبر هذه الدالة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_122_59">
<span class="kwd">function</span><span class="pln"> supports_video</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> </span><span class="pun">!!</span><span class="pln">document</span><span class="pun">.</span><span class="pln">createElement</span><span class="pun">(</span><span class="str">'video'</span><span class="pun">).</span><span class="pln">canPlayType</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p dir="rtl">
	وبدلًا من كتابة الدالة السابقة بنفسك، تستطيع استعمال Modernizr للكشف عن دعم HTML5 video.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_122_61">
<span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Modernizr</span><span class="pun">.</span><span class="pln">video</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// لنشغل مقاطع الفيديو</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// لا يوجد دعم للفيديو :(</span><span class="pln">
  </span><span class="com">// ربما علينا استخدام QuickTime أو Flash بدلًا منه</span><span class="pln">
</span><span class="pun">}</span></pre>

<p dir="rtl">
	سأشرح -في الدرس الخاص بالفيديو- حلًا آخر يستعمل تقنيات الكشف السابقة لتحويل عناصر<span style="font-family:courier new,courier,monospace;"> &lt;video&gt;</span> إلى مشغلات فيديو مبنية على تقنية Flash، وذلك لتشغيل الفيديو على المتصفحات التي لا تدعم HTML5 video.
</p>

<p dir="rtl">
	هنالك اختبارٌ منفصلٌ للتحقق من صيغ الفيديو التي يمكن للمتصفح تشغيلها، مشروحٌ في الفقرة الآتية.
</p>

<h3 dir="rtl">
	صيغ الفيديو
</h3>

<p dir="rtl">
	مَثَلُ صيغ الفيديو كمَثَلِ اللغات المكتوبة، فقد تحتوي صحيفة إنكليزية على نفس المعلومات التي تحتويها صحيفة عربية، لكن إن كنت تقرأ اللغة العربية فقط، فستكون إحدى تلك الصحيفتين مفيدةً لك. ولتشغيل مقطع فيديو، يجب أن يفهم المتصفح "اللغة" التي كُتِبَ فيها هذا المقطع.
</p>

<p dir="rtl">
	تسمى "اللغة" التي تكتب فيها مقاطع الفيديو "بالمرماز" (codec) الذي هو الخوارزمية المستخدمة لترميز (encode) مقطع الفيديو إلى سلسلة من البتات، وهنالك عدِّة مرمزات، لكن أيها تستعمل؟ في الواقع، من المؤسف أن المتصفحات لم تتوافق على مرماز معيّن، لكنهم قللوا الخيارات إلى خيارين فقط. أحدهما يكلف مالًا (بسبب براءة الاختراع)، لكنه يعمل في متصفح <a href="http://www.apple.com/safari/" rel="external nofollow">Safari</a> وفي iPhone (وهو يعمل أيضًا في مشغلات Flash إن كنت ستستعمل حلًا مثل <a href="http://camendesign.com/code/video_for_everybody" rel="external nofollow">Video for Everybody!</a>‎). أما المزمار الآخر فهو مجاني ويعمل على المتصفحات مفتوحة المصدر مثل <a href="http://code.google.com/chromium/" rel="external nofollow">Chromium</a> و <a href="http://www.getfirefox.com/" rel="external nofollow">Firefox</a>.
</p>

<p dir="rtl">
	نستخدم التقنية الثالثة لمعرفة صيغ الفيديو المدعومة. وإذا كان متصفحك يدعم HTML5 video، فإن كائن DOM الذي سيُنشئه المتصفح لتمثيل عنصر <span style="font-family:courier new,courier,monospace;">&lt;video&gt;</span> سيملك الخاصية<span style="font-family:courier new,courier,monospace;"> canPlayType()‎</span>. ستخبرك الطريقة الآتية إن كان متصفحك يدعم صيغة فيديو معينة.
</p>

<p dir="rtl">
	تتحقق هذه الدالة من دعم الصيغة المحمية بحقوق براءة الاختراع والمدعومة من أجهزة Mac و iPhone.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_122_29">
<span class="kwd">function</span><span class="pln"> supports_h264_baseline_video</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">supports_video</span><span class="pun">())</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
  </span><span class="kwd">var</span><span class="pln"> v </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">createElement</span><span class="pun">(</span><span class="str">"video"</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> v</span><span class="pun">.</span><span class="pln">canPlayType</span><span class="pun">(</span><span class="str">'video/mp4; codecs="avc1.42E01E, mp4a.40.2"'</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p dir="rtl">
	تبدأ هذه الدالة بالتحقق من دعم HTML video في المتصفح، وذلك باستخدام الدالة <span style="font-family:courier new,courier,monospace;">supports_video()‎</span> التي رأيتها في القسم السابق. فإن لم يكن يدعم متصفحك HTML5 video، فهو بالتأكيد لن يدعم أيّة صيغة من صيغ الفيديو.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_122_31">
<span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">supports_video</span><span class="pun">())</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span></pre>

<p dir="rtl">
	ثم ستُنشِئ الدالة عنصر <span style="font-family:courier new,courier,monospace;">&lt;video&gt; </span>(لكن دون أن تضيفه إلى الصفحة، أي أنه لن يكون مرئيًا) وتستدعي الدالة<span style="font-family:courier new,courier,monospace;"> canPlayType()‎</span>، من المؤكد وجود هذه الدالة لأن الدالة <span style="font-family:courier new,courier,monospace;">supports_video()‎ </span>تحققت منها في الخطوة السابقة.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_122_33">
<span class="kwd">var</span><span class="pln"> v </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">createElement</span><span class="pun">(</span><span class="str">"video"</span><span class="pun">);</span></pre>

<p dir="rtl">
	في الواقع، "صيغة الفيديو" هي مجموعة من عدِّة أشياء، فبكلامٍ تقني، أنت تسأل المتصفح إن كان يستطيع تشغيل فيديو H.264 بنمط Baseline مع صوت AAC LC في حاوية MPEG-4.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_122_35">
<span class="kwd">return</span><span class="pln"> v</span><span class="pun">.</span><span class="pln">canPlayType</span><span class="pun">(</span><span class="str">'video/mp4; codecs="avc1.42E01E, mp4a.40.2"'</span><span class="pun">);</span></pre>

<p dir="rtl">
	لن تُعيد الدالة <span style="font-family:courier new,courier,monospace;">canPlayType()‎</span> القيمة true أو false، وإنما ستعيد سلسلة نصية آخذةً بعين الاعتبار الطبيعة المُعقَّدة لصيغ الفيديو:
</p>

<ul dir="rtl">
<li>
		"probably" إن كان المتصفح واثقًا أنه يستطيع تشغيل هذه الصيغة
	</li>
	<li>
		"maybe" إن ظن المتصفح أنه يستطيع تشغيل هذه الصيغة
	</li>
	<li>
		"" (سلسلة نصية فارغة) إن كان المتصفح متأكدًا أنه لن يستطيع تشغيل هذه الصيغة
	</li>
</ul>
<p dir="rtl">
	أما الدالة الآتية فهي تتحقق من دعم صيغة الفيديو المفتوحة المدعومة من متصفح Firefox وغيره من المتصفحات مفتوحة المصدر. العملية مماثلة تمامًا لما سبق، لكن الاختلاف الوحيد هو في السلسلة النصية التي تمررها إلى الدالة <span style="font-family:courier new,courier,monospace;">canPlayType()</span>‎. تقنيًا، أنت تسأل المتصفح إن كان قادرًا على تشغيل فيديو Theora مع صوت Vorbis في حاوية Ogg.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_122_37">
<span class="kwd">function</span><span class="pln"> supports_ogg_theora_video</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">supports_video</span><span class="pun">())</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
  </span><span class="kwd">var</span><span class="pln"> v </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">createElement</span><span class="pun">(</span><span class="str">"video"</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> v</span><span class="pun">.</span><span class="pln">canPlayType</span><span class="pun">(</span><span class="str">'video/ogg; codecs="theora, vorbis"'</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p dir="rtl">
	في النهاية، <a href="http://www.webmproject.org/" rel="external nofollow">WebM</a> هو مرماز فيديو جديد ومفتوح المصدر (وغير محمي ببراءة اختراع) تم دعمه في الإصدارات الجديدة من المتصفحات الحديثة، بما في ذلك Chrome، و Firefox، و <a href="http://labs.opera.com/news/2010/05/19/" rel="external nofollow">Opera</a>. ويمكنك استخدام نفس التقنية السابقة لاكتشاف دعم صيغة WebM.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_122_40">
<span class="kwd">function</span><span class="pln"> supports_webm_video</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">supports_video</span><span class="pun">())</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
  </span><span class="kwd">var</span><span class="pln"> v </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">createElement</span><span class="pun">(</span><span class="str">"video"</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> v</span><span class="pun">.</span><span class="pln">canPlayType</span><span class="pun">(</span><span class="str">'video/webm; codecs="vp8, vorbis"'</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p dir="rtl">
	بدلًا من كتابة هذه الدالة بنفسك، يمكنك استعمال Modernizr (الإصدار 1.5 أو ما بعده) لاكتشاف الدعم لمختلف صيغ الفيديو في HTML5.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_122_42">
<span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Modernizr</span><span class="pun">.</span><span class="pln">video</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// لنشغل مقاطع الفيديو! لكن ما صيغتها؟</span><span class="pln">
  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Modernizr</span><span class="pun">.</span><span class="pln">video</span><span class="pun">.</span><span class="pln">webm</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="com">// لنجرب WebM</span><span class="pln">
  </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Modernizr</span><span class="pun">.</span><span class="pln">video</span><span class="pun">.</span><span class="pln">ogg</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="com">// لنجرب Ogg Theora + Vorbis في حاوية Ogg</span><span class="pln">
  </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Modernizr</span><span class="pun">.</span><span class="pln">video</span><span class="pun">.</span><span class="pln">h264</span><span class="pun">){</span><span class="pln">
    </span><span class="com">// لنجرب H.264 video + AAC audio في حاوية MP4</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<h2 dir="rtl">
	التخزين المحلي Local Storage
</h2>

<p dir="rtl">
	يوفر التخزين المحلي لمواقع الويب طريقةً لتخزين المعلومات على حاسوبك ثم استعادتها لاحقًا، مفهومها مشابه لمفهوم "الكعكات" (cookies)، لكنها مصممة لكمية معلومات أكبر، فالكعكات محدودة الحجم، ويرسلها المتصفح إلى خادوم الويب في كل مرة يطلب فيها صفحة جديدة (مما يأخذ وقتًا أطول ويستهلك بيانات التراسل). أما تخزين HTML5 فهو يبقى في حاسوبك، وتستطيع مواقع الويب الوصول إليه عبر JavaScript بعد أن يتم تحميل الصفحة.
</p>

<ul dir="rtl">
<li>
		<strong>س</strong>: هل التخزين المحلي هو جزءٌ من HTML5؟ ولماذا وضعوه في معيار منفصل؟
	</li>
	<li>
		<strong>ج</strong>: الجواب المختصر هو "نعم"، التخزين المحلي هو جزءٌ من HTML5. أما الجواب الأطول فهو أن التخزين المحلي كان جزءًا من معيار HTML5 الرئيسي، لكنه أصبح معيارًا منفصلًا بسبب شكوى بعض الأشخاص في مجموعة عمل HTML5 أن HTML5 أصبحت كبيرة جدًا. حتى لو كان ذلك يشبه تقسيم شطيرة إلى قطع صغيرة لتقليل كمية الحريرات :-| حسنًا، أهلًا بك في العالم العجيب للمعايير القياسية.
	</li>
</ul>
<p dir="rtl">
	سنستخدم تقنية الكشف الأولى للتحقق من دعم المتصفح للتخزين المحلي، فإن دَعَم متصفحك التخزين المحلي، فستكون هنالك خاصية <span style="font-family:courier new,courier,monospace;">localStorage</span> في كائن <span style="font-family:courier new,courier,monospace;">window</span> العام. وإن لم يكن يدعم متصفحك التخزين المحلي، فلن تكون الخاصية <span style="font-family:courier new,courier,monospace;">localStorage</span> معرَّفةً. وبسبب علِّة في الإصدارات القديمة من Firefox، سيسبب هذا الخيار بحدوث استثناء (exception) إن كانت الكعكات (cookies) مُعطَّلةً، لذلك وضعنا الاختبار في عبارة <span style="font-family:courier new,courier,monospace;">try..catch</span>.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_122_44">
<span class="kwd">function</span><span class="pln"> supports_local_storage</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">try</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> </span><span class="str">'localStorage'</span><span class="pln"> in window </span><span class="pun">&amp;&amp;</span><span class="pln"> window</span><span class="pun">[</span><span class="str">'localStorage'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">!==</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">catch</span><span class="pun">(</span><span class="pln">e</span><span class="pun">){</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p dir="rtl">
	بدلًا من كتابة هذه الدالة بنفسك، يمكنك استعمال Modernizr (الإصدار 1.1 أو ما بعده) لاكتشاف الدعم للتخزين المحلي.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_122_46">
<span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Modernizr</span><span class="pun">.</span><span class="pln">localstorage</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// متوفرة!</span><span class="pln">
  window</span><span class="pun">.</span><span class="pln">localStorage 
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// لا يوجد دعم للتخزين المحلي</span><span class="pln">
  </span><span class="com">// ربما تجرب Gears أو مكتبة أخرى</span><span class="pln">
</span><span class="pun">}</span></pre>

<p dir="rtl">
	لاحظ أنَّ JavaScript حساسة لحالة الأحرف، إذ تُدعى خاصية Modernizr ‏"localstorage" (جميعها بأحرفٍ صغيرة)، أما خاصية DOM فهي <span style="font-family:courier new,courier,monospace;">window.localStorage</span> (حرف S كبير).
</p>

<ul>
<li>
		<strong>س</strong>: ما مدى أمان قاعدة بيانات التخزين المحلي في HTML5؟ هل يستطيع أحدٌ قراءتها؟
	</li>
	<li>
		<strong>ج</strong>: أي شخص لديه وصولٌ فيزيائيٌ لحاسوبك قد يستطيع عرض (أو حتى تعديل) البيانات الموجودة في قاعدة بيانات التخزين المحلي في HTML5. ويستطيع أي موقع ويب قراءة وتخزين القيم الخاصة به، لكن لا يستطيع الوصول إلى القيم التي خزنتها المواقع الأخرى، وهذا يسمى same-origin restriction.
	</li>
</ul>
<h2>
	Web Workers
</h2>

<p>
	توفر ميزة Web Workers طريقةً قياسيةً لتشغيل JavaScript في الخلفية، إذ تستطيع تشغيل عدِّة "خيوط" (threads) التي تعمل في نفس الوقت تقريبًا (تذكر طريقة تشغيل الحاسوب لعدِّة تطبيقات معًا في آنٍ واحد)، تستطيع تلك الخيوط التي تعمل في الخلفية أن تجري عمليات حسابية معقدة، أو أن تجري طلبيات شبكيّة، أو أن تصل إلى التخزين المحلي في أثناء استجابة صفحة الويب إلى تفاعل المستخدم معها.
</p>

<p>
	نستعمل طريقة الاكتشاف الأولى لمعرفة إن كان المتصفح يدعم واجهة Web Worker البرمجية، وذلك إن وُجِدَت الخاصية <span style="font-family:courier new,courier,monospace;">Worker</span> في الكائن العام <span style="font-family:courier new,courier,monospace;">window</span>، وإن لم يكن يدعم متصفحك واجهة Web Worker البرمجية، فستكون خاصية <span style="font-family:courier new,courier,monospace;">Worker</span> غير معرفة.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1216_9">
<span class="kwd">function</span><span class="pln"> supports_web_workers</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> </span><span class="pun">!!</span><span class="pln">window</span><span class="pun">.</span><span class="typ">Worker</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	بدلًا من كتابة هذه الدالة بنفسك، يمكنك استعمال Modernizr (الإصدار 1.1 أو ما بعده) لاكتشاف الدعم لواجهة Web Workers البرمجية.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1216_11">
<span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Modernizr</span><span class="pun">.</span><span class="pln">webworkers</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// window.Worker متوفرة!</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// لا يوجد دعم لواجهة Web Workers :(</span><span class="pln">
  </span><span class="com">// ربما تجرب Gears أو مكتبة أخرى</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	لاحظ أنَّ JavaScript حساسة لحالة الأحرف، إذ تُدعى خاصية Modernizr ‏"webworkers" (جميعها بأحرفٍ صغيرة)، أما خاصية DOM فهي window.Worker (حرف W كبير في Worker).
</p>

<h2>
	تطبيقات الويب دون اتصال Offline Web Applications
</h2>

<p>
	يمكن ببساطة قراءة صفحات الويب الثابتة دون اتصال: اتصل إلى الإنترنت، حمِّل صفحة الويب، اقطع اتصالك بالإنترنت، ثم سافر إلى بلدٍ آخر، واقرأ الصفحة في وقت فراغك (يمكنك تخطي خطوة السفر إلى بلدٍ آخر لتوفير الوقت). لكن ماذا عن تطبيقات الويب مثل Gmail أو Google Docs؟ الفضل يعود إلى HTML5، التي تُمكِّن الجميع (وليس فقط Google) من بناء تطبيقات ويب تعمل دون اتصال.
</p>

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

<p>
	نستعمل طريقة الاكتشاف الأولى لمعرفة إن كان المتصفح يدعم تشغيل تطبيقات الويب دون اتصال، وذلك إن وُجِدَت الخاصية <span style="font-family:courier new,courier,monospace;">applicationCache</span> في الكائن العام <span style="font-family:courier new,courier,monospace;">window</span>، وإن لم يكن يدعم متصفحك تشغيل تطبيقات الويب دون اتصال، فستكون خاصية <span style="font-family:courier new,courier,monospace;">applicationCache</span> غير معرفة؛ يمكنك التحقق من دعم تشغيل تطبيقات الويب دون اتصال مع هذه الدالة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1216_15">
<span class="kwd">function</span><span class="pln"> supports_offline</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> </span><span class="pun">!!</span><span class="pln">window</span><span class="pun">.</span><span class="pln">applicationCache</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	بدلًا من كتابة هذه الدالة بنفسك، يمكنك استعمال Modernizr (الإصدار 1.1 أو ما بعده) لاكتشاف الدعم لتشغيل تطبيقات الويب دون اتصال.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1216_17">
<span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Modernizr</span><span class="pun">.</span><span class="pln">applicationcache</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// window.applicationCache متوفرة!</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// لا يوجد دعم للتطبيقات دون اتصال :(</span><span class="pln">
  </span><span class="com">// ربما تجرب Gears أو مكتبة أخرى</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	لاحظ أنَّ JavaScript حساسة لحالة الأحرف، إذ تُدعى خاصية Modernizr ‏"applicationcache" (جميعها بأحرفٍ صغيرة)، أما خاصية DOM فهي window.applicationCache (حرف c كبير في Cache).
</p>

<h2>
	تحديد الموقع الجغرافي Geolocation
</h2>

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

<ul>
<li>
		<strong>س</strong>: هل تحديد الموقع الجغرافي جزءٌ من HTML5؟ ولماذا تتحدث عنه إذًا؟
	</li>
	<li>
		<strong>ج</strong>: لقد أضيف دعم تحديد الموقع الجغرافي من المتصفحات مع ميزات HTML5 الجديدة. لكن إذا ابتغينا الدقة، يُوفَّر معيار تحديد الموقع الجغرافي من مجموعة عمل Geolocation، التي هي مجموعة عمل منفصلة عن مجموعة عمل HTML5، لكننا سنتحدث عن تحديد الموقع الجغرافي في هذه السلسلة على أيّة حال، لأنه جزءٌ من التطوير الذي يحدث في الويب في الوقت الراهن.
	</li>
</ul>
<p>
	نستعمل طريقة الاكتشاف الأولى لمعرفة إن كان المتصفح يدعم واجهة تحديد الموقع الجغرافي البرمجية، وذلك إن وُجِدَت الخاصية <span style="font-family:courier new,courier,monospace;">geolocation</span> في الكائن العام <span style="font-family:courier new,courier,monospace;">navigator</span>، وإن لم يكن يدعم متصفحك تحديد الموقع الجغرافي، فستكون خاصية <span style="font-family:courier new,courier,monospace;">geolocation</span> غير معرفة؛ يمكنك التحقق من دعم تحديد الموقع الجغرافي مع هذه الدالة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1216_20">
<span class="kwd">function</span><span class="pln"> supports_geolocation</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> </span><span class="pun">!!</span><span class="pln">navigator</span><span class="pun">.</span><span class="pln">geolocation</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	بدلًا من كتابة هذه الدالة بنفسك، يمكنك استعمال Modernizr لاكتشاف الدعم لتحديد الموقع الجغرافي.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1216_22">
<span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Modernizr</span><span class="pun">.</span><span class="pln">geolocation</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// لنكتشف أين أنت الآن!</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// لا يوجد دعم لتحديد الموقع الجغرافي :(</span><span class="pln">
  </span><span class="com">// ربما تجرب Gears أو مكتبة أخرى</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	إن لم يدعم متصفحك واجهة تحديد الموقع الجغرافي البرمجية داخليًا، فلا تيأس. فهنالك Gears التي هي إضافة مفتوحة المصدر للمتصفحات من Google التي تعمل على ويندوز و Mac OS X ولينُكس والهواتف العاملة بنظامَي ويندوز وأندرويد. حيث توفر ميزاتٍ للمتصفحات القديمة التي لا تدعم الأشياء الجديدة التي تحدثنا عنها في هذا الدرس. إحدى الميزات التي توفرها Gears هي تحديد الموقع الجغرافي، لكنها ليست مطابقة لواجهة <span style="font-family:courier new,courier,monospace;">navigator.geolocation</span> البرمجية، لكنها تخدم نفس الغرض.
</p>

<p>
	هنالك واجهات برمجية لتحديد المواقع لأنظمة الهواتف القديمة مثل BlackBerry، و Nokia، و Palm، و OMTP BONDI.
</p>

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

<h2>
	أنواع الإدخال في النماذج Input Types
</h2>

<p>
	أنت تعرف الكثير عن نماذج الويب، صحيح؟ أنشِئ عنصر<span style="font-family:courier new,courier,monospace;"> &lt;form&gt;</span> ثم أضف بعض عناصر <span style="font-family:courier new,courier,monospace;">&lt;input type="text"‎&gt;</span> إليه وربما عنصر <span style="font-family:courier new,courier,monospace;">&lt;input type="password"‎&gt;</span>، ثم أنهِ النموذج بزر <span style="font-family:courier new,courier,monospace;">&lt;input type="submit"‎&gt;</span>.
</p>

<p>
	حسنًا، ذلك جزءٌ يسيرٌ من النماذج، إذ أضافت HTML5 حوالي ثلاثة عشر نوعًا من أنواع المدخلات التي يمكنك استعمالها في نماذجك.
</p>

<ul>
<li>
		<span style="font-family:courier new,courier,monospace;">&lt;"input type="search"&gt;</span> لصناديق البحث
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;">&lt;"input type="number"&gt;</span> لإدخال الأرقام
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;">&lt;"input type="range"&gt;</span> للمزلاج (slider) لتحديد مجال
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;">&lt;"input type="color"&gt;</span> لاختيار الألوان
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;">&lt;"input type="tel"&gt;</span> لأرقام الهواتف
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;">&lt;"input type="url"&gt;</span> لعناوين الويب
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;">&lt;"input type="email"&gt;</span> لعناوين البريد الإلكتروني
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;">&lt;"input type="date"&gt;</span> التقويم لاختيار التاريخ
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;">&lt;"input type="month"&gt;</span> للأشهر
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;">&lt;"input type="week"&gt;</span> للأسابيع
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;">&lt;"input type="time"&gt;</span> لبصمات الوقت
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;">&lt;"input type="datetime"&gt;</span> لبصمات الوقت والتاريخ بدقة
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;">&lt;"input type="datetime-locale"&gt;</span> للوقت والتاريخ المحليين
	</li>
</ul>
<p>
	سنستخدم التقنية الرابعة لاكتشاف أنواع الحقول المدعومة في النماذج. في البداية سننشِئ عنصر<span style="font-family:courier new,courier,monospace;"> &lt;input&gt; </span>في الذاكرة، وسيكون نوع الحقل الافتراضي لجميع عناصر <span style="font-family:courier new,courier,monospace;">&lt;input&gt;</span> هو "text"، وسيتضح لك لماذا هذا مهمٌ جدًا.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1216_35">
<span class="kwd">var</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">createElement</span><span class="pun">(</span><span class="str">"input"</span><span class="pun">);</span></pre>

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

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1216_37">
<span class="pln">i</span><span class="pun">.</span><span class="pln">setAttribute</span><span class="pun">(</span><span class="str">"type"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"color"</span><span class="pun">);</span></pre>

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

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1216_39">
<span class="kwd">return</span><span class="pln"> i</span><span class="pun">.</span><span class="pln">type </span><span class="pun">!==</span><span class="pln"> </span><span class="str">"text"</span></pre>

<p>
	بدلًا من كتابة 13 دالة منفصلة يدويًا، تستطيع استخدام Modernizr لاكتشاف الدعم لجميع أنواع حقول الإدخال المُعرَّفة في HTML5. يُعيد Modernizr استخدام عنصر <span style="font-family:courier new,courier,monospace;">&lt;input&gt;</span> وحيد لكي يكتشف ما هي أنواع حقول الإدخال المدعومة. ثم يبني جدولًا من نوع hash باسم <span style="font-family:courier new,courier,monospace;">Modernizr.inputtypes</span> يحتوي على 13 مفتاح (خاصيات type في HTML5) و 13 قيمة منطقية (أي true إن كان الحقل مدعومًا، أو false إن لم يكن كذلك).
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1216_41">
<span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="typ">Modernizr</span><span class="pun">.</span><span class="pln">inputtypes</span><span class="pun">.</span><span class="pln">date</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// لا يوجد دعم لحقل &lt;input type="date"‎&gt; :(</span><span class="pln">
  </span><span class="com">// ربما تستعمل مكتبة Dojo أو jQueryUI</span><span class="pln">
</span><span class="pun">}</span></pre>

<h2>
	النص البديل Placeholder
</h2>

<p>
	بالإضافة إلى أنواع حقول الإدخال الجديدة، تضمنت HTML5 بعض الإضافات الصغيرة للنماذج. أحدها هو إمكانية وضع نص بديل (placeholder) في حقل الإدخال.
</p>

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

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

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1216_66">
<span class="kwd">function</span><span class="pln"> supports_input_placeholder</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">var</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">createElement</span><span class="pun">(</span><span class="str">'input'</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> </span><span class="str">'placeholder'</span><span class="pln"> in i</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	بدلًا من كتابة هذه الدالة بنفسك، يمكنك استعمال Modernizr (الإصدار 1.1 أو ما بعده) لاكتشاف الدعم للنص البديل في حقول الإدخال.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1216_64">
<span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Modernizr</span><span class="pun">.</span><span class="pln">input</span><span class="pun">.</span><span class="pln">placeholder</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// يمكنك استعمال النص البديل في حقول الإدخال!</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// لا يوجد دعم للنص البديل :(</span><span class="pln">
  </span><span class="com">// استعمل سكربت لفعل ذلك</span><span class="pln">
</span><span class="pun">}</span></pre>

<h2>
	التركيز التلقائي على النماذج autofocus
</h2>

<p>
	تستعمل مواقع الويب JavaScript للتركيز (focus) على حقل من حقول الإدخال في نماذج الويب. على سبيل المثال، الصفحة الرئيسية لمحرك البحث Google ستُركِّز تلقائيًا على حقل البحث كي تستطيع كتابة ما الذي تريد البحث عنه مباشرةً دون الحاجة إلى النقر على حقل الإدخال، ربما هذا ملائم للكثيرين، لكنه مزعج للمستخدمين المتقدمين أو لأولي الاحتياجات الخاصة، فإن ضغطت على زر المسافة (space) متوقعًا أن تُمرِّر إلى الأسفل، فلن يتم ذلك، لوجود المؤشر في حقل إدخال (وستُكتب مسافة فارغة في حقل الإدخال بدلًا من التمرير)، وإن ركزت على حقل إدخال مختلف في أثناء تحميل الصفحة، فسيحرك سكربت التركيز التلقائي التركيز إلى الحقل المُحدَّد بعد إكمال تحميل الصفحة، مما يؤدي إلى كتابتك في المكان الخاطئ.
</p>

<p>
	ولأن التركيز التلقائي كان يتم عبر JavaScript، فمن الصعب التعامل مع جميع الحالات الغريبة، وليس هنالك ملجأ من التركيز التلقائي للحقول لِمَن لا يريد ذلك!
</p>

<p>
	ولحل هذه المشكلة، قدَّمَت HTML5 خاصية autofocus في جميع عناصر نماذج الويب. وهذه الخاصية تفعل تمامًا كما هو واضح من اسمها: تنقل التركيز إلى حقل إدخال معين، ولأنها من شيفرة HTML بدلًا من كونها سكربت، فإن سلوكها سيكون متناغمًا ومتماثلًا في كل مواقع الويب، ويمكن لصانعي المتصفحات (أو مطوري الإضافات) توفير طريقة للمستخدمين لكي يُعطِّلوا إمكانية التركيز التلقائي.
</p>

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

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1216_60">
<span class="kwd">function</span><span class="pln"> supports_input_autofocus</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">var</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">createElement</span><span class="pun">(</span><span class="str">'input'</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> </span><span class="str">'autofocus'</span><span class="pln"> in i</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	بدلًا من كتابة هذه الدالة بنفسك، يمكنك استعمال Modernizr (الإصدار 1.1 أو ما بعده) لاكتشاف الدعم للتركيز التلقائي في حقول الإدخال.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1216_58">
<span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Modernizr</span><span class="pun">.</span><span class="pln">input</span><span class="pun">.</span><span class="pln">autofocus</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// التركيز التلقائي يعمل!</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// التركيز التلقائي غير مدعوم :(</span><span class="pln">
  </span><span class="com">// استعمل سكربت لفعل ذلك</span><span class="pln">
</span><span class="pun">}</span></pre>

<h2>
	البيانات الوصفية Microdata
</h2>

<p>
	البيانات الوصفية (Microdata) هي الطريقة القياسية لتوفير هيكليّة معنوية لصفحات الويب. على سبيل المثال، يمكنك استعمال البيانات الوصفية لتصرِّح أن صورةً ما مرخَّصة بإحدى رخص المشاع الإبداعي. وكما سترى لاحقًا في هذه السلسلة، يمكنك استعمال البيانات الوصفية لتوصيف صفحة "معلومات عني"، فيمكن للمتصفحات –أو لإضافات المتصفحات– أو لمحركات البحث تحويل تلك البيانات الوصفية إلى vCard، التي هي صيغة معيارية لمشاركة معلومات الاتصال؛ يمكنك أيضًا تعريف أنواع خاصة بك من البيانات الوصفية.
</p>

<p>
	معيار البيانات الوصفية في HTML5 يتضمن شيفرات HTML (تستعملها محركات البحث بشكلٍ أساسي) ومجموعة من دوال DOM (تستعملها المتصفحات بشكلٍ أساسي). لا حرج في تضمين البيانات الوصفية في صفحات الويب، فهي مجرد خاصيات ذات معنى خاص، وستتجاهلها محركات البحث التي لا تستطيع تفسير البيانات الوصفية. لكن إن كنت تريد الوصول إلى أو تعديل البيانات الوصفية عبر DOM، فعليك أن تتحقق أن متصفحك يدعم واجهة البيانات الوصفية البرمجية (<abbr title="Application Programming Interface | واجهة برمجية">API</abbr>).
</p>

<p>
	نستعمل طريقة الاكتشاف الأولى لمعرفة إن كان المتصفح يدعم واجهة البيانات الوصفية البرمجية، وذلك إن وُجِدَت الدالة<span style="font-family:courier new,courier,monospace;"> getItems()‎ </span>في الكائن العام <span style="font-family:courier new,courier,monospace;">document</span>، وإن لم يكن يدعم متصفحك البيانات الوصفية، فستكون الدالة <span style="font-family:courier new,courier,monospace;">getItems()</span>‎ غير معرفة.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1216_54">
<span class="kwd">function</span><span class="pln"> supports_microdata_api</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> </span><span class="pun">!!</span><span class="pln">document</span><span class="pun">.</span><span class="pln">getItems</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	بدلًا من كتابة هذه الدالة بنفسك، يمكنك استعمال Modernizr لاكتشاف الدعم للبيانات الوصفية.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1216_52">
<span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Modernizr</span><span class="pun">.</span><span class="pln">microdata</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// هنالك دعمٌ للبيانات الوصفية!</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// البيانات الوصفية غير مدعومة :(</span><span class="pln">
</span><span class="pun">}</span></pre>

<h2>
	التأريخ History <abbr title="Application Programming Interface | واجهة برمجية">API</abbr>
</h2>

<p>
	واجهة التأريخ البرمجية في HTML5 هي طريقة معيارية لتعديل تأريخ (history) المتصفح عبر السكربتات، جزءٌ من هذه الواجهة -التنقل في التأريخ- كان متوفرًا في الإصدارات السابقة من HTML. أما الجزء الجديد في HTML5 هو طريقة إضافة مدخلات جديدة إلى تأريخ المتصفح، والاستجابة عندما تُحذَف تلك المدخلات عبر ضغط المستخدم لزر الرجوع، وهذا يعني أن URL سيبقى يعمل عمله كمُعرِّف فريد للمورد الحالي، حتى في التطبيقات التي تعتمد اعتمادًا كبيرًا على السكربتات التي لا تجري عملية تحديث لكامل الصفحة.
</p>

<p>
	نستعمل طريقة الاكتشاف الأولى لمعرفة إن كان المتصفح يدعم واجهة التأريخ البرمجية، وذلك إن وُجِدَت الدالة <span style="font-family:courier new,courier,monospace;">pushState()‎ </span>في الكائن العام <span style="font-family:courier new,courier,monospace;">history</span>، وإن لم يكن يدعم متصفحك واجهة التأريخ البرمجية، فستكون الدالة <span style="font-family:courier new,courier,monospace;">pushState()‎ </span>‎ غير معرفة.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1216_48">
<span class="kwd">function</span><span class="pln"> supports_history_api</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> </span><span class="pun">!!(</span><span class="pln">window</span><span class="pun">.</span><span class="pln">history </span><span class="pun">&amp;&amp;</span><span class="pln"> history</span><span class="pun">.</span><span class="pln">pushState</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	بدلًا من كتابة هذه الدالة بنفسك، يمكنك استعمال Modernizr (الإصدار 1.6 أو ما بعده) لاكتشاف الدعم لواجهة التأريخ البرمجية.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1216_46">
<span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Modernizr</span><span class="pun">.</span><span class="pln">history</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// يمكنك تعديل تأريخ المتصفح!</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// لا يوجد دعم لتعديل التأريخ :(</span><span class="pln">
  </span><span class="com">// استعمل مكتبة مثل History.js</span><span class="pln">
</span><span class="pun">}</span></pre>

<h2>
	مراجع إضافية
</h2>

<p>
	مكتبات JavaScript:
</p>

<ul>
<li>
		<a href="http://www.modernizr.com/" rel="external nofollow">Modernizr</a>، مكتبة اكتشاف الدعم لميزات HTML5
	</li>
	<li>
		<a href="http://code.google.com/p/geo-location-javascript/" rel="external nofollow">geo.js</a>، مكتبة لإضافة الدعم لواجهة تحديد المواقع
	</li>
	<li>
		<a href="http://camendesign.com/code/video_for_everybody" rel="external nofollow">Video for Everybody!‎</a>
	</li>
</ul>
<p dir="rtl">
	ترجمة -وبتصرّف- للفصل <a href="http://diveinto.html5doctor.com/detect.html" rel="external nofollow">Detecting HTML5 Features</a> من كتاب Dive Into HTML5 لمؤلفه Mark Pilgrim.
</p>

<h2 dir="rtl">
	اقرأ أيضًا
</h2>

<ul dir="rtl">
<li>
		المقال التالي: <a href="https://academy.hsoub.com/programming/html/html5/%D8%A7%D9%84%D8%B1%D8%B3%D9%85-%D8%B9%D8%A8%D8%B1-%D8%B9%D9%86%D8%B5%D8%B1-canvas-%D9%81%D9%8A-html5-r345/" rel="">الرسم عبر عنصر canvas في HTML5</a>
	</li>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/html/html5/%D9%86%D8%B8%D8%B1%D8%A9-%D8%B9%D9%84%D9%89-%D8%AA%D8%A7%D8%B1%D9%8A%D8%AE-html-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%AB%D8%A7%D9%86%D9%8A-r336/" rel="">نظرة على تاريخ HTML - الجزء الثاني</a>
	</li>
	<li>
		النسخة  العربية الكاملة من كتاب <a href="https://academy.hsoub.com/files/13-%D9%86%D8%AD%D9%88-%D9%81%D9%87%D9%85-%D8%A7%D9%94%D8%B9%D9%85%D9%82-%D9%84%D8%AA%D9%82%D9%86%D9%8A%D8%A7%D8%AA-html5/" rel="">نحو فهم أعمق لتقنيات HTML5 </a>
	</li>
</ul>
]]></description><guid isPermaLink="false">340</guid><pubDate>Fri, 27 May 2016 07:03:00 +0000</pubDate></item><item><title>&#x646;&#x638;&#x631;&#x629; &#x639;&#x644;&#x649; &#x62A;&#x627;&#x631;&#x64A;&#x62E; HTML - &#x627;&#x644;&#x62C;&#x632;&#x621; &#x627;&#x644;&#x62B;&#x627;&#x646;&#x64A;</title><link>https://academy.hsoub.com/programming/html/%D9%86%D8%B8%D8%B1%D8%A9-%D8%B9%D9%84%D9%89-%D8%AA%D8%A7%D8%B1%D9%8A%D8%AE-html-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%AB%D8%A7%D9%86%D9%8A-r336/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_05/diveintohtml5-history.png.4270f615603c6e0ef909974db387072f.png" /></p>

<p dir="rtl" style="text-align: center;">
	<img alt="diveintohtml5-history.png" class="ipsImage ipsImage_thumbnailed" data-fileid="16710" data-unique="z1rm0xn7y" src="https://academy.hsoub.com/uploads/monthly_2016_05/diveintohtml5-history.png.528feb7786b9534482a0a525f182d661.png"></p>

<p dir="rtl">
	أنا منبهر كثيرًا بجميع نواحي المحادثة ذات 23 عامًا، التي أدت إلى إنشاء عنصر HTML الذي استعمل في كل صفحة ويب تقريبًا. خذ بعين الاعتبار أنَّ:
</p>

<ul dir="rtl">
<li>
		HTTP ما زال موجودًا، ونجح بالتطور من الإصدار 0.9 إلى 1.0 ثم إلى 1.1، وما يزال يتطور.
	</li>
	<li>
		HTML ما زالت موجودةً، صيغة البيانات البدائية تلك التي لم تكن تدعم تضمين الصور! تطورت إلى الإصدار 2.0 ثم إلى 3.2 ثم إلى 4.0، أي أنَّ خط تطويرها لم ينقطع، لكنه بالتأكيد خطٌ ملتوٍ ومتعرج، وفيه العديد من النهايات المغلقة. لكن ها نحن ذا في عام 2016، وما زالت <a href="http://www.w3.org/People/Berners-Lee/FAQ.html#Examples" rel="external nofollow">صفحات الويب من عام </a><a href="http://www.w3.org/People/Berners-Lee/FAQ.html#Examples" rel="external nofollow">1990</a> تُعرَض بشكلٍ جيد في المتصفحات الحديثة. ولقد فتحتُ إحداها في متصفح هاتفي الحديث العامل بنظام أندرويد، ولم أحصل على رسالة تقول "الرجاء الانتظار إلى أن يتم استيراد الصيغة القديمة".
	</li>
	<li>
		نتجت HTML من النقاشات بين صانعي المتصفحات والمطورين وواضعي المعايير والأشخاص الذين يحبون التحدث عنها. أغلبية الإصدارات الناجحة من HTML كانت عبارة عن إضفاءِ صفةٍ رسميةٍ لما هو موجودٌ مُحاوِلَةً توجيهه نحو الطريق الصحيح. أي شخص يخبرك أنه يجب أن تكون HTML «صرفة» (أي على الأرجح بتجاهل صانعي المتصفحات أو المطورين أو كليهما) هو شخصٌ لديه معلوماتٌ خاطئة. لم تكن HTML صرفةً أبدًا، وأيةّ محاولات لجعلها كذلك قد باءت بالفشل.
	</li>
	<li>
		لم يبق أي متصفح منذ عام 1993 موجودًا كما هو. فتم التخلي عن متصفح Netscape Navigator في 1998، ثم أعيدت كتابته من الصفر لإنشاء Mozilla Suite، ثم تم الاشتقاق لإنشاء Firefox. وكانت لمتصفح Internet Explorer بداياتٌ متواضعة في «Microsoft Plus!‎» لويندوز 95، حيث حُزِّمَ مع بعض سمات سطح المكتب ولعبة pinball (لكن بالطبع يمكن <a href="http://en.wikipedia.org/wiki/Spyglass_Mosaic" rel="external nofollow">تتبع تاريخ المتصفح إلى أبعد من تلك النقطة</a>).
	</li>
	<li>
		بعض أنظمة التشغيل من عام 1993 ما زالت موجودةٌ، لكن ليس لها صلة بالويب الحديث الذي نعرفه. فأغلبية مستخدمي الويب الآن بدؤوا باستعماله على حاسوب مكتبي يعمل بنظام ويندوز 2000 أو أحدث منه، أو على جهاز Mac يعمل بنظام OS X، أو على حاسوب مكتبي يعمل بتوزيعة من توزيعات لينُكس، أو على هاتف محمول مثل هواتف أندرويد أو iPhone. لكن كان إصدار ويندوز 3.1 في عام 1993، وكان لينُكس يوزَّع عبر Usernet.
	</li>
	<li>
		بقي بعض الأشخاص موجودين وما يزالون منهمكين في العمل على ما ندعون «معايير الويب»، حيث بقي هؤلاء الأشخاص يعملون لأكثر من 20 عامًا، وعمل بعضهم على اللغات التي تسبق HTML التي يمكن تتبع تاريخها إلى ثمانينيات القرن الماضي.
	</li>
	<li>
		بالحديث عن اللغات التي سبقت HTML، أصبح من السهل نسيان الصيغ والأنظمة التي كانت موجودةٌ عند إنشاء HTML بعد الانتشار الواسع والكبير للغة HTML والويب. ماذا عن Andrew؟ أو Intermedia؟ أو HyTime؟ لم تكن HyTime مشروعًا بحثيًا أكاديميًا لا شأن لها، وإنما كانت من معايير ISO، ولقد كانت تُستعمل لأغراضٍ عسكرية.
	</li>
</ul>
<p dir="rtl">
	لم يُجِب كل ما سبق عن تساؤلنا الأصلي: لماذا لدينا عنصر<span style="font-family:courier new,courier,monospace;"> &lt;img&gt;</span>؟ لماذا ليس عنصر <span style="font-family:courier new,courier,monospace;">&lt;icon&gt;</span>؟ أو عنصر <span style="font-family:courier new,courier,monospace;">&lt;include&gt;</span>؟ لماذا ليس رابطًا مع خاصية include، أو مجموعةٌ من قيم الخاصية rel؟ لماذا عنصر <span style="font-family:courier new,courier,monospace;">&lt;img&gt;</span>؟ الجواب بسيطٌ للغاية، لأن Marc Andreessen قام بتنفيذ (بناء) وتوفير العنصر <span style="font-family:courier new,courier,monospace;">&lt;img&gt; </span>في مُتصفّحه والذي يقوم ببناء العنصر وتوفيره في متصفّحه سيربح.
</p>

<p dir="rtl">
	لكن هذا لا يعني أنَّ مَن يبني العُنصر وينشره سيربح دائمًا، فلا تنسَ أنَّ Adnrew و Intermedia و HyTime قامت بذلك أيضًا، فبناء العنصر وتوفيره هو شرطٌ لازمٌ لكنه غير كافٍ للنجاح؛ وأنا هنا لا أقصد أنَّ بناء العُنصر قبل المعيار هو الحل الأمثل، ووسم <span style="font-family:courier new,courier,monospace;">&lt;img&gt;</span> لم يكن يستعمل صيغة صور شائعة، ولم يُعرِّف كيف يلتف النص حول الصورة، ولم يكن يدعم النص البديل أو محتوى احتياطي للمتصفحات القديمة، وبعد 23 عامًا، ما زلنا نعاني مع مشكلة Content Sniffing، وما تزال هذه المشكلة مصدرًا للثغرات الأمنية. ويمكنك تتبع كل هذا إلى 23 عامًا مضت، مرورًا بحرب المتصفحات، إلى 23 شباط/فبراير عام 1993، عندما قال Marc Andreessen بشكلٍ عابر «ربما في يوم ما سنعتمد الـ MIME» ومع ذلك نشر العنصر الذي قام ببنائه وتضمينه في مُتصفّحه.
</p>

<h2 dir="rtl">
	التسلسل الزمني لتطوير HTML من 1997 إلى 2004
</h2>

<p dir="rtl">
	في كانون الأول/ديسمبر من عام 1997، نشرت رابطة الشبكة العالمية (W3C) نسخة HTML 4.0 ثم أغلقت مجموعة عمل HTML‏ (HTML Working Group) في الحال. وبعد أقل من شهرين، نشرت مجموعة عمل أخرى من W3C معيار XML 1.0، وبعد ذلك بثلاثة أشهر، أنشَأ القائمون على W3C ورشة عمل (workshop) اسمها "بلورة مستقبل HTML"‏ (Shaping the Future of HTML) للإجابة عن هذا السؤال: "هل تخلت W3C عن HTML؟" وكان جوابهم:
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			"كان من المتفق عليه في النقاشات التي أجريناها أنَّ توسيع HTML 4.0 سيكون صعبًا، وكذلك تحويل 4.0 إلى تطبيق XML. الطريقة المقترحة لتجاوز هذه العوائق هي بداية جديدة للجيل القادم من HTML بناءً على مجموعة من وسوم XML."
		</p>
	</div>
</blockquote>

<p dir="rtl">
	منحت W3C مجموعة عمل HTML هذا التكليف لإنشاء "مجموعة من وسوم XML"، كانت أول خطوة –في كانون الأول/ديسمبر 1998– هي كتابة مسودة لمعيار مؤقت (انتقالي) الذي كانت مهمته إعادة قولبة HTML في XML دون إضافة أيّة عناصر أو خاصيات جديدة، عُرِفَ هذا المعيار لاحقًا باسم "XHTML 1.0" وعرَّف نوع MIME جديد لمستندات XHTML ‏"application/xhtml+xml"، لكن لتسهيل انتقال صفحات HTML 4 الموجودة من قبل، فقد تضمن المعيار "الملحق C" الذي "يلخص إرشادات التصميم للمطورين الذين يريدون تشغيل مستندات XHTML في متصفحات HTML الموجودة من قبل"، إذ قال الملحق C أنك تستطيع كتابة ما يسمى "صفحات XHTML" لكن تستطيع تخديمها عبر نوع MIME القديم text/html.
</p>

<p dir="rtl">
	الهدف الجديد هو النماذج (forms)، ففي آب/أغسطس 1999، نشرت مجموعة عمل HTML نفسها أول مسودةٍ لنماذج XHTML الموسعة ولقد وضعوا التوقعات التي يرمون إلى تنفيذها في أول فقرة:
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			"بعد دراسات مطولة، قررت مجموعة عمل HTML أن الأهداف للجيل الجديد من النماذج تتعارض مع الحفاظ على التوافقية مع المتصفحات المصممة على النسخ القديمة من HTML. فأحد أهدافنا توفير نمط نماذج جديد (نماذج XHTML الموسعة [XHTML Extended Forms]) بناءً على مجموعة من المتطلبات المحددة بدقة، وهذه المتطلبات مشروحة في هذا المستند وهي مبنية على الخبرات والتجارب مع طيفٍ واسعٍ من التطبيقات التي تستعمل النماذج."
		</p>
	</div>
</blockquote>

<p dir="rtl">
	وبعد عدِّة أشهر أُعيدت تسمية "XHTML Extended Forms" إلى "XForms" وانتقلت إلى مجموعة العمل الخاصة بها، وعَمِلَت هذه المجموعة على التوازي مع مجموعة عمل HTML ونَشرت في النهاية الإصدار الأول من XForms 1.0 في تشرين الأول/أكتوبر 2003.
</p>

<p dir="rtl">
	وفي تلك الأثناء -وبعد اكتمال التحويل إلى XML- حطَّت مجموعة عمل HTML أنظارها إلى إنشاء "الجيل الجديد من HTML"، ففي أيار/مايو 2001، نشروا الإصدار الأول من XHTML 1.1، الذي أضاف بعض الميزات الصغيرة على XHTML 1.0، لكنه أزال الملحق C، فيجب -بدءًا من الإصدار 1.1- تخديم مستندات XHTML بنوع MIME الخاص بها application/xhtml+xml.
</p>

<h2 dir="rtl">
	كل شيء تعرفه عن XHTML خاطئ
</h2>

<p dir="rtl">
	لماذا أنواع MIME مهمة جدًا؟ لماذا أذكرها بين الحين والآخر؟ لسبب واحد: draconian error handling (أي عدم التساهل في معالجة الأخطاء). فكانت المتصفحات "متسامحة" مع HTML، فلو أنشأت صفحة HTML ولكن نسيت وسم الإغلاق <span style="font-family:courier new,courier,monospace;">‎&lt;/head&gt;</span>‎، فستُظهِرها المتصفحات على أيّة حال (لأن هنالك وسومًا معيّنة تشير إلى نهاية قسم <span style="font-family:courier new,courier,monospace;">&lt;head&gt; </span>وبداية <span style="font-family:courier new,courier,monospace;">&lt;body&gt;</span>)، فيجب عليك أن تضع هيكلية معيّنة عند تداخل الوسوم (أي إغلاق الوسوم المفتوحة بنمط "last-in-first-out" أي أن آخر وسم مستعمل سيُغلق أولًا) لكن إن كتبتَ <span style="font-family:courier new,courier,monospace;">&lt;b&gt;&lt;i&gt;&lt;/b&gt;&lt;/i&gt;</span>، فستتعامل المتصفحات معها (بطريقةٍ ما) وستكمل عرض الصفحة دون إظهار رسالة خطأ.
</p>

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

<p dir="rtl">
	رأت W3C هذه المشكلة الأصولية في الويب، ثم همّوا لتصحيحها. لغة XML، المنشورة في 1997، تخلصت من العملاء المتساهلين وقالت بأن جميع البرامج التي تستعمل XML يجب أن تعامل الأخطاء المتعلقة "بطريقة الكتابة السليمة" على أنها أخطاء (Fetal Errors). اشتهر مفهوم توقف المعالجة عند أول خطأ بالاسم "draconian error handling" وذلك نسبةً إلى القائد الإغريقي Draco الذي شرَّع عقوبة الموت لأيّة تجاوزات (ولو صغيرة نسبيًا) لقوانينه. فعندما أعادت W3C صياغة HTML بمفردات XML، اعتبرت أنَّ جميع المستندات التي تُخدَّم بنوع MIME الجديد application/xhtml+xml ستخضع إلى سياسة draconian error handling، فلو كان هنالك خطأٌ ما في أسلوب صياغة صفحة XHTML -نسيان وسم الإغلاق ‎<span style="font-family:courier new,courier,monospace;">&lt;/head&gt;</span>‎ أو تداخل غير صحيح للوسوم على سبيل المثال- فلن يكون لمتصفح الويب خيارٌ إلا إيقاف معالجة الصفحة وإظهار رسالة خطأ إلى المستخدم النهائي.
</p>

<p dir="rtl">
	لم تكن هذه الفكرة شائعةً على نطاقٍ واسع، لأن النسبة المُقدَّرة للأخطاء في صفحات الويب هي 99%، هذا يعني أن رسائل الخطأ ستُعرَض على المستخدم طوال الوقت، ولقلة الميزات التي توفرها XHTML 1.0 و 1.1، فقرر مطورو الويب تجاهل application/xhtml+xml، لكن هذا لا يعني أنهم تجاهلوا XHTML بالكلية، لأن الملحق C من معيار XHTML 1.0 أعطى مطوري الويب ثغرةً يمكنهم استعمالها: "اكتب شيئًا يشبه بنية XHTML، لكن خدِّمه بنوع MIME القديم text/html"، وهذا ما فعله الآلاف من مطوري الويب، إذ «حدَّثوا» صفحاتهم إلى بنية XHTML لكن بقيت تلك الصفحات مُخدَّمة بنوع MIME القديم text/html.
</p>

<p dir="rtl">
	ولليوم، ما تزال تعلن ملايين الصفحات أنها XHTML، فيبدؤون بنوع المستند doctype الخاص بلغة XHTML في أول سطر، ويستعملون أحرفًا صغيرةً لأسماء الوسوم، ويستعملون علامات الاقتباس حول قيم الخاصيات، ويضيفون خطًا مائلًا بعد العناصر الفارغة مثل <span style="font-family:courier new,courier,monospace;">&lt;br /‎&gt;</span> و <span style="font-family:courier new,courier,monospace;">&lt;hr /‎&gt;</span> لكن قلّة قليلة من تلك الصفحات تُخدَّم بنوع MIME الجديد application/xhtml+xml، الذي سيُفعِّل عدم التساهل في الأخطاء الخاص بلغة XML. فأيّة صفحة تُخدَّم بنوع MIME القديم text/html -بغض النظر عن doctype أو بنية الوسوم- ستُفسَّر باستعمال مُفسِّر HTML المُتساهل، وسيتم تجاهل الأخطاء دون إظهار أيّة رسالة، ودون تحذير المستخدم (أو أي شخص آخر) حتى لو كانت الصفحة فيها أخطاء تقنية.
</p>

<p dir="rtl">
	فتحت XHTML 1.0 هذه النافذة، ولكن XHTML 1.1 أغلقتها، والنسخة التي لن تُصدَر XHTML 2.0 استمرت في منهج عدم التساهل في الأخطاء، وهذا هو السبب وراء ادعاء ملايين الصفحات على أنها XHTML 1.0 وأنَّ حفنة قليلة منهم هي XHTML 1.1 (أو XHTML 2.0)، فهل أنت تستعمل XHTML حقًا؟ تحقق من نوع MIME (في الواقع، إن لم تكن تعرف ما هو نوع MIME الذي تستعمله، فأنا أضمن لك أنك ما زلتَ تستعمل text/html)، فما لم تُخدِّم صفحاتك بنوع MIME الجديد application/xhtml+xml، فإن «XHTML» هي XML بالاسم فقط.
</p>

<h2 dir="rtl">
	رؤية تنافسية
</h2>

<p dir="rtl">
	في حزيران/يونيو 2004، أقامت W3C ورشة عمل حول تطبيقات الويب والمستندات المجمّعة، حضر هذا الاجتماع ممثلون عن مصنعي ثلاثة متصفحات، وشركات تطوير الويب، وأعضاء آخرون من W3C، ومجموعة من الجهات المهتمة بما في ذلك منظمة Mozilla وشركة Opera Software، وأعطوا رؤيتهم لمستقبل الويب: تطوير معيار HTML 4 لتضمين ميزات جديدة تساعد مطوري تطبيقات الويب الحديثة.
</p>

<p dir="rtl">
	تمثِّل المبادئ السبعة الآتية ما نظن أنه أهم المتطلبات اللازمة لهذا العمل:
</p>

<h3>
	التوافقية مع الإصدارات القديمة، ومسار واضح للهجرة
</h3>

<p>
	يجب أن تكون تقنيات تطبيقات الويب مبنية على تقنيات مألوفة للمطورين، بما في ذلك HTML و CSS و DOM و JavaScript.
</p>

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

<h3 dir="rtl">
	نظام معالجة أخطاء مُحدَّد بدقة
</h3>

<p dir="rtl">
	يجب تفصيل كيفية معالجة الأخطاء إلى درجة لا تحتاج المتصفحات فيها إلى اختراع نظام معالجة أخطاء خاص بهم، أو أن يبنوا واحدًا مشتقًا من المتصفحات الأخرى.
</p>

<h3 dir="rtl">
	لا يجب عرض الأخطاء على المستخدمين
</h3>

<p dir="rtl">
	يجب أن تُحدِّد المعايير السلوك اللازم اتباعه عند حدوث أي نوع من الأخطاء، ويجب أن يكون نظام معالجة الأخطاء متساهلًا (كما في CSS) بدلًا من أن يكون واضحًا للمستخدم وكارثيًا (كما في XML).
</p>

<h3 dir="rtl">
	الاستعمال العملي
</h3>

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

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

<h3 dir="rtl">
	سيبقى استخدام السكربتات قائمًا
</h3>

<p dir="rtl">
	لكن يجب الابتعاد عنه إذا توفرت وسوم مناسبة. ويجب أن لا تتدخل السكربتات في طريقة العرض، وأن تكون مستقلة عن الجهاز المشغل لها.
</p>

<h3 dir="rtl">
	يجب تجنب التفريق بين الأجهزة
</h3>

<p dir="rtl">
	يجب أن يتمكن المطورون من استخدام نفس الميزات الموجودة في نسخة سطح المكتب ونسخة الهواتف المحمولة لنفس المتصفح.
</p>

<h3 dir="rtl">
	عملية مفتوحة
</h3>

<p dir="rtl">
	استفاد الويب من كونه مطوَّرًا في بيئة مفتوحة. وستصبح تطبيقات الويب أساسية في المستقبل، ويجب أن يكون تطويرها في بيئةٍ مفتوحةٍ أيضًا، ويجب إتاحة القوائم البريدية والأرشيفات ومسودات المعايير للجميع.
</p>

<p dir="rtl">
	سُئِلَ المشاركون في ورشة العمل في استطلاعٍ للرأي: «هل يجب على W3C تطوير إضافات لوظائف جاهزة في HTML و CSS، وإضافات لأساس DOM لكي تتحقق متطلبات تطوير تطبيقات الويب متوسطة التعقيد. أم عليها تطوير واجهة برمجية (<abbr title="Application Programming Interface | واجهة برمجية">API</abbr>) كاملة على مستوى النظام (OS-level)؟ (هذا الاقتراح من Ian Hickson، من Opera Software)» كان التصويت 11 إلى 8 ضد هذا الاقتراح، وكتبت W3C في ملخص الورشة:
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			"في الوقت الراهن، لا تنوي W3C أن تستثمر أيّة موارد في العمل على موضوع استطلاع الرأي: «تطوير إضافات إلى HTML و CSS لتطبيقات الويب» في مجموعات عمل W3C الحالية".
		</p>
	</div>
</blockquote>

<p dir="rtl">
	وبعد هذا القرار، كان لدى الأشخاص الذين اقترحوا تطوير HTML ونماذج HTML خياران فقط: الاستسلام، أو إكمال عملهم خارج إطار W3C، وقرروا المضي قدمًا في الخيار الثاني، وسجلوا النطاق <a href="http://www.whatwg.org/" rel="external nofollow">whatwg.org</a>، وفي حزيران/يونيو 2004، وُلِدَت مجموعة عمل WHAT.
</p>

<h2 dir="rtl">
	مجموعة عمل WHAT
</h2>

<p dir="rtl">
	ما هي مجموعة عمل WHAT؟ <a href="http://www.whatwg.org/news/start" rel="external nofollow">سأقتبس من كلامهم</a>:
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			"مجموعة عمل تقنيات تطبيقات الويب (Web Hypertext Applications Technology Working Group) هي مشاركة مفتوحة وغير رسمية لصانعي متصفحات الويب والأطراف المهتمة بتطوير تطبيقات الويب. تهدف المجموعة إلى تطوير تطبيقات الويب، مع العزم على إرسال النتائج إلى المنظمات الواضعة للمعايير القياسية، مما سيُشكِّل أساسًا للعمل على توسيع HTML المعيارية.
		</p>

		<p dir="rtl">
			يأتي تشكيل هذا المنتدى بعد عدِّة أشهر من العمل عبر رسائل البريد الإلكتروني الخاصة حول المعايير المُقترَحة لمثل هذه التقنيات، الأمر الذي نركِّز عليه الآن هو توسعة نماذج HTML 4 لدعم الميزات التي يطلبها المطورون دون التسبب بمشاكل تتعلق بالتوافقية مع المحتوى الحالي. أُنشِئت هذه المجموعة للتأكيد على أن مستقبل تطوير هذه المعايير سيكون في قائمة بريدية مفتوحة ومؤرشفة يمكن للجميع الوصول إليها."
		</p>
	</div>
</blockquote>

<p dir="rtl">
	الجملة الأساسية في الفقرة السابقة هي "دون التسبب بمشاكل تتعلق بالتوافقية"، ليست XHTML (دون الثغرة التي وفرها الملحق C) متوافقةً مع HTML، وتتطلب نوع MIME خاص بها، وXForms ليست متوافقة مع نماذج HTML لعدم القدرة على استعمالها إلا مع الصفحات المُخدَّمة بنوع MIME الخاص بصفحات XHTML، هذا يعني أن XForms تتطلب عدم التساهل في التعامل مع الأخطاء.
</p>

<p dir="rtl">
	فبدلًا من أن نرمي ما يقارب عقدًا من الزمن من العمل على HTML ونجعل 99% من صفحات الويب الموجودة حاليًا غير قابلة للاستخدام، قررت مجموعة عمل WHAT أن تنتهج منهجًا آخر: توثيق خوارزميات التعامل مع الأخطاء «المتسامحة» التي تستعملها المتصفحات. كانت وما زالت المتصفحات متساهلةً مع أخطاء HTML، لكن لم يُتعِب أحدٌ نفسه ويوثق آلية التساهل بالضبط. لدى متصفح NCSA Mosaic خوارزميات خاصة به للتعامل مع الأخطاء، وحاول Netscape أن يقلده، ثم حاول Internet Explorer تقليد Netscape، ثم حاول Opera و Firefox تقليد Internet Explorer، ثم حاول Safari تقليد Firefox، وهلّم جرًا حتى يومنا هذا. إذ ضيع المطورون آلاف الساعات محاولين جعل منتجاتهم متوافقة مع منتجات منافسيهم.
</p>

<p dir="rtl">
	استغرقت مجموعة عمل WHAT خمسة أعوامٍ من العمل للنجاح في توثيق كيفية تفسير HTML (ما عدا بعض الحالات الخاصة جدًا والغامضة) بطريقة متوافقة مع جميع المحتوى الموجود على الويب. فلا يوجد في الخوارزمية النهائية أيّة حالة يتوقف فيها مفسر HTML عن إكمال تفسير صفحة HTML ويعرض رسالة خطأ للمستخدم النهائي.
</p>

<p dir="rtl">
	وفي الفترة التي كانت تجرى فيها الهندسة العكسية، كانت تعمل مجموعة WHAT بصمت على أشياءٍ أخرى أيضًا، منها معيارٌ سُمي في بادئ الأمر "Web Forms 2.0" الذي أضاف بعض عناصر التحكم إلى نماذج HTML (ستتعلم المزيد عن نماذج HTML في درسٍ لاحق). ومسودة معيار أخرى باسم "Web Applications 1.0" التي حَوَت ميزات أخرى رئيسية مثل canvas والدعم المُضمَّن لتشغيل الصوت والفيديو دون إضافات.
</p>

<h2 dir="rtl">
	العودة إلى W3C
</h2>

<p dir="rtl">
	لمدة تقارب السنتين ونصف، تجاهلت W3C ومجموعة عمل WHAT بعضهما البعض، على الرغم من أن مجموعة عمل WHAT كانت تركز على نماذج الويب وميزات HTML الجديدة، ومجموعة عمل W3C مشغولة بإصدار 2.0 من XHTML، لكن بحلول تشرين الأول/أكتوبر، كان جليًا أن مجموعة عمل WHAT قد أحدثت زخمًا كبيرًا، بينما كانت XHTML 2.0 تقبع على شكل مسودة لم يتم تطبيقها من أيّ متصفح رئيسي. في تشرين الأول/أكتوبر، أعلن Tim Berners-Lee -مؤسس W3C- أن W3C ستعمل مع مجموعة عمل WHAT لتطوير HTML.
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			"أصبحت بعض الأمور واضحةً بعد عدِّة سنوات، من الضروري تطوير HTML تطويرًا تدريجيًا، فالمحاولة لجعل العالم ينتقل إلى XML – بما في ذلك وضع علامات اقتباس حول قيم الخاصيات وشرطات مائلة في نهاية الوسوم الفارغة ومجالات الأسماء– لم تجدِ نفعًا، إذ لم يتخذ المطورون أيّة حركة لسببٍ رئيسي هو عدم شكوى المتصفحات. تحركت بعض المجتمعات الكبيرة وتمتعت بثمار الأنظمة المُحدَّدة بدقة، لكن ليست كلها.
		</p>

		<p dir="rtl">
			الخطة الآن هي إنشاء مجموعة HTML جديدة. وعلى النقيض من المجموعة السابقة، مهمة هذه المجموعة هي عمل تطويرات وتحسينات تدريجية على HTML، والعمل أيضًا بالتوازي على XHTML، وسيكون لها رئيسٌ منفصل وطاقم عملٍ آخر. وستعمل على HTML و XHTML معًا. لدينا دعمٌ قوي لمثل هذه المجموعة من الكثيرين الذين تحدثنا معهم، بما في ذلك صانعي المتصفحات.
		</p>

		<p dir="rtl">
			سيكون هنالك أيضًا عملٌ على النماذج، وهو موضوعٌ شائك، لأن HTML و XForms هما لغتا نماذج، ونماذج HTML شائعة للغاية، وهنالك الكثير من التطبيقات والاستخدامات لنماذج XForms، وفي هذه الأثناء، وجدنا أن اقتراح Webforms لإضافات إلى نماذج HTML منطقيًا ومقبولًا. فالخطة هي توسعة نماذج HTML بوضع Webforms بعين الاعتبار."
		</p>

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

<p dir="rtl">
	واحد من أول الأشياء التي قررت مجموعة عمل W3C الجديدة فعلها هي إعادة تسمية "Web Applications 1.0" إلى "HTML5"، ومن هنا بدأت رحلة هذا السلسلة.
</p>

<h2 dir="rtl">
	حاشية
</h2>

<p dir="rtl">
	في تشرين الأول/أكتوبر 2009، أغلقت W3C مجموعة عمل XHTML 2 وأصدرت هذه الإفادة لشرح قرارها:
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			"عندما أعلنت W3C مجموعات عمل HTML و XHTML في آذار/مارس 2007، أشرنا أننا سنكمل مراقبة استخدام XHTML 2. أدركت W3C أهمية إرسال إشارة واضحة إلى المجتمع حول مستقبل HTML.
		</p>

		<p dir="rtl">
			على الرغم من أننا نقدر قيمة مساهمات مجموعة عمل XHTML على مر السنين، وبعد التشاور مع المشاركين، قررت إدارة W3C السماح بانتهاء مدة عمل المجموعة في نهاية 2009 وعدم تجديدها."
		</p>
	</div>
</blockquote>

<h2 dir="rtl">
	مراجع إضافية
</h2>

<ul dir="rtl">
<li>
		<a href="http://hixie.ch/commentary/web/history" rel="external nofollow">The History of the Web</a>، مسودة قديمة كتبها Ian Hickson
	</li>
	<li>
		<a href="http://esw.w3.org/topic/HTML/history" rel="external nofollow">HTML/History</a> كتبها Michael Smith، و Henri Sivonen، وآخرون
	</li>
	<li>
		<a href="http://www.atendesigngroup.com/blog/brief-history-of-html" rel="external nofollow">A Brief History of HTML</a> لكاتبها Scott Reynen
	</li>
</ul>
<p dir="rtl">
	ترجمة -وبتصرّف- لفصل <a href="http://diveinto.html5doctor.com/past.html" rel="external nofollow">A Quite Biased History of HTML5</a> من كتاب Dive Into HTML5 لمؤلفه Mark Pilgrim.
</p>

<h2 dir="rtl">
	اقرأ أيضًا
</h2>

<ul dir="rtl">
<li>
		المقال التالي: <a href="https://academy.hsoub.com/programming/html/html5/%D8%A7%D9%83%D8%AA%D8%B4%D8%A7%D9%81-%D8%AF%D8%B9%D9%85-%D8%A7%D9%84%D9%85%D8%AA%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D9%84%D9%85%D9%8A%D8%B2%D8%A7%D8%AA-html5-r340/" rel="">اكتشاف دعم المتصفحات لميزات HTML5</a>
	</li>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/html/html5/%D9%86%D8%B8%D8%B1%D8%A9-%D8%B9%D9%84%D9%89-%D8%AA%D8%A7%D8%B1%D9%8A%D8%AE-html-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%A3%D9%88%D9%84-r322/" rel="">نظرة على تاريخ HTML - الجزء الأول</a>
	</li>
	<li>
		النسخة الكاملة من كتاب <a href="https://academy.hsoub.com/files/13-%D9%86%D8%AD%D9%88-%D9%81%D9%87%D9%85-%D8%A7%D9%94%D8%B9%D9%85%D9%82-%D9%84%D8%AA%D9%82%D9%86%D9%8A%D8%A7%D8%AA-html5/" rel="">نحو فهم أعمق لتقنيات HTML5 </a>
	</li>
	<li>
		دليل: <a href="https://academy.hsoub.com/programming/html/%D8%AA%D8%B9%D9%84%D9%85-%D9%84%D8%BA%D8%A9-html-r1702/" rel="">تعلم لغة HTML</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">336</guid><pubDate>Tue, 24 May 2016 09:34:00 +0000</pubDate></item><item><title>&#x646;&#x638;&#x631;&#x629; &#x639;&#x644;&#x649; &#x62A;&#x627;&#x631;&#x64A;&#x62E; HTML - &#x627;&#x644;&#x62C;&#x632;&#x621; &#x627;&#x644;&#x623;&#x648;&#x644;</title><link>https://academy.hsoub.com/programming/html/%D9%86%D8%B8%D8%B1%D8%A9-%D8%B9%D9%84%D9%89-%D8%AA%D8%A7%D8%B1%D9%8A%D8%AE-html-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%A3%D9%88%D9%84-r322/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_05/diveintohtml5-history.png.4ebb6fc653cbd21bd6aa7bc8a2821825.png" /></p>

<p dir="rtl">
	وقعتُ أخيرًا بالصدفة على اقتباس من مطور في مشروع Mozilla عن التوتر الكامن في إنشاء المعايير القياسية:
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			"تجب الموازنة بين المعايير وتطبيقاتها بدقة، فلا تريد أن يحدث تطبيقٌ للمعايير قبل أن تنتهي صياغة المعيار، لأن الآخرين سيبدؤون بالاعتماد على تفاصيل التطبيق وهذا سيقيّد عملية تطوير المعايير. لكن لا تريد انتهاء صياغة المعيار قبل أن يكون هنالك تطبيقٌ له، وقبل أن يجرب مطور ذاك المعيار في هذه التطبيقات، لأنك تحتاج إلى تغذية راجعة، وهذا أمرٌ حساسٌ جدًا علينا التعامل معه بحذر."
		</p>
	</div>
</blockquote>

<p dir="rtl">
	ابقِ هذه المقولة في عقلك، ولنشرح كيف أصبحت HTML5 على ما هي عليه.
</p>

<p dir="rtl" style="text-align: center;">
	<img alt="diveintohtml5-history.png" class="ipsImage ipsImage_thumbnailed" data-fileid="15898" data-unique="6bwudexe0" src="https://academy.hsoub.com/uploads/monthly_2016_05/diveintohtml5-history.png.7f19cc52a9638db2bf4cf9e6c5832c47.png"></p>

<h2 dir="rtl">
	أنواع MIME
</h2>

<p dir="rtl">
	<a href="https://academy.hsoub.com/search/?tags=%D9%85%D8%AF%D8%AE%D9%84+%D8%A5%D9%84%D9%89+html5" rel="">هذه السّلسلة تتحدث حول HTML5</a>، وليس عن إحدى إصدارات HTML السابقة أو أي إصدارٍ من XHTML، لكن لفهم تاريخ HTML5 والدوافع خلف إنشائها تمامًا، فعليك أن تستوعب بعض التفاصيل التقنية أولًا، تحديدًا أنواع MIME.
</p>

<p dir="rtl">
	في كل مرة يطلب فيها متصفح الويب صفحةً، فسيُرسِل الخادوم "ترويسات" (headers) قبل أن يرسل شيفرة الصفحة نفسها، وهذه الترويسات غير ظاهرة عمومًا على الرغم من توفر أدوات تطويرية تمكنك من رؤيتها إن كنت مهتمًا بها. لكن الترويسات مهمة لأنها تُخبر المتصفح كيف يُفسِّر الشيفرات الموجودة في الصفحة، أحد أهم تلك الترويسات هو <span style="font-family:courier new,courier,monospace;">Content-Type</span> وهو يبدو كما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6739_7">
<span class="pln">Content-Type: text/html</span></pre>

<p align="right" class="western" dir="rtl">
	"<span style="font-family:courier new,courier,monospace;">text/html</span>" <span lang="ar-SA">يدعى </span>"Content Type" <span lang="ar-SA">أو نوع المحتوى أو نوع </span>MIME<span lang="ar-SA">، هذه الترويسة هي الشيء الوحيد الذي يُحدِّد طبيعة المورد المُحدَّد وكيف يجب عرضه</span>. <span lang="ar-SA">فالصورة لها أنواع </span>MIME <span lang="ar-SA">خاصة بها </span>(<span style="font-family:courier new,courier,monospace;"><code class="western">image/jpeg</code></span> <span lang="ar-SA">لصور </span>JPEG<span lang="ar-SA">، و </span><code class="western">image/png</code> <span lang="ar-SA">لصور </span>PNG<span lang="ar-SA">، وهلمَّ جرًا</span>)<span lang="ar-SA">؛ ولملفات </span>JavaScript <span lang="ar-SA">نوع </span>MIME <span lang="ar-SA">خاص بها، وكذلك الأمر لصفحات الأنماط </span>CSS<span lang="ar-SA">، فلكل شيء في الويب له نوع </span>MIME <span lang="ar-SA">خاص به</span>.
</p>

<p align="right" dir="rtl">
	<span lang="ar-SA">وبالطبع الواقع معقَّد أكثر من هذا، فالجيل الأول من خواديم الويب </span>(<span lang="ar-SA">وهنا أتكلم عن خواديم الويب في </span>1993) <span lang="ar-SA">لم تكن تُرسِل ترويسة </span><code class="western">Content-Type</code> <span lang="ar-SA">لأنها لم تكن موجودةً في ذاك الوقت </span>(<span lang="ar-SA">إذ لم تُستعمَل إلا في </span>1994)<span lang="ar-SA">، وكانت بعض المتصفحات الشهيرة تتجاهل ترويسة </span><code class="western">Content-Type</code> <span lang="ar-SA">في بعض الظروف لأسبابٍ لها علاقة بالتوافقية </span>(<span lang="ar-SA">وهذا يسمى </span>"content sniffing")<span lang="ar-SA">، لكن كقاعدة عامة، كل شيء يمكنك الحصول عليه على الويب </span>(<span lang="ar-SA">كصفحات </span>HTML<span lang="ar-SA">، والصور، والسكربتات، والفيديو، وملفات </span>PDF<span lang="ar-SA">، وكل شيء له رابط </span>URL) <span lang="ar-SA">يجب أن يُخدَّم بإضافة نوع </span>MIME <span lang="ar-SA">المناسب في ترويسة </span><code class="western">Content-Type</code>.
</p>

<p align="right" dir="rtl">
	<span lang="ar-SA">خزِّن المعلومات السابقة في عقلك، وسنعود إليها لاحقًا</span>.
</p>

<h2 align="right" class="western" dir="rtl">
	<font face="Droid Arabic Naskh"><span lang="ar-SA">شرح مسهب لكيفية إنشاء المعايير</span></font>
</h2>

<p align="right" dir="rtl">
	<span lang="ar-SA">لماذا لدينا عنصر </span><span style="font-family:courier new,courier,monospace;"><code class="western">&lt;img&gt;</code></span><span lang="ar-SA">؟ لن تسمع مثل هذا السؤال كل يوم</span>. <span lang="ar-SA">بكل تأكيد أنشأه أحدهم، إذ لم تظهر تلك الأشياء من العدم، فكل عنصر وكل خاصية </span>(attribute) <span lang="ar-SA">وكل ميزة من ميزات </span>HTML <span lang="ar-SA">التي استخدمتها من قبل قد أنشأها أحدهم وقرر كيف يجب أن تعمل وكتب كل ذلك، هؤلاء الأشخاص الذين كتبوا المعايير ليسوا خارقين وإنما مجرد بَشَر ولكنهم أذكياء</span>.
</p>

<p align="right" dir="rtl">
	<span lang="ar-SA">أحد الأشياء الرائعة عن المعايير هي أنها طُوِّرَت على الملأ، أي أنَّك تستطيع العودة في الزمن والإجابة عن ذاك النوع من الأسئلة؛ إذ أنَّ النقاشات كانت تُجرى في القوائم البريدية، التي أُرشِفَت وأصبحت متاحةً للعموم كي يبحثوا فيها؛ لذلك قررت أن </span>"<span lang="ar-SA">أنقِّب</span>" <span lang="ar-SA">في رسائل البريد الإلكتروني كي أحاول الإجابة عن السؤال السابق</span>: "<span lang="ar-SA">لماذا لدينا عنصر </span><code class="western">&lt;img&gt;</code><span lang="ar-SA">؟</span>"<span lang="ar-SA">، كان علي البدء في حقبةِ قبل إنشاء منظمة باسم </span>"<span lang="ar-SA">رابطة الشبكة العالمية</span>" (World Wide Web Consortium <span lang="ar-SA">اختصارًا </span>W3C)<span lang="ar-SA">، ذهبت إلى الأيام الأولى للويب، حيث كنتَ تستطيع عدّ صفحات الويب على أصابع اليدين</span>.
</p>

<p align="right" dir="rtl">
	<span lang="ar-SA">في </span>25 <span lang="ar-SA">شباط</span>/<span lang="ar-SA">فبراير من عام </span>1993<span lang="ar-SA">، <a href="http://1997.webhistory.org/www.lists/www-talk.1993q1/0182.html" rel="external nofollow">كتب </a></span><a href="http://1997.webhistory.org/www.lists/www-talk.1993q1/0182.html" rel="external nofollow">Marc Andreessen</a>:
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			"<span lang="ar-SA">أود أن أقترح وسم </span>HTML <span lang="ar-SA">جديد اختياري</span>:
		</p>

		<p dir="rtl" style="text-align: right;">
			<span style="font-family:courier new,courier,monospace;"><code class="western">IMG</code></span>
		</p>

		<p dir="rtl" style="text-align: right;">
			<span lang="ar-SA">يتطلب وسيطًا </span>(argument) <span lang="ar-SA">هو<span style="font-family:courier new,courier,monospace;"> </span></span><span style="font-family:courier new,courier,monospace;"><code class="western">SRC="url"</code>‎</span>.
		</p>

		<p dir="rtl" style="text-align: right;">
			<span lang="ar-SA">حيث يُحدِّد صورة نقطية لكي يحاول المتصفح تنزيلها عبر الشبكة وتفسيرها على أنها صورة يجب أن تُضمَّن في النص مكان ظهور الوسم</span>.
		</p>

		<p dir="rtl" style="text-align: right;">
			<span lang="ar-SA">مثالٌ عنها</span>:
		</p>

		<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6739_9">

<span class="tag">&lt;IMG</span><span class="pln"> </span><span class="atn">SRC</span><span class="pun">=</span><span class="atv">"file://foobar.com/foo/bar/blargh.xbm"</span><span class="pln">‎</span><span class="tag">&gt;</span></pre>

		<p dir="rtl" style="text-align: right;">
			(<span lang="ar-SA">لا يوجد وسم إغلاق لها</span>).
		</p>

		<p dir="rtl" style="text-align: right;">
			<span lang="ar-SA">يمكن جعل الصورة تشير إلى رابط، وعندها سيمكن الضغط عليها مثل الروابط النصية العادية</span>.
		</p>

		<p dir="rtl" style="text-align: right;">
			<span lang="ar-SA">يجب على المتصفحات أن تكون مرنة في دعمها لصيغ الصور، ومن المستحسن على سبيل المثال دعم الصيغتين </span>Xbm <span lang="ar-SA">و </span>Xpm<span lang="ar-SA">؛ وإن لم يتمكن المتصفح من تفسير صيغة معيّنة من الصور، فيمكن أن يضع ما يشاء بدلًا منها </span>(<span lang="ar-SA">سيضع متصفح </span>X Mosaic <span lang="ar-SA">صورةً بديلةً افتراضيةً</span>).
		</p>

		<p dir="rtl" style="text-align: right;">
			<span lang="ar-SA">هذه وظيفة مطلوبة في </span>X Mosaic<span lang="ar-SA">، ولقد عملنا على تطبيقها وسنستخدمها محليًا على الأقل</span>. <span lang="ar-SA">أنا منفتحٌ حاليًا لأيّة اقتراحات حول كيفية التعامل مع ذلك في </span>HTML<span lang="ar-SA">، فإن كانت عندك فكرة أفضل مما قدمته، فرجاءً أعلمني بها، أنا أعلم أنَّ هذه ليست صيغة مثالية للصور، لكنني لا أجد بديلًا عن قول </span>"<span lang="ar-SA">دع المتصفح يفعل ما يستطيع</span>" <span lang="ar-SA">وانتظار الحل المثالي لكي يأتي في المستقبل </span>(<span lang="ar-SA">ربما أنواع </span>MIME)."
		</p>
	</div>
</blockquote>

<p align="right" dir="rtl">
	<span lang="ar-SA">كانت صيغتا </span>Xbm <span lang="ar-SA">و </span>Xpm <span lang="ar-SA">صيغتَا رسوميات شهيرتان في أنظمة يونكس</span>.
</p>

<p align="right" dir="rtl">
	"Mosaic" <span lang="ar-SA">كان من أوائل متصفحات الويب </span>("X Mosaic" <span lang="ar-SA">كان الإصدار الذي يعمل على أنظمة يونكس</span>)<span lang="ar-SA">، عندما كتب </span>Marc Andreessen <span lang="ar-SA">رسالته في بدايات </span>1993<span lang="ar-SA">، لم يكن قد أسس الشركة التي جعلته مشهورًا </span>(<span lang="ar-SA">شركة </span>Mosaic Communications Corporation)<span lang="ar-SA">، ولم يكن بدأ العمل على المنتج الرائد في تلك الشركة</span>: "Mosaic Netscape" (<span lang="ar-SA">ربما تعرفها بأسمائها الحديثة </span>"Netscape Corporation" <span lang="ar-SA">و </span>"Netscape Navigator").
</p>

<p align="right" dir="rtl">
	<span lang="ar-SA">عبارته </span>"<span lang="ar-SA">ربما أنواع </span>MIME" <span lang="ar-SA">كانت تُشير إلى ميزة </span>Content negotiation <span lang="ar-SA">في </span>HTTP<span lang="ar-SA">، حيث يُخبر العميل </span>(<span lang="ar-SA">أي متصفح الويب</span>) <span lang="ar-SA">الخادوم </span>(<span lang="ar-SA">أي خادوم الويب</span>) <span lang="ar-SA">ما هي أنواع الوسائط التي يدعمها </span>(<span lang="ar-SA">مثل </span><code class="western">image/jpeg</code>) <span lang="ar-SA">ومن ثم سيُرسِل الخادوم الوسائط إلى العميل بالصيغة التي يُفضلِّها</span>. عُرِّفَت الصيغة الأصلية من HTTP في 1991 (<span lang="ar-SA">وهي النسخة الوحيدة التي كانت موجودةً في شباط</span>/<span lang="ar-SA">فبراير </span>1993) <span lang="ar-SA">ولم تكن توفِّر طريقةً للعملاء لأن يخبروا الخواديم ما هي صيغ الصور التي يدعموها، وهذه هي المعضلة التي واجهها </span>Marc.
</p>

<p align="right" dir="rtl">
	<span lang="ar-SA">بعد عدِّة ساعات، <a href="http://1997.webhistory.org/www.lists/www-talk.1993q1/0183.html" rel="external nofollow">ردِّ </a></span><a href="http://1997.webhistory.org/www.lists/www-talk.1993q1/0183.html" rel="external nofollow">Tony Johnson</a>:
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			"<span lang="ar-SA">لدي شيءٌ شبيهٌ بما اقترحتَ في </span>Midas 2.0 (<span lang="ar-SA">نستخدمه هنا في </span>SLAC<span lang="ar-SA">، وسيُنشَر للجميع خلال أسابيع</span>)<span lang="ar-SA">، عدا أنَّ جميع الأسماء مختلفة، وهنالك وسيطٌ إضافيٌ اسمه </span><span style="font-family:courier new,courier,monospace;"><code class="western">NAME="name"</code>‎</span><span lang="ar-SA">، وله نفس الوظيفة تقريبًا لوسم </span><code class="western">IMG</code> <span lang="ar-SA">الذي اقترحتَه</span>:
		</p>

		<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6739_17">

<span class="tag">&lt;ICON</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"NoEntry"</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"http://note/foo/bar/NoEntry.xbm"</span><span class="tag">&gt;</span></pre>

		<p dir="rtl" style="text-align: right;">
			<span lang="ar-SA">الفكرة في معامل </span><span style="font-family:courier new,courier,monospace;">name</span> <span lang="ar-SA">هي السماح للمتصفح بأن يكون لديه مجموعةٌ من الصور المُضمَّنة داخليًا فيه، فإن طابق الاسمُ صورةً مضمنةً داخليًا، فسيَستعمِل تلك الصورة بدلًا من تنزيل الصورة المُحدَّدة، يمكن لخاصية </span><span style="font-family:courier new,courier,monospace;">name</span> <span lang="ar-SA">أن تصبح </span>"<span lang="ar-SA">تلميحة</span>" <span lang="ar-SA">لمحتوى الصورة للمتصفحات السطرية </span>(<span lang="ar-SA">أي تلك المتصفحات التي تعمل من سطر الأوامر</span>) <span lang="ar-SA">حيث ستضع رمزًا ما مكان الصورة</span>.
		</p>

		<p dir="rtl" style="text-align: right;">
			<span lang="ar-SA">لا أهتم كثيرًا بأسماء الخاصيات أو الوسوم، لكني أظن أنه من المناسب أن نوحد التسميات</span>. <span lang="ar-SA">ولا أهتم أيضًا بالاختصارات </span>(<span lang="ar-SA">لِمَ لا نستخدم </span><span style="font-family:courier new,courier,monospace;"><code class="western">IMAGE=</code>‎</span> <span lang="ar-SA">و </span><code class="western">SOURCE=</code>‎ <span lang="ar-SA">على سبيل المثال</span>)<span lang="ar-SA">، وأنا أفضِّل </span><code class="western">ICON</code> <span lang="ar-SA">لأنه يعني أن الصورة يجب أن تكون صغيرة، لكن أليست كلمة </span><code class="western">ICON</code> <span lang="ar-SA">مستعملة كثيرًا؟"</span>
		</p>
	</div>
</blockquote>

<p align="right" dir="rtl">
	Midas <span lang="ar-SA">هو متصفح آخر من فترة بدايات الويب، وكان منافسًا لمتصفح </span>X Mosaic<span lang="ar-SA">، وكان متعدد المنصات، إذ كان يعمل على أنظمة يونكس و </span>VMS. <span lang="ar-SA">أما </span>"SLAC" <span lang="ar-SA">فهي تُشير إلى </span>Stanford Linear Accelerator Center <span lang="ar-SA">التي أصبح اسمها الآن </span>"SLAC National Accelerator Laboratory" <span lang="ar-SA">التي استضافت أول خادوم ويب في الولايات المتحدة </span>(<span lang="ar-SA">وفي الواقع، </span>أول خادوم ويب خارج أوروبا). <span lang="ar-SA">عندما كتب </span>Tony <span lang="ar-SA">هذه الرسالة، كانت </span>SLAC <span lang="ar-SA">من المحاربين القدامى في الشبكة العالمية، التي استضافت </span>خمس صفحات<span lang="ar-SA"> على خادوم الويب الخاص بها لمدة </span>441 <span lang="ar-SA">يومًا</span>.
</p>

<p align="right" dir="rtl">
	<span lang="ar-SA">أكمل </span>Tony <span lang="ar-SA">قائلًا</span>:
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			"<span lang="ar-SA">لمّا كنّا نتباحث في موضوع إضافة وسوم جديد، فلدي وسمٌ آخرٌ ذو وظيفةٍ مشابهةٍ أود أن أضيف دعمًا له في متصفح </span>Midas 2.0<span lang="ar-SA">، كما يلي</span>:
		</p>

		<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6739_25">

<span class="tag">&lt;INCLUDE</span><span class="pln"> </span><span class="atn">HREF</span><span class="pun">=</span><span class="atv">"..."</span><span class="tag">&gt;</span></pre>

		<p dir="rtl" style="text-align: right;">
			<span lang="ar-SA">الغرض منه هو تضمين مستند آخر ضمن المستند الأول في مكان ورود الوسم، ويمكن أن يكون ذاك المستند من أي نوع، لكن الغرض الأساسي منه هو السماح بتضمين الصور </span>(<span lang="ar-SA">بحجمها الطبيعي</span>) <span lang="ar-SA">في المستندات، أذكِّر مرةً أخرى أن الغاية منه ستظهر بشكلٍ جلي عندما يسمح بروتوكول </span>HTTP2 <span lang="ar-SA">بتحديد صيغة المستند المُضمَّن بشكل منفصل</span>."
		</p>
	</div>
</blockquote>

<p align="right" dir="rtl">
	<span lang="ar-SA">قصد ببروتوكول </span>"HTTP2" بروتوكول HTTP الأساسي المُعرِّف في 1992<span lang="ar-SA">، الذي لم يُطبَّق تطبيقًا كاملًا في بدايات </span>1993<span lang="ar-SA">، وعُرِفَت المسودة باسم </span>HTTP2 <span lang="ar-SA">ثم أصبحت معيارًا قياسيًا باسم </span>"HTTP 1.0" (<span lang="ar-SA">بالرّغم من أن الأمر قد </span>تم ذلك بعد ثلاثة أعوام)<span lang="ar-SA">، تضمَّن بروتوكول </span>HTTP 1.0 ترويسات طلبات لتحديد صيغة المحتوى<span lang="ar-SA"> </span>(request headers for content negotiation)<span lang="ar-SA">، أي أنواع </span>MIME.
</p>

<p align="right" dir="rtl">
	<span lang="ar-SA">أكمل </span>Tony:
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			"<span lang="ar-SA">بديلٌ عمّا سبق هو</span>:
		</p>

		<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6739_31">

<span class="tag">&lt;A</span><span class="pln"> </span><span class="atn">HREF</span><span class="pun">=</span><span class="atv">"..."</span><span class="pln"> </span><span class="atn">INCLUDE</span><span class="tag">&gt;</span><span class="pln">See photo</span><span class="tag">&lt;/A&gt;</span></pre>

		<p dir="rtl" style="text-align: right;">
			<span lang="ar-SA">لا أفضِّل إضافة المزيد من الوظائف إلى وسم </span><code class="western">&lt;A&gt;</code> <span lang="ar-SA">لكن الفكرة هنا هي الحفاظ على التوافقية مع المتصفحات التي لا تراعي المعامل </span><code class="western">INCLUDE</code><span lang="ar-SA">، فالغاية هي أنَّ المتصفحات التي تفهم المعامل </span><code class="western">INCLUDE</code> <span lang="ar-SA">ستُبدِّل النص </span>(<span lang="ar-SA">في هذه الحالة </span>"See photo") <span lang="ar-SA">وتضع بدلًا منه المستند </span>(<span lang="ar-SA">الصورة</span>)<span lang="ar-SA">، بينما المتصفحات الأقدم أو الأقل كفاءة ستتجاهل </span><code class="western">INCLUDE</code> <span lang="ar-SA">تمامًا</span>."
		</p>
	</div>
</blockquote>

<p align="right" dir="rtl">
	<span lang="ar-SA">لم يُطبَّق اقتراحه أبدًا، إلا أنَّ فكرة توفير نص إن لم تتوفر الصورة هي تقنية مهمة لتسهيل الوصول التي كانت ناقصة من اقتراح </span>Marc <span lang="ar-SA">الأولي لوسم </span><code class="western">&lt;IMG&gt;</code>. <span lang="ar-SA">استعملت هذه الميزة في </span>خاصية <span style="font-family:courier new,courier,monospace;">&lt;img alt&gt;</span><span lang="ar-SA">، التي أساء متصفح </span>Netscape <span lang="ar-SA">معاملتها </span>باعتبارها تلميحًا<span lang="ar-SA"> </span>(tooltip).
</p>

<p align="right" dir="rtl">
	<span lang="ar-SA">بعد عدِّة ساعات من إرسال </span>Tony <span lang="ar-SA">لرسالته، <a href="http://1997.webhistory.org/www.lists/www-talk.1993q1/0186.html" rel="external nofollow">ردَّ </a></span><a href="http://1997.webhistory.org/www.lists/www-talk.1993q1/0186.html" rel="external nofollow">Tim Berners-Lee</a> <span lang="ar-SA">عليها</span>:
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			"<span lang="ar-SA">لقد تخيلت أنَّ طريقة تمثيل الصور هي</span>:
		</p>

		<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6739_38">

<span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">fig1</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"fghjkdfghj"</span><span class="pln"> </span><span class="atn">REL</span><span class="pun">=</span><span class="atv">"EMBED, PRESENT"</span><span class="tag">&gt;</span><span class="pln">Figure </span><span class="tag">&lt;/a&gt;</span></pre>

		<p dir="rtl" style="text-align: right;">
			<span lang="ar-SA">حيث قيم الخاصية </span>REL <span lang="ar-SA">تعني</span>:
		</p>

		<ul dir="rtl">
<li style="text-align: right;">
				<code class="western">EMBED</code> – <span lang="ar-SA">التضمين هنا عند العرض</span>
			</li>
			<li style="text-align: right;">
				<code class="western">PRESENT</code> – <span lang="ar-SA">اعرضها كلما عُرِضَ مصدر المستند</span>
			</li>
		</ul>
<p dir="rtl" style="text-align: right;">
			<span lang="ar-SA">لاحظ أنك تستطيع استعمال تركبيات مختلفة من القيم السابقة، ولن يتعطل المتصفح إن لم يدعم إحداها</span>.
		</p>

		<p dir="rtl" style="text-align: right;">
			<span lang="ar-SA">أرى أنَّ استعمال الطريقة السابقة للأيقونات التي يمكن النقر عليها يعني تشعّب وسوم </span><span style="font-family:courier new,courier,monospace;"><code class="western">&lt;a&gt;</code></span><span lang="ar-SA">؛ مممممم، لكن لم أُرِد وسمًا خاصًا</span>."
		</p>
	</div>
</blockquote>

<p align="right" dir="rtl">
	<span lang="ar-SA">لم يُطبَّق هذا الاقتراح مطلقًا، لكن خاصية </span><code class="western">rel</code> <span lang="ar-SA">ما زالت موجودةً</span>.
</p>

<p align="right" dir="rtl">
	<span lang="ar-SA"><a href="http://1997.webhistory.org/www.lists/www-talk.1993q1/0188.html" rel="external nofollow">أضاف </a></span><a href="http://1997.webhistory.org/www.lists/www-talk.1993q1/0188.html" rel="external nofollow">Jim Davis</a>:
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			"<span lang="ar-SA">أظن أنَّ من الجيد وجود طريقة لتحديد نوع المحتوى، أي</span>:
		</p>

		<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6739_40">

<span class="tag">&lt;IMG</span><span class="pln"> </span><span class="atn">HREF</span><span class="pun">=</span><span class="atv">"http://nsa.gov/pub/sounds/gorby.au"</span><span class="pln"> </span><span class="atn">CONTENT-TYPE</span><span class="pun">=</span><span class="atv">audio/basic</span><span class="tag">&gt;</span></pre>

		<p dir="rtl" style="text-align: right;">
			<span lang="ar-SA">لكنني مستعد للتعايش مع وجوب تحديد نوع المحتوى عبر امتداد الملف</span>."
		</p>
	</div>
</blockquote>

<p align="right" dir="rtl">
	<span lang="ar-SA">لم يُطبَّق هذا الاقتراح قط، لكن أضاف متصفح </span>Netscape <span lang="ar-SA">لاحقًا دعمًا لتضمين عناصر الوسائط المتعددة باستعمال عنصر </span><code class="western">&lt;embed&gt;</code>.
</p>

<p align="right" dir="rtl">
	<span lang="ar-SA"><a href="http://1997.webhistory.org/www.lists/www-talk.1993q1/0192.html" rel="external nofollow">سأل </a></span><a href="http://1997.webhistory.org/www.lists/www-talk.1993q1/0192.html" rel="external nofollow">Jay C. Weber</a>:
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			<span lang="ar-SA">"على الرغم من أنَّ الصور في أعلى قائمة أنواع الوسائط التي أود أن تُضمَّن في متصفحات الويب، لكن لا أظن أنَّ علينا إضافة طرق مختلفة لكل نوع من أنواع الوسائط على حدة؛ فما الذي حدث لحماسنا تجاه استعمال أنواع </span>MIME<span lang="ar-SA">؟"</span>
		</p>
	</div>
</blockquote>

<p align="right" dir="rtl">
	<span lang="ar-SA"><a href="http://1997.webhistory.org/www.lists/www-talk.1993q1/0194.html" rel="external nofollow">ردَّ </a></span><a href="http://1997.webhistory.org/www.lists/www-talk.1993q1/0194.html" rel="external nofollow">Marc Andreessen</a>:
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			<span lang="ar-SA">"ما سبق ليس بديلًا عن استعمال </span>MIME <span lang="ar-SA">كآلية قياسية لتضمين المستندات، لكنه يُوفِّر تطبيقًا بسطيًا وضروريًا لوظيفة منفصلة عن </span>MIME."
		</p>
	</div>
</blockquote>

<p align="right" dir="rtl">
	<span lang="ar-SA"><a href="http://1997.webhistory.org/www.lists/www-talk.1993q1/0198.html" rel="external nofollow">أ</a><a href="http://1997.webhistory.org/www.lists/www-talk.1993q1/0198.html" rel="external nofollow">جاب </a></span><a href="http://1997.webhistory.org/www.lists/www-talk.1993q1/0198.html" rel="external nofollow">Jay C. Weber</a> <span lang="ar-SA">له قائلًا</span>:
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			"<span lang="ar-SA">لننسَ مؤقتًا أنواع </span>MIME <span lang="ar-SA">إن كانت ستؤثر على وضوح المشكلة</span>. <span lang="ar-SA">اعتراضي على نقاش </span>"<span lang="ar-SA">كيف يمكن أن ندعم تضمين الصور</span>" <span lang="ar-SA">وليس </span>"<span lang="ar-SA">كيف يمكن أن ندعم تضمين الكائنات لمختلف أنواع الوسائط المتعددة</span>".
		</p>

		<p dir="rtl" style="text-align: right;">
			<span lang="ar-SA">وإلا، فسنجد أحدهم يقترح </span>"<span lang="ar-SA">لنضع وسمًا جديدًا هو </span><span style="font-family:courier new,courier,monospace;"><code class="western">&lt;AUD SRC="file://foobar.com/foo/bar/blargh.snd"</code><code class="western">‎</code><code class="western">&gt;</code> </span><span lang="ar-SA">لتضمين الصوت</span>".
		</p>

		<p dir="rtl" style="text-align: right;">
			<span lang="ar-SA">لا أظن أنَّ استعمال شيءٍ عام وشامل سيكلفنا الكثير</span>."
		</p>
	</div>
</blockquote>

<p align="right" dir="rtl">
	<span lang="ar-SA">أدركنا بعد فوات الأوان أنَّ مخاوف </span>Jay <span lang="ar-SA">كان لها أساسٌ من الصحة لكن ذلك استغرق فترةً طويلةً، فقد أضافت </span>HTML5 <span lang="ar-SA">أخيرًا عنصرَيّ<span style="font-family:courier new,courier,monospace;"> </span></span><span style="font-family:courier new,courier,monospace;"><code class="western">&lt;video&gt;</code></span> <span lang="ar-SA">و </span><span style="font-family:courier new,courier,monospace;"><code class="western">&lt;audio&gt;</code></span>.
</p>

<p align="right" dir="rtl">
	<span lang="ar-SA">ردًا على رسالة </span>Jay <span lang="ar-SA">الأصلية، <a href="http://1997.webhistory.org/www.lists/www-talk.1993q1/0204.html" rel="external nofollow">قال </a></span><a href="http://1997.webhistory.org/www.lists/www-talk.1993q1/0204.html" rel="external nofollow">Dave Raggett</a>:
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			<span lang="ar-SA">"هذا صحيح</span>! <span lang="ar-SA">أريد دعمًا لمختلف أنواع الصور، مع إمكانية تحديد النوع المُفضَّل لدى المتصفح</span>. <span lang="ar-SA">وأرى أنَّ ملاحظة </span>Tim <span lang="ar-SA">عن دعم النقر على مناطق في الصورة مهمة</span>."
		</p>
	</div>
</blockquote>

<p align="right" dir="rtl">
	<span lang="ar-SA">لاحقًا في </span>1993<span lang="ar-SA">، اقترح </span>Dave Raggett <span lang="ar-SA">معيار </span>HTML+‎ <span lang="ar-SA">الذي كان تطويرًا لمعيار </span>HTML. <span lang="ar-SA">لكن لم يُطبَّق اقتراحه مطلقًا، ثم حلَّت </span>HTML 2.0 <span lang="ar-SA">محله التي أعطت طابعًا رسميًا للميزات شائعة الاستعمال</span>: "<span lang="ar-SA">هذا </span>المعيار<span lang="ar-SA"> يضفي توضيحًا وطابعًا رسميًا لمجموعة من ميزات </span>HTML <span lang="ar-SA">التي كانت شائعة الاستعمال قبل حزيران</span>/<span lang="ar-SA">يونيو عام </span>1994".
</p>

<p align="right" dir="rtl">
	<span lang="ar-SA">كتب </span>Dave <span lang="ar-SA">لاحقًا معيار </span>HTML 3.0 <span lang="ar-SA">المبني على مسودة </span>HTML+‎ <span lang="ar-SA">التي كتبها سابقًا، وذلك خارج إطار </span>W3C <span lang="ar-SA">للمعايير </span>(<span lang="ar-SA">المسمى </span>Arena)<span lang="ar-SA">؛ لكن لم تُطبَّق </span>HTML 3.0 <span lang="ar-SA">أبدًا، وحلَّت محلها </span>HTML 3.2<span lang="ar-SA">، التي رسَّمَت الميزات كالإصدار السابق </span>HTML 2.0: "أضافت HTML 3.2 الميزات شائعة الاستخدام مثل الجداول، و applets <span lang="ar-SA">والتفاف النص حول الصور، بالإضافة إلى توافقيتها مع معيار </span>HTML 2.0".
</p>

<p align="right" dir="rtl">
	<span lang="ar-SA">شارك </span>Dave <span lang="ar-SA">لاحقًا بوضع معيار </span>HTML 4.0<span lang="ar-SA">، وطوَّر </span><a href="http://tidy.sourceforge.net/" rel="external nofollow">HTML Tidy</a><span lang="ar-SA">، وشارك في المساعدة بتطوير </span>XHTML<span lang="ar-SA">، و </span>XForms<span lang="ar-SA">، و </span>MathML<span lang="ar-SA">، وغيرها من معايير </span>W3C <span lang="ar-SA">الحديثة</span>.
</p>

<p align="right" dir="rtl">
	<span lang="ar-SA">بالعودة إلى </span>1993<span lang="ar-SA">، <a href="http://1997.webhistory.org/www.lists/www-talk.1993q1/0209.html" rel="external nofollow">رد </a></span><a href="http://1997.webhistory.org/www.lists/www-talk.1993q1/0209.html" rel="external nofollow">Marc <span lang="ar-SA">على </span>Dave</a>:
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			<span lang="ar-SA">ربما علينا التفكير في لغة لتوصيفِ الرسومات ذاتُ غرضٍ عام يمكن فيها تضمين الروابط التشعبية المرتبطة بأيقونات أو صور أو نصوص أو أي شيء</span>. <span lang="ar-SA">هل رأى أحدكم شيئًا يشبه </span>Intermedia <span lang="ar-SA">بهذه الإمكانيات؟</span>
		</p>
	</div>
</blockquote>

<p align="right" dir="rtl">
	Intermedia <span lang="ar-SA">هو مشروعٌ من جامعة </span>Brown<span lang="ar-SA">، طوِّر من عام </span>1985 <span lang="ar-SA">إلى </span>1991 <span lang="ar-SA">وكان يعمل على نظام </span>A/UX<span lang="ar-SA">، الذي هو نظام شبيه بِيونكس </span>(Unix-like) <span lang="ar-SA">لحواسيب ماكنتوش في ذاك الوقت</span>.
</p>

<p align="right" dir="rtl">
	<span lang="ar-SA">راجت فكرة </span>"<span lang="ar-SA">لغة لتوصيفِ الرسومات ذاتُ غرضٍ عام</span>"<span lang="ar-SA">، وذلك بدعم المتصفحات الحديثة لصيغة </span>SVG (<span lang="ar-SA">لغة توصيفية يمكن دمج السكربتات معها</span>)<span lang="ar-SA">، و </span><span style="font-family:courier new,courier,monospace;"><code class="western">&lt;canvas&gt;</code></span> (<span lang="ar-SA">واجهة برمجية </span>[<abbr title="Application Programming Interface | واجهة برمجية">API</abbr>] <span lang="ar-SA">إجرائية </span>[procedural] <span lang="ar-SA">مباشرة</span>)<span lang="ar-SA">، على الرغم من أن الأخيرة </span>بدأت كإضافة<span lang="ar-SA"><a href="http://ln.hixie.ch/?start=1089635050&amp;count=1" rel="external nofollow"> مملوكة</a> </span>(proprietary extension) <span lang="ar-SA">قبل أن يتم ترسيمُها من </span><a href="http://www.whatwg.org/" rel="external nofollow">WHATGW</a>.
</p>

<p align="right" dir="rtl">
	<span lang="ar-SA"><a href="http://1997.webhistory.org/www.lists/www-talk.1993q1/0217.html" rel="external nofollow">رد</a></span><a href="http://1997.webhistory.org/www.lists/www-talk.1993q1/0217.html" rel="external nofollow">Bill Janssen</a>:
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			<span lang="ar-SA">"أنظمة أخرى –التي فيها هذا المفهوم– علينا النظر إليها هي </span>Andrew <span lang="ar-SA">و </span>Slate<span lang="ar-SA">، إذا أنَّ </span>Andrew <span lang="ar-SA">مبني على </span>"<span lang="ar-SA">إدراج الأشياء</span>"<span lang="ar-SA">، فكلٌ نظامٍ منهما فيه نوعٌ من أنواع الإدراج، مثل النص، أو الصور النقطية، أو الرسومات، أو الرسوم المتحركة، أو الرسائل، أو جداول البيانات، إلخ</span>. <span lang="ar-SA">وتسمح أيضًا بتكرار الإدراج ضمن العناصر، أي أن أي نوع من الأشياء القابلة للإدراج يمكن إدراجها في أي شيء يقبل أن تُدرَج فيه الأشياء، على سبيل المثال، يمكن يمكن إدراج كائن ضمن أي مكان في مربع النص، أو في منطقة في لوحة الرسم، أو في أي خلية في الجدول</span>."
		</p>
	</div>
</blockquote>

<p align="right" dir="rtl">
	"Andrew" <span lang="ar-SA">هو إشارة إلى </span>Andrew User Interface System (<span lang="ar-SA">إلا أنه كان يسمى في ذاك الوقت </span>Andrew Project).
</p>

<p align="right" dir="rtl">
	<span lang="ar-SA">في ذاك الحين، وجد </span><a href="http://1997.webhistory.org/www.lists/www-talk.1993q1/0215.html" rel="external nofollow">Thomas Fine</a> <span lang="ar-SA">فكرةً مختلفةً</span>:
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			"<span lang="ar-SA">أنا أرى أنَّ أفضل طريقة لتضمين الصور في الويب هي استعمال أنواع </span>MIME. <span lang="ar-SA">أنا متأكد أنَّ صيغة </span>postscript <span lang="ar-SA">مدعومة كنوع من أنواع </span>MIME<span lang="ar-SA">، وهي تتعامل بشكلٍ رائعٍ مع دمج النصوص والصور</span>.
		</p>

		<p dir="rtl" style="text-align: right;">
			<span lang="ar-SA">لكنها غير قابلة للنقر؟ ربما أنتم محقون، لكنني أظن أن هنالك حلًا لذلك في </span>Display Postscript<span lang="ar-SA">، وذلك بتعريف أمرٍ ما يُحدِّد عنوان </span>URL <span lang="ar-SA">ويستخدم المسار </span>(path) <span lang="ar-SA">الحالي كمنطقة مغلقة للزر القابل للضغط</span>. <span lang="ar-SA">ولأن </span>postscript <span lang="ar-SA">تتعامل تعاملًا جيدًا مع المسارات، فإن الفكرة السابقة تجعل من السهل إضافة الروابط</span>."
		</p>
	</div>
</blockquote>

<p align="right" dir="rtl">
	"Display Postscript" <span lang="ar-SA">هي تقنية لعرض </span>Postscript <span lang="ar-SA">على الشاشة طوِّرَتها كل من </span>Adobe <span lang="ar-SA">و </span>NeXT.
</p>

<p align="right" dir="rtl">
	<span lang="ar-SA">لم يُطبَّق هذا الاقتراح أبدًا، لكن الفكرة أنَّ أفضل طريقة لحل مشاكل </span>HTML <span lang="ar-SA">هي استبدال شيءٍ ما آخر بها </span>ما زالت تظهر من وقتٍ لآخر.
</p>

<p align="right" dir="rtl">
	<span lang="ar-SA"><a href="http://1997.webhistory.org/www.lists/www-talk.1993q1/0221.html" rel="external nofollow">قال </a></span><a href="http://1997.webhistory.org/www.lists/www-talk.1993q1/0221.html" rel="external nofollow">Tim Berners-Lee</a> <span lang="ar-SA">في الثاني من آذار</span>/<span lang="ar-SA">مارس عام </span>1993:
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			"<span lang="ar-SA">تسمح </span>HTML 2 <span lang="ar-SA">للمستند أن يتضمن أي نوع يستطيع المستخدم التعامل معه، وليس فقط أنواع </span>MIME <span lang="ar-SA">المُسجَّلة</span>.
		</p>

		<p dir="rtl" style="text-align: right;">
			<span lang="ar-SA">نعم، أنا أظن أن هنالك حالات يمكن استعمال </span>postscript <span lang="ar-SA">فيها مع النصوص الفائقة </span>(hypertext)<span lang="ar-SA">، لكن لا أعلم إن كان عرض </span>postscript <span lang="ar-SA">كافيًا، أنا أعلم أنَّ </span>Adobe <span lang="ar-SA">تحاول إرساء استخدام صيغة </span>PDF <span lang="ar-SA">المبنية على </span>postscript <span lang="ar-SA">التي يمكن أن أن تتواجد فيها الروابط؛ والقابلة للقراءة بمجموعة من عارضات الملفات الاحتكارية</span>.
		</p>

		<p dir="rtl" style="text-align: right;">
			<span lang="ar-SA">أظن أن لغة خاصة بإضافة الروابط </span>(<span lang="ar-SA">ربما مبنية على </span>Hytime<span lang="ar-SA">؟</span>) <span lang="ar-SA">قد تسمح بتطوير معايير النصوص الفائقة والرسوميات</span>/<span lang="ar-SA">الفيديو كلًا على حدة، مما يفيدهما معًا</span>.
		</p>

		<p dir="rtl" style="text-align: right;">
			<span lang="ar-SA">دع وسم </span><code class="western">IMG</code> <span lang="ar-SA">يصبح </span><code class="western">INCLUDE</code> <span lang="ar-SA">واجعله يشير إلى نوع مستندات عادي، أو </span><code class="western">EMBED</code> <span lang="ar-SA">أن بدت </span><code class="western">INCLUDE</code> <span lang="ar-SA">شبيهةً بعبارة </span>include <span lang="ar-SA">في لغة </span>cpp<span lang="ar-SA">، التي يتوقع فيها الناس توفير شيفرة </span>SGML <span lang="ar-SA">لكي تُفسَّر مباشرةً – وهذا بالطبع ليس الغرض منها</span>."
		</p>
	</div>
</blockquote>

<p align="right" dir="rtl">
	<a href="http://www.hytime.org/" rel="external nofollow">HyTime</a> <span lang="ar-SA">كان نظام مستندات قديم مبني على </span>SGML<span lang="ar-SA">، وقد أثَّرَ كثيرًا في النقاشات الأولية للغة </span>HTML<span lang="ar-SA">، ولاحقًا لغة </span>XML.
</p>

<p align="right" dir="rtl">
	<span lang="ar-SA">لم يُطبَّق اقتراح </span>Tim <span lang="ar-SA">لوسم </span><code class="western">&lt;INCLUDE&gt;</code> <span lang="ar-SA">مطلقًا، لكنك تجده صداه واضحًا في عناصر </span><code class="western">&lt;object&gt;</code> <span lang="ar-SA">و </span><code class="western">&lt;embed&gt;</code> <span lang="ar-SA">و </span><code class="western">&lt;iframe&gt;</code>.
</p>

<p align="right" dir="rtl">
	<span lang="ar-SA">في النهاية، <a href="http://1997.webhistory.org/www.lists/www-talk.1993q1/0257.html" rel="external nofollow">قال </a></span><a href="http://1997.webhistory.org/www.lists/www-talk.1993q1/0257.html" rel="external nofollow">Marc Andreessen</a> <span lang="ar-SA">في الثاني عشر من آذار</span>/<span lang="ar-SA">مارس عام </span>1993:
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			"<span lang="ar-SA">بالعودة إلى موضوع تضمين الصور في المستندات، اقتربتُ من إصدار </span>Mosaic V0.10<span lang="ar-SA">، الذي سيدعم تضمين صور </span>GIF <span lang="ar-SA">و </span>XBM <span lang="ar-SA">كما ذكرتُ سابقًا…</span>
		</p>

		<p dir="rtl" style="text-align: right;">
			<span lang="ar-SA">لسنا مستعدين لدعم </span><code class="western">INCLUDE/EMBED</code> <span lang="ar-SA">في هذه المرحلة… لذا سنستعمل </span><code class="western">&lt;IMG SRC="url"‎&gt;</code> (<span lang="ar-SA">وليس </span><code class="western">ICON</code><span lang="ar-SA">، لأنه ليس من الضروري أن تكون كل الصور المُضمَّنة تعني أيقونات</span>). <span lang="ar-SA">حاليًا، لن يُحدَّد نوع الصورة </span>(<span lang="ar-SA">أي </span><code class="western">content-type</code>)<span lang="ar-SA">، لكننا نفكر في دعم ذلك </span>(<span lang="ar-SA">مع التكيف مع أنواع </span>MIME)<span lang="ar-SA">، وفي الحقيقة، آلية قراءة الصور التي نستعملها حاليًا تستطيع تحديد صيغة الصورة آليًا، لذا لن يكون امتداد الملف أيّة قيمة</span>."
		</p>
	</div>
</blockquote>

<p align="right" dir="rtl">
	<span lang="ar-SA">ترجمة </span>-<span lang="ar-SA">وبتصرّف</span>- <span lang="ar-SA">لفصل </span><a href="http://diveinto.html5doctor.com/past.html" rel="external nofollow">A Quite Biased History of HTML5</a> <span lang="ar-SA">من كتاب </span>Dive Into HTML5 <span lang="ar-SA">لمؤلفه </span>Mark Pilgrim.
</p>

<h2 align="right" dir="rtl">
	اقرأ أيضًا
</h2>

<ul dir="rtl">
<li>
		المقال التالي: <a href="https://academy.hsoub.com/programming/html/html5/%D9%86%D8%B8%D8%B1%D8%A9-%D8%B9%D9%84%D9%89-%D8%AA%D8%A7%D8%B1%D9%8A%D8%AE-html-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%AB%D8%A7%D9%86%D9%8A-r336/" rel="">نظرة على تاريخ HTML - الجزء الثاني</a>
	</li>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/html/html5/%D8%AE%D9%85%D8%B3%D8%A9-%D8%A3%D8%B4%D9%8A%D8%A7%D8%A1-%D8%B9%D9%84%D9%8A%D9%83-%D9%85%D8%B9%D8%B1%D9%81%D8%AA%D9%87%D8%A7-%D8%B9%D9%86-html5-r324/" rel="">خمسة أشياء عليك معرفتها عن HTML5</a>
	</li>
	<li>
		النسخة الكملة لكتاب <a href="https://academy.hsoub.com/files/13-%D9%86%D8%AD%D9%88-%D9%81%D9%87%D9%85-%D8%A7%D9%94%D8%B9%D9%85%D9%82-%D9%84%D8%AA%D9%82%D9%86%D9%8A%D8%A7%D8%AA-html5/" rel="">نحو فهم أعمق لتقنيات HTML5 </a>
	</li>
</ul>
]]></description><guid isPermaLink="false">322</guid><pubDate>Sun, 15 May 2016 18:50:00 +0000</pubDate></item><item><title>&#x62E;&#x645;&#x633;&#x629; &#x623;&#x634;&#x64A;&#x627;&#x621; &#x639;&#x644;&#x64A;&#x643; &#x645;&#x639;&#x631;&#x641;&#x62A;&#x647;&#x627; &#x639;&#x646; HTML5</title><link>https://academy.hsoub.com/programming/html/%D8%AE%D9%85%D8%B3%D8%A9-%D8%A3%D8%B4%D9%8A%D8%A7%D8%A1-%D8%B9%D9%84%D9%8A%D9%83-%D9%85%D8%B9%D8%B1%D9%81%D8%AA%D9%87%D8%A7-%D8%B9%D9%86-html5-r324/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_05/diveintohtml5-introduction.png.90bd09eecbe393e1e1b0f7f7b1982d1a.png" /></p>

<p dir="rtl">
	هذه <a href="https://academy.hsoub.com/search/?tags=%D9%85%D8%AF%D8%AE%D9%84+%D8%A5%D9%84%D9%89+html5" rel="">السلسلة</a> عبارة عن ترجمة لكتاب <a href="http://diveinto.html5doctor.com/" rel="external nofollow">Dive Into HTML5</a> لمؤلفه Mark Pilgrim والتي سنتعلم من خلالها أساسيات HTML5 وكيفية الإنتقال إليها من نسخ HTML أقدم مع مراعاة دعم المتصفحات المختلفة.
</p>

<p dir="rtl">
	قبل البدء باستخدام HTML5 سنتطرق في هذا الدرس الأول إلى خمسة أشياء عليك معرفتها حول HTML5.
</p>

<p dir="rtl" style="text-align: center;">
	<img alt="diveintohtml5-introduction.png" class="ipsImage ipsImage_thumbnailed" data-fileid="15897" data-unique="qpuvbxihx" src="https://academy.hsoub.com/uploads/monthly_2016_05/diveintohtml5-introduction.png.f2c03fb646ef02cb4df1e639c9972d99.png"></p>

<h2 dir="rtl">
	1. HTML5 ليست شيئا واحدا كبيرا
</h2>

<p dir="rtl">
	ربما تتساءل: "كيف يمكنني البدء باستعمال HTML5 إن لم تكن تدعمها المتصفحات القديمة؟" لكن السؤال نفسه سيُضلِّلُكَ، HTML5 ليست شيئًا واحدًا كبيرًا، وإنما مجموعة من الميزات المنفصلة عن بعضها، أي أنَّك لن تحاول اكتشاف "دعم HTML5" في المتصفح، لأن ذلك غير منطقي؛ وإنما يمكنك اكتشاف الدعم للمزايا المختلفة مثل التخزين المحلي، أو عرض الفيديو، أو الحصول على الموقع الجغرافي.
</p>

<p dir="rtl" style="text-align: center;">
	<img alt="video.png" class="ipsImage ipsImage_thumbnailed" data-fileid="15896" data-unique="nevuoztmw" src="https://academy.hsoub.com/uploads/monthly_2016_05/video.png.920a9ad2b7c2cfa2c0aba1e05f0f5821.png"></p>

<p dir="rtl">
	ربما تظن أنَّ HTML هي مجموعة من الوسوم وتلك الأقواس التي تشبه الزاوية… إن هذا جزءٌ مهمٌ منها، لكنه لا يمثلها كلها. إذ تُعرِّف مواصفات HTML5 كيف تتفاعل تلك الوسوم مع لغة JavaScript وذلك عبر ما يُعرَف بالمصطلح "DOM" (اختصار للعبارة Document Object Model). فلا تُعرِّف HTML وسمًا باسم <span style="font-family:courier new,courier,monospace;">&lt;video&gt;</span> فقط، وإنما هنالك واجهة برمجية للتعامل مع كائنات الفيديو عبر DOM. يمكنك استعمال تلك الواجهة البرمجية (أي <abbr title="Application Programming Interface | واجهة برمجية">API</abbr>) لكي تكتشف الدعم لمختلف صيغ الفيديو، ولكي تبدأ المقطع أو توقفه مؤقتًا، أو أن تكتم صوته، أو أن تعرف ما هو المقدار الذي نُزِّل (downloaded) من الفيديو، وكل شيءٍ آخر يلزمك لبناء تجربة مستخدم رائعة عند استعمال وسم <span style="font-family:courier new,courier,monospace;">&lt;video&gt;</span> لعرض المقاطع.
</p>

<h2 dir="rtl">
	2. ليس عليك التخلي عن كل شيء
</h2>

<p dir="rtl">
	شئت أم أبيت، لا تستطيع أن تنكر أنَّ HTML 4 هي أنجح لغة توصيف (markup) على الإطلاق. بُنيَت HTML5 على هذا النجاح، وليس عليك أن تتخلى عن الشيفرات التي كتبتها، وليس عليك إعادة تعلم أشياء تعرفها من قبل، فإن كان تطبيقك يعمل البارحة باستخدام HTML 4، فسيبقى يعمل اليوم في عصر HTML5.
</p>

<p dir="rtl">
	لكن إن أتيت لتحسين تطبيق الويب الخاص بك، فقد أتيت إلى المكان الصحيح. هذا مثالٌ واقعي: تدعم HTML5 كل عناصر النماذج (forms) في HTML 4، لكنها تتضمن عناصر جديدة أخرى. كنا ننتظر إضافة بعض تلك العناصر بفارغ الصبر، مثل المزلاج (slider) ومنتقي التاريخ (date picker)؛ بعضها الآخر ذو ميزاتٍ خفية.
</p>

<p dir="rtl" style="text-align: center;">
	<img alt="forms.png" class="ipsImage ipsImage_thumbnailed" data-fileid="15893" data-unique="fv17k07af" src="https://academy.hsoub.com/uploads/monthly_2016_05/forms.png.c3cd14b7013c628f001ebca7d52085f2.png"></p>

<p dir="rtl">
	فحقل email مثَلَهُ كمَثَلِ حقل الإدخال النصي العادي، إلا أنَّ متصفحات الهواتف الذكية ستخصص لوحة المفاتيح الظاهرة على الشاشة لتسهيل كتابة عناوين البريد الإلكتروني. بعض المتصفحات القديمة لا تدعم حقل email وستعامله على أنَّه حقل نصي عادي، وسيبقى النموذج يعمل دون تعديلات في الشيفرة أو استخدام أساليب ملتوية عبر JavaScript.
</p>

<p dir="rtl" style="text-align: center;">
	<img alt="rel-email.png" class="ipsImage ipsImage_thumbnailed" data-fileid="15895" data-unique="p6n722tal" src="https://academy.hsoub.com/uploads/monthly_2016_05/rel-email.png.5aa4cb277a69dd6d921fdf7e5a00cbfe.png"></p>

<p dir="rtl">
	هذا يعني أنك تستطيع تحسين النماذج في صفحاتك اليوم، حتى لو كان زوارك يستعملون IE 6.
</p>

<h2 dir="rtl">
	3. من السهل البدء باستعمالها
</h2>

<p dir="rtl">
	يمكن أن يكون "التحديث" إلى HTML5 بسيطًا لدرجة أنَّ كل ما عليك فعله هو تعديل doctype، الذي يجب أن يكون أول سطر من كل صفحة HTML. تُعرِّف الإصدارات السابقة من HTML الكثير من أنواع doctype، وكان من الصعب اختيار النوع المناسب؛ لكن هنالك نوع doctype وحيد في HTML5:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5943_7">
<span class="dec">&lt;!DOCTYPE html&gt;</span></pre>

<p dir="rtl">
	لن يضر التحديث إلى نمط doctype في HTML5 شيفراتك المكتوبة، لأنَّ جميع الوسوم (tags) المُعرَّفة في HTML 4 ما تزال مدعومةً في HTML5، لكنها ستسمح لك باستعمال –والتحقق من صحة صياغة– العناصر التنظيمية الجديدة مثل<span style="font-family:courier new,courier,monospace;"> &lt;article&gt;</span> و <span style="font-family:courier new,courier,monospace;">&lt;section&gt;</span> و <span style="font-family:courier new,courier,monospace;">&lt;header&gt;</span> و <span style="font-family:courier new,courier,monospace;">&lt;footer&gt;</span>، سنتحدّث عن هذه العناصر الجديدة في مقال قادم.
</p>

<p dir="rtl" style="text-align: center;">
	<img alt="markup-with-arrow.png" class="ipsImage ipsImage_thumbnailed" data-fileid="15894" data-unique="vscqv5d6p" src="https://academy.hsoub.com/uploads/monthly_2016_05/markup-with-arrow.png.e54a2b75b79b5a0dc31b63918442abb2.png"></p>

<h2 dir="rtl">
	4. إنها تعمل بالفعل
</h2>

<p dir="rtl">
	سواءً كنت تريد الرسم عبر canvas، أو تشغيل مقطع فيديو، أو تصميم نماذج أفضل، أو بناء تطبيقات ويب تعمل دون اتصال؛ فستجد أنَّ HTML5 مدعومةً دعمًا جيدًا، حيث يوجد دعمٌ لخاصية canvas في Firefox و Safari و Chrome و Opera ومتصفحات الهواتف الذكية وتشغيل الفيديو وتحديد المواقع والتخزين المحلي والمزيد. تدعم غوغل (في متصفحها) البيانات الوصفية الخاصة (microdata)، وحتى مايكروسوفت –المشهورة بتأخرها عن اللحاق بركب دعم المعايير القياسية– تدعم أغلبية ميزات HTML5 في متصفح "Internet Explorer 9".
</p>

<p dir="rtl">
	يتضمن كل درس من هذه <a href="https://academy.hsoub.com/search/?tags=%D9%85%D8%AF%D8%AE%D9%84+%D8%A5%D9%84%D9%89+html5" rel="">السلسلة</a> جداول لتوافقية المتصفحات الشهيرة للميزة المشروحة، ولكن الأهم من ذلك أنَّ كل درس يتضمن نقاشًا عن خياراتك إن كنت تحتاج إلى دعم المتصفحات القديمة. تم توفير ميزات في HTML5 مثل تحديد الموقع الجغرافي وتشغيل الفيديو في السابق عبر إضافات للمتصفح مثل Gears أو Flash. الميزات الأخرى، مثل canvas، تستطيع محاكاتها بشكلٍ تام باستعمال JavaScript.
</p>

<p dir="rtl">
	ستتعلم من خلال هذه السّلسلة (التي تقرأ الآن درسها الأول) كيف تستهدف المتصفحات ذات الدعم المدمج لتلك الميزات، دون أن تترك خلفك المتصفحات القديمة.
</p>

<h2 dir="rtl">
	5. HTML5 ستبقى وستتطور
</h2>

<p dir="rtl">
	اخترع "Tim Berners-Lee" الشبكة العنكبوتية في بدايات التسعينات من القرن الماضي، ثم أنشَأ جمعية W3C لكي تكون المرجع في معايير الويب، وهذا ما فعلته تلك الجمعية لأكثر من 20 عامًا. هذا ما قالته W3C عن مستقبل معايير الويب في تموز/يوليو عام 2009:
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			"أعلن اليوم المدير أنَّه عندما ينتهي عقد مجموعة العمل على XHTML 2 كما هو مقرر في نهاية 2009، فلن يُمدَّد العقد. وبهذا –وبزيادة الموارد في مجموعة عمل HTML– فإن W3C تأمل بتسريع وتيرة العمل على HTML5، وتوضيح موقف W3C تجاه مستقبل HTML."
		</p>
	</div>
</blockquote>

<p dir="rtl">
	ستبقى HTML5 في المستقبل، لنبدأ بتعلمها.
</p>

<p dir="rtl">
	ترجمة -وبتصرّف- لفصل <a href="http://diveinto.html5doctor.com/introduction.html" rel="external nofollow">Introduction</a> من كتاب Dive Into HTML5 لمؤلفه Mark Pilgrim.
</p>

<h2 dir="rtl">
	اقرأ أيضًا
</h2>

<ul dir="rtl">
<li>
		المقال التالي: <a href="https://academy.hsoub.com/programming/html/html5/%D9%86%D8%B8%D8%B1%D8%A9-%D8%B9%D9%84%D9%89-%D8%AA%D8%A7%D8%B1%D9%8A%D8%AE-html-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%A3%D9%88%D9%84-r322/" rel="">نظرة على تاريخ HTML - الجزء الأول</a>
	</li>
	<li>
		النسخة الكاملة من كتاب <a href="https://academy.hsoub.com/files/13-%D9%86%D8%AD%D9%88-%D9%81%D9%87%D9%85-%D8%A7%D9%94%D8%B9%D9%85%D9%82-%D9%84%D8%AA%D9%82%D9%86%D9%8A%D8%A7%D8%AA-html5/" rel="">نحو فهم أعمق لتقنيات HTML5 </a>
	</li>
</ul>
]]></description><guid isPermaLink="false">324</guid><pubDate>Wed, 04 May 2016 08:17:00 +0000</pubDate></item><item><title>HTML &#x648; CSS &#x644;&#x644;&#x645;&#x628;&#x62A;&#x62F;&#x626;&#x64A;&#x646;: &#x643;&#x64A;&#x641; &#x62A;&#x646;&#x634;&#x626; &#x645;&#x648;&#x642;&#x639;&#x627; &#x645;&#x646; &#x639;&#x62F;&#x629; &#x635;&#x641;&#x62D;&#x627;&#x62A;</title><link>https://academy.hsoub.com/programming/html/html-%D9%88-css-%D9%84%D9%84%D9%85%D8%A8%D8%AA%D8%AF%D8%A6%D9%8A%D9%86-%D9%83%D9%8A%D9%81-%D8%AA%D9%86%D8%B4%D8%A6-%D9%85%D9%88%D9%82%D8%B9%D8%A7-%D9%85%D9%86-%D8%B9%D8%AF%D8%A9-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-r286/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_02/56c38c5d1b79e_html-css-beginners-multipages-website(1).png.e1d65b8c2fb87ab83e7eedf676682e84.png" /></p>

<div id="wmd-preview-section-40">
	<p id="للمبتدئين-كيف-تنشئ-موقعا-من-عدة-صفحات-باستخدام-html-وcss">
		يحتوي <a href="https://academy.hsoub.com/programming/html5/html-%D9%88-css-%D9%84%D9%84%D9%85%D8%A8%D8%AA%D8%AF%D8%A6%D9%8A%D9%86-%D9%83%D9%8A%D9%81-%D8%AA%D8%B5%D9%85%D9%85-%D8%A3%D9%88%D9%84-%D8%B5%D9%81%D8%AD%D8%A9-%D9%88%D9%8A%D8%A8-%D9%84%D9%83-r242/">مشروع الملف الشخصي الخاص بنا</a> على صفحة واحدة حتى الآن. من الواضح أنّ معظم مواقع الويب تمتلك أكثر من صفحة. سنُضيف في هذا الدرس صفحات إضافيّة.
	</p>

	<p style="text-align: center;">
		<img alt="56c38c5b1a749_html-css-beginners-multipa" class="ipsImage ipsImage_thumbnailed" data-fileid="13034" data-unique="c0w8t8o8t" src="https://academy.hsoub.com/uploads/monthly_2016_02/56c38c5b1a749_html-css-beginners-multipages-website(1).png.96a4fdcdc6c29791980ab38f67908cfa.png"></p>
</div>

<div id="wmd-preview-section-41">
	<h2 id="إنشاء-صفحة-جديدة">
		إنشاء صفحة جديدة
	</h2>

	<p>
		سننشئ ثلاث صفحات جديدة، صفحة من أجل مدوّنة الموقع Blog، وصفحة من أجل المشاريع Projects وأخرى من أجل معلومات التواصل Contact.
	</p>

	<p>
		ستكون هذه الصفحات الرئيسيّة في الموقع. يجب أن نتذكّر دائمًا أنّه يمكن أن نضيف صفحات فرعيّة أخرى لاحقًا. فمثلًا سيكون هناك صفحة فرعيّة لكل تدوينة ضمن المدوّنة.
	</p>

	<p>
		لامتلاك بنية جيّدة ضمن الموقع من الأفضل إنشاء مجلّدات فرعيّة من أجل كلّ صفحة. سيكون لكل مجلّد فرعي ملف index.html خاص به يُعرَض افتراضيًّا عندما يفتح المتصفّح هذا المجلّد.
	</p>

	<p>
		يُعتبر إنشاء صفحة جديدة أمر سهلًا للغاية. من الأفضل نسخ ملف <span style="font-family:courier new,courier,monospace;">index.html</span> الذي أنشأناه مسبقًا بحيث يكون لدينا البنية الأساسية جاهزة. بعد ذلك نُجري بالطبع بعض التعديلات المناسبة لكلّ صفحة جديدة.
	</p>

	<p>
		<strong>ملاحظة</strong>: يجب أن نتأكّد بأنّنا لا نستخدم أيّ رمز خاص أو فراغات عند تسمية أي مجلّد فرعي أو ملف. يجب أن نستخدم الأحرف القياسيّة ويُفضّل أن تكون بحالة صغيرة lower case، ومن الجيّد أيضًا فصل الكلمات عن بعضها باستخدام إشارة الناقص (-).
	</p>
</div>

<div id="wmd-preview-section-42">
	<h2 id="صفحة-المدونة">
		صفحة المدونة
	</h2>

	<p>
		أنشئ مجلّدًا فرعيًّا ضمن مجلّد <strong>portfolio</strong> وسمّه <strong>blog</strong>. انسخ الملف<span style="font-family:courier new,courier,monospace;"> index.html</span> إلى هذا المجلّد الفرعي الجديد. يجب الآن أن تبدو بنية الملفات لديك على الشكل التالي:
	</p>

	<p style="text-align: center;">
		<img alt="blog-subfolder.png.f866b7c6263912579d909" class="ipsImage ipsImage_thumbnailed" data-fileid="13032" data-unique="mgr0kqa1u" src="https://academy.hsoub.com/uploads/monthly_2016_02/blog-subfolder.png.f866b7c6263912579d909ce2e33baac1.png"></p>

	<p>
		افتح الملف المنسوخ <span style="font-family:courier new,courier,monospace;">blog/index.html</span> في المتصفّح (إذا كنت تستخدم Brackets انقر زر Live Preview). ستلاحظ وجود أمرين لا يعملان بشكل صحيح:
	</p>

	<ol><li>
			صور الصفحة لا تظهر.
		</li>
		<li>
			الألوان المعرّفة ضمن ملف css غير مُطبّقة في هذه الصفحة.
		</li>
	</ol><p>
		يعود السبب في ذلك هو أنّنا ضمن مجلّد فرعي، فالمسار الخاص بملفات الصور لم يعد صحيحًا. لكي نسمح للصور بالظهور يجل أن نستخدم المسار <span style="font-family:courier new,courier,monospace;">marco.jpg/..</span> بدلًا من<span style="font-family:courier new,courier,monospace;"> marco.jpg</span> ضمن السمة <span style="font-family:courier new,courier,monospace;">src</span> لعنصر الصورة <span style="font-family:courier new,courier,monospace;">img</span>. ولكن من المؤكّد أنّنا لن نريد استخدام نفس الصور ضمن صفحة المدوّنة. لذلك يمكن إزالة العنصر <span style="font-family:courier new,courier,monospace;">img</span> بشكل كامل.
	</p>

	<p>
		جرت العادة أن نعرّف قواعد css بحيث تكون شاملة لكل صفحات موقع الويب. وهكذا فإنّه من الضروري أن نشير إلى نفس ملف css الذي يحوي هذه القواعد وذلك ضمن ملف المدوّنة. يمكننا ذلك بتغيير عنوان URL من <span style="font-family:courier new,courier,monospace;">main.css</span> إلى<span style="font-family:courier new,courier,monospace;"> main.css/..</span>  ضمن عنصر <span style="font-family:courier new,courier,monospace;">link</span>. يوضّح السطر التالي شكل عنصر <span style="font-family:courier new,courier,monospace;">link</span> بعد تعديل<br>
		الملف <span style="font-family:courier new,courier,monospace;"><strong>blog/index.html</strong>:</span>
	</p>
</div>

<div id="wmd-preview-section-43">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8330_7">
<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">"../main.css"</span><span class="tag">&gt;</span></pre>

	<p>
		سيؤدي تعديل عنوان ملف css ضمن عنصر <span style="font-family:courier new,courier,monospace;">link</span> إلى تطبيق تنسيقات css الموجودة ضمن الملف <span style="font-family:courier new,courier,monospace;">main.css</span> على صفحة المدوّنة. سنغيّر الآن عنوان ومحتوى صفحة المدوّنة.
	</p>

	<p>
		<strong><span style="font-family:courier new,courier,monospace;">blog/index.html</span></strong>
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8330_9">
<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;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">"../main.css"</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="tag">&lt;title&gt;</span><span class="pln">Blog - Web Portfolio of Marco</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;h1</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"title"</span><span class="tag">&gt;</span><span class="pln">Blog</span><span class="tag">&lt;/h1&gt;</span><span class="pln">

    </span><span class="tag">&lt;p&gt;</span><span class="pln">I write about things I encounter while learning web programming.</span><span class="tag">&lt;/p&gt;</span><span class="pln">

    </span><span class="tag">&lt;h2&gt;</span><span class="pln">Blog Entries</span><span class="tag">&lt;/h2&gt;</span><span class="pln">

    </span><span class="com">&lt;!-- Here will be a list of all the blog entries. --&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>

	<p>
		يمكننا رؤية بعض الوسوم الجديدة في الشيفرة السابقة وهي <span style="font-family:courier new,courier,monospace;">&lt;--</span> و <span style="font-family:courier new,courier,monospace;">--!&gt;</span> حيث يمكننا أن نكتب تعليق comment بين الرمزين السابقين. الهدف من التعليقات هو كتابة بعض الملاحظات التوضيحيّة لنا فقط، فهي لا تظهر لمستخدم الصفحة.
	</p>
</div>

<div id="wmd-preview-section-45">
	<h3 id="التدوينة-كصفحة-فرعية">
		التدوينة كصفحة فرعية
	</h3>

	<p>
		تحتاج مدوّنتنا بالطبع إلى بعض المُدخلات (التدوينات). سننشئ صفحة HTML مستقلّة من أجل كل تدوينة. أنشئ مجلّدًا فرعيًّا ضمن المجلّد blog وسمّه <span style="font-family:courier new,courier,monospace;">first-entry</span> ثمّ انسخ الملف <span style="font-family:courier new,courier,monospace;">blog/index.html</span> إلى المجلّد الفرعي<span style="font-family:courier new,courier,monospace;"> first-entry</span>: 
	</p>

	<p style="text-align: center;">
		<img alt="blog-entry-subfolder2.png.bd06029faa4247" class="ipsImage ipsImage_thumbnailed" data-fileid="13031" data-unique="t7fttvel1" src="https://academy.hsoub.com/uploads/monthly_2016_02/blog-entry-subfolder2.png.bd06029faa42479a5ab5e16ff62611ea.png"></p>

	<p>
		 افتح ملف التدوينة وغيّر محتوياته كما يلي:
	</p>

	<p>
		<strong><span style="font-family:courier new,courier,monospace;">blog/first-entry/index.html</span></strong>
	</p>
</div>

<div id="wmd-preview-section-46">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8330_11">
<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;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">"../../main.css"</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="tag">&lt;title&gt;</span><span class="pln">First Entry - Web Portfolio of Marco</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;h1</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"title"</span><span class="tag">&gt;</span><span class="pln">First Entry</span><span class="tag">&lt;/h1&gt;</span><span class="pln">
    </span><span class="tag">&lt;p&gt;</span><span class="pln">April 7, 2015</span><span class="tag">&lt;/p&gt;</span><span class="pln">

    </span><span class="tag">&lt;hr&gt;</span><span class="pln">

    </span><span class="tag">&lt;p&gt;</span><span class="pln">This is my very first blog entry.</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>

	<p>
		لقد وضعت في الشيفرة السابقة عنصر HTML جديد وهو<span style="font-family:courier new,courier,monospace;"> &lt;hr&gt; </span>حاول أن تعرف وظيفته بمفردك، حاول مثلًا إزالته ومن ثمّ انظر إلى تأثير ذلك على الصفحة. أو يمكنك البحث عن معلومات عنه في الانترنت.
	</p>
</div>

<div id="wmd-preview-section-47">
	<h3 id="لنبدأ-بكتابة-التدوينات">
		لنبدأ بكتابة التدوينات
	</h3>

	<p>
		أنصح دائمًا أن تبدأ فورًا بكتابة تدويناتك. يمكنك كتابة تدوينة قصيرة في كل مرّة تتعلّم شيئًا جديدًا حول البرمجة. يمكنك الاطلاع على بعض الأفكار التالية التي قد تساعدك في البدء بالتدوين:
	</p>

	<ul><li>
			ماذا تعلّمت اليوم؟ 
			<ul><li>
					أضف صور توضيحية.
				</li>
				<li>
					أضف روابط إلى مواقع مفيدة.
				</li>
			</ul></li>
		<li>
			ما هي المشاكل التي واجهتها؟
		</li>
		<li>
			كيف حللت تلك المشاكل؟
		</li>
		<li>
			ما العمل الذي يتوجّب عليّ إنجازه في المرّة القادمة؟
		</li>
	</ul><p>
		بمثل هذه التدوينات السابقة ستتقدّم سريعًا في احتراف البرمجة، وأسباب ذلك:
	</p>

	<ol><li>
			ستكون ملّمًا بما تعلّمته بالتدريج.
		</li>
		<li>
			يمكنك أن تبحث عن المعلومات ضمن وثائقك الشخصيّة.
		</li>
		<li>
			ستتدرّب على HTML وCSS بينما تكتب هذه التدوينات.
		</li>
		<li>
			إذا نشرت موقعك على الانترنت يمكنك أن تجعل تدويناتك متاحة للآخرين. <br>
			وهذا يساعد على مشاركة المعرفة التي اكتسبتها أو حتى أن تطلب من أحد الأشخاص أن يساعدك على حل مشكلة ما.
		</li>
		<li>
			إذا نشرت ملفّك الشخصي سيكون من الرائع مشاركته مع الآخرين للاطّلاع على إمكانيّاتك وأعمالك.
		</li>
	</ol></div>

<div id="wmd-preview-section-48">
	<h3 id="التدوينة-الثانية">
		التدوينة الثانية
	</h3>

	<p>
		<strong>تلميح</strong>: أنشئ مجلّدًا فرعيًّا من أجل كل ملف تدوينة جديد. سيسمح لك هذا التنظيم بوضع الصور والملفات الأخرى لكل تدوينة بشكل منفصل عن ملفات التدوينات الأخرى.
	</p>

	<p style="text-align: center;">
		<img alt="blog-entry-subfolder.png.a75db4dbffae51d" class="ipsImage ipsImage_thumbnailed" data-fileid="13030" data-unique="98pq0ip7m" src="https://academy.hsoub.com/uploads/monthly_2016_02/blog-entry-subfolder.png.a75db4dbffae51de9859127af0552230.png"></p>
</div>

<div id="wmd-preview-section-49">
	<h2 id="صفحة-المشاريع">
		صفحة المشاريع
	</h2>

	<p>
		من المفيد الاحتفاظ بصفحة خاصّة للمشاريع والمهام التي ننجزها. سنحضّر صفحة خاصّة لمثل هذه المشاريع على الرغم من عدم وجود أي محتوى بعد.
	</p>

	<p>
		لنكمل كما فعلنا من أجل صفحة المدوّنة ولننشئ مجلّدً فرعيً اسمه <strong>projects</strong> ضمن المجلّد الرئيسي <strong>portfolio</strong> ولننسخ الملف <span style="font-family:courier new,courier,monospace;">index.html </span>إليه.
	</p>

	<p>
		<strong><span style="font-family:courier new,courier,monospace;">projects/index.html</span></strong>
	</p>
</div>

<div id="wmd-preview-section-50">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8330_13">
<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;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">"../main.css"</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="tag">&lt;title&gt;</span><span class="pln">Projects - Web Portfolio of Marco</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;h1</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"title"</span><span class="tag">&gt;</span><span class="pln">Projects</span><span class="tag">&lt;/h1&gt;</span><span class="pln">

    </span><span class="tag">&lt;p&gt;</span><span class="pln">Here you will soon find my web projects.</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>

	<h2>
		صفحة التواصل
	</h2>
</div>

<div id="wmd-preview-section-51">
	<p>
		سننشئ الآن الصفحة الأخيرة من الصفحات الرئيسيّة في الموقع وهي صفحة التواصل Contact. أنشئ مجلّدًا اسمه <strong>contact</strong> ضمن المجلّد الرئيسي <strong>portfolio</strong> وانسخ الصفحة <span style="font-family:courier new,courier,monospace;">index.html </span>إليه.
	</p>

	<p>
		<strong>ملاحظة مهمّة</strong>: كُن حذرًا فيما يتعلّق بالمعلومات التي ترغب بنشرها للعموم. فمثلًا لا تنشر بريدك الإلكتروني الرئيسي، لأنّه من الممكن أن تستقبل بريدًا مزعجًا.
	</p>

	<p>
		<strong><span style="font-family:courier new,courier,monospace;">contact/index.html</span></strong>
	</p>
</div>

<div id="wmd-preview-section-52">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8330_15">
<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;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">"../main.css"</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="tag">&lt;title&gt;</span><span class="pln">Contact - Web Portfolio of Marco</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;h1</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"title"</span><span class="tag">&gt;</span><span class="pln">Contact</span><span class="tag">&lt;/h1&gt;</span><span class="pln">

    </span><span class="tag">&lt;p&gt;</span><span class="pln">
      You can contact me by email: </span><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"mailto:spammails@gmx.ch"</span><span class="tag">&gt;</span><span class="pln">spammails@gmx.ch</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;p&gt;</span><span class="pln">
      Marco Jakob</span><span class="tag">&lt;br&gt;</span><span class="pln">
      Switzerland
    </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>

	<p>
		يمكننا أن نلاحظ وجود عنصر HTML جديد بجوار اسم Marco Jakob وهو العنصر <span style="font-family:courier new,courier,monospace;">&lt;br&gt;</span>. يعمل هذا العنصر على الانتقال إلى سطر جديد ضمن الصفحة. نلاحظ أيضًا الرّابط الخاص <span style="font-family:courier new,courier,monospace;">mailto</span> الذي يوجد على يسار البريد الإلكتروني (ضمن السمة <span style="font-family:courier new,courier,monospace;">href</span>). سيعمل هذا الرّابط في حال نقره على فتح برنامج البريد الإلكتروني الافتراضي المثبّت على حاسوبك، مع فتح رسالة جديدة بعنوان البريد الإلكتروني المطلوب.
	</p>

	<p>
		لدينا الآن خمس صفحات HTML:
	</p>

	<p style="text-align: center;">
		<img alt="all-files.png.4949005427144f0e5df71fd7b4" class="ipsImage ipsImage_thumbnailed" data-fileid="13029" data-unique="26koua8ix" src="https://academy.hsoub.com/uploads/monthly_2016_02/all-files.png.4949005427144f0e5df71fd7b4d3ee6e.png"></p>

	<p>
		سنزوّد موقعنا في الدرس السادس بوسيلة للتنقّل بين صفحاته.
	</p>

	<p>
		ترجمة -وبتصرّف- للمقال <a href="http://code.makery.ch/library/html-css/part5/" rel="external nofollow">HTML &amp; CSS Tutorial - Part 5: Blog and Other Pages</a> لصاحبه Marco Jakob.
	</p>
</div>
]]></description><guid isPermaLink="false">286</guid><pubDate>Tue, 16 Feb 2016 20:55:00 +0000</pubDate></item><item><title>HTML &#x648; CSS &#x644;&#x644;&#x645;&#x628;&#x62A;&#x62F;&#x626;&#x64A;&#x646;: &#x645;&#x642;&#x62F;&#x645;&#x629; &#x625;&#x644;&#x649; &#x62A;&#x646;&#x633;&#x64A;&#x642;&#x627;&#x62A; CSS</title><link>https://academy.hsoub.com/programming/html/html-%D9%88-css-%D9%84%D9%84%D9%85%D8%A8%D8%AA%D8%AF%D8%A6%D9%8A%D9%86-%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D8%A5%D9%84%D9%89-%D8%AA%D9%86%D8%B3%D9%8A%D9%82%D8%A7%D8%AA-css-r272/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_02/css-beginners.png.f93b6de8875239013ddbbc23ba8962cb.png" /></p>

<div id="wmd-preview-section-13">
	<p dir="rtl">
		تعلّمنا في الدرسين السابقين كيفية <a href="https://academy.hsoub.com/programming/html5/html-%D9%88-css-%D9%84%D9%84%D9%85%D8%A8%D8%AA%D8%AF%D8%A6%D9%8A%D9%86-%D9%83%D9%8A%D9%81-%D8%AA%D8%B5%D9%85%D9%85-%D8%A3%D9%88%D9%84-%D8%B5%D9%81%D8%AD%D8%A9-%D9%88%D9%8A%D8%A8-%D9%84%D9%83-r242/">إنشاء</a> و<a href="https://academy.hsoub.com/apps/web/%D9%83%D9%8A%D9%81-%D8%AA%D9%86%D8%B4%D8%B1-%D8%B5%D9%81%D8%AD%D8%A9-%D8%A3%D9%88-%D9%85%D9%88%D9%82%D8%B9-%D9%88%D9%8A%D8%A8-%D9%82%D9%85%D8%AA-%D8%A8%D8%AA%D8%B5%D9%85%D9%8A%D9%85%D9%87-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D8%A5%D9%86%D8%AA%D8%B1%D9%86%D8%AA-r52/">نشر موقعنا الأوّل</a>. في الحقيقة موقعنا حاليًّا بسيط وذو محتوى قليل وليس جذّابًا بعد. سنتعلّم في هذ الدرس كيف نستخدم تنسيقات CSS لتنسيق الصفحة. كما سنتعلّم في درس لاحق كيف نضيف المزيد من التنسيقات إلى موقعنا وذلك بمساعدة إطار عمل اسمه Bootstrap.
	</p>

	<p dir="rtl" style="text-align: center;">
		<img alt="css-beginners.png.80c0da67484ce49167c692" class="ipsImage ipsImage_thumbnailed" data-fileid="12590" data-unique="lkjki5qc6" src="https://academy.hsoub.com/uploads/monthly_2016_02/css-beginners.png.80c0da67484ce49167c6929936f517cc.png"></p>

	<h2 dir="rtl">
		البنية والتنسيق Structure and Style
	</h2>

	<p dir="rtl">
		لنتذكّر معًا: يُعبّر HTML عن بنية صفحة الويب، في حين تُعرّف CSS المظهر العامّ للصفحة. يُعتبر فصل بنية الصفحة عن تنسيقها أمر في غاية الأهميّة وله الكثير من المزايا رغم أنّه ليس إلزاميًّا. لذلك سنعمل دومًا على جعل رُماز HTML وتنسيقات CSS في ملفات منفصلة.
	</p>

	<h2 dir="rtl">
		الربط مع ملف CSS
	</h2>

	<p dir="rtl">
		ملف CSS هو ملف نص عادي له الامتداد (css.) ونربط معه من داخل ملف HTML.
	</p>

	<p dir="rtl">
		أنشئ ملف جديد ضمن المجلّد Portfolio وسمّه <span style="font-family:courier new,courier,monospace;">main.css</span>.
	</p>

	<p dir="rtl" style="text-align: center;">
		<img alt="new-css-file.png.6765b6fa258725698a88c35" class="ipsImage ipsImage_thumbnailed" data-fileid="12585" data-unique="rect97oab" src="https://academy.hsoub.com/uploads/monthly_2016_02/new-css-file.png.6765b6fa258725698a88c353a301fcf3.png"></p>

	<p dir="rtl">
		افتح الملف <span style="font-family:courier new,courier,monospace;">index.html </span>واضف العنصر <span style="font-family:courier new,courier,monospace;">&lt;link&gt;</span> ضمن العنصر <span style="font-family:courier new,courier,monospace;">&lt;head&gt;</span>. سنخبر الصفحة<span style="font-family:courier new,courier,monospace;"> index.html</span> عن طريق العنصر <span style="font-family:courier new,courier,monospace;">&lt;link&gt;</span> أن تُحمّل ملف CSS، أي سننشئ رابط بينهما:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3490_7">
<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">"main.css"</span><span class="tag">&gt;</span></pre>

	<p dir="rtl">
		أضف العنصر السابق إلى العنصر <span style="font-family:courier new,courier,monospace;">&lt;head&gt;</span>. ستبدو الشيفرة لديك مُشابهة لما يلي:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3490_9">
<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;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">"main.css"</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;title&gt;</span><span class="pln">Web Portfolio of Marco</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;h1&gt;</span><span class="pln">Web Portfolio of Marco</span><span class="tag">&lt;/h1&gt;</span><span class="pln">
  </span><span class="tag">&lt;h2&gt;</span><span class="pln">Welcome!</span><span class="tag">&lt;/h2&gt;</span><span class="pln">
  </span><span class="tag">&lt;p&gt;</span><span class="pln">Thanks for stopping by.</span><span class="tag">&lt;/p&gt;</span><span class="pln">
  </span><span class="tag">&lt;p&gt;</span><span class="pln">Please have a look around. In the blog section I document my experiences in programming. You may also look at my web projects. Have fun.</span><span class="tag">&lt;/p&gt;</span><span class="pln">
  </span><span class="tag">&lt;img</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"marco.jpg"</span><span class="pln"> </span><span class="atn">alt</span><span class="pun">=</span><span class="atv">"Picture of me"</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;p&gt;</span><span class="pln">Marco :-)</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>

	<p dir="rtl">
		<strong>ملاحظة مهمّة</strong>: لكي يكون من الممكن الوصول لملف CSS، يجب أن تحتوي السمة <span style="font-family:courier new,courier,monospace;">href</span> على المسار الصحيح للملف. وهذا يعني بدوره أنّه إذا كان ملف CSS في مجلّد فرعي، يحب أن نضم هذا المجلّد الفرعي إلى مسار الملف كما هو واضح. يمكنك مراجعة هذا الموضوع في الدرس الأوّل في فقرة عناوين URL النسبيّة والمطلقة.
	</p>

	<h2 dir="rtl">
		الألوان
	</h2>

	<p dir="rtl">
		إلى الآن ما يزال ملف CSS فارغًا، لنبدأ الآن بكتابة أولى تنسيقات CSS. تحوي CSS ما يُعرف بالقواعد CSS Rules. يمكننا باستخدام قاعدة CSS أن نُخبر المتصفّح كيف يُعالج جزءًا مُحدّدًا من مستند HTML.
	</p>

	<p dir="rtl">
		كمثال على ذلك، سنغيّر لون الخلفيّة ولون النص للعنوان من المستوى الثاني <span style="font-family:courier new,courier,monospace;">h2</span> ضمن الملف <span style="font-family:courier new,courier,monospace;">index.html </span>الخاص بنا. أضف ما يلي إلى ملف CSS:
	</p>

	<p dir="rtl">
		<strong>الملف main.css</strong>
	</p>

	<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5169_7">
<span class="pln">h2 </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">#607d8b;</span><span class="pln">
  color</span><span class="pun">:</span><span class="pln"> </span><span class="com">#ffffff;</span><span class="pln">
</span><span class="pun">}</span></pre>

	<p dir="rtl">
		يجب أن تحصل على شكل شبيه بما يلي:
	</p>

	<p dir="rtl" style="text-align: center;">
		<img alt="changed-color.png.94f9030746ce61b22b5bfe" class="ipsImage ipsImage_thumbnailed" data-fileid="12581" data-unique="rwd4i438o" src="https://academy.hsoub.com/uploads/monthly_2016_02/changed-color.png.94f9030746ce61b22b5bfeb65b762371.png"></p>

	<h3 dir="rtl">
		أكواد الألوان Color Codes
	</h3>

	<p dir="rtl">
		تظهر الألوان على الشاشة كمزيج من نسب متفاوتة من الأحمر والأخضر والأزرق (RGB). يمكن التعبير عن المزج بين هذه الألوان الثلاثة في CSS بطريقتين: كقيم RGB عشرية (محصورة بين 0 إلى 255 لكل لون) أو كقيم RGB ستة عشرية hex values. وفي الواقع تُستَخدم القيم الستة عشرية في الغالب.
	</p>

	<p dir="rtl">
		إذا نظرنا إلى مثالنا الأخير، فنجد أنّنا قد عيّنا لونًا أزرقًا مائلًا للرمادي كلون خلفية باستخدام كود اللون <strong>607d8b#</strong> بالترميز الستة عشري. أمّا لو أردنا استخدام الترميز العشري المُكافئ له فسنكتب<strong> (rgb(96, 125, 139</strong>.
	</p>

	<p dir="rtl">
		في التمثيل الستة عشري، يُعبّر أوّل رمزين من اليسار عن اللون الأحمر، والرمزين في الوسط عن اللون الأخضر، ويُعبّر الرمزان الأخيران عن اللون الأزرق.
	</p>

	<h3 dir="rtl">
		العمل مع أكواد الألوان
	</h3>

	<p dir="rtl">
		يُعتبر التعامل مع الألوان كأكواد، شائع جدًا لكنه صعب في الحقيقة. لأنّك تتعامل مع قيم ورموز وليس مع ألوان، يُنصح دوماً استخدام أداة لانتقاء الألوان color picker.
	</p>

	<p dir="rtl">
		إذا كنت تستخدم المحرّر <a href="http://brackets.io/" rel="external nofollow">Brackets</a> عندها يمكن أن تفتح أداة انتقاء اللون الموجودة ضمن ملف CSS الذي تعمل ضمنه. فقط تحتاج لأن تنقر بزر الفأرة الأيمن على كود اللون وتختار تحرير سريع Quick Edit أو أن تضغط <span style="font-family:courier new,courier,monospace;">Ctrl+E</span> من لوحة المفاتيح.
	</p>

	<p dir="rtl" style="text-align: center;">
		<img alt="quick-edit.png.b608c75eee8a312ded0dc6eee" class="ipsImage ipsImage_thumbnailed" data-fileid="12586" data-unique="vjestlwbr" src="https://academy.hsoub.com/uploads/monthly_2016_02/quick-edit.png.b608c75eee8a312ded0dc6eee852be97.png"></p>

	<p dir="rtl">
		يؤدي ذلك إلى ظهور أداة اختيار الألوان حيث يمكنك اختيار اللون الذي يناسبك بسهولة. كما يمكنك اختيار ترميز اللون بالصيغة التي ترغبها من خلال ثلاثة أزرار موجودة في الأسفل.
	</p>

	<p dir="rtl" style="text-align: center;">
		<img alt="color-chooser.png.7f5c8fd473f57306b442ef" class="ipsImage ipsImage_thumbnailed" data-fileid="12582" data-unique="v8b5nzex2" src="https://academy.hsoub.com/uploads/monthly_2016_02/color-chooser.png.7f5c8fd473f57306b442ef19f7f6a3a6.png"></p>

	<h3 dir="rtl">
		أدوات اختيار الألوان من الانترنت
	</h3>

	<p dir="rtl">
		إذا لم تتوفّر أداة لاختيار الألوان ضمن المحرّر لديك، فيمكنك استخدام عدد كبير جدًّا من هذه الأدوات ولكن على الانترنت، فعلى سبيل المثال لا الحصر:
	</p>

	<ul dir="rtl"><li>
			<a href="http://html-color-codes.info/" rel="external nofollow">HTML Color Codes</a>
		</li>
		<li>
			<a href="http://www.colorpicker.com/" rel="external nofollow">ColorPicker</a>
		</li>
	</ul><h3 dir="rtl">
		ألواح الألوان من الانترنت
	</h3>

	<p dir="rtl">
		نحتاج في كثير من الأحيان إلى أكثر من لون واحد لاستخدامه في موقعنا. لذلك نحتاج إلى أداة تزوّدنا بمجموعة من الألوان المنسجمة، والتي تتناغم مع بعضها لإضفاء تأثير جميل على الموقع. وهذا ما تفعله ألواح الألوان color palettes. هناك بعض المواقع على الانترنت التي توفّر مثل هذه الميزة.
	</p>

	<p dir="rtl">
		أمثلة على مواقع بمجموعات ألوان معرّفة مسبقًا:
	</p>

	<ul dir="rtl"><li>
			<a href="http://www.colourlovers.com/palettes" rel="external nofollow">Colour Lovers</a>
		</li>
		<li>
			<a href="http://design-seeds.com/" rel="external nofollow">Design Seeds</a>
		</li>
		<li>
			<a href="http://www.google.com/design/spec/style/color.html" rel="external nofollow">Google Color Palette</a>
		</li>
	</ul><p dir="rtl">
		أمثلة على مواقع تولّد مجموعات ألوان حسب رغبة المستخدم:
	</p>

	<ul dir="rtl"><li>
			<a href="https://kuler.adobe.com/" rel="external nofollow">Kuler</a>: يُعرّف قاعدة لون (سنتكلّم عن القواعد بعد قليل)، ويسمح لنا بالحصول على خمسة ألوان منسجمة معًا.
		</li>
		<li>
			<a href="http://www.paletton.com/" rel="external nofollow">Paletton</a>: أداة متقدّمة للحصول على مجموعات ألوان منسجمة.
		</li>
		<li>
			<a href="http://colourco.de/" rel="external nofollow">Colourco.de</a>: مولّد ألواح ألوان عملي أيضًا.
		</li>
	</ul><h2 dir="rtl">
		قواعد CSS
	</h2>

	<p dir="rtl">
		رأينا كيف تُغيّر CSS من هيئة عناصر HTML من خلال تأثيرها على الألوان. لنلقي نظرة عن كثب حول CSS وطريقة عملها.
	</p>

	<p dir="rtl">
		تُعتبر القاعدة rule البنية الأساسية لـ CSS وهي تتكوّن من ثلاثة عناصر: المحدِّد Selector والخاصية Property والقيمة Value.
	</p>

	<p dir="rtl" style="text-align: center;">
		<img alt="css-rule.png.80b5c4c97ccf9dcb7d825eedfab" class="ipsImage ipsImage_thumbnailed" data-fileid="12583" data-unique="eq5z4hlyq" src="https://academy.hsoub.com/uploads/monthly_2016_02/css-rule.png.80b5c4c97ccf9dcb7d825eedfab13e69.png"></p>

	<p dir="rtl">
		تُشير القاعدة السابقة إلى أنّ جميع عناصر &lt;h2&gt; يجب أن يكون لها لون خلفية له الكود <strong>607d8b#</strong>.
	</p>

	<h2 dir="rtl">
		محددات CSS
	</h2>

	<p dir="rtl">
		تُقرّر المحدّدات أيّ عناصر HTML ستُطبّق عليها قاعدة CSS.
	</p>

	<p dir="rtl">
		<strong>ملاحظة</strong>: سنتعلّم هنا المحدّدات الأكثر أهمية. من أجل الاطلاع على أنواع المُحدّدات الأخرى ابحث في Google عن CSS Selectors.
	</p>

	<h3 dir="rtl">
		محددات النوع Type Selectors
	</h3>

	<p dir="rtl">
		تستهدف محدّدات النوع جميع العناصر التي يكون لها وسم HTML مُحدّد. فلو أردنا مثلًا استهداف جميع عناصر الفقرة p ضمن المستند بتنسيقات معيّنة، فسنكتب شبيه بما يلي:
	</p>

	<p style="text-align: left;">
		<strong>CSS</strong>
	</p>

	<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5169_11">
<span class="pln">p </span><span class="pun">{</span><span class="pln">
</span><span class="pun">...</span><span class="pln">
</span><span class="pun">}</span></pre>

	<p style="text-align: left;">
		<strong>HTML</strong>
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5169_13">
<span class="tag">&lt;p&gt;</span><span class="pln">...</span><span class="tag">&lt;/p&gt;</span><span class="pln">
</span><span class="tag">&lt;p&gt;</span><span class="pln">...</span><span class="tag">&lt;/p&gt;</span></pre>

	<h3 dir="rtl">
		محددات الصنف Class Selectors
	</h3>

	<p dir="rtl">
		تُستخدم هذه المحدّدات بشكل متكرّر، وتُعتبر أنّها مُخصّصة أكثر قليلًا من مُحدّدات النوع، كما أنّه بإمكانها استهداف مجموعة مخصّصة من العناصر بدلًا من عناصر النوع الواحد فقط.
	</p>

	<p dir="rtl">
		لاستخدام محدّدات الصنف نضيف السمة class إلى العنصر المراد استهدافه، ونسند إليها قيمة مُعبّرة من اختيارنا. عند استخدام محدّد الصنف فإنّنا نستخدم نقطة عادية يليها قيمة السمة class التي أضفناها إلى العنصر.
	</p>

	<p dir="rtl">
		سيستهدف محدّد الصنف في المثال التالي، جميع العناصر التي لها سمة <span style="font-family:courier new,courier,monospace;">class</span> تحمل القيمة <span style="font-family:courier new,courier,monospace;">highlight</span>:
	</p>

	<p style="text-align: left;">
		<strong>CSS</strong>
	</p>

	<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5169_15">
<span class="pun">.</span><span class="pln">highlight </span><span class="pun">{</span><span class="pln">
</span><span class="pun">...</span><span class="pln">
</span><span class="pun">}</span></pre>

	<p style="text-align: left;">
		<strong>HTML</strong>
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5169_17">
<span class="tag">&lt;p</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"highlight"</span><span class="tag">&gt;</span><span class="pln">...</span><span class="tag">&lt;/p&gt;</span><span class="pln">
</span><span class="tag">&lt;p&gt;</span><span class="pln">...</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">class</span><span class="pun">=</span><span class="atv">"highlight new"</span><span class="tag">&gt;</span><span class="pln">...</span><span class="tag">&lt;/p&gt;</span></pre>

	<p dir="rtl">
		لاحظ من شيفرة HTML في الأعلى، أنّ التنسيق سيُطبّق على عنصر<span style="font-family:courier new,courier,monospace;"> p</span> الأوّل والثالث فحسب، لأنّ عنصر <span style="font-family:courier new,courier,monospace;">p </span>الثاني لا يمتلك سمة class لها القيمة highlight. كما نلاحظ أنّ عنصر <span style="font-family:courier new,courier,monospace;">p </span>الثالث له أكثر من قيمة ضمن سمة class الخاصة به (highlight وnew). في الحقيقة يمكن استخدام عدة قيم لعنصر واحد بشرط أن نفصل بينها بفراغات.
	</p>

	<h3 dir="rtl">
		محددات معرف العنصر ID Selectors
	</h3>

	<p dir="rtl">
		تشبه هذه المحدّدات محدّدات الصنف. فهي تستهدف جميع عناصر HTML التي تملك السمة id بقيمة مُعيّنة. من المهم أن نوضّح أنّ السمة id عبارة عن مُعرّف العنصر ضمن شيفرة HTML ورغم أنّه ليس من الملزم وضعها مع كل عنصر، إلّا أنّه في حال وجودها يجب أن تكون القيمة التي تحملها فريدةً ضمن كامل مستند HTML.
	</p>

	<p dir="rtl">
		نستنتج إذًا أنّ أي محدّد معرّف عنصر سيستهدف في الواقع عنصر واحد فقط ضمن مستند HTML. عند استخدام محدّد معرّف العنصر فإننا نكتب الرمز # يليه معرّف العنصر (قيمة السمة id).
	</p>

	<p dir="rtl">
		سيستهدف محدّد معرّف العنصر في المثال التالي عنصر واحد فقط ضمن مستند HTML بحيث تكون قيمة السمة <span style="font-family:courier new,courier,monospace;">id</span> له هي <span style="font-family:courier new,courier,monospace;">navigation</span>:
	</p>

	<p style="text-align: left;">
		<strong>CSS</strong>
	</p>

	<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5169_19">
<span class="com">#navigation {</span><span class="pln">
</span><span class="pun">...</span><span class="pln">
</span><span class="pun">}</span></pre>

	<p style="text-align: left;">
		<strong>HTML</strong>
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5169_21">
<span class="tag">&lt;p</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"navigation"</span><span class="tag">&gt;</span><span class="pln">...</span><span class="tag">&lt;/p&gt;</span><span class="pln">
</span><span class="tag">&lt;p&gt;</span><span class="pln">...</span><span class="tag">&lt;/p&gt;</span></pre>

	<h3 dir="rtl">
		محددات الفروع Descendant Selectors
	</h3>

	<p dir="rtl">
		يمكنك باستخدام هذا النوع من المحدّدات استهداف العناصر الأبناء لعنصر مُعيّن. ونقصد بالعناصر الأبناء لعنصر معيّن، تلك العناصر التي تقع ضمن هذا العنصر بصرف النظر عن المستوى الذي تقع فيه. انظر المثال التالي:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5169_23">
<span class="tag">&lt;p</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"level1"</span><span class="tag">&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">"level2"</span><span class="tag">&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">"myfile.html"</span><span class="tag">&gt;</span><span class="pln">My File</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;/p&gt;</span></pre>

	<p dir="rtl">
		نلاحظ بأنّ كلًّا من العنصر <span style="font-family:courier new,courier,monospace;">&lt;p&gt;</span> (ذو المعرّف <span style="font-family:courier new,courier,monospace;">level2</span>) والعنصر <span style="font-family:courier new,courier,monospace;">&lt;a&gt;</span> هما ابنان للعنصر<span style="font-family:courier new,courier,monospace;"> &lt;p&gt;</span> (ذو المعرّف <span style="font-family:courier new,courier,monospace;">level1</span>). لأنّهما يقعان ضمنه بصرف النظر عن المستوى. في حين يُعتبر العنصر (ذو المعرّف <span style="font-family:courier new,courier,monospace;">level2</span>) ابنًا مباشرًا للعنصر <span style="font-family:courier new,courier,monospace;">&lt;p&gt;</span> (ذو المعرّف <span style="font-family:courier new,courier,monospace;">level1</span>).
	</p>

	<p dir="rtl">
		أمّا بالنسبة لمحدّدات الفروع فنلق نظرة خاطفة على هذ المثال البسيط قبل أن نبدأ بالشرح:
	</p>

	<p style="text-align: left;">
		<strong>CSS</strong>
	</p>

	<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5169_25">
<span class="pln">p a </span><span class="pun">{</span><span class="pln">
</span><span class="pun">...</span><span class="pln">
</span><span class="pun">}</span></pre>

	<p style="text-align: left;">
		<strong>HTML</strong>
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5169_27">
<span class="tag">&lt;p&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">"http://code.makery.ch"</span><span class="tag">&gt;</span><span class="pln">My Website</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;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"http://www.example.com"</span><span class="tag">&gt;</span><span class="pln">Example Website</span><span class="tag">&lt;/a&gt;</span></pre>

	<p dir="rtl">
		نلاحظ بأنّ محدّد الفروع <span style="font-family:courier new,courier,monospace;">p a </span>يستهدف جميع عناصر <span style="font-family:courier new,courier,monospace;">&lt;a&gt;</span> أينما وُجدَت داخل عنصر <span style="font-family:courier new,courier,monospace;">&lt;p&gt;</span>. وبناءً عليه نجد أنّ التنسيق سيُطبّق على My Website وليس على Example Website لأنّ الأخيرة موجودة ضمن عنصر<span style="font-family:courier new,courier,monospace;"> &lt;a&gt; </span>لا يقع ضمن أي عنصر <span style="font-family:courier new,courier,monospace;">&lt;p&gt;</span> كما هو واضح.
	</p>

	<p dir="rtl">
		<strong>ملاحظة</strong>: ليس من الضروري أن يكون العنصر <span style="font-family:courier new,courier,monospace;">&lt;a&gt;</span> في المثال في الأعلى ابنًا مباشرًا للعنصر<span style="font-family:courier new,courier,monospace;">&lt;p&gt;</span>. فمحدّد الفروع السابق يستهدف أي عنصر <span style="font-family:courier new,courier,monospace;">&lt;a&gt;</span> موجود ضمن أي مستوى ضمن العنصر <span style="font-family:courier new,courier,monospace;">&lt;p&gt;</span>. إذا أردنا استهداف الابن المباشر فحسب، فيمكننا استخدام مُحدّد الابن ( <strong>&gt;</strong> ).
	</p>

	<h2 dir="rtl">
		خصائص CSS
	</h2>

	<p dir="rtl">
		تُقرّر قواعد CSS كيف يجب أن تظهر عناصر HTML. هناك العديد من الخصائص التي يمكن تعريفها في CSS. في الواقع لقد صادفنا اثنتان منهم: <span style="font-family:courier new,courier,monospace;">background-color</span> و<span style="font-family:courier new,courier,monospace;">color</span>.
	</p>

	<p dir="rtl">
		لن نتوسّع في الحديث عن خصائص CSS المختلفة، لأنّ هذا الدرس ليس مرجعًا لهذه الخصائص، لكن سنتعلّم كيف نجد المزيد من المعلومات عنها بأنفسنا. سنستفيد بشكل أكبر عندما نتعلّم هذه الخصائص عندما نحتاج إليهم فعليّا. توجد حالتان مختلفتان يمكن أن نصادفهما لنتعلُّم المزيد عن CSS.
	</p>

	<h3 dir="rtl">
		الحالة الأولى: عندما نصادف خاصية CSS لا نعرفها
	</h3>

	<p dir="rtl">
		في هذه الحالة نبحث عن معلومات عنها في الانترنت، اكتب اسم الخاصية متبوعًا بكلمة css ضمن محرّك البحث. يمكنك أن تجرّب هذه الطريقة الآن لتحصل على معلومات حول خاصية CSS جديدة وهي:
	</p>

	<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5169_29">
<span class="pln">padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">5px</span><span class="pun">;</span></pre>

	<p dir="rtl">
		استخدم <span style="font-family:courier new,courier,monospace;">css padding </span>كعبارة بحث. لا تكتفي بالاطلاع على نتيجة البحث الأولى، بل اطّلع على النتائج الخمس الأولى أو أكثر إن أحببت. بعد ذلك قرّر أيُّ المواقع ستوفّر المعلومات المناسبة لك.
	</p>

	<p dir="rtl">
		جرّب تطبيق قاعدة CSS السابقة (أي القاعدة<span style="font-family:courier new,courier,monospace;"> padding: 5px</span>) على عنصر <span style="font-family:courier new,courier,monospace;">h2</span> في مشروعنا.
	</p>

	<h3 dir="rtl">
		الحالة الثانية: نريد تغيير أسلوب عرض أحد العناصر ولكن لا نعرف خاصية CSS المناسبة
	</h3>

	<p dir="rtl">
		ابحث في الانترنت عن الشيء الذي ترغب أن تقوم به، متبوعًا بكلمة css. ربما تحتاج إلى إجراء عدة عمليات بحث قبل أن تجد ضالّتك.
	</p>

	<p dir="rtl">
		فإذا أردنا مثلًا تغيير حجم النص. في هذه الحالة استخدم الكلمات التالية<span style="font-family:courier new,courier,monospace;"> text size css </span>في محرّك البحث. ومرّة أخرى لا تكتفي بالنتيجة الأولى فقط من نتائج البحث.
	</p>

	<h2 dir="rtl">
		قيم CSS
	</h2>

	<p dir="rtl">
		لقد صادفنا قبل قليل بعضًا من قيم CSS، فمثلًا القيم الست عشرية مثل<strong> ffffff#</strong> أو تلك القيم المتعلّقة بتعيين قياسات الأحجام مثل 5px. يتوجّب علينا أحيانًا وبحسب خاصية CSS المستخدمة استخدام كلمات مُعيّنة مثل left أو right لمحاذاة النصوص على سبيل المثال.
	</p>

	<p dir="rtl">
		أكثر قيم CSS المستخدمة هي القيم المتعلّقة بتعيين قياسات الأحجام. لذلك سنتناولها بشيء من التفصيل. غالبًا ما يُعرّف الحجم باستخدام البيكسل Pixel، ونرمز له اختصارًا بالرمز px.
	</p>

	<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5169_40">
<span class="pln">p </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">16px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

	<p dir="rtl">
		توجد إمكانية أخرى وهي تعيين الأحجام باستخدام النسبة المئوية Percentage. دائمًا ما تكون النسب المئوية نسبيّةً بالنسبة للعنصر الأب. في المثال التالي سيشغل العنصر<span style="font-family:courier new,courier,monospace;"> p</span> ما مقداره 60% من عرض <span style="font-family:courier new,courier,monospace;">width</span> العنصر الأب الذي يقع ضمنه، في حين سيشغل العنصر الأب عرض النافذة كاملًا.
	</p>

	<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5169_38">
<span class="pln">p </span><span class="pun">{</span><span class="pln">
  width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">60</span><span class="pun">%;</span><span class="pln">
</span><span class="pun">}</span></pre>

	<p dir="rtl">
		توجد وحدة قياس مشهورة أخرى للأحجام وهي em. والـ em ترتبط دومًا بحجم الخط. ويعني ذلك أنّنا إذا غيّرنا حجم الخط فإنّ حجم العنصر المُقاس بالوحدة em سيتغيّر أيضًا. كمثال على ذلك إذا كان لعنصر ما حجم خط مقداره 20px وعرض 5em، فسيكون عرض العنصر الفعلي في هذه الحالة 100px (أي 20 مضروبة بـ 5). انظر إلى الشيفرة التالية:
	</p>

	<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5169_42">
<span class="pln">p </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">20px</span><span class="pun">;</span><span class="pln">
  width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">5em</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

	<h3 dir="rtl">
		محددات الصنف في مشروعنا
	</h3>

	<p dir="rtl">
		إذا أردنا تكبير العنوان الرئيسي في موقعنا: "Web Portfolio of Marco". فسيكون ذلك ممكنًا بتعريف قاعدة CSS للعنصر <span style="font-family:courier new,courier,monospace;">h1</span> كما يلي:
	</p>

	<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5169_36">
<span class="pln">h1 </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">65px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

	<p dir="rtl">
		المشكلة التي ستصادفنا هنا أنّ جميع عناصر <span style="font-family:courier new,courier,monospace;">h1</span> الموجودة في المستند ستكبُر بتأثير هذه القاعدة. لذلك فإذا أردنا أن نُكبّر عنوان <span style="font-family:courier new,courier,monospace;">h1</span> الأوّل الموجود في المستند فسنستخدم لهذا الغرض مُحدّد صنف class selector. سنضيف السمة <span style="font-family:courier new,courier,monospace;">class</span> إلى عنصر <span style="font-family:courier new,courier,monospace;">h1</span> المراد استهدافه، ويمكننا بالطبع إسناد أي قيمة لهذه السمة، سنختار القيمة <span style="font-family:courier new,courier,monospace;">title</span>:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5169_34">
<span class="tag">&lt;h1</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"title"</span><span class="tag">&gt;</span><span class="pln">Web Portfolio of Marco</span><span class="tag">&lt;/h1&gt;</span></pre>

	<p dir="rtl">
		يمكننا الآن استهداف عنصر <span style="font-family:courier new,courier,monospace;">h1</span> هذا بكتابة قاعدة CSS بالشكل التالي:
	</p>

	<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5169_32">
<span class="pun">.</span><span class="pln">title </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">65px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

	<p dir="rtl">
		إذا جرت الأمور على ما يرام فستحصل على شكل شبيه بما يلي:
	</p>

	<p dir="rtl" style="text-align: center;">
		<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2016_02/portfolio.jpg.f35d51507d9c1f638f4dce80a657e714.jpg"><img alt="portfolio.thumb.jpg.ca4b1846c26875575f3c" class="ipsImage ipsImage_thumbnailed" data-fileid="12584" data-unique="m6m226p0j" src="https://academy.hsoub.com/uploads/monthly_2016_02/portfolio.thumb.jpg.ca4b1846c26875575f3c7251fe9ea554.jpg"></a>
	</p>

	<p dir="rtl">
		سننتقل الآن إلى الدرس الرابع، والذي يتحدّث عن <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A3%D8%AF%D9%88%D8%A7%D8%AA-%D8%A7%D9%84%D8%AA%D8%B7%D9%88%D9%8A%D8%B1-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-%D9%81%D9%8A-%D9%85%D8%AA%D8%B5%D9%81%D8%AD-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-devtools-r277/">أدوات التطوير البرمجية المتاحة ضمن متصفّح الانترنت</a>.
	</p>

	<p dir="rtl">
		ترجمة -وبتصرّف- للمقال <a href="http://code.makery.ch/library/html-css/part3/" rel="external nofollow">HTML &amp; CSS Tutorial - Part 3: Introduction to CSS</a> لصاحبه Marco Jakob.
	</p>
</div>
]]></description><guid isPermaLink="false">272</guid><pubDate>Thu, 04 Feb 2016 15:29:00 +0000</pubDate></item><item><title>HTML &#x648; CSS &#x644;&#x644;&#x645;&#x628;&#x62A;&#x62F;&#x626;&#x64A;&#x646;: &#x643;&#x64A;&#x641; &#x62A;&#x635;&#x645;&#x645; &#x623;&#x648;&#x644; &#x635;&#x641;&#x62D;&#x629; &#x648;&#x64A;&#x628; &#x644;&#x643;</title><link>https://academy.hsoub.com/programming/html/html-%D9%88-css-%D9%84%D9%84%D9%85%D8%A8%D8%AA%D8%AF%D8%A6%D9%8A%D9%86-%D9%83%D9%8A%D9%81-%D8%AA%D8%B5%D9%85%D9%85-%D8%A3%D9%88%D9%84-%D8%B5%D9%81%D8%AD%D8%A9-%D9%88%D9%8A%D8%A8-%D9%84%D9%83-r242/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_01/html-css-part1.png.fa73e94a7a12e88f3bca5a9798e7c9e7.png" /></p>
<div id="wmd-preview-section-61">
	<p id="html-وcss-للمبتدئين-كيف-تصمم-أول-صفحة-ويب-لك">
		سنتعلّم <a href="https://academy.hsoub.com/learn/front-end-web-development/" rel="">مبادئ HTML و CSS</a> لإنشاء مشاريع ويب خاصة بنا. سيتميّز هذا الدرس بتركيزه على الجانب العملي بشكل كبير، حيث سنبدأ فورًا بإنشاء مشروع خاص بنا.
	</p>

	<p style="text-align: center;">
		<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="11420" href="https://academy.hsoub.com/uploads/monthly_2016_01/html-css-part1.png.539c1f05e794c93185f5dfb111a32e38.png" rel=""><img alt="html-css-part1.thumb.png.16c196804c84ab5" class="ipsImage ipsImage_thumbnailed" data-fileid="11420" src="https://academy.hsoub.com/uploads/monthly_2016_01/html-css-part1.thumb.png.16c196804c84ab5ac29db86875ab206a.png"></a>
	</p>

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

<div id="wmd-preview-section-62">
	<h2 id="المشروع">
		المشروع
	</h2>

	<p>
		سيكون المشروع عبارة عن بناء ملف شخصي portfolio على الويب. سيضم صفحة بداية Home ومدوّنة Blog وصفحة تُظهر مشاريع ويب المستقبلية التي تنوي إنشائها Projects، بالإضافة إلى صفحة للتواصل Contact. 
	</p>

	<p style="text-align: center;">
		<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="11416" href="https://academy.hsoub.com/uploads/monthly_2016_01/portfolio.png.4faf586a981aaa4390e7636b007c01cd.png" rel=""><img alt="portfolio.thumb.png.925ce6326288e6809042" class="ipsImage ipsImage_thumbnailed" data-fileid="11416" src="https://academy.hsoub.com/uploads/monthly_2016_01/portfolio.thumb.png.925ce6326288e6809042bdaa49f2e05a.png"></a>
	</p>
</div>

<div id="wmd-preview-section-63">
	<h2 id="الهدف-من-المشروع">
		الهدف من المشروع
	</h2>

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

<div id="wmd-preview-section-64">
	<h2 id="ما-هو-html-وcss">
		ما هو HTML و CSS؟
	</h2>

	<p>
		لغة الرُماز المعلَّم Hypertext Markup Language والتي ندعوها اختصاراً <a href="https://wiki.hsoub.com/HTML" rel="external">HTML</a> هي لغة مسؤولة عن بُنية structure صفحة الويب. فمثلًا يمكنك تعريف عناوين headings وفقرات paragraphs ونصوص texts وصور images في HTML.
	</p>

	<p>
		أمّا بالنسبة لأوراق الأنماط المتتالية Cascading Style Sheet وندعوها اختصاراً CSS فهي مسؤولة عن تنسيق (تنميط) style وتخطيط layout صفحة الويب. يمكنك تعريف تنسيقات جديدة خاصة بالألوان والخطوط وطرق المحاذاة وحتى يمكنك إنشاء بعض التحريكات animations البسيطة في CSS.
	</p>

	<p>
		تذكّر: تزوّدنا HTML بالمحتوى في حين تُنسّق CSS هذا المحتوى.
	</p>
</div>

<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>

<div id="wmd-preview-section-65">
	<h2 id="موقع-ويب-أم-تطبيق-ويب">
		موقع ويب أم تطبيق ويب
	</h2>

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

	<p>
		لبرمجة مواقع ويب ديناميكية dynamic تكون تفاعلية مع المستخدم، سنحتاج إلى لغة برمجة إضافية مثل JavaScript أو Dart. ويمكننا باستخدامهما تطوير (هو مفهوم أوسع من البرمجة) تطبيقات ويب Web Applications كاملة مثل التطبيقات التي تهتم بإجراء الحسابات المختلفة أو تطبيقات الألعاب أو تطبيقات المحادثة وغيرها الكثير. تعمل هذه التطبيقات في الواقع ضمن متصفّح الويب. كما توجد لغات برمجة وتقنيات أخرى مثل PHP وRuby وASP.NET تسمح ببناء تطبيقات ويب ديناميكية أيضًا ولكن تعمل هذه التطبيقات ضمن مزوّد خدمة الاستضافة (على المخدّم). كما يمكن المزج بين هذين الأسلوبين لإنشاء مواقع ويب فعّالة للغاية. يمكنك بعد الانتهاء من هذه الدروس، البدء بتعلّم مثل هذه اللغات والتقنيات وإنشاء تطبيقات ويب ديناميكية.
	</p>
</div>



<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://sndian.com/" rel="external">أطلق موقعك الآن</a>
		</div>
	</div>
</div>


<div id="wmd-preview-section-66">
	<h2 id="الأجهزة-المحمولة">
		الأجهزة المحمولة
	</h2>

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

<div id="wmd-preview-section-67">
	<h2 id="الأدوات-المستخدمة">
		الأدوات المستخدمة
	</h2>

	<p>
		نحتاج إلى تطبيقين للدخول في عالم تطوير وبرمجة الويب، محرّر نصوص لإنشاء الملفات الخاصة بموقع الويب، ومتصفّح ويب لعرض وتجربة الموقع.
	</p>
</div>

<div id="wmd-preview-section-68">
	<h3 id="1-المحرر-editor">
		1- المحرر Editor
	</h3>

	<p>
		سيكون كافيًا استخدام محرّر نصوص عادي (كبرنامج المفكرة Notepad في ويندوز مثلًا). ولكن من الأفضل استخدام محرّر نصوص يسهّل عملنا إلى حدٍّ كبير. لهذا الغرض أنصح باستخدام محرّر نصوص عصري ومخصّص لتحرير HTML. 
	</p>

	<p style="text-align: center;">
		<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="11401" href="https://academy.hsoub.com/uploads/monthly_2016_01/brackets-editor-screenshot.png.a3f593eb6bc24a3b4f65ab9e58a70410.png" rel=""><img alt="brackets-editor-screenshot.thumb.png.bf3" class="ipsImage ipsImage_thumbnailed" data-fileid="11401" src="https://academy.hsoub.com/uploads/monthly_2016_01/brackets-editor-screenshot.thumb.png.bf344985713b5ab6645841441154d17f.png"></a>
	</p>

	<p>
		محرّر النصوص الذي أنصح به حاليًا هو Brackets (مجّاني من شركة أدوبي Adobe). يمكنك أن تستخدم أي محرّر تريده، ولكنّني في هذه السلسلة سأُشير أحيانًا إلى بعض وظائف تطبيق <a href="http://brackets.io/" rel="external nofollow">Brackets</a>. يوجد محرّر نصوص جيّد أيضاً ويمكنك استخدامه وهو <a href="http://atom.io/" rel="external nofollow">Atom</a>، ويوجد محرّر نصوص آخر أيضًا، قديم قليلًا لكنّه جيّد وهو <a href="http://notepad-plus-plus.org/" rel="external nofollow">++Notepad</a>. 
	</p>

	<p style="text-align: center;">
		<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpg" data-fileid="11396" href="https://academy.hsoub.com/uploads/monthly_2016_01/brackets-editor-logo.jpg.4e73dd4851f12d1edd2590d60266176a.jpg" rel=""><img alt="brackets-editor-logo.thumb.jpg.72a879519" class="ipsImage ipsImage_thumbnailed" data-fileid="11396" src="https://academy.hsoub.com/uploads/monthly_2016_01/brackets-editor-logo.thumb.jpg.72a8795199197f728a0894bdc8aa8409.jpg"></a>
	</p>

	<p>
		حمّل ونصّب المحرّر Brackets إذا أردت ذلك.
	</p>
</div>

<div id="wmd-preview-section-69">
	<h3 id="2-المتصفح-browser">
		2- المتصفح Browser
	</h3>

	<p>
		يتوجّب على موقعنا أن يعمل على جميع المتصفحات الرئيسية بالطبع (Internet Explorer و Firefox و Chrome و Safari). على أية حال، أنصح باستخدام المتصفح <a href="https://www.google.com/chrome/browser/" rel="external nofollow">Chrome</a> لأغراض التطوير والبرمجة. يضم Chrome أدوات مفيدة للغاية لمطوّر الويب والتي سيستخدمها على نحو متكرّر. بالإضافة إلى ذلك، يدعم المحرّر Brackets المتصفّح Chrome بشكل جيّد، بحيث أنّ التغييرات التي تحدث في النص ستظهر مباشرةً ضمن Chrome (عن طريق ميزة اسمها Live Reload). 
	</p>

	<p style="text-align: center;">
		<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="11404" href="https://academy.hsoub.com/uploads/monthly_2016_01/chrome-logo.png.09c42b404f63f331cbe9779af4648411.png" rel=""><img alt="chrome-logo.thumb.png.43fd884182677254aa" class="ipsImage ipsImage_thumbnailed" data-fileid="11404" src="https://academy.hsoub.com/uploads/monthly_2016_01/chrome-logo.thumb.png.43fd884182677254aa76908b1a85cf70.png"></a>
	</p>

	<p>
		حمّل ونصّب المتصفح Chrome الآن <a href="https://www.google.com/chrome/browser/" rel="external nofollow">من هنا</a>.
	</p>
</div>

<div id="wmd-preview-section-70">
	<h2 id="إنشاء-مستند-html">
		إنشاء مستند HTML
	</h2>

	<p>
		لنبدأ الآن بإنشاء مستند HTML الأوّل لنا من أجل موقع الويب:
	</p>

	<ol>
		<li>
			أنشئ مجلّدًا من أجل المشروع. سمّ المجلّد بالاسم Portfolio (أو أي اسم آخر ترغبه).
		</li>
		<li>
			افتح برنامج Brackets.
		</li>
		<li>
			من القائمة File اختر الأمر …Open Folder لتحديد وفتح المجلّد الذي أنشأناه قبل قليل. 
		</li>
	</ol>

	<p style="text-align: center;">
		<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="11414" href="https://academy.hsoub.com/uploads/monthly_2016_01/open-folder.png.9ed5f3f0b79d319faf2266f9b182bfb3.png" rel=""><img alt="open-folder.thumb.png.3d0ec8f22e7e1236a0" class="ipsImage ipsImage_thumbnailed" data-fileid="11414" src="https://academy.hsoub.com/uploads/monthly_2016_01/open-folder.thumb.png.3d0ec8f22e7e1236a053f5d5ed73e72f.png"></a>
	</p>

	<p>
		انقر بزر الفأرة الأيمن أسفل اسم المجلّد واختر New File لإنشاء ملف جديد، سمّه index.html. 
	</p>

	<p style="text-align: center;">
		<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="11409" href="https://academy.hsoub.com/uploads/monthly_2016_01/new-file.png.69751cd965bfe7576160383b4e399bd9.png" rel=""><img alt="new-file.thumb.png.247198b5297d229602b0e" class="ipsImage ipsImage_thumbnailed" data-fileid="11409" src="https://academy.hsoub.com/uploads/monthly_2016_01/new-file.thumb.png.247198b5297d229602b0e71233285a3b.png"></a>
	</p>

	<p>
		لديك الآن ملف نصّي فارغ اسمه index.html
	</p>

	<p style="text-align: center;">
		<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="11410" href="https://academy.hsoub.com/uploads/monthly_2016_01/new-index-file.png.a9d9d45aa135ef342131e5680347e077.png" rel=""><img alt="new-index-file.thumb.png.b9cf522f7715a37" class="ipsImage ipsImage_thumbnailed" data-fileid="11410" src="https://academy.hsoub.com/uploads/monthly_2016_01/new-index-file.thumb.png.b9cf522f7715a370c0477cb21a021f60.png"></a>
	</p>
</div>

<div id="wmd-preview-section-71">
	<h3 id="لماذا-الملف-indexhtml">
		لماذا الملف index.html؟
	</h3>

	<p>
		في الواقع للملف index.html معنى خاص، فعندما نطلب من المتصفّح عنوان موقع ويب ما، وليكن مثلًا <a href="http://code.makery.ch/" rel="external nofollow">http://code.makery.ch</a>، فعند ذلك سيُعرَض الملف index.html أولاً بشكل تلقائي، أي كأنّنا طلبنا العنوان <a href="http://code.makery.ch/index.html" rel="external nofollow">http://code.makery.ch/index.html</a>. بالنسبة إلينا، سيمثّل الملف index.html الصفحة الرئيسية.
	</p>
</div>

<div id="wmd-preview-section-72">
	<h3 id="عمليتا-العرض-والتحديث">
		عمليتا العرض والتحديث
	</h3>

	<p>
		يمكننا الآن تعبئة مستند HTML (الملف index.html) بالمحتوى. اكتب الأسطر التالية ضمن مستند HTML. 
	</p>

	<p style="text-align: center;">
		<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="11406" href="https://academy.hsoub.com/uploads/monthly_2016_01/first-website-de.png.d30d328bc902b4e0e09e12663041e9cd.png" rel=""><img alt="first-website-de.thumb.png.55cc62ea7f69d" class="ipsImage ipsImage_thumbnailed" data-fileid="11406" src="https://academy.hsoub.com/uploads/monthly_2016_01/first-website-de.thumb.png.55cc62ea7f69da856314673f2cd42980.png"></a>
	</p>

	<p>
		لعرض الصفحة ضمن المتصفّح، انقر الأيقونة التي تُشبه البرق في الطرف الأيمن من البرنامج (المعاينة الحية Live Preview). سيُفتَح المتصفّح Chrome وسيُعرض المستند ضمنه، وفي حال أجريت أي تغيير جديد على مستند HTML فسترى نتيجة ذلك على المتصفّح مباشرةً، وهي في الحقيقة ميزة هامة وفعّالة.
	</p>

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

	<p>
		تهانينا، لقد أنشأت موقع ويب الأوّل الخاص بك.
	</p>
</div>

<div id="wmd-preview-section-73">
	<h3 id="التحييد-indentation">
		التحييد Indentation
	</h3>

	<p>
		لكي نُبقي الشيفرة نظيفة وواضحة، من المهم أن تعمل على تحييد النص بشكل صحيح باستخدام مفتاح الجدولة Tab من لوحة المفاتيح. يأخذ مفتاح Tab في برنامج Brackets أربعة فراغات بشكل افتراضي. بالنسبة لي أجد ذلك كثيراً بعض الشيء، لذلك أنصح أن تغيّر هذا لتصبح الفراغات spaces التي يأخذها المفتاح Tab تساوي 2، وذلك من أسفل نافذة Brackets. 
	</p>

	<p style="text-align: center;">
		<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="11402" href="https://academy.hsoub.com/uploads/monthly_2016_01/brackets-spaces.png.d2067d99641164a862eac8e466d2c4d4.png" rel=""><img alt="brackets-spaces.thumb.png.30e17882e7528f" class="ipsImage ipsImage_thumbnailed" data-fileid="11402" src="https://academy.hsoub.com/uploads/monthly_2016_01/brackets-spaces.thumb.png.30e17882e7528f7da636feec1e211ea9.png"></a>
	</p>

	<p>
		من المهم جدًّا أن ننتبه إلى تحييد الشيفرة من البداية، لكي نكتب شيفرة نظيفة وواضحة من بداية تعلّمنا للبرمجة عموماً.
	</p>

	<p>
		تلميح 1: استخدام Shift+Tab لكي تنقل المحاذاة إلى اليسار بدلاً من اليمين.
	</p>

	<p>
		تلميح 2: يمكنك محاذاة عدة أسطر بنفس الوقت إذا اخترتهم وضغطت <span style="font-family:courier new,courier,monospace;">Tab</span> أو حتى <span style="font-family:courier new,courier,monospace;">Shift+Tab</span>.
	</p>
</div>

<div id="wmd-preview-section-74">
	<h2 id="عناصر-html">
		عناصر HTML
	</h2>
</div>

<div id="wmd-preview-section-75">
	<h3 id="1-الوسوم-tags">
		1- الوسوم Tags
	</h3>

	<p>
		في المثال السابق رأيت رموزًا مكتوبة ضمن رمزي &lt;&gt; تشكل هذه الرموز كلمات نُسميها الوسوم Tags. تتألف عناصر HTML عادةً (ولكن ليس دائماً) من وسمين، وسم للفتح opening tag ووسم للإغلاق closing tag. في مثالنا السابق كان <span style="font-family:courier new,courier,monospace;">&lt;html&gt;</span> هو وسم للفتح، أمّا <span style="font-family:courier new,courier,monospace;">&lt;html/&gt;</span> هو وسم للإغلاق حيث نلاحظ وجود محرف slash قبل اسم الوسم.
	</p>

	<p>
		أي نص موجود بين وسمي الفتح والإغلاق يُعتبر محتوى لعنصر HTML هذا. فمثلاً بالنسبة للوسمين <span style="font-family:courier new,courier,monospace;">&lt;html&gt;</span> و <span style="font-family:courier new,courier,monospace;">&lt;html/&gt;</span> نُخبر متصفّح الويب عن بداية ونهاية مستند HTML لصفحة الويب الخاصة بنا.
	</p>

	<p>
		أمّا الوسم الثاني الذي صادفناه هو الوسم <span style="font-family:courier new,courier,monospace;">&lt;body&gt;</span>. يُحدّد هذا الوسم أنّ جميع المحتوى الواقع بين وسم الفتح <span style="font-family:courier new,courier,monospace;">&lt;body&gt;</span> والإغلاق <span style="font-family:courier new,courier,monospace;">&lt;body/&gt;</span> سيظهر بشكل مرئي للمستخدم في المنطقة الرئيسية من نافذة المتصفّح.
	</p>
</div>

<div id="wmd-preview-section-76">
	<h3 id="2-السمات-attributes">
		2- السمات Attributes
	</h3>

	<p>
		تُعرّف السمات معلومات إضافية لعنصر HTML. وتقع هذه السمات ضمن وسم الفتح لعنصر HTML، ويكون لها دائماً اسم name وقيمة value.
	</p>

	<p>
		كمثال على السمات، دعنا ننظر إلى عنصر HTML الخاص بالروابط. وهو ربما من أهم العناصر على الإطلاق. 
	</p>

	<p style="text-align: center;">
		<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="11413" href="https://academy.hsoub.com/uploads/monthly_2016_01/html-element-attribute.png.b4898ff23064e7663d926ed0aafa3182.png" rel=""><img alt="html-element-attribute.thumb.png.e45febc" class="ipsImage ipsImage_thumbnailed" data-fileid="11413" src="https://academy.hsoub.com/uploads/monthly_2016_01/html-element-attribute.thumb.png.e45febca22cb084bf3323c8fabc69c50.png"></a>
	</p>

	<p>
		يضم عنصر الروابط <span style="font-family:courier new,courier,monospace;">&lt;a&gt;</span> السمة <span style="font-family:courier new,courier,monospace;">href</span> (وهي اختصار للكلمتين hypertext reference) التي تحمل القيمة في هذا المثال <a href="http://code.makery.ch/" rel="external nofollow">http://code.makery.ch</a>.ولكن سيعرض المتصفّح هذا الرابط على شكل النص التالي: My Website.
	</p>
</div>

<div id="wmd-preview-section-77">
	<h2 id="البنية-الأساسية-لصفحة-html">
		البنية الأساسية لصفحة HTML
	</h2>

	<p>
		لقد رأينا قبل قليل عنصري HTML وهما <span style="font-family:courier new,courier,monospace;">&lt;html&gt;</span> و <span style="font-family:courier new,courier,monospace;">&lt;body&gt;</span>. ولكن بنية صفحة (مستند) HTML تتكوّن عادةً من المزيد من العناصر. استبدل محتويات الملف <span style="font-family:courier new,courier,monospace;">index.html </span>بالشيفرة التالية، بعد ذلك سنناقش كل عنصر HTML موجود فيها.
	</p>

	<h3>
		بنية ملف (مستند) HTML
	</h3>

	<pre class="html ipsCode prettyprint prettyprinted" data-pbcklang="html" data-pbcktabsize="4" style=""><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">Web Portfolio of Marco</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;h1&gt;</span><span class="pln">Web Portfolio of Marco</span><span class="tag">&lt;/h1&gt;</span><span class="pln"> 
    </span><span class="tag">&lt;p&gt;</span><span class="pln">Write anything you want to tell the world.</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>
</div>

<div id="wmd-preview-section-78">
	<h3>
		الشرح
	</h3>

	<ul>
		<li>
			نضع في السطر الأوّل <span style="font-family:courier new,courier,monospace;">&lt;DOCTYPE html<span style="line-height: 22.4px; text-align: right;">!</span>&gt;</span> دوماً. فهي تخبر المتصفّح عن نوع المستند.
		</li>
		<li>
			يشير الوسم <span style="font-family:courier new,courier,monospace;">&lt;html&gt;</span> إلى بداية المستند والوسم <span style="font-family:courier new,courier,monospace;">&lt;html/&gt;</span> إلى نهايته.
		</li>
		<li>
			يحتوي العنصر<span style="font-family:courier new,courier,monospace;"> &lt;head&gt; </span>(بين وسمي الفتح والإغلاق له) على معلومات إضافية حول الصفحة. وبشكل مختلف عن العنصر &lt;body&gt;، لا تظهر هذه المعلومات في نافذة المتصفح الرئيسية.
		</li>
		<li>
			يجب أن تكون هناك إشارة ضمن العنصر <span style="font-family:courier new,courier,monospace;">&lt;head&gt;</span> حول الترميز character set المستَخدَم في هذا المستند: <span style="font-family:courier new,courier,monospace;">&lt;"meta charset="utf-8&gt;</span>. إذا لم تحدّد الترميز المستَخدَم فإنّ بعض الرموز قد لا تظهر بصورة صحيحة. ربما قد لاحظت أنّ العنصر <span style="font-family:courier new,courier,monospace;">&lt;meta&gt;</span> لا يمتلك وسم إغلاق. توجد بعض عناصر HTML التي لا تمتلك أيضًا وسوم إغلاق، ولكنها تعتبر استثناءً.
		</li>
		<li>
			نرى بعد ذلك الوسم<span style="font-family:courier new,courier,monospace;"> &lt;title&gt;</span> الذي يضم عنوان المستند والذي سيظهر على شريط العنوان لنافذة المتصفّح.
		</li>
		<li>
			كل شيء ضمن الوسم<span style="font-family:courier new,courier,monospace;"> &lt;body&gt;</span> سيظهر ضمن نافذة المتصفّح الرئيسية.
		</li>
		<li>
			يُعرّف العنصر <span style="font-family:courier new,courier,monospace;">&lt;h1&gt;</span> العنوان الرئيسي الذي سيظهر للمستخدم ضمن صفحة الويب. ويمكن إنشاء عناوين فرعية أيضاً باستخدام العناصر <span style="font-family:courier new,courier,monospace;">&lt;h2&gt; &lt;h3&gt; &lt;h4&gt; &lt;h5&gt; &lt;h6&gt;</span>.
		</li>
		<li>
			النص الموجود بين الوسمين <span style="font-family:courier new,courier,monospace;">&lt;p&gt;</span> و <span style="font-family:courier new,courier,monospace;">&lt;p/&gt;</span> يُعتبر فقرة مستقلة، وهذا ما يُعبّر عنه العنصر &lt;p&gt;.
		</li>
		<li>
			بعد كل وسم فتح لعنصر ما، يجب أن نحاذي العنصر التالي (بمفتاح الجدولة Tab) لتحسين عرض الشيفرة. ورغم أنّ ذلك ليس ضرورياً ولا يؤثّر أصلاً في عرض المستند، ولكن تأكّد من امتلاكك لهذه العادة الجيّدة.
		</li>
	</ul>

	<p>
		تلميح 1: يمكنك استخدام بنية HTML السابقة لأي صفحة HTML جديدة. <br>
		تلميح 2: استخدم الاختصار <span style="font-family:courier new,courier,monospace;">Ctrl+S</span> من لوحة المفاتيح لحفظ الملف الحالي. <br>
		تلميح 3: استخدم الاختصار <span style="font-family:courier new,courier,monospace;">Ctrl+Z</span> من لوحة المفاتيح للتراجع عن العمليات التي أجريتها.
	</p>

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

<div id="wmd-preview-section-79">
	<h2 id="إدراج-صورة">
		إدراج صورة
	</h2>

	<p>
		لإدراج صورة نستخدم العنصر <span style="font-family:courier new,courier,monospace;">&lt;img&gt;</span>. المثال التالي سيُدرج صورة موجودة ضمن ملف اسمه <span style="font-family:courier new,courier,monospace;">marco.jpg</span>:
	</p>

	<pre class="html ipsCode prettyprint prettyprinted" data-pbcklang="html" data-pbcktabsize="4" style=""><span class="tag">&lt;img</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"marco.jpg"</span><span class="pln"> </span><span class="atn">alt</span><span class="pun">=</span><span class="atv">"Picture of me"</span><span class="tag">&gt;</span></pre>

	<p>
		للعنصر<span style="font-family:courier new,courier,monospace;"> &lt;img&gt;</span> وسم فتح فقط ولا يوجد له وسم إغلاق. وهو يحتوي على سمتين <span style="font-family:courier new,courier,monospace;">src</span> و <span style="font-family:courier new,courier,monospace;">alt</span>. السمة src تُحدّد عنوان URL الذي يُعبّر عن اسم ملف الصورة ومساره. أمّا السمة <span style="font-family:courier new,courier,monospace;">alt</span> فتمثّل النص البديل، وهو النص الذي يصف محتويات الصورة. يُستخدم هذا النص من قِبل محرّكات البحث، وفي حال تعذّر عرض الصورة ضمن الصفحة سيُعرض هذا النص بدلاً عنها.
	</p>
</div>

<div id="wmd-preview-section-80">
	<h3 id="1-عناوين-url-النسبية-والمطلقة">
		1- عناوين URL النسبية والمطلقة
	</h3>

	<p>
		تُستخدم عناوين URL من أجل السمة <span style="font-family:courier new,courier,monospace;">src</span> الخاصة بعنصر الصورة، وأيضاً من أجل السمة <span style="font-family:courier new,courier,monospace;">href</span> الخاصة بعنصر الارتباط. يُحدّد عنوان URL عنوان (مسار) ملف، وبصورة عامة العنوان هو مصدر resource قد يكون صورة أو صفحة ويب من موقع آخر. بالاعتماد على موقع الملف نستخدم إمّا العنوان النسبي relative أو العنوان المطلق absolute.
	</p>

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

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

	<p>
		فإذا فرضنا مثلًا أنّ ملف الصورة من المثال السابق موجودة ضمن مجلّد فرعي اسمه images سيكون عنوان URL النسبي لملف الصورة <span style="font-family:courier new,courier,monospace;">images/marco.jpg</span>. أمّا إذا كان ملف الصورة موجود ضمن المجلّد الأب، فيمكنك عندئذ الوصول إليه باستخدام البادئة (<strong> /.. </strong>) أي سيصبح عنوان الملف في هذه الحالة <span style="font-family:courier new,courier,monospace;">marco.jpg/.. </span>
	</p>

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

	<p>
		حقائق عن عناوين URL:
	</p>

	<ul>
		<li>
			عنوان URL الذي يبدأ بـ <strong>//:http</strong> هو عنوان URL مطلق. 
		</li>
		<li>
			عنوان URL بدون <strong style="line-height: 22.4px; text-align: right;">//:http</strong> هو عنوان URL نسبي بالنسبة إلى صفحة ويب الحالية. 
		</li>
		<li>
			تُشير النقطة ( <strong>.</strong> ) إلى المجلّد الحالي. 
		</li>
		<li>
			تُشير النقطتان ( <strong>..</strong> ) إلى المجلّد الأب.
		</li>
	</ul>

	<p>
		أمثلة عن عناوين ويب النسبية والمطلقة:
	</p>

	<pre class="html ipsCode prettyprint prettyprinted" data-pbcklang="html" data-pbcktabsize="4" style=""><span class="com">&lt;!-- عناوين نسبية --&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">"image-gallery.html"</span><span class="tag">&gt;</span><span class="pln">Image Gallery</span><span class="tag">&lt;/a&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">"blog/first-blog-entry.html"</span><span class="tag">&gt;</span><span class="pln">My First Blog Entry</span><span class="tag">&lt;/a&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">"../image-gallery.html"</span><span class="tag">&gt;</span><span class="pln">Back to Image Gallery</span><span class="tag">&lt;/a&gt;</span><span class="pln"> 

</span><span class="com">&lt;!-- عناوين مُطلقة --&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">"http://www.my-colleague.com/blog.html"</span><span class="tag">&gt;</span><span class="pln">Blog of a Colleague</span><span class="tag">&lt;/a&gt;</span></pre>
</div>

<div id="wmd-preview-section-82">
	<h3 id="2-إضافة-صورة-إلى-موقعنا">
		2- إضافة صورة إلى موقعنا
	</h3>

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

	<p>
		الملف<span style="font-family:courier new,courier,monospace;"> index.html</span> مع الشيفرة اللازمة:
	</p>

	<pre class="html ipsCode prettyprint prettyprinted" data-pbcklang="html" data-pbcktabsize="4" style=""><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">Web Portfolio of Marco</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;h1&gt;</span><span class="pln">Web Portfolio of Marco</span><span class="tag">&lt;/h1&gt;</span><span class="pln"> 
    </span><span class="tag">&lt;h2&gt;</span><span class="pln">Welcome!</span><span class="tag">&lt;/h2&gt;</span><span class="pln"> 
    </span><span class="tag">&lt;p&gt;</span><span class="pln">Thanks for stopping by.</span><span class="tag">&lt;/p&gt;</span><span class="pln"> 
    </span><span class="tag">&lt;p&gt;</span><span class="pln">Please have a look around. In the blog section I document my experiences in programming. You may also look at my web projects. Have Fun.</span><span class="tag">&lt;/p&gt;</span><span class="pln"> 
    </span><span class="tag">&lt;img</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"marco.jpg"</span><span class="pln"> </span><span class="atn">alt</span><span class="pun">=</span><span class="atv">"Picture of me"</span><span class="tag">&gt;</span><span class="pln"> 
    </span><span class="tag">&lt;p&gt;</span><span class="pln">Marco :-)</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>

	<p>
		والصورة التالية لما ستبدو عليه الصفحة في متصفّح الويب: 
	</p>
</div>

<div id="wmd-preview-section-83">
	<p style="text-align: center;">
		<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpg" data-fileid="11415" href="https://academy.hsoub.com/uploads/monthly_2016_01/portfolio.jpg.8a3c64ec5e1fd9ea2a1661c2a25f43bb.jpg" rel=""><img alt="portfolio.thumb.jpg.b442df259a805d25fa7f" class="ipsImage ipsImage_thumbnailed" data-fileid="11415" src="https://academy.hsoub.com/uploads/monthly_2016_01/portfolio.thumb.jpg.b442df259a805d25fa7fa6041e4900f2.jpg"></a>
	</p>

	<p>
		إن أردت تعلم المزيد حول HTML و CSS وأن تصبح خبيرًا بهما وأن تطور مواقع وتطبيقات ويب عالية الجودة، فأنصحك بالاطلاع على <a href="https://academy.hsoub.com/learn/front-end-web-development/" rel="">دورة تطوير واجهات المستخدم</a> المقدمة من أكاديمية حسوب.
	</p>

	<p>
		سنتعلّم في الدرس الثاني <a href="https://academy.hsoub.com/apps/web/%D9%83%D9%8A%D9%81-%D8%AA%D9%86%D8%B4%D8%B1-%D8%B5%D9%81%D8%AD%D8%A9-%D8%A3%D9%88-%D9%85%D9%88%D9%82%D8%B9-%D9%88%D9%8A%D8%A8-%D9%82%D9%85%D8%AA-%D8%A8%D8%AA%D8%B5%D9%85%D9%8A%D9%85%D9%87-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D8%A5%D9%86%D8%AA%D8%B1%D9%86%D8%AA-r52/" rel="">كيف ننشر موقعنا على الانترنت</a>.
	</p>

	<p>
		ترجمة -وبتصرّف- للدّرس <a href="http://code.makery.ch/library/html-css/part1/" rel="external nofollow">HTML &amp; CSS Tutorial - Part 1: Your First Website</a> لصاحبه Marco Jakob.
	</p>

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

	<ul>
		<li>
			<a href="https://academy.hsoub.com/programming/general/%D8%AA%D8%B9%D9%84%D9%85-%D8%AA%D8%B7%D9%88%D9%8A%D8%B1-%D8%A7%D9%84%D9%88%D9%8A%D8%A8/" rel="">المدخل الشامل لتعلم تطوير الويب</a>
		</li>
		<li>
			<a href="https://academy.hsoub.com/programming/html/%D8%AA%D8%B9%D9%84%D9%85-%D9%84%D8%BA%D8%A9-html-r1702/" rel="">دليل تعلم لغة HTML</a>
		</li>
		<li>
			<a href="https://academy.hsoub.com/programming/general/%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-r662/" rel="">دليل تعلم البرمجة</a>
		</li>
	</ul>
</div>
]]></description><guid isPermaLink="false">242</guid><pubDate>Sat, 16 Jan 2016 23:24:00 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x62A;&#x62D;&#x648;&#x64A;&#x644; &#x62A;&#x635;&#x645;&#x64A;&#x645; &#x641;&#x648;&#x62A;&#x648;&#x634;&#x648;&#x628; &#x625;&#x644;&#x649; HTML/CSS</title><link>https://academy.hsoub.com/programming/html/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D8%AD%D9%88%D9%8A%D9%84-%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D9%81%D9%88%D8%AA%D9%88%D8%B4%D9%88%D8%A8-%D8%A5%D9%84%D9%89-htmlcss-r213/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_12/coding-portfolio-html-css.png.4584735b17f8bd9d98f7dd254ff7358e.png" /></p>

<div id="wmd-preview-section-25"><p>في هذا الدرس سوف نقوم بتحويل <a href="https://academy.hsoub.com/design/graphic-design/photoshop/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D9%81%D9%83%D8%B1%D8%A9-%D9%85%D9%88%D9%82%D8%B9-%D9%85%D8%B9%D8%B1%D8%B6-%D8%A3%D8%B9%D9%85%D8%A7%D9%84-%D8%A3%D9%86%D9%8A%D9%82-r203/">تصميم تم إعداده باستخدام فوتوشوب</a> وجعله صفحة ويب جاهزة وذلك باستخدام لغتي HTML وCSS (وهو أمر يُعرف أيضا تحت اسم “التكويد”). </p><p>هذا هو التصميم الذي سوف نعمل على تكويده في هذا الدرس: </p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_12/01.jpg.a2c4c49abc43ce9c9601732cbed82666.jpg"><img data-fileid="9397" class="ipsImage ipsImage_thumbnailed" alt="01.thumb.jpg.2bee9850fa5eedfe443589eb417" src="https://academy.hsoub.com/uploads/monthly_2015_12/01.thumb.jpg.2bee9850fa5eedfe443589eb4175a595.jpg"></a></p></div><div id="wmd-preview-section-26"><h2 id="استخراج-بعض-الصور">استخراج بعض الصور</h2><p>قبل أن نبدأ في تكويد التصميم سوف نحتاج إلى استخراج بعض الصور منه (في الأسفل يوجد صورة توضيحية للملفات التي نحتاجها، وكوننا لا نملك الملف لاستخراج الملفات منه فيمكنك استعمال أي بديل تراه مناسبًا فالمهم هو أن تعرف كيفية التكويد وكتابة أكواد مناسبة). </p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_12/02.jpg.5a03594791fb9b7957b3a6914e1a6eb1.jpg"><img data-fileid="9398" class="ipsImage ipsImage_thumbnailed" alt="02.thumb.jpg.eac0601f25797f75ea3ac6239bc" src="https://academy.hsoub.com/uploads/monthly_2015_12/02.thumb.jpg.eac0601f25797f75ea3ac6239bc17cda.jpg"></a></p><h2>بنية ملف HTML</h2></div><p> </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">&lt;!DOCTYPE html&gt; 
&lt;html&gt;
  &lt;head&gt; 
    &lt;meta charset="utf-8" /&gt; 
    &lt;title&gt;Chris Spooner Design Portfolio&lt;/title&gt; 
    &lt;link href="style.css" rel="stylesheet" type="text/css" media="screen" /&gt; 
  &lt;/head&gt; 

  &lt;body&gt; 
    &lt;div id="container"&gt; &lt;/div&gt; 
  &lt;/body&gt;
&lt;/html&gt;
</pre><p>يبدأ ملف الـHTML كما هو معتاد على وسم <span style="font-family:courier new,courier,monospace;">&lt;doctype&gt;</span> و <span style="font-family:courier new,courier,monospace;">&lt;head&gt;</span> وأخيرًا وسم <span style="font-family:courier new,courier,monospace;">&lt;body&gt;</span>. كما أننا قمنا بربط ملف CSS بواسطة استعمال وسم <span style="font-family:courier new,courier,monospace;">&lt;link&gt;</span> وأضفنا أيضًا وسم <span style="font-family:courier new,courier,monospace;">&lt;div id="container"&gt;</span> ليعمل كحاوٍ لجميع محتوى الصفحة.</p><div id="wmd-preview-section-28"><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">&lt;p id="logo"&gt;
  &lt;a href="#"&gt;&lt;img src="images/logo.png" alt="Chris Spooner logo" /&gt;&lt;/a&gt;
&lt;/p&gt; 

&lt;ul id="nav"&gt; 
  &lt;li&gt;&lt;a href="index.html"&gt;Home&lt;/a&gt;&lt;/li&gt; 
  &lt;li&gt;&lt;a href="about.html"&gt;About&lt;/a&gt;&lt;/li&gt; 
  &lt;li&gt;&lt;a href="portfolio.html"&gt;Portfolio&lt;/a&gt;&lt;/li&gt; 
  &lt;li&gt;&lt;a href="contact.html"&gt;Contact&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 

&lt;div id="header"&gt; 
  &lt;h1&gt;Hello, I'm Chris Spooner.&lt;/h1&gt; 
  &lt;h2&gt;I craft websites that are beautiful on both the inside and out.&lt;/h2&gt; 
  &lt;p class="btn"&gt;&lt;a href="portfolio.html"&gt;View my portfolio&lt;/a&gt;&lt;/p&gt; 
&lt;/div&gt;</pre><p>لو نظرت إلى التصميم سوف تجد أن القائمة تأتي قبل الشعار ولكن مع ذلك فإننا سوف نقوم بإضافة الشعار قبل القائمة حتى نبقي كل شيء مرتّبًا ومنظمًا. وضعنا الشعار داخل وسم <span style="font-family:courier new,courier,monospace;">&lt;p&gt;</span> واستعملنا العنصر <span style="font-family:courier new,courier,monospace;">&lt;ul&gt;</span> ليحتوي على عناصر القائمة وأضفنا أيضًا وسمي <span style="font-family:courier new,courier,monospace;">&lt;h1&gt;</span> و <span style="font-family:courier new,courier,monospace;">&lt;h2&gt;</span> وبداخلهما عنوان ومقدمة بسيطة.</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">&lt;div id="content"&gt; 
  &lt;h3&gt;About Chris Spooner&lt;/h3&gt; 
  &lt;p&gt;I earn a living by creating custom brands and logo designs from scratch, as well as designing and building high quality websites and blogs, but I also enjoy producing the odd t-shirt graphic, illustration or character design. I pride myself in having the nerdy skills to build top notch creations online, as well as being knowledgeable in the print side of design.&lt;/p&gt; 
  
  &lt;h3&gt;My latest work&lt;/h3&gt; 
  &lt;p&gt;I’m forever creating design work for both myself as personal projects and as a hired gun for clients from around the world. Here’s a few of my most recent works.&lt;/p&gt; 
  
  &lt;div class="portfolio-item"&gt; 
    &lt;a href="#"&gt;&lt;img src="images/portfolio-1.jpg" alt="View more info" /&gt;&lt;/a&gt; 
    &lt;p class="btn"&gt;&lt;a href="#"&gt;See more&lt;/a&gt;&lt;/p&gt; 
  &lt;/div&gt; 

  &lt;div class="portfolio-item"&gt; 
    &lt;a href="#"&gt;&lt;img src="images/portfolio-2.jpg" alt="View more info" /&gt;&lt;/a&gt; 
    &lt;p class="btn"&gt;&lt;a href="#"&gt;See more&lt;/a&gt;&lt;/p&gt; 
  &lt;/div&gt; 

  &lt;div class="portfolio-item"&gt; 
    &lt;a href="#"&gt;&lt;img src="images/portfolio-3.jpg" alt="View more info" /&gt;&lt;/a&gt; 
    &lt;p class="btn"&gt;&lt;a href="#"&gt;See more&lt;/a&gt;&lt;/p&gt; 
  &lt;/div&gt; 

  &lt;div class="portfolio-item"&gt; 
    &lt;a href="#"&gt;&lt;img src="images/portfolio-4.jpg" alt="View more info" /&gt;&lt;/a&gt; 
    &lt;p class="btn"&gt;&lt;a href="#"&gt;See more&lt;/a&gt;&lt;/p&gt; 
  &lt;/div&gt; 
&lt;/div&gt; 

&lt;div id="footer"&gt; 
  &lt;p id="copyright"&gt;&amp;copy; Chris Spooner / SpoonGraphics (Please don’t steal my work)&lt;/p&gt; 
  &lt;p id="back-top"&gt;&lt;a href="#"&gt;Going up?&lt;/a&gt;&lt;/p&gt; 
&lt;/div&gt;</pre><p>قمنا بعد ذلك بإضافة وسم <span style="font-family:courier new,courier,monospace;">&lt;h3&gt;</span> وبداخله نص يعتبر أقل أهمية عن النص السابق (فكما تعلم أنّ وسم <span style="font-family:courier new,courier,monospace;">&lt;h1&gt;</span> أهم من <span style="font-family:courier new,courier,monospace;">&lt;h2&gt;</span> ومن <span style="font-family:courier new,courier,monospace;">&lt;h3&gt;</span> وهكذا). بعد ذلك قمنا بإضافة العنصر <span style="font-family:courier new,courier,monospace;">&lt;div id="content"&gt;</span> وبداخله يوجد المحتوى الرئيسي للصفحة والعديد من وسوم &lt;div&gt; كل واحد منها يحتوي على صورة مصغرة عن أحد الأعمال التي قمنا بها (وكأنها معرض أعمال مُصغّر). وأخيرًا يوجد هناك التذييل (footer) ممثلًا بالعنصر <span style="font-family:courier new,courier,monospace;">&lt;div id="footer"&gt;</span> وبداخله حقوق الملكية وزر العودة للأعلى. <br>الآن وبعد أن انتهينا من ملف الـHTML دعونا ننتقل إلى تنسيق الصفحة باستعمال CSS.</p></div><div id="wmd-preview-section-30"><h2 id="تنسيقات-css">تنسيقات CSS</h2></div><div id="wmd-preview-section-31"><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">body, div, h1, h2, h3, h4, h5, h6, p, ul, ol, li, dl, dt, dd, img, form, fieldset, input, textarea, blockquote { 
  margin: 0; 
  padding: 0; 
  border: 0; 
} 

body { 
  background: #f2f0eb url(images/bg.png); 
  font: 16px Helvetica, Arial, Sans-Serif; 
  color: #636363; 
  line-height: 24px; 
} 

#container { 
  width: 960px; 
  margin: 0 auto; 
} 

#logo { 
  margin: 10px auto 0 auto; 
  position: relative; 
  width: 183px; 
}</pre><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_12/03.jpg.8664a82e519616644e7e2b9b2a01302e.jpg"><img data-fileid="9399" class="ipsImage ipsImage_thumbnailed" alt="03.thumb.jpg.8a53e242e6215206694b47a1a10" src="https://academy.hsoub.com/uploads/monthly_2015_12/03.thumb.jpg.8a53e242e6215206694b47a1a10da832.jpg"></a></p><p>بدأنا ملف الـCSS بتنسيقات بسيطة لإزالة التنيسقات الافتراضية للمتصفحات، وبعد ذلك قمنا بإضافة بعض التنسيقات لجسم المدونة (وسم <span style="font-family:courier new,courier,monospace;">&lt;body&gt;</span>). لاحظ أننا قمنا في البداية بإضافة خلفية مزخرفة (صورة) إلى جسم المدونة وبعدها أضفنا بعض التنسيقات التي تخص الخطوط في الصفحة. قمنا بعدها بإعطاء العنصر الحاوي (container div) عرضًا بقيمة 960px واستعملنا أيضًا الخاصية<span style="font-family:courier new,courier,monospace;"> margin: 0 auto</span> لتوسيط العنصر في منتصف الصفحة، كما أننا أضفنا نفس الخاصية السابقة إلى الشعار حتى يتوسط في الصفحة.</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">ul#nav { 
  width: 940px; 
  list-style: none; 
  overflow: hidden; 
  margin: -134px auto 25px auto; 
} 

ul#nav li { 
  width: 126px; 
  height: 33px; 
  float: left; 
  padding: 13px 0 0 0; 
  background: url(images/nav-bg.png); 
  font-weight: bold; 
  text-align: center; 
  text-transform: uppercase; 
} 

ul#nav li:nth-child(1) { 
  margin: 0 60px 0 0; 
} 

ul#nav li:nth-child(2) { 
  margin: 0 316px 0 0; 
} 

ul#nav li:nth-child(3) { 
  margin: 0 60px 0 0; 
} 

ul#nav li:nth-child(4) { 
  margin: 0; 
} 

ul#nav li a { 
  color: #616369; 
  text-decoration: none; 
} 

ul#nav li a:hover {                 
  color: #a12121; 
}</pre><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_12/04.jpg.d50df141231cb3bfec506614b4a99582.jpg"><img data-fileid="9400" class="ipsImage ipsImage_thumbnailed" alt="04.thumb.jpg.3a2fc1b553461170c78e744e8dc" src="https://academy.hsoub.com/uploads/monthly_2015_12/04.thumb.jpg.3a2fc1b553461170c78e744e8dc57ab4.jpg"></a></p><p>سوف نحتاج لإضافة مجموعة من الخصائص للقائمة الرئيسية حتى تتماشى وتتوافق مع التصميم الذي نعمل عليه، فقمنا أولًا بتحريك العنصر <span style="font-family:courier new,courier,monospace;">&lt;ul&gt;</span> إلى الأعلى وذلك باستخدام قيمة <span style="font-family:courier new,courier,monospace;">margin</span> سالبة وبعدها قمنا بإعطاء كل عنصر من عناصر القائمة (عناصر <span style="font-family:courier new,courier,monospace;">&lt;li&gt;</span>) مجموعة خصائص، أبعاد، خلفيات وتنسيقات خطوط حتى تتوافق مع التصميم الذي نريده. وحتى نجعل الصفحة تبدو كالتصميم تمامًا فإننا استخدمنا المحدد <span style="font-family:courier new,courier,monospace;">()nth-child:</span> حتى نُعطي قيم <span style="font-family:courier new,courier,monospace;">margin</span> مختلفة لكل عنصر.</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">#header { 
  height: 244px; 
  padding: 52px 0 0 57px; 
  background: url(images/home-header.jpg); 
} 

#header h1 { 
  font: 38px Georgia, Serif; 
  color: #f2f0eb; 
  letter-spacing: 2px; 
  margin: 0 0 20px 0; 
  text-shadow: 0px 3px 3px #494949; 
} 

#header h2 { 
  width: 510px; 
  font: 30px Georgia, Serif; 
  color: #f2f0eb; 
  letter-spacing: 2px; 
  margin: 0 0 20px 0; 
  text-shadow: 0px 3px 3px #494949; 
} 

#header p.btn a { 
  display: block; 
  width: 225px; 
  height: 50px; 
  overflow: hidden; 
  background: url(images/home-header-btn.jpg); 
  text-indent: -9999px; 
}</pre><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_12/05.jpg.190e9b7f6c45be6737dacfbbef6b72c0.jpg"><img data-fileid="9401" class="ipsImage ipsImage_thumbnailed" alt="05.thumb.jpg.9d0fd9fda074dd9397d717ef992" src="https://academy.hsoub.com/uploads/monthly_2015_12/05.thumb.jpg.9d0fd9fda074dd9397d717ef9924f8cd.jpg"></a></p><p>لاحظ أننا أعطينا الترويسة (header) ارتفاعًا بقيمة 244px وذلك لأن ارتفاع صور الخلفية الذي أعطيناها لها هو 244px. بعد ذلك استخدمنا <span style="font-family:courier new,courier,monospace;">padding</span> مناسب حتى نُبعد النصوص عن الحواف ونجعل كل شيء مناسبًا ومتوافقًا مع التصميم، وقمنا أيضًا بإعطاء الوسمين <span style="font-family:courier new,courier,monospace;">&lt;h1&gt;</span> و <span style="font-family:courier new,courier,monospace;">&lt;h2&gt;</span> الموجودين في الترويسة بعض تنسيقات الخطوط حتى تتوافق مع التصميم (نوع الخط Georgia واستخدمنا أيضًا الخاصية <span style="font-family:courier new,courier,monospace;">letter-spacing</span> لزيادة المسافة بين كل أحرف الكلمات). يمكننا كذلك محاكاة تأثير الظل عن طريق استخدام الخاصية <span style="font-family:courier new,courier,monospace;">text-shadow</span>، بينما أضفنا عرضًا بقيمة 510px للوسم<span style="font-family:courier new,courier,monospace;"> &lt;h2&gt;</span> حتى نمنع النص من الظهور فوق المنطقة المخصصة له. وأخيرًا قمنا باستخدام الخاصية <span style="font-family:courier new,courier,monospace;">()background: url</span> وبعض الخصائص الأخرى على العنصر الذي يحمل الفئة <span style="font-family:courier new,courier,monospace;">btn.</span> وذلك لتحويله إلى زر كما هو موجود في التصميم.</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">#content { 
  background: url(images/content-bg.png) repeat-y; 
  padding: 57px 69px 50px 69px; 
  overflow: hidden; 
} 

#content h2 { 
  font: 30px Georgia, Serif; 
  letter-spacing: 2px; 
  margin: 0 0 20px 0; 
} 

#content h3 { 
  font: 26px Georgia, Serif; 
  letter-spacing: 2px; 
  margin: 0 0 20px 0; 
} 

#content p { 
  margin: 0 0 30px 0; 
} 

#content a { 
  color: #a12121; 
  text-decoration: none; 
} 

#content a:hover {             
  color: #671111; 
} 

#content .portfolio-item { 
  width: 182px; 
  padding: 4px; 
  background: #eee; 
  text-align: center; 
  float: left; 
  margin: 0 7px 14px 7px; 
} 

#content .portfolio-item p.btn { 
  margin: 0; 
} 

#content .portfolio-item p.btn a { 
  display: block; 
  width: 183px; 
  height: 29px; 
  padding: 7px 0 0 0; 
  background: url(images/see-more-bg.png); 
  font-weight: bold; 
  text-align: center; 
  text-transform: uppercase; 
  text-decoration: none; 
}</pre><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_12/06.jpg.5d31b895bf78df3effa6ead3b003d8df.jpg"><img data-fileid="9402" class="ipsImage ipsImage_thumbnailed" alt="06.thumb.jpg.2da9aa50821cefca0c078af36f2" src="https://academy.hsoub.com/uploads/monthly_2015_12/06.thumb.jpg.2da9aa50821cefca0c078af36f269144.jpg"></a></p><p>الآن سنقوم بتنسيق المحتوى الرئيسي للمدونة. لاحظ أننا أعطينا العنصر <span style="font-family:courier new,courier,monospace;">content#</span> صورة كخلفية وأضفنا <span style="font-family:courier new,courier,monospace;">padding</span> بقيم معينة حتى نُبعد المحتوى عن الأطراف. بعد ذلك استخدمنا <span style="font-family:courier new,courier,monospace;">overflow: hidden</span> حتى نتأكد من أنّ جميع العناصر الموجودة داخل هذا العنصر والتي تحمل الخاصية <span style="font-family:courier new,courier,monospace;">float</span> لن تقوم بتشويه التصميم وتخطيط الصفحة (استخدام الخاصية <span style="font-family:courier new,courier,monospace;">overflow: hidden</span> في مثل هذه الحالة يسمى clearing floats). قمنا كذلك باستخدام بعض الخصائص البسيطة للنصوص الموجودة داخل هذا العنصر (كنوع الخط وحجمه وبعض الأمور الأخرى). قمنا بعد ذلك بتنسيق الصور المصغرة وذلك بإعطائها خلفية بلون رمادي وإعطائها الخاصية<span style="font-family:courier new,courier,monospace;"> float: left</span> حتى تظهر جميع الصور إلى جانب بعضها أفقيًا، وأخيرًا قمنا بتنسيق عناصر <span style="font-family:courier new,courier,monospace;">&lt;a&gt;</span> لنجعلها تبدو وكأنها أزرار وذلك بإعطائها خلفية باستعمال الخاصية <span style="font-family:courier new,courier,monospace;">()background: url</span>.</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">#footer { 
  background: url(images/footer-bg.png) no-repeat; 
  padding: 40px 0 0 0; 
  overflow: hidden; 
  margin: 0 0 30px 0; 
} 

#footer p#copyright { 
  font-size: 12px; 
  float: left; 
  margin: 0 0 0 30px; 
  color: #b8b6b2; 
} 

#footer p#back-top { 
  font-size: 12px; 
  float: right; 
  margin: 0 30px 0 0; 
} 

#footer a { 
  color: #a12121; 
  text-decoration: none; 
} 

#footer a:hover { 
  color: #671111; 
}</pre><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_12/07.jpg.7d01b199ef4153db8a1ef4b248b53d0f.jpg"><img data-fileid="9403" class="ipsImage ipsImage_thumbnailed" alt="07.thumb.jpg.6c7280c4cfab01cbce1bfbf103b" src="https://academy.hsoub.com/uploads/monthly_2015_12/07.thumb.jpg.6c7280c4cfab01cbce1bfbf103b8ba7d.jpg"></a></p><p>بقي علينا الآن تنسيق التذييل الخاص بالصفحة. الجزء الأسفل من المحتوى تم إضافته كخلفية للتذييل، وبعدها أضفنا <span style="font-family:courier new,courier,monospace;">padding</span> بقيم مناسبة حتى ندفع بمحتوى التذييل إلى أسفل صورة الخلفية. لاحظ أننا استخدمنا <span style="font-family:courier new,courier,monospace;">no-repeat</span> وذلك حتى نتأكد بأنّ الصورة تظهر مرة واحدة فقط ولا تتكرر. قمنا بإضافة خصائص نصيّة لكل من حقوق الملكية وكذلك زر العودة إلى الأعلى وقمنا أيضًا باستخدام الخاصية <span style="font-family:courier new,courier,monospace;">float</span> لإزاحة العنصرين إلى يمين ويسار الصفحة.</p></div><div id="wmd-preview-section-36"><h2 id="إضافة-بعض-الجافاسكربت-لدعم-متصفح-ie8-وأقل">إضافة بعض الجافاسكربت لدعم متصفح IE8 وأقل</h2><p>إنّ متصفح IE8 والنسخ الأقدم منه لا تدعم المحدد <span style="font-family:courier new,courier,monospace;">nth-child:</span> لذلك إذا أردت أن تدعم هذه المتصفحات فبإمكانك أن تستخدم مكتبة jQuery لتساعدنا في ذلك:</p><pre data-pbcklang="javascript" data-pbcktabsize="4" class="javascript ipsCode prettyprint">$(document).ready(function() { 
  $("ul#nav li:nth-child(1)").css("margin-right", "60px"); 
  $("ul#nav li:nth-child(2)").css("margin-right", "316px"); 
  $("ul#nav li:nth-child(3)").css("margin-right", "60px"); 
  $("ul#nav li:nth-child(4)").css("margin-right", "0px"); 
});</pre><p>حتى وإن كانت تلك المتصفحات لا تدعم المحدد <span style="font-family:courier new,courier,monospace;">nth-child</span> إلا أن استخدام هذا المحدد مع jQuery ممكن وسوف تقوم تلك المتصفحات بتطبيق التنسيقات بدون أي مشاكل.</p></div><div id="wmd-preview-section-38"><h2 id="إنهاء-الصفحات-الداخلية">إنهاء الصفحات الداخلية</h2><p>بعد أن قدمنا بإنهاء الصفحة الرئيسية فإننا سوف نقوم ببناء الصفحات الداخلية للموقع. سوف تكون بنية هذه الصفحات متشابهة نوعًا ما مع القليل من الاختلافات كما أن فيها بعض العناصر المشتركة لذلك سيكون بناؤها أمرًا يسيرًا. </p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_12/08.jpg.ce571fa7e78378826f134f14b60a1b59.jpg"><img data-fileid="9404" class="ipsImage ipsImage_thumbnailed" alt="08.thumb.jpg.f64cabf85feb0b102f1929e456a" src="https://academy.hsoub.com/uploads/monthly_2015_12/08.thumb.jpg.f64cabf85feb0b102f1929e456ab172e.jpg"></a></p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">&lt;div id="header" class="page"&gt; 
  &lt;h1&gt;About Chris Spooner&lt;/h1&gt; 
&lt;/div&gt;</pre><p>لنقوم بتنسيق ترويسة أخرى يمكننا بكل بساطة أن نضيف فئة (class) للترويسة الخاصة بالصفحات الداخلية وبعدها نقوم بإعطاء هذه الترويسة حجمًا أصغر وصورة خلفية معينة. </p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_12/09.jpg.e944ff13f29dc0364bb5ce91fa539a01.jpg"><img data-fileid="9405" class="ipsImage ipsImage_thumbnailed" alt="09.thumb.jpg.be441de89b55ec69b89f0684357" src="https://academy.hsoub.com/uploads/monthly_2015_12/09.thumb.jpg.be441de89b55ec69b89f0684357ce6b1.jpg"></a></p><p>لقد قمنا مسبقًا بإنشاء الشيفرة البرمجية الخاصة بعناصر معرض الأعمال، لذلك يمكننا تكرار هذه العناصر لكل مشروع على حدة، وكل ما نحتاج لتغييره هو الصورة المصغرة الخاصة بكل مشروع.</p></div><div id="wmd-preview-section-40"><h2 id="خاتمة">خاتمة</h2><p>وهكذا نكون قد قمنا بتكويد كامل التصميم. أتمنى أن تكونوا قد استفدتم من الدرس.</p><p>ترجمة -وبتصرّف- للمقال <a rel="external nofollow" href="http://line25.com/tutorials/how-to-code-a-stylish-portfolio-design-in-html-and-css">How to Code a Stylish Portfolio Design in HTML/CSS</a> لصاحبه Iggy.</p></div>
]]></description><guid isPermaLink="false">213</guid><pubDate>Mon, 14 Dec 2015 22:04:38 +0000</pubDate></item><item><title>&#x62A;&#x62D;&#x648;&#x64A;&#x644; &#x62A;&#x635;&#x645;&#x64A;&#x645; &#x648;&#x627;&#x62C;&#x647;&#x629; &#x64A;&#x639;&#x62A;&#x645;&#x62F; &#x639;&#x644;&#x649; &#x645;&#x628;&#x627;&#x62F;&#x626; Typography &#x625;&#x644;&#x649; HTML5 &#x648; CSS</title><link>https://academy.hsoub.com/programming/html/%D8%AA%D8%AD%D9%88%D9%8A%D9%84-%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D9%88%D8%A7%D8%AC%D9%87%D8%A9-%D9%8A%D8%B9%D8%AA%D9%85%D8%AF-%D8%B9%D9%84%D9%89-%D9%85%D8%A8%D8%A7%D8%AF%D8%A6-typography-%D8%A5%D9%84%D9%89-html5-%D9%88-css-r173/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_09/typography-to-html-css-blog-ui.png.773023662d41d57dcfb3986a6151cca4.png" /></p>

<p dir="rtl">قمنا في <a href="https://academy.hsoub.com/design/graphic-design/photoshop/%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D9%88%D8%A7%D8%AC%D9%87%D8%A9-%D9%85%D8%AF%D9%88%D9%86%D8%A9-%D8%A8%D9%86%D8%A7%D8%A1-%D8%B9%D9%84%D9%89-%D9%85%D8%A8%D8%A7%D8%AF%D8%A6-typography-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%81%D9%88%D8%AA%D9%88%D8%B4%D9%88%D8%A8-r124/">الدرس الأول</a> من <a href="https://academy.hsoub.com/search/?tags=%D9%82%D8%A7%D9%84%D8%A8+typography">هذه السلسلة</a> بإنهاء تصميم واجهة مدونة بناءً على مبادئ الخطوط والطباعة (typography) باستخدام برنامج فوتوشوب، وكنا قد استعملنا نظام شبكي (grid) صارم لتخطيط الصفحة.</p><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/typography-to-html-css-blog-ui.png.dd82240ae25db772b839e1f537857de0.png"><img data-fileid="5075" class="ipsImage ipsImage_thumbnailed" alt="typography-to-html-css-blog-ui.thumb.png" src="https://academy.hsoub.com/uploads/monthly_2015_09/typography-to-html-css-blog-ui.thumb.png.0422a5905cc28b209b602485303008a2.png"></a></p><p dir="rtl">وفي هذا الدرس سنقوم بتحويل ذلك التصميم إلى نموذج HTML5. وفي الدرس التالي والأخير من هذه السلسلة سنقوم بتحويل هذا النموذج إلى قالب ووردبريس كامل.</p><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/Figure1-typo-wordpress-theme-sm.jpg.58929fe19f5fc47318b53df585dbd111.jpg"><img data-fileid="5065" class="ipsImage ipsImage_thumbnailed" alt="Figure1-typo-wordpress-theme-sm.thumb.jp" src="https://academy.hsoub.com/uploads/monthly_2015_09/Figure1-typo-wordpress-theme-sm.thumb.jpg.8ec63d9786240b0c3ba0e31b5b0d836f.jpg"></a></p><p dir="rtl"><a href="https://academy.hsoub.com/design/graphic-design/photoshop/%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D9%88%D8%A7%D8%AC%D9%87%D8%A9-%D9%85%D8%AF%D9%88%D9%86%D8%A9-%D8%A8%D9%86%D8%A7%D8%A1-%D8%B9%D9%84%D9%89-%D9%85%D8%A8%D8%A7%D8%AF%D8%A6-typography-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%81%D9%88%D8%AA%D9%88%D8%B4%D9%88%D8%A8-r124/">يمكنك الاطلاع على الدرس السابق</a> الذي قمنا فيه بتصميم واجهة المدونة باستخدام الفوتوشوب. وقد قلنا بأن اسم القالب سيكون "Typo" وبأنه سيعتمد بشكل كلي على الـtypography من دون استعمال أي صور حتى يكون التركيز بالكامل على المحتوى.</p><h2 dir="rtl">التحضير لبدء التكويد</h2><p dir="rtl">بما أنّ هذا التصميم بسيط ويرتكز بشكل كبير على مبادئ الـtypography فلن يكون هناك الكثير من الصور التي سنحتاج إلى استخراجها من الفوتوشوب، فالملفات الوحيدة التي سنحتاج إلى استخراجها هي الخلفية المزخرفة (background texture) وبعض الأيقونات. مع ذلك وحتى نجعل عملية التكويد سهلة فسوف نقوم باستخراج نُسخ من الأعمدة (columns) والخطوط الشبكية (grid lines) مما يسهل عملية موضعة ومحاذاة العناصر أثناء عملية التكويد.</p><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/Figure2.jpg.2c98d505d3c45c0268ced6010f74810b.jpg"><img data-fileid="5066" class="ipsImage ipsImage_thumbnailed" alt="Figure2.thumb.jpg.0442da80abf0fc7943d7d5" src="https://academy.hsoub.com/uploads/monthly_2015_09/Figure2.thumb.jpg.0442da80abf0fc7943d7d52fd3561f7a.jpg"></a></p><p dir="rtl">سنقوم بتحويل هذا التصميم باستخدام عناصر HTML5 (مثل &lt;header&gt; ،&lt;nav&gt; ،&lt;section&gt;)، وبذلك فإنّه من الضروري أن تعرف هذه العناصر وفيما إذا كانت مناسبة لهذا التصميم.</p><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/Figure3-html5-layout.jpg.71ab658f9d11d877a72eb8b1a4f6619d.jpg"><img data-fileid="5067" class="ipsImage ipsImage_thumbnailed" alt="Figure3-html5-layout.thumb.jpg.c3da937b2" src="https://academy.hsoub.com/uploads/monthly_2015_09/Figure3-html5-layout.thumb.jpg.c3da937b269776accedb0650bb0bfc10.jpg"></a></p><h2 dir="rtl">بنية ملف HTML5</h2><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
    &lt;meta charset="utf-8" /&gt;
    &lt;title&gt;Typo&lt;/title&gt;
    &lt;link href="style.css" rel="stylesheet" /&gt;
    &lt;link href='http://fonts.googleapis.com/css?family=Droid+Serif:400,400italic' rel='stylesheet' type='text/css'&gt;
    &lt;script src="js/scripts.js"&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;div id="container"&gt;</pre><p dir="rtl">يبدأ الملف عادة بـDoctype لتعريف المتصفح بأننا نستخدم HTML5، وهناك أيضًا وسم <strong>&lt;head&gt;</strong> وبداخله وسم <strong>&lt;title&gt;</strong> يحتوي على عنوان المدونة ووسم <strong>&lt;link&gt;</strong> لربط ملف CSS الذي نريد استخدامه. لاحظ أيضًا أننا استعملنا خدمة Google We Fonts للحصول على الخط Droid Serif.</p><p dir="rtl">من الضروري أن تنتبه أيضًا لأمر ما وهو أنه عندما تريد أن تقوم بتكويد أي صفحة باستخدام وسوم HTML5 فإنه لا يجب عليك دائمًا استخدام وسوم <strong>&lt;section&gt;</strong> بدلًا من <strong>&lt;div&gt;</strong>، ففي بعض الأحيان تكون وسوم <strong style="line-height: 17.92px;">&lt;div&gt; </strong>مناسبة أكثر (كأن تستخدمه كحاوي لباقي العناصر).</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">&lt;header&gt;
    &lt;h1&gt;&lt;a href="#" title="Return to the homepage"&gt;Typo&lt;/a&gt;&lt;/h1&gt;
    &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;About&lt;/a&gt;&lt;/li&gt;
            &lt;li&gt;&lt;a href="#"&gt;Archives&lt;/a&gt;&lt;/li&gt;
            &lt;li&gt;&lt;a href="#"&gt;Contact&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
    &lt;/nav&gt;
&lt;/header&gt;</pre><p dir="rtl">أحد الوسوم الجديدة في لغة HTML5 هو <strong>&lt;header&gt;</strong> ويعد استخدام هذا الوسم من أجل بناء وتكويد ترويسة الموقع أفضل من استخدام وسم <strong>&lt;div&gt;</strong> وإعطائه id بقيمة "header" كما يفعل الكثير من المطورين. ويمكنك بعد ذلك أن تضع وسم <strong>&lt;nav&gt;</strong> داخله ليحتوي على القائمة الرئيسية للموقع (main navigation menu). استخدمنا أيضًا وسم <strong>&lt;h1&gt;</strong> وبداخله وسم <strong>&lt;a&gt;</strong> ليحتوي على عنوان المدونة (ليعمل وكأنه شعار الموقع).</p><p dir="rtl">إذا كنت تتذكر عندما صممنا الموقع في فوتوشوب فقد قمنا بوضع رقم بجانب كل عنصر من عناصر القائمة الرئيسية، لذلك قد تعتقد أنه من المناسب استعمال <strong>&lt;ol&gt;</strong> ولكن من وجهة نظر دلالية (semantically) فهذا غير صحيح لأنه لا يوجد علاقة ترابطية/تتابعية بين تلك العناصر فهي وضعت فقط من أجل تجميل تلك العناصر، وبالتالي سوف نقوم بإضافة هذه الأرقام لاحقًا باستخدام CSS.</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">&lt;div id="content" role="main"&gt;
    &lt;article&gt;
        &lt;h2&gt;&lt;a href="#"&gt;Getting your stock photos seen&lt;/a&gt;&lt;/h2&gt;
        &lt;p&gt;Lorem ipsum dolor sit amet[...]leo placerat.&lt;/p&gt;
        &lt;ul class="postinfo"&gt;
            &lt;li&gt;17th October 2011&lt;/li&gt;
            &lt;li&gt;Posted in &lt;a href="#"&gt;Articles&lt;/a&gt;&lt;/li&gt;
            &lt;li&gt;&lt;a href="#"&gt;Continue Reading &amp;raquo;&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
    &lt;/article&gt;</pre><p dir="rtl">قد تعتقد أيضًا أن استعمال <strong>&lt;section&gt;</strong> بدلًا من <strong>&lt;div&gt;</strong> هو الأنسب، ولكن هذا غير صحيح من ناحية دلالية (semantic). فالطريقة المفضلة هي استخدام <strong>&lt;div&gt;</strong> مع إضافة ARIA role بالقيمة "main" حتى نعطي للوسم معنى أفضل. وبالنسبة لمحتوى المدونة (المقالات) يمكنك استخدام <strong>&lt;article&gt;</strong> لاحتوائها.</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">    &lt;nav id="pagination"&gt;
        &lt;ul&gt;
            &lt;li class="older"&gt;&lt;a href="#"&gt;&amp;laquo; Older posts&lt;/a&gt;&lt;/li&gt;
            &lt;li class="newer"&gt;&lt;a href="#"&gt;Newer posts &amp;raquo;&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
    &lt;/nav&gt;
&lt;/div&gt;</pre><p dir="rtl">أسفل المقالات يوجد روابط ترقيم الصفحات (pagination)، وفي العادة فإنّ هذه الروابط ليست بتلك الأهمية التي تجعلنا نضعها داخل وسم <strong>&lt;nav&gt;</strong> (استخدام <strong style="line-height: 17.92px;">&lt;nav&gt; </strong>ليس محصورًا فقط على القائمة الرئيسية للمدونة، بل يمكن استخدامه في عدة أماكن) إلّا أنني أرى أنّ روابط ترقيم الصفحات مهمة في أي مدونة للوصول إلى محتوى إضافي.</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">&lt;aside id="sidebar"&gt;
    &lt;section id="about"&gt;
        &lt;h3&gt;About me&lt;/h3&gt;
        &lt;p&gt;Typo is a WordPress theme based entirely on a balanced typographic design. A strict grid layout keeps everything tidy, allowing the content to shine. &lt;a href="#" class="more"&gt;Find out more &amp;raquo;&lt;/a&gt;&lt;/p&gt;
    &lt;/section&gt;

    &lt;section id="categories"&gt;
        &lt;h3&gt;Categories&lt;/h3&gt;
        &lt;ul&gt;
            &lt;li&gt;&lt;a href="#"&gt;Articles&lt;/a&gt;&lt;/li&gt;
            &lt;li&gt;&lt;a href="#"&gt;Design&lt;/a&gt;&lt;/li&gt;
            &lt;li&gt;&lt;a href="#"&gt;Graphics&lt;/a&gt;&lt;/li&gt;
            &lt;li&gt;&lt;a href="#"&gt;Inspiration&lt;/a&gt;&lt;/li&gt;
            &lt;li&gt;&lt;a href="#"&gt;Retro&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
    &lt;/section&gt;</pre><p dir="rtl">لاحظ أننا استخدمنا الوسم <strong>&lt;aside&gt;</strong> لاحتواء محتوى القائمة الجانبية (sidebar). لاحظ أنّ القائمة الجانبية تحتوي على عدة أقسام وبالتالي سيكون استخدام <strong>&lt;section&gt;</strong> لكل قسم في هذه الحالة مناسبًا أكثر من <strong>&lt;div&gt;</strong>.</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">    &lt;section id="search"&gt;
        &lt;h3&gt;Search&lt;/h3&gt;
        &lt;form method="get" action="#"&gt;
            &lt;fieldset&gt;
                &lt;input type="text" id="searchbar" placeholder="I'm looking for&amp;hellip;" /&gt;
                &lt;input type="submit" id="searchsubmit" value="Search" /&gt;
            &lt;/fieldset&gt;
        &lt;/form&gt;
    &lt;/section&gt;
&lt;/aside&gt;
</pre><p dir="rtl">وفي أسفل القائمة الجانبية يوجد مربع البحث، وسوف نستخدم بعض من الخصائص الجديدة في لغة HTML5. وأحد هذه الخصائص هو placeholder بحيث تمكننا هذه الخاصية من وضع نص داخل حقل الإدخال لإخبار المستخدم بما يجب عليه إدخاله في ذلك الحقل.</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">&lt;/div&gt;
&lt;div id="footer-container"&gt;
    &lt;footer&gt;
        &lt;ul id="credits"&gt;
            &lt;li class="wordpress"&gt;&lt;a href="http://wordpress.org"&gt;Powered by WordPress&lt;/a&gt;&lt;/li&gt;
            &lt;li class="spoongraphics"&gt;&lt;a href="http://www.blog.spoongraphics.co.uk"&gt;Theme by SpoonGraphics&lt;/a&gt;  &lt;/li&gt;
        &lt;/ul&gt;
        &lt;p id="back-top"&gt;&lt;a href="#"&gt;Back to top&lt;/a&gt;&lt;/p&gt;
    &lt;/footer&gt;
&lt;/div&gt;</pre><p dir="rtl">بقي علينا الآن إضافة الـfooter، ففي هذه الحالة سنحتاج إلى وضعه خارج منطقة المحتوى الرئيسي لنسمح له بالتمدد على كامل الصفحة. يمكننا استخدام الوسم<strong> &lt;footer&gt;</strong> لاحتواء عناصر ومحتويات تلك المنطقة.</p><h2 dir="rtl">ملف الـHTML كاملا</h2><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
  &lt;meta charset="utf-8" /&gt;
  &lt;title&gt;Typo&lt;/title&gt;
  &lt;link href="style.css" rel="stylesheet" /&gt;
  &lt;link href='<a rel="external nofollow" href="http://fonts.googleapis.com/css?family=Droid+Serif:400,400italic'">http://fonts.googleapis.com/css?family=Droid+Serif:400,400italic'</a> rel='stylesheet' type='text/css'&gt;
  &lt;script src="js/scripts.js"&gt;&lt;/script&gt;
&lt;/head&gt;

&lt;body&gt;
&lt;div id="container"&gt;
  &lt;header&gt;
    &lt;h1&gt;&lt;a href="#" title="Return to the homepage"&gt;Typo&lt;/a&gt;&lt;/h1&gt;
    &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;About&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="#"&gt;Archives&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="#"&gt;Contact&lt;/a&gt;&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/nav&gt;
  &lt;/header&gt;

  &lt;div id="content" role="main"&gt;
    &lt;article&gt;
      &lt;h2&gt;&lt;a href="#"&gt;Getting your stock photos seen&lt;/a&gt;&lt;/h2&gt;
      &lt;p&gt;Lorem ipsum dolor sit amet[...]leo placerat.&lt;/p&gt;
      &lt;ul class="postinfo"&gt;
        &lt;li&gt;17th October 2011&lt;/li&gt;
        &lt;li&gt;Posted in &lt;a href="#"&gt;Articles&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="#"&gt;Continue Reading &amp;raquo;&lt;/a&gt;&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/article&gt;
  
    &lt;article&gt;
      &lt;h2&gt;&lt;a href="#"&gt;Top 10 tips for new bloggers&lt;/a&gt;&lt;/h2&gt;
      &lt;p&gt;Lorem ipsum dolor sit amet[...]leo placerat.&lt;/p&gt;
      &lt;ul class="postinfo"&gt;
        &lt;li&gt;17th October 2011&lt;/li&gt;
        &lt;li&gt;Posted in &lt;a href="#"&gt;Articles&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="#"&gt;Continue Reading &amp;raquo;&lt;/a&gt;&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/article&gt;

    &lt;article&gt;
      &lt;h2&gt;&lt;a href="#"&gt;10 fantastic photography tips&lt;/a&gt;&lt;/h2&gt;
      &lt;p&gt;Lorem ipsum dolor sit amet[...]leo placerat.&lt;/p&gt;
      &lt;ul class="postinfo"&gt;
        &lt;li&gt;17th October 2011&lt;/li&gt;
        &lt;li&gt;Posted in &lt;a href="#"&gt;Articles&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="#"&gt;Continue Reading &amp;raquo;&lt;/a&gt;&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/article&gt;

    &lt;nav id="pagination"&gt;
      &lt;ul&gt;
        &lt;li class="older"&gt;&lt;a href="#"&gt;&amp;laquo; Older posts&lt;/a&gt;&lt;/li&gt;
        &lt;li class="newer"&gt;&lt;a href="#"&gt;Newer posts &amp;raquo;&lt;/a&gt;&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/nav&gt;
  &lt;/div&gt;

  &lt;aside id="sidebar"&gt;
    &lt;section id="about"&gt;
      &lt;h3&gt;About me&lt;/h3&gt;
      &lt;p&gt;Typo is a WordPress theme based entirely on a balanced typographic design. A strict grid layout keeps everything tidy, allowing the content to shine. &lt;a href="#" class="more"&gt;Find out more &amp;raquo;&lt;/a&gt;&lt;/p&gt;
    &lt;/section&gt;

    &lt;section id="categories"&gt;
      &lt;h3&gt;Categories&lt;/h3&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href="#"&gt;Articles&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href="#"&gt;Design&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href="#"&gt;Graphics&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href="#"&gt;Inspiration&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href="#"&gt;Retro&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
    &lt;/section&gt;

    &lt;section id="social"&gt;
      &lt;h3&gt;social&lt;/h3&gt;
      &lt;ul&gt;
        &lt;li&gt;&lt;a href="#"&gt;Twitter&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="#"&gt;Facebook&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="#"&gt;Flickr&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="#"&gt;Behance&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="#"&gt;Last.FM&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="#"&gt;Youtube&lt;/a&gt;&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/section&gt;

    &lt;section id="latest"&gt;
      &lt;h3&gt;Latest posts&lt;/h3&gt;
      &lt;ul&gt;
        &lt;li&gt;&lt;a href="#"&gt;Getting your stock photos seen&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="#"&gt;Top 10 tips for new bloggers&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="#"&gt;10 fantastic photography tips&lt;/a&gt;&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/section&gt;

    &lt;section id="search"&gt;
      &lt;h3&gt;Search&lt;/h3&gt;
      &lt;form method="get" action="#"&gt;
        &lt;fieldset&gt;
          &lt;input type="text" id="searchbar" placeholder="I'm looking for&amp;hellip;" /&gt;
          &lt;input type="submit" id="searchsubmit" value="Search" /&gt;
        &lt;/fieldset&gt;
      &lt;/form&gt;
    &lt;/section&gt;
  &lt;/aside&gt;
&lt;/div&gt;

&lt;div id="footer-container"&gt;
  &lt;footer&gt;
    &lt;ul id="credits"&gt;
      &lt;li class="wordpress"&gt;&lt;a href="<a rel="external nofollow" href="http://wordpress.org">http://wordpress.org</a>"&gt;Powered by WordPress&lt;/a&gt;&lt;/li&gt;
      &lt;li class="spoongraphics"&gt;&lt;a href="<a rel="external nofollow" href="http://www.blog.spoongraphics.co.uk">http://www.blog.spoongraphics.co.uk</a>"&gt;Theme by SpoonGraphics&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
    &lt;p id="back-top"&gt;&lt;a href="#"&gt;Back to top&lt;/a&gt;&lt;/p&gt;
  &lt;/footer&gt;
&lt;/div&gt;

&lt;/body&gt;
&lt;/html&gt;</pre><h2 dir="rtl">إضافة تنسيقات CSS</h2><p dir="rtl">بما أننا نملك الآن مستند HTML جاهز فيمكننا إضافة تنسيقات CSS للخروج بصفحة تشبه التي قمنا بتصميمها باستخدام الفوتوشوب.</p><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/Figure4.jpg.ecb54518d472f123633571aa2abe46f0.jpg"><img data-fileid="5068" class="ipsImage ipsImage_thumbnailed" alt="Figure4.thumb.jpg.5ccf26a34542ee66166575" src="https://academy.hsoub.com/uploads/monthly_2015_09/Figure4.thumb.jpg.5ccf26a34542ee66166575e9693cc9e7.jpg"></a></p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">body, div, h1, h2, h3, h4, h5, h6, p, ul, ol, li, dl, dt, dd, img, form, fieldset, input, textarea, blockquote {
    margin: 0; padding: 0; border: 0;
}

body {
    background: #dedede url(images/bg.jpg);
    font-family: 'Droid Serif', serif; font-size: 14px;
    line-height: 24px;
    color: #666;
}

a { color: #4b7ea9; font-style: italic; }

a:hover { color: #105896; }

header a, h2 a { color: #666; font-style: normal; text-decoration: none; }

#container {
    width: 916px; margin: 0 auto; padding: 48px 22px 0 22px;
    background: url(images/grid.jpg); overflow: hidden;
}</pre><p dir="rtl">يُستخدم السطر الأول من أجل إزالة أي تنسيقات افتراضية للمتصفحات (يسمى هذا "CSS reset")، وبعد ذلك يوجد داخل المحدد body الخصائص العامة للخطوط (ما يهمنا هنا هو الخاصية <strong>line-height</strong>، فقد أعطيناها القيمة 24px حتى تتوافق مع شبكة الخطوط القاعدية (baseline grid) التي استخدمناها في تصميم الواجهة في برنامج الفوتوشوب (وصورة خلفية. وبما أننا أضفنا الكود الخاص بخدمة Google Web Fonts في ملف الـHTML فيمكننا استخدام الخط Droid Serif في تنسيقات CSS كما يحلو لنا.</p><p dir="rtl">أضفنا أيضًا التنسيقات الخاصة بالروابط ولكن استثنينا الروابط الموجودة في الترويسة (header) وعناوين التدوينات (الموجودة داخل وسم <strong>&lt;h2&gt;</strong>) حتى يتوافق كل شيء مع التصميم. قمنا أيضًا بتوسيط الحاوي الرئيسي باستخدام <span style="font-family:courier new,courier,monospace;">margin: 0 auto</span> ووضعنا لهذا الحاوي صورة الشبكة (grid) على شكل خلفية حتى نستطيع موضعة عناصر الصفحة بكل سهولة بناءً على التصميم الموجود لدينا.</p><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/Figure5.jpg.e34679064d9bfdae38f539c7b9291f52.jpg"><img data-fileid="5069" class="ipsImage ipsImage_thumbnailed" alt="Figure5.thumb.jpg.d274bb7b828a31c364aad0" src="https://academy.hsoub.com/uploads/monthly_2015_09/Figure5.thumb.jpg.d274bb7b828a31c364aad0ab925e7356.jpg"></a></p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">header { margin: 0 0 98px 0; }

header h1 {
    float: left; font-size: 36px;
    font-weight: normal;
}

header nav {
    float: right; text-align: right;
    padding: 6px 0 0 0;
}

header nav ul { list-style: none; }

header nav li {
    float: left; font-size: 18px;
    width: 136px; margin: 0 0 0 20px;
}
 
header nav li:nth-child(1):before {
    content: "1. ";
    color: #a2a2a2;
}

header nav li:nth-child(2):before {
    content: "2. ";
    color: #a2a2a2;
}

header nav li:nth-child(3):before {
    content: "3. ";
    color: #a2a2a2;
}

header nav li:nth-child(4):before {
    content: "4. ";
    color: #a2a2a2;
}

header nav li:nth-child(5):before {
    content: "5. ";
    color: #a2a2a2;
}</pre><p dir="rtl">استعملنا margins وpaddings بقيم مناسبة لوضع العناصر استنادًا على خطوط الشبكة مع استخدام بعض القيم العشوائية مثل 98px حتى نضمن أن كل شيء موضوع في مكانه الصحيح. يمكنك استخدام Developer tools أو Firebug لمساعدتك في عمل التعديلات من دون أن يصيبك صداع في رأسك بسبب وجود بعض الحسابات المعقدة قليلًا.</p><p dir="rtl">هل تذكر عندما تكلمنا عن تلك الأرقام الموجودة بجانب عناصر القائمة الرئيسية؟ فقد قلنا بأننا سوف نستخدم CSS لإضافتها لأنها ليست مهمة كثيرًا ولأننا لا نريدها أن تظهر في ملف HTML، وللقيام بذلك سوف نستخدم المحددين <strong>:nth-child</strong> و <strong>:before</strong> مع الخاصية <strong>content</strong>  التي سنضع الأرقام بداخلها.</p><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/Figure6.jpg.735666d3fc6e282ce258871937b39882.jpg"><img data-fileid="5070" class="ipsImage ipsImage_thumbnailed" alt="Figure6.thumb.jpg.0fcde06b596b9c1bb7dfbf" src="https://academy.hsoub.com/uploads/monthly_2015_09/Figure6.thumb.jpg.0fcde06b596b9c1bb7dfbf7cc15f0897.jpg"></a></p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">#content {
    float: left; width: 526px;
    margin: 0 98px 0 0;
}

#content article { margin: 0 0 67px 0; }

#content article h2 {
    font-size: 30px; margin: 0 0 29px 0;
    font-weight: normal;
}

#content p { margin: 0 0 24px 0; }

#content .postinfo { list-style: none; overflow: hidden; }

#content .postinfo li {
    float: left; width: 136px; margin: 0 20px 0 0;
    font-style: italic; color: #a2a2a2;
}

#pagination { overflow: hidden; margin: 0 0 120px 0; }

#pagination ul { list-style: none; }

#pagination li { font-size: 18px; }

#pagination li.older { float: left; }

#pagination li.newer { float: right; }</pre><p dir="rtl">قمنا أيضًا بإضافة تنسيقات CSS الخاصة بالتدوينات ابتداءً بـdiv المحتوى. بالنسبة لعرض هذا الـdiv فقد قمنا بحسابه اعتمادً على عرض الأعمدة والمسافة بينها (columns and gutters) التي عندما نقوم بجمعها مع العرض الخاص بالقائمة الجانبية وأي margins فإنها تعطينا العرض الخاص بالـdiv الحاوي (container div). قمنا أيضًا بإضافة تنسيقات الخطوط الخاصة بعناصر h2 وmargin بقيمة مناسبة حتى يبقى كل شيء متوافقًا مع شبكة الخطوط القاعدية، واستعملنا الخاصية <span style="font-family:courier new,courier,monospace;">()background: url </span>لوضع صورة شعار ووردبريس في أسفل يسار الصفحة ولم ننسَ أيضًا العنصر <strong>back-top#</strong> إلى يسار الصفحة بحيث يأخذنا إلى أعلى الصفحة عند الضغط عليه.</p><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/Figure7.jpg.25ab16fc10b53df2fa987fefdc3d9b9a.jpg"><img data-fileid="5071" class="ipsImage ipsImage_thumbnailed" alt="Figure7.thumb.jpg.222ecb12a99c444e4bf1a5" src="https://academy.hsoub.com/uploads/monthly_2015_09/Figure7.thumb.jpg.222ecb12a99c444e4bf1a5898de1a5cb.jpg"></a></p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">#sidebar {
    width: 292px; float: left;
    padding: 4px 0 0 0;
}

#sidebar h3 {
    font-size: 18px; font-weight: normal;
    margin: 0 0 25px 0;
}

#sidebar ul { list-style: none; }

#sidebar section { margin: 0 0 47px 0; }

#sidebar #about a.more { display: block; text-align: right; }

#sidebar #categories {
    width: 136px; float: left;
    margin: 0 20px 0 0;
}

#sidebar #social { width: 136px; float: left; }</pre><p dir="rtl">قمنا بإزاحة القائمة الجانبية إلى جانب المحتوى الرئيسي (عن طريق الخاصية <span style="font-family:courier new,courier,monospace;">float:left</span>) وأضفنا التنسيقات الخاصة بالعناصر الموجودة داخلها ليصبح كل شيء كما هو موجود في تصميم الفوتوشوب. بعض عناصر القائمة الجانبية يمكن وضعها بجانب بعضها، لذلك قمنا بإضافة العرض المناسب لهذه العناصر حتى تتوافق مع التصميم.</p><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/Figure8.jpg.6819334d887fd4c7857a0ea31b0277e4.jpg"><img data-fileid="5073" class="ipsImage ipsImage_thumbnailed" alt="Figure8.thumb.jpg.87a8c7bc48f6f0a5a1860f" src="https://academy.hsoub.com/uploads/monthly_2015_09/Figure8.thumb.jpg.87a8c7bc48f6f0a5a1860fb824e30f1b.jpg"></a></p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">#sidebar #search #searchbar {
    width: 230px; height: 36px; float: left;
    border: 1px solid #c7c7c7; padding: 0 45px 0 15px; margin: -8px 0 0 0;
    background: #e2e2e2; /* Old browsers */
    background: -moz-linear-gradient(top, #e2e2e2 0%, #ffffff 16%);   
    /* FF3.6+ */
    background: -webkit-linear-gradient(top, #e2e2e2 0%,#ffffff 16%); 
    /* Chrome10+,Safari5.1+ */
    font-size: 14px; font-style: italic; color: #a2a2a2;
}

#sidebar #search #searchsubmit {
    width: 17px; height: 17px; float: right; margin: -27px 15px 0 0;
    background: url(images/search-icon.png); text-indent: -9999px;
}</pre><p dir="rtl">مربع البحث هو العنصر الوحيد في الموقع الذي يحتوي على تأثيرات بصرية، فيمكننا إضافة تأثيرات التدرج باستخدام خاصية gradient الموجودة في لغة CSS، وبالنبسة للأيقونة فيمكننا إضافتها باستخدام الخاصية <span style="font-family:courier new,courier,monospace;">()background: url</span>.</p><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/Figure9.jpg.9e9d585b7bfcd0e7d927ac0b1ca749ad.jpg"><img data-fileid="5074" class="ipsImage ipsImage_thumbnailed" alt="Figure9.thumb.jpg.f9b39bc8e79f52b6e7d4d3" src="https://academy.hsoub.com/uploads/monthly_2015_09/Figure9.thumb.jpg.f9b39bc8e79f52b6e7d4d348a1040350.jpg"></a></p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">#footer-container {
    background: rgba(0,0,0,0.2);
    overflow: hidden;
}

footer { width: 916px; margin: 0 auto; padding: 10px 22px 50px 22px; }

footer #credits { list-style: none; float: left; }

footer #credits li { float: left; margin: 0 6px 0 0; }

footer #credits li.wordpress a {
    display: block; width: 20px; height: 20px;
    background: url(images/credits.png) no-repeat 0 0; text-indent: -9999px;
}

footer #credits li.spoongraphics a {
    display: block; width: 25px; height: 20px;
    background: url(images/credits.png) no-repeat -30px 0; text-indent: -9999px;
}

footer #back-top { float: right; font-size: 12px; }</pre><p dir="rtl">كا ما تبقى علينا الآن هو إضافة التنسيقات الخاصة بالـfooter. يمكننا محاكاة خلفية الـfooter عن طريق استخدام الخاصية background وإعطاؤها لونًا أسودًا بشفافية 20% <span style="font-family:courier new,courier,monospace;">(background: rgba(0,0,0,0.2</span>. وبما أنَ الحاوي الخاص بالـfooter سيتمدد على كامل الصفحة فإننا سنضطر إلى إعطاء الـfooter قيم width وmargin مختلفة.</p><h2 dir="rtl">تنسيقات CSS كاملة</h2><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">body, div, h1, h2, h3, h4, h5, h6, p, ul, ol, li, dl, dt, dd, img, form, fieldset, input, textarea, blockquote {
    margin: 0; padding: 0; border: 0;
}

body {
    background: #dedede url(images/bg.jpg);
    font-family: 'Droid Serif', serif; font-size: 14px;
    line-height: 24px;
    color: #666;
}

a { color: #4b7ea9; font-style: italic; }

a:hover { color: #105896; }

header a, h2 a { color: #666; font-style: normal; text-decoration: none; }

#container {
    width: 916px; 
    margin: 0 auto; 
    padding: 48px 22px 0 22px;
    background: url(images/grid.jpg); overflow: hidden;
}

header { margin: 0 0 98px 0; }

header h1 {
    float: left; 
    font-size: 36px;
    font-weight: normal;
}

header nav {
    float: right; 
    text-align: right;
    padding: 6px 0 0 0;
}

header nav ul { list-style: none; }

header nav li {
    float: left; 
    font-size: 18px;
    width: 136px; 
    margin: 0 0 0 20px;
}

header nav li:nth-child(1):before {
    content: "1. ";
    color: #a2a2a2;
}

header nav li:nth-child(2):before {
    content: "2. ";
    color: #a2a2a2;
}

header nav li:nth-child(3):before {
    content: "3. ";
    color: #a2a2a2;
}

header nav li:nth-child(4):before {
    content: "4. ";
    color: #a2a2a2;
}

header nav li:nth-child(5):before {
    content: "5. ";
    color: #a2a2a2;
}

#content {
    float: left; 
    width: 526px;
    margin: 0 98px 0 0;
}

#content article { margin: 0 0 67px 0; }

#content article h2 {
    font-size: 30px; 
     margin: 0 0 29px 0;
    font-weight: normal;
}
 
#content p { margin: 0 0 24px 0; }

#content .postinfo { list-style: none; overflow: hidden; }

#content .postinfo li {
    float: left; width: 136px; margin: 0 20px 0 0;
    font-style: italic; color: #a2a2a2;
}

#pagination { overflow: hidden; margin: 0 0 120px 0; }

#pagination ul { list-style: none; }

#pagination li { font-size: 18px; }

#pagination li.older { float: left; }

#pagination li.newer { float: right; }

#sidebar {
    width: 292px; float: left;
    padding: 4px 0 0 0;
}

#sidebar h3 {
    font-size: 18px; font-weight: normal;
    margin: 0 0 25px 0;
}

#sidebar ul { list-style: none; }

#sidebar section { margin: 0 0 47px 0; }

#sidebar #about a.more { display: block; text-align: right; }

#sidebar #categories { 
    width: 136px; float: left;
    margin: 0 20px 0 0;
}

#sidebar #social { width: 136px; float: left; }

#sidebar #search #searchbar {
    width: 230px; height: 36px; float: left;
    border: 1px solid #c7c7c7; padding: 0 45px 0 15px; margin: -8px 0 0 0;
    background: #e2e2e2; /* Old browsers */
    background: -moz-linear-gradient(top, #e2e2e2 0%, #ffffff 16%); /* FF3.6+ */
    background: -webkit-linear-gradient(top, #e2e2e2 0%,#ffffff 16%); /* Chrome10+,Safari5.1+ */
    font-size: 14px; font-style: italic; color: #a2a2a2;
}

#sidebar #search #searchsubmit {
    width: 17px; 
    height: 17px; 
    float: right; 
    margin: -27px 15px 0 0;
    background: url(images/search-icon.png); text-indent: -9999px;
}

#footer-container {
    background: rgba(0,0,0,0.2);
    overflow: hidden;
}

footer { width: 916px; margin: 0 auto; padding: 10px 22px 50px 22px; }

footer #credits { list-style: none; float: left; }

footer #credits li { float: left; margin: 0 6px 0 0; }

footer #credits li.wordpress a {
    display: block; width: 20px; height: 20px;
    background: url(images/credits.png) no-repeat 0 0; text-indent: -9999px;
}

footer #credits li.spoongraphics a {
    display: block; width: 25px; height: 20px;
    background: url(images/credits.png) no-repeat -30px 0; text-indent: -9999px;
}

footer #back-top { float: right; font-size: 12px;}</pre><h2 dir="rtl">نموذج HTML5 النهائي</h2><p dir="rtl">أصبح نموذجنا جاهزًا الآن للاختبار قبل أن نقوم بتحويله إلى قالب ووردبريس. كل شيء يبدو جيدًا في المتصفحات الحديثة (إضافة إلى متصفح IE9). إذا أردت أن تدعم الإصدارات الأقدم من متصفح Internet Explorer فسوف تحتاج إلى المزيد من المجهود.</p><p dir="rtl"><a rel="external nofollow" href="http://line25.com/wp-content/uploads/2011/typo-code/demo/index.html">تصفح النتيجة النهائية من هنا</a><a rel="external nofollow" href="http://line25.com/wp-content/uploads/2011/typo-code/demo/index.html">.</a></p><p dir="rtl">ترجمة -وبتصرّف- للمقال <a rel="external nofollow" href="http://line25.com/tutorials/create-a-typography-based-blog-layout-in-html5">Create a Typography Based Blog Layout in HTML5</a> لصاحبه Iggy.</p>
]]></description><guid isPermaLink="false">173</guid><pubDate>Wed, 23 Sep 2015 15:28:00 +0000</pubDate></item><item><title>&#x62A;&#x62D;&#x648;&#x64A;&#x644; &#x648;&#x627;&#x62C;&#x647;&#x629; &#x645;&#x648;&#x642;&#x639; &#x645;&#x646; &#x645;&#x62C;&#x631;&#x62F; &#x62A;&#x635;&#x645;&#x64A;&#x645; &#x639;&#x644;&#x649; &#x641;&#x648;&#x62A;&#x648;&#x634;&#x648;&#x628; &#x625;&#x644;&#x649; HTML &#x648; CSS</title><link>https://academy.hsoub.com/programming/html/%D8%AA%D8%AD%D9%88%D9%8A%D9%84-%D9%88%D8%A7%D8%AC%D9%87%D8%A9-%D9%85%D9%88%D9%82%D8%B9-%D9%85%D9%86-%D9%85%D8%AC%D8%B1%D8%AF-%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D8%B9%D9%84%D9%89-%D9%81%D9%88%D8%AA%D9%88%D8%B4%D9%88%D8%A8-%D8%A5%D9%84%D9%89-html-%D9%88-css-r161/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_09/forest-coding.png.e8fd39afc2bb25a0d58ff8c4f185bcec.png" /></p>

<p>
	<a href="https://academy.hsoub.com/design/graphic-design/photoshop/%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D9%88%D8%A7%D8%AC%D9%87%D8%A9-%D9%85%D9%88%D9%82%D8%B9-%D9%84%D8%BA%D8%A7%D8%A8%D8%A9-%D8%A7%D9%81%D8%AA%D8%B1%D8%A7%D8%B6%D9%8A%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%81%D9%88%D8%AA%D9%88%D8%B4%D9%88%D8%A8-r106/" rel="">في الدرس السابق</a> قمنا باستخدام برنامج فوتوشوب لتصميم واجهة موقع لغابة افتراضية باسم "Pinewood Forest". أمّا في هذا الدرس فسوف نقوم بتكويد ذلك التصميم باستخدام لغتي HTML وCSS وتحويله إلى صفحة ويب كاملة. كما سنقوم أيضًا باستخراج الصور الموجودة في التصميم لاستعمالها في الموقع.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/Figure1-pinewood-forest-concept.jpg.325e1263edf227e9dcf2e97a8ea6ad96.jpg" data-fileid="4482" rel=""><img alt="Figure1-pinewood-forest-concept.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="4482" src="https://academy.hsoub.com/uploads/monthly_2015_09/Figure1-pinewood-forest-concept.thumb.jpg.9a30e1be2d50df997639d5451e469e78.jpg"></a>
</p>

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

<h2>
	استخراج الصور الموجودة في التصميم
</h2>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/Figure2-export-01.jpg.815f315221950eaa52493f2f4adce289.jpg" data-fileid="4483" rel=""><img alt="Figure2-export-01.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="4483" src="https://academy.hsoub.com/uploads/monthly_2015_09/Figure2-export-01.thumb.jpg.79686ed6ded079ed256da472863ebf7b.jpg"></a>
</p>

<p>
	كما قلنا سابقًا، سيحتوي الموقع على خلفية ثابتة وسوف يظهر المحتوى فوق هذه الصورة، وبالتالي فإن العناصر مثل الشّعار سنحتاج إلى استخراجها بصيغة PNG-24 لأن هذه الصيغة تدعم الشفافية (transparency).
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/Figure3-export-02.jpg.77bfc2a34fa0e9c5d0cea4b3b81d926a.jpg" data-fileid="4484" rel=""><img alt="Figure3-export-02.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="4484" src="https://academy.hsoub.com/uploads/monthly_2015_09/Figure3-export-02.thumb.jpg.7a456cf592536f93931cbeea3e2c9db6.jpg"></a>
</p>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/Figure4-export-03.jpg.de3bfb6a7f0f80657097b03a2bb11809.jpg" data-fileid="4485" rel=""><img alt="Figure4-export-03.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="4485" src="https://academy.hsoub.com/uploads/monthly_2015_09/Figure4-export-03.thumb.jpg.084008999a97fbabbb49bbf23031afc5.jpg"></a>
</p>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/Figure5-export-04.jpg.1825c7b91c2bed5260342f843146dae0.jpg" data-fileid="4486" rel=""><img alt="Figure5-export-04.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="4486" src="https://academy.hsoub.com/uploads/monthly_2015_09/Figure5-export-04.thumb.jpg.4cb4750ea939d7fd0f74ce9749c40489.jpg"></a>
</p>

<h2>
	بنية ملف HTML
</h2>

<pre class="html ipsCode prettyprint prettyprinted" data-pbcklang="html" data-pbcktabsize="4">
<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">Visit Pinewood Forest</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">href</span><span class="pun">=</span><span class="atv">"styles.css"</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="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;div</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"container"</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="tag">&lt;/div&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>

<p>
	سيحتوي الملف الرئيسي (index file) على أكواد HTML. يُستخدم <span style="font-family:courier new,courier,monospace;">&lt;doctype html!&gt;</span> لتعريف المتصفح بإصدار HTML المُستخدم ويعتبر أيضًا من الممارسات الجيدة في عالم تصميم الويب، لذلك احرص على أن يكون موجودًا في كل موقع تقوم بتصميمه. يتبع ذلك وسم <span style="font-family:courier new,courier,monospace;">&lt;head&gt;</span> ويحتوي هذا الوسم على عنوان الصفحة وعلى رابط لملف CSS. وأخيرًا يوجد وسم <span style="font-family:courier new,courier,monospace;">&lt;div&gt;</span> وسيحتوي هذا الوسم على بقية عناصر/وسوم الصفحة.
</p>

<pre class="html ipsCode prettyprint prettyprinted" data-pbcklang="html" data-pbcktabsize="4">
<span class="tag">&lt;body&gt;</span><span class="pln">
  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"container"</span><span class="tag">&gt;</span><span class="pln"> 
     </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"header"</span><span class="tag">&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">"logo"</span><span class="tag">&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">"#"</span><span class="pln"> </span><span class="atn">title</span><span class="pun">=</span><span class="atv">"Return to the homepage"</span><span class="tag">&gt;</span><span class="pln">
          </span><span class="tag">&lt;img</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"images/pinewood-forest-logo.png"</span><span class="pln"> </span><span class="atn">alt</span><span class="pun">=</span><span class="atv">"Pinewood Forest logo"</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
        </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;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">"#"</span><span class="tag">&gt;</span><span class="pln">Visit</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">"#"</span><span class="tag">&gt;</span><span class="pln">Discover</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">"#"</span><span class="tag">&gt;</span><span class="pln">Trails</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">"#"</span><span class="tag">&gt;</span><span class="pln">Maps</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;/div&gt;</span><span class="pln">
  </span><span class="tag">&lt;/div&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>

<p>
	يبدأ التصميم بوسم <span style="font-family:courier new,courier,monospace;">div</span> مع إعطائه id بقيمة "<span style="font-family:courier new,courier,monospace;">header</span>" وسيحتوي هذا الوسم على الشّعار وعلى عناصر القائمة الرئيسية (navigation items)، وسيكون الشعار عبارة عن صورة داخل وسم <code>&lt;img&gt;</code> موضوعة في وسم <code>&lt;a&gt;</code>. تُستخدم <code>title</code> الموجودة في وسم <code>&lt;a&gt;</code> لتعريف المستخدم بالوجهة التي سيصل إليها حال نقره على الرابط، أمّا <code>alt</code> في وسم <code>&lt;img&gt;</code> فإنها تُستخدم لإعطاء المستخدم وصفًا عن الصورة في حالة عدم ظهور الصورة.
</p>

<p>
	يُعتبر وسم <code>&lt;ul&gt;</code> هو الوسم الشائع عند عمل القوائم الرئيسية لأنّه يُصوّر لنا وبدقة تلك القائمة على هيئة HTML حتى لو لم يكن هناك تنسيقات CSS. وبالرجوع إلى التصميم يمكنك ملاحظة أن الشعار موجود في الوسط بين قوائم العناصر الرئيسية، ولكننا سنبقي كلا العنصرين (الشعار والقائمة الرئيسية) مفصولين عن بعضهما حتى نحصل على هئية وملف HTML نظيف ومُرتّب، وسنلجأ لاحقًا إلى استخدام CSS لتحريك تلك العناصر حتى نحصل على نتيجة مرضية ومطابقة للتصميم.
</p>

<pre class="html ipsCode prettyprint prettyprinted" data-pbcklang="html" data-pbcktabsize="4">
<span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"content"</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"feature"</span><span class="tag">&gt;</span><span class="pln">
      </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"feature-content"</span><span class="tag">&gt;</span><span class="pln">
        </span><span class="tag">&lt;h1&gt;</span><span class="pln">Explore the forest</span><span class="tag">&lt;/h1&gt;</span><span class="pln">
        </span><span class="tag">&lt;p&gt;</span><span class="pln">Find everything you need to explore and discover the mysteries of the forest, from maps and trail guides to must see attractions</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">class</span><span class="pun">=</span><span class="atv">"btn"</span><span class="tag">&gt;&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"#"</span><span class="tag">&gt;</span><span class="pln">Begin your journey</span><span class="tag">&lt;/a&gt;&lt;/p&gt;</span><span class="pln">
      </span><span class="tag">&lt;/div&gt;</span><span class="pln">
    </span><span class="tag">&lt;/div&gt;</span><span class="pln">
  </span><span class="tag">&lt;/div&gt;</span></pre>

<div id="content">
	<div id="feature">
		<p>
			بعد الترويسة (header) تأتي منطقة المحتوى الرئيسي (main content)، ولجعل هيكل ملف HTML نظيفًا فسوف يتم وضع جميع العناصر في وسم <span style="font-family:courier new,courier,monospace;"><code>&lt;div&gt;</code></span> واحد، كما وستظهر منطقة الـfeature في بداية الصفحة وداخل وسم <span style="font-family:courier new,courier,monospace;"><code>&lt;div&gt;</code></span> ليتم تموضعها بشكل دقيق ومناسب. أمّا بالنسبة للعنوان الرئيسي في الصفحة (الذي يحتوي على النص "Explore the forest") فسوف يتم وضعه داخل وسم <span style="font-family:courier new,courier,monospace;"><code>&lt;h1&gt;</code></span>. لاحظ أيضًا أنه تم إضافة "<code>class="btn </code>إلى العنصر <span style="font-family:courier new,courier,monospace;"><code>&lt;p&gt;</code></span> ليمكننا تحويل هذا العنصر إلى زر باستخدام CSS.
		</p>
	</div>

	<p>
		المستوى الثاني من العناوين سيكون موجودًا داخل وسم <code>&lt;h2&gt;</code>، وسيكون المحتوى الرئيسي منقسمًا إلى عمودين، بحيث يكون العمود الأكبر عبارة عن <span style="font-family:courier new,courier,monospace;">div</span> مع id بقيمة "<span style="font-family:courier new,courier,monospace;">main</span>" وبداخل هذا العمود توجد النصوص (عناصر <code>&lt;p&gt;</code>). لا تنسى تحويل الروابط إلى عناصر <code>&lt;a&gt;</code> وأي رموز خاصة (characters) إلى ما يقابلها من HTML entities (مثل رمز "<span style="font-family:arial,helvetica,sans-serif;">&amp;</span>" يتم تحويله إلى "&amp;").<br>
		وفي الأسفل من نفس العمود يوجد قسم "upcoming events"، ويمكننا استخدام عناصر <code>&lt;dl&gt;</code> ،<code>&lt;dt&gt;</code> و<code>&lt;dd&gt;</code> (اختصار للكلمات "Definition List"، "Definition Term" و"Definition Description" على التوالي) بحيث تحتوي عناصر <code>dt</code> على تاريخ الحدث وعناصر <code>&lt;dd&gt;</code> على وصف بسيط للحدث. لاحظ أننا استعملنا وسوم <code>&lt;span&gt;</code> داخل عناصر <code>&lt;dt&gt;</code> وذلك لإعطائها تنسيقات مميزة باستخدام CSS.
	</p>

	<pre class="html ipsCode prettyprint prettyprinted" data-pbcklang="html" data-pbcktabsize="4">
<span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"side"</span><span class="tag">&gt;</span><span class="pln">
      </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"aside"</span><span class="tag">&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">"#"</span><span class="tag">&gt;&lt;img</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"images/tracks-and-trails.jpg"</span><span class="pln"> </span><span class="atn">alt</span><span class="pun">=</span><span class="atv">"Tracks and Trails"</span><span class="pln"> </span><span class="tag">/&gt;&lt;/a&gt;</span><span class="pln">
        </span><span class="tag">&lt;p&gt;</span><span class="pln">Pinewood Forest has a vast selection of walking and hiking trails to suit every visitor</span><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"#"</span><span class="tag">&gt;</span><span class="pln">Find out more</span><span class="tag">&lt;/a&gt;&lt;/p&gt;</span><span class="pln">
      </span><span class="tag">&lt;/div&gt;</span><span class="pln">

      </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"aside"</span><span class="tag">&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">"#"</span><span class="tag">&gt;&lt;img</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"images/mountain-biking.jpg"</span><span class="pln"> </span><span class="atn">alt</span><span class="pun">=</span><span class="atv">"Mountain Biking"</span><span class="pln"> </span><span class="tag">/&gt;&lt;/a&gt;</span><span class="pln">
        </span><span class="tag">&lt;p&gt;</span><span class="pln">Pinewood Forest is home to some of the most demanding XC and Freeride Mountain Biking routes</span><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"#"</span><span class="tag">&gt;</span><span class="pln">Find out more</span><span class="tag">&lt;/a&gt;&lt;/p&gt;</span><span class="pln">
      </span><span class="tag">&lt;/div&gt;</span><span class="pln">

      </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"aside"</span><span class="tag">&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">"#"</span><span class="tag">&gt;&lt;img</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"images/christmas-events.jpg"</span><span class="pln"> </span><span class="atn">alt</span><span class="pun">=</span><span class="atv">"Christmas Events"</span><span class="pln"> </span><span class="tag">/&gt;&lt;/a&gt;</span><span class="pln">
        </span><span class="tag">&lt;p&gt;</span><span class="pln">Pinewood Forest has a vast selection of walking and hiking trails to suit every visitor</span><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"#"</span><span class="tag">&gt;</span><span class="pln">Find out more</span><span class="tag">&lt;/a&gt;&lt;/p&gt;</span><span class="pln">
      </span><span class="tag">&lt;/div&gt;</span><span class="pln">
    </span><span class="tag">&lt;/div&gt;</span><span class="pln">      
  </span><span class="tag">&lt;/div&gt;</span><span class="pln">
  
  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"footer"</span><span class="tag">&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">"back-to-top"</span><span class="tag">&gt;&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"#"</span><span class="tag">&gt;</span><span class="pln">Back to top</span><span class="tag">&lt;/a&gt;&lt;/p&gt;</span><span class="pln">
  </span><span class="tag">&lt;/div&gt;</span><span class="pln">
</span><span class="tag">&lt;/div&gt;</span></pre>

	<p>
		بالنسبة للعمود الأصغر فسوف يكون موجودًا داخل عنصر <span style="font-family:courier new,courier,monospace;">div</span> آخر مع id بقيمة "<span style="font-family:courier new,courier,monospace;">side</span>". تتكون القائمة الجانبية (sidebar) من ثلاثة أقسام رئيسية وكل قسم يحتوي عنوان على شكل صورة وعلى وصف بسيط لكل قسم، ولأن كل صورة تحتوي على نص بداخلها فقد قمنا باستخدام <span style="font-family:courier new,courier,monospace;">alt</span> لكل صورة حتى نحافظ على ما يسمى بالـaccessibility.
	</p>
</div>

<p>
	وفي نهائية الصفحة قمنا بإغلاق وسم <code>&lt;div&gt;</code> الخاص بالمحتوى وتحتها يوجد <span style="font-family:courier new,courier,monospace;">div</span> خاص بالـ<span style="font-family:courier new,courier,monospace;">footer</span> وبادخله نص "Back to top" ليأخذنا إلى أعلى الصفحة عند الضغط عليه.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/Figure10-06.png.923a4126d6353b960f65c263d5737a12.png" data-fileid="4491" rel=""><img alt="Figure10-06.png" class="ipsImage ipsImage_thumbnailed" data-fileid="4491" src="https://academy.hsoub.com/uploads/monthly_2015_09/Figure10-06.thumb.png.0b7eecb7ecb9fbb5cb94044836246c2f.png"></a>
</p>

<p>
	انتهينا إلى الآن من هيكلة ملف HTML ويمكنك إلقاء نظرة إلى الصورة في الأعلى لترى كيف يجب أن يظهر بدون CSS. لاحظ أنه يمكن قراءة الملف حتى بدون تنسيق الملف باستخدام CSS.
</p>

<h2>
	تنسيق الصفحة باستخدام CSS
</h2>

<pre class="css ipsCode prettyprint prettyprinted" data-pbcklang="css" data-pbcktabsize="4">
<span class="pln">body</span><span class="pun">,</span><span class="pln"> div</span><span class="pun">,</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"> h4</span><span class="pun">,</span><span class="pln"> h5</span><span class="pun">,</span><span class="pln"> h6</span><span class="pun">,</span><span class="pln"> p</span><span class="pun">,</span><span class="pln"> ul</span><span class="pun">,</span><span class="pln"> ol</span><span class="pun">,</span><span class="pln"> li</span><span class="pun">,</span><span class="pln"> dl</span><span class="pun">,</span><span class="pln"> dt</span><span class="pun">,</span><span class="pln"> dd</span><span class="pun">,</span><span class="pln"> img</span><span class="pun">,</span><span class="pln"> form</span><span class="pun">,</span><span class="pln"> fieldset</span><span class="pun">,</span><span class="pln"> input</span><span class="pun">,</span><span class="pln"> textarea</span><span class="pun">,</span><span class="pln"> blockquote </span><span class="pun">{</span><span class="pln">
  margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
  padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
  border</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

body </span><span class="pun">{</span><span class="pln">
  font</span><span class="pun">:</span><span class="pln"> </span><span class="lit">14px</span><span class="pun">/</span><span class="lit">26px</span><span class="pln"> </span><span class="typ">Georgia</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Serif</span><span class="pun">;</span><span class="pln">
  color</span><span class="pun">:</span><span class="pln"> </span><span class="com">#444a54;</span><span class="pln">
  background</span><span class="pun">:</span><span class="pln"> </span><span class="com">#2d3237 url(images/bg-photo.jpg) center top no-repeat fixed;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">#container {</span><span class="pln">
  width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">960px</span><span class="pun">;</span><span class="pln">
  margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">50px</span><span class="pln"> </span><span class="kwd">auto</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	لنبدأ الآن بتنسيق الموقع باستخدام CSS. يُستخدم السطر الأول من أجل إزالة أي تنسيقات افتراضية للمتصفحات (يسمى هذا "CSS reset")، وبعد ذلك يوجد داخل المحدد <span style="font-family:courier new,courier,monospace;">body</span> الخصائص العامة للخطوط في الموقع وصورة خلفية، ولأننا نريد هذه الصورة أن تكون ثابتة لا تتحرك مع باقي الصفحة عند التمرير(scrolling) فقد قمنا بإعطائها القيم "fixed" ،"top" و"center".
</p>

<p>
	وقد قمنا بإضافة لون أزرق (2d3237) حتى تظهر الخلفية بشكل أفضل لمن لا يمكنه رؤية الصورة لسبب أو لآخر وكذلك لمن يمتلك شاشات بدقة وأبعاد ضخمة.
</p>

<p>
	أمّا بالنسبة للحاوي الرئيسي (main container) فقد تم إعطاؤه عرض ثابت بقيمة 960px وتم توسيطه باستخدام الطريقة الشائعة <span style="font-family:courier new,courier,monospace;"><code>margin: 0 auto</code></span>.  
</p>

<pre class="css ipsCode prettyprint prettyprinted" data-pbcklang="css" data-pbcktabsize="4">
<span class="pln">header </span><span class="pun">{</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">background</span><span class="pun">:</span><span class="pln"> url</span><span class="pun">(</span><span class="pln">images</span><span class="pun">/</span><span class="pln">content</span><span class="pun">-</span><span class="pln">top</span><span class="pun">.</span><span class="pln">jpg</span><span class="pun">)</span><span class="pln"> center bottom </span><span class="kwd">no</span><span class="pun">-</span><span class="pln">repeat</span><span class="pun">;</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">overflow</span><span class="pun">:</span><span class="pln"> hidden</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

header p</span><span class="com">#logo {</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">position</span><span class="pun">:</span><span class="pln"> relative</span><span class="pun">;</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">295px</span><span class="pun">;</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="kwd">auto</span><span class="pln"> </span><span class="pun">-</span><span class="lit">74px</span><span class="pln"> </span><span class="kwd">auto</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

header ul </span><span class="pun">{</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">916px</span><span class="pun">;</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="kwd">auto</span><span class="pln"> </span><span class="lit">110px</span><span class="pln"> </span><span class="kwd">auto</span><span class="pun">;</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">overflow</span><span class="pun">:</span><span class="pln"> hidden</span><span class="pun">;</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">list</span><span class="pun">-</span><span class="pln">style</span><span class="pun">:</span><span class="pln"> none</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

header li </span><span class="pun">{</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="kwd">float</span><span class="pun">:</span><span class="pln"> left</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

header li</span><span class="pun">:</span><span class="pln">nth</span><span class="pun">-</span><span class="pln">child</span><span class="pun">(</span><span class="lit">1</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">70px</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

header li</span><span class="pun">:</span><span class="pln">nth</span><span class="pun">-</span><span class="pln">child</span><span class="pun">(</span><span class="lit">2</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">325px</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

header li</span><span class="pun">:</span><span class="pln">nth</span><span class="pun">-</span><span class="pln">child</span><span class="pun">(</span><span class="lit">3</span><span class="pun">),</span><span class="pln">
header li</span><span class="pun">:</span><span class="pln">nth</span><span class="pun">-</span><span class="pln">child</span><span class="pun">(</span><span class="lit">4</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">70px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

header li a </span><span class="pun">{</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></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">16px</span><span class="pun">;</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">letter</span><span class="pun">-</span><span class="pln">spacing</span><span class="pun">:</span><span class="pln"> </span><span class="lit">9px</span><span class="pun">;</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">color</span><span class="pun">:</span><span class="pln"> </span><span class="com">#4e5761;</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></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">

header li a</span><span class="pun">:</span><span class="pln">hover </span><span class="pun">{</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">color</span><span class="pun">:</span><span class="pln"> </span><span class="com">#7c8896;</span><span class="pln">
</span><span class="pun">}</span></pre>

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

<pre class="css ipsCode prettyprint prettyprinted" data-pbcklang="css" data-pbcktabsize="4">
<span class="pln">content </span><span class="pun">{</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">52px</span><span class="pun">;</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">overflow</span><span class="pun">:</span><span class="pln"> hidden</span><span class="pun">;</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">background</span><span class="pun">:</span><span class="pln"> url</span><span class="pun">(</span><span class="pln">images</span><span class="pun">/</span><span class="pln">content</span><span class="pun">-</span><span class="pln">repeat</span><span class="pun">.</span><span class="pln">png</span><span class="pun">)</span><span class="pln"> center top repeat</span><span class="pun">-</span><span class="pln">y</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

content </span><span class="com">#feature {</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">916px</span><span class="pun">;</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">height</span><span class="pun">:</span><span class="pln"> </span><span class="lit">420px</span><span class="pun">;</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">position</span><span class="pun">:</span><span class="pln"> relative</span><span class="pun">;</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">30px</span><span class="pln"> </span><span class="pun">-</span><span class="lit">30px</span><span class="pun">;</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">background</span><span class="pun">:</span><span class="pln"> url</span><span class="pun">(</span><span class="pln">images</span><span class="pun">/</span><span class="pln">feature</span><span class="pun">-</span><span class="pln">bg</span><span class="pun">.</span><span class="pln">jpg</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

content </span><span class="com">#feature #feature-content {</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">position</span><span class="pun">:</span><span class="pln"> relative</span><span class="pun">;</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">384px</span><span class="pun">;</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">top</span><span class="pun">:</span><span class="pln"> </span><span class="lit">92px</span><span class="pun">;</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">left</span><span class="pun">:</span><span class="pln"> </span><span class="lit">460px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

content </span><span class="com">#feature #feature-content h1 {</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">widht</span><span class="pun">:</span><span class="pln"> </span><span class="lit">384px</span><span class="pun">;</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">height</span><span class="pun">:</span><span class="pln"> </span><span class="lit">91px</span><span class="pun">;</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">5px</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">background</span><span class="pun">:</span><span class="pln"> url</span><span class="pun">(</span><span class="pln">images</span><span class="pun">/</span><span class="pln">explore</span><span class="pun">-</span><span class="pln">the</span><span class="pun">-</span><span class="pln">forest</span><span class="pun">.</span><span class="pln">png</span><span class="pun">);</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">text</span><span class="pun">-</span><span class="pln">indent</span><span class="pun">:</span><span class="pln"> </span><span class="pun">-</span><span class="lit">9999px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

content </span><span class="com">#feature #feature-content p {</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">color</span><span class="pun">:</span><span class="pln"> </span><span class="com">#fff;</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">15px</span><span class="pln"> </span><span class="lit">8px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

content </span><span class="com">#feature #feature-content p.btn a {</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">display</span><span class="pun">:</span><span class="pln"> block</span><span class="pun">;</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">widows</span><span class="pun">:</span><span class="pln"> </span><span class="lit">163px</span><span class="pun">;</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">height</span><span class="pun">:</span><span class="pln"> </span><span class="lit">39px</span><span class="pun">;</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">background</span><span class="pun">:</span><span class="pln"> url</span><span class="pun">(</span><span class="pln">images</span><span class="pun">/</span><span class="kwd">begin</span><span class="pun">-</span><span class="pln">your</span><span class="pun">-</span><span class="pln">journey</span><span class="pun">.</span><span class="pln">png</span><span class="pun">);</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">text</span><span class="pun">-</span><span class="pln">indent</span><span class="pun">:</span><span class="pln"> </span><span class="pun">-</span><span class="lit">9999px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

content </span><span class="com">#feature #feature-content p.btn a:hover {</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">margin</span><span class="pun">:</span><span class="pln"> </span><span class="pun">-</span><span class="lit">1px</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

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

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

<pre class="css ipsCode prettyprint prettyprinted" data-pbcklang="css" data-pbcktabsize="4">
<span class="pln">content </span><span class="com">#main {</span><span class="pln">
    width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">536px</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">float</span><span class="pun">:</span><span class="pln"> left</span><span class="pun">;</span><span class="pln">
    margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">20px</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

content h2 </span><span class="pun">{</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></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">20px</span><span class="pun">;</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">font</span><span class="pun">-</span><span class="pln">weight</span><span class="pun">:</span><span class="pln"> normal</span><span class="pun">;</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">20px</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

content p </span><span class="pun">{</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">20px</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

content a </span><span class="pun">{</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">color</span><span class="pun">:</span><span class="pln"> </span><span class="com">#3f6489;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

content a</span><span class="pun">:</span><span class="pln">hover </span><span class="pun">{</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">color</span><span class="pun">:</span><span class="pln"> </span><span class="com">#0d3965;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

content dl </span><span class="pun">{</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

content dt </span><span class="pun">{</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="kwd">float</span><span class="pun">:</span><span class="pln"> left</span><span class="pun">;</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">40px</span><span class="pun">;</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">height</span><span class="pun">:</span><span class="pln"> </span><span class="lit">50px</span><span class="pun">;</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">15px</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">background</span><span class="pun">:</span><span class="pln"> </span><span class="com">#a1a3a5 url(images/date-bg.png);</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></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">30px</span><span class="pun">;</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">color</span><span class="pun">:</span><span class="pln"> </span><span class="com">#fff;</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">text</span><span class="pun">-</span><span class="pln">align</span><span class="pun">:</span><span class="pln"> center</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

content dt span </span><span class="pun">{</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">display</span><span class="pun">:</span><span class="pln"> block</span><span class="pun">;</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></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">12px</span><span class="pun">;</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">font</span><span class="pun">-</span><span class="pln">weight</span><span class="pun">:</span><span class="pln"> bold</span><span class="pun">;</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">text</span><span class="pun">-</span><span class="pln">transform</span><span class="pun">:</span><span class="pln"> uppercase</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

content dd </span><span class="pun">{</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="kwd">float</span><span class="pun">:</span><span class="pln"> left</span><span class="pun">;</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">480px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

content dd h3 </span><span class="pun">{</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="kwd">float</span><span class="pun">:</span><span class="pln"> left</span><span class="pun">;</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></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">20px</span><span class="pun">;</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">font</span><span class="pun">-</span><span class="pln">weight</span><span class="pun">:</span><span class="pln"> normal</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

content dd span </span><span class="pun">{</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="kwd">float</span><span class="pun">:</span><span class="pln"> left</span><span class="pun">;</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">4px</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">10px</span><span class="pun">;</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">visibility</span><span class="pun">:</span><span class="pln"> hidden</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

content dd p </span><span class="pun">{</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">clear</span><span class="pun">:</span><span class="pln"> left</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

content dd</span><span class="pun">:</span><span class="pln">hover span </span><span class="pun">{</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">visibility</span><span class="pun">:</span><span class="pln"> visible</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	سيكون الـdiv الرئيسي هو الأعرض بين العمودين؛ بعرض 536px. وسيكون العرض لكل من <code>main</code> و<code>side</code> بالإضافة إلى الـ<span style="font-family:courier new,courier,monospace;">margin</span> بينهما هو العرض الخاص بـdiv الأب منقوصًا منه قيمة <span style="font-family:courier new,courier,monospace;">padding</span> اليسار واليمين. تم تحويل عناصر <code>dt</code> إلى أيقونة التاريخ عن طريق إعطائها عرض وطول ولون خلفية رمادي. وباستخدام تنسيقات font مناسبة أمكننا جعل نص التاريخ كبيرًا وبلون أبيض، كما أنّه تم جعل الخط الخاص بالعنصر <code>span</code> أصغر بقليل حتى يظهر الشهر أسفل رقم اليوم بشكل جميل. وحتى تظهر عناصر <code>dt</code> و<code>dd</code> بجانب بعضها فقد تم إعطاؤها الخاصية <code>float: left</code>. لاحظ أننا استخدمنا <code>visibility: hidden</code> على العنصر <code>span</code> وذلك حتى نخفيه عن أنظار الزائر إلى أن يضع مؤشر الفأرة فوق عنصر <code>dd</code> لنقوم عندها بإظهار رابط "View more info".
</p>

<pre class="css ipsCode prettyprint prettyprinted" data-pbcklang="css" data-pbcktabsize="4">
<span class="pln">content </span><span class="com">#side {</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">300px</span><span class="pun">;</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="kwd">float</span><span class="pun">:</span><span class="pln"> left</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

content </span><span class="pun">.</span><span class="pln">aside </span><span class="pun">{</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">17px</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">17px</span><span class="pun">;</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">30px</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">background</span><span class="pun">:</span><span class="pln"> url</span><span class="pun">(</span><span class="pln">images</span><span class="pun">/</span><span class="pln">aside</span><span class="pun">-</span><span class="pln">bg</span><span class="pun">.</span><span class="pln">png</span><span class="pun">)</span><span class="pln"> center top </span><span class="kwd">no</span><span class="pun">-</span><span class="pln">repeat</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

content </span><span class="pun">.</span><span class="pln">aside img </span><span class="pun">{</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">15px</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

footer </span><span class="pun">{</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">70px</span><span class="pln"> </span><span class="lit">22px</span><span class="pun">;</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">background</span><span class="pun">:</span><span class="pln"> url</span><span class="pun">(</span><span class="pln">images</span><span class="pun">/</span><span class="pln">content</span><span class="pun">-</span><span class="pln">bottom</span><span class="pun">.</span><span class="pln">png</span><span class="pun">)</span><span class="pln"> center top </span><span class="kwd">no</span><span class="pun">-</span><span class="pln">repeat</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

footer p</span><span class="com">#back-to-top {</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="kwd">float</span><span class="pun">:</span><span class="pln"> right</span><span class="pun">;</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></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">11px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

footer p</span><span class="com">#back-to-top a {</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">color</span><span class="pun">:</span><span class="pln"> </span><span class="com">#fff;</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></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">

footer p</span><span class="com">#back-to-top a:hover {</span><span class="pln">
</span><span style="line-height: 17.92px;"><span class="pln">    </span></span><span class="pln">color</span><span class="pun">:</span><span class="pln"> </span><span class="com">#d7d9d8;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	كل عنصر <span style="font-family:courier new,courier,monospace;">aside</span>. تم إعطاؤه خلفية مزخرفة، وبالنسبة للخطوط فإنها ستأخد التنسيقات الخاصة بـ <span style="font-family:courier new,courier,monospace;">div</span> المحتوى بسبب ما يسمى بالتوريث (inheritance). أمّا بالنسبة لرابط "back to top" فسوف نضطر إلى إعطائه تنسيقات جديدة لأنه موجود خارج <span style="font-family:courier new,courier,monospace;">div</span> المحتوى، ولأنّ هذا الرابط موجود ضمن خلفية داكنة وخارج المحتوى الرئيسي فإننا سنحتاج لتعديل الألوان وجعلها مختلفة عن البقية الموجودة في باقي الصفحة.
</p>

<p>
	بقي شيء واحد قبل أن ننتهي من هذا الدرس وهو أنّه يجب عليك أن تعرف أن خاصية <code>nth-child</code> غير مدعومة في بعض إصدارات متصفح Internet Explorer، لذلك إذا أردت أن تدعم تلك المتصفحات فيجب عليك استخدام jQuery:
</p>

<pre class="javascript ipsCode prettyprint prettyprinted" data-pbcklang="javascript" data-pbcktabsize="4">
<span class="pln">$</span><span class="pun">(</span><span class="pln">document</span><span class="pun">).</span><span class="pln">ready</span><span class="pun">(</span><span class="pln">fucntion</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> 
    $</span><span class="pun">(</span><span class="str">"#header ul li:nth-child(1)"</span><span class="pun">).</span><span class="pln">css</span><span class="pun">(</span><span class="str">"margin-right"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"70px"</span><span class="pun">);</span><span class="pln">      
    $</span><span class="pun">(</span><span class="str">"#header ul li:nth-child(2)"</span><span class="pun">).</span><span class="pln">css</span><span class="pun">(</span><span class="str">"margin-right"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"325px"</span><span class="pun">);</span><span class="pln"> 
    $</span><span class="pun">(</span><span class="str">"#header ul li:nth-child(3)"</span><span class="pun">).</span><span class="pln">css</span><span class="pun">(</span><span class="str">"margin-left"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"70px"</span><span class="pun">);</span><span class="pln"> 
    $</span><span class="pun">(</span><span class="str">"#header ul li:nth-child(4)"</span><span class="pun">).</span><span class="pln">css</span><span class="pun">(</span><span class="str">"margin-left"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"70px"</span><span class="pun">);</span><span class="pln"> 
</span><span class="pun">});</span></pre>

<p>
	إلى هنا نكون قد أنهينا درسنا وحصلنا على صفحة كاملة وجاهزة. <a href="http://HsoubAcademy.github.io/examples/Simple-Forest-Website-Demo/" rel="external nofollow">يمكنك أيضًا تصفح الموقع بشكله النهائي إذا أحببت ذلك</a>. أو تصفح <a href="https://github.com/HsoubAcademy/HsoubAcademy.github.io/tree/master/examples/Simple-Forest-Website-Demo" rel="external nofollow">الملفات المصدرية</a>.
</p>

<p>
	ترجمة -وبتصرف- للمقال: <a href="http://line25.com/tutorials/code-a-textured-outdoors-website-in-html-css" rel="external nofollow">Design a Textured Outdoors Website in Photoshop</a> لصاحبه: Iggy.
</p>
]]></description><guid isPermaLink="false">161</guid><pubDate>Sat, 05 Sep 2015 20:13:00 +0000</pubDate></item><item><title>&#x62A;&#x639;&#x631;&#x651;&#x641; &#x639;&#x644;&#x649; IndexedDB</title><link>https://academy.hsoub.com/programming/html/%D8%AA%D8%B9%D8%B1%D9%91%D9%81-%D8%B9%D9%84%D9%89-indexeddb-r67/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_04/indexedDB_480x300.jpg.f9dadfffe30d53e389ad33c32f4edb52.jpg" /></p>

<p dir="RTL">تُقدم IndexedDB أو "<strong>قاعدة البيانات المُفَهرَسَة</strong>" طريقة حيوية وفعالّة لتخزين وجلب البيانات باستخدام المتصفح. و لكونها تتعامل مع قواعد البيانات في الخادم فإن IndexedDB تسمح بتوليد مفاتيح وبحث البيانات أو ترتيبها في حقل معين. سنُبحر في هذه المقالة في عالم IndexedDB حيث سنشرح واجهة التطبيقات البرمجية الخاصة بقواعد البيانات المفهرسة IndexedDB <abbr title="واجهة برمجية | Application Programming Interface"><abbr title="واجهة برمجية | Application Programming Interface"><abbr title="واجهة برمجية | Application Programming Interface"><abbr title="واجهة برمجية | Application Programming Interface"><abbr title="واجهة برمجية | Application Programming Interface"><abbr title="واجهة برمجية | Application Programming Interface"><abbr title="واجهة برمجية | Application Programming Interface"><abbr title="واجهة برمجية | Application Programming Interface"><abbr title="واجهة برمجية | Application Programming Interface"><abbr title="واجهة برمجية | Application Programming Interface"><abbr title="واجهة برمجية | Application Programming Interface"><abbr title="واجهة برمجية | Application Programming Interface"><abbr title="واجهة برمجية | Application Programming Interface"><abbr title="واجهة برمجية | Application Programming Interface">API</abbr></abbr></abbr></abbr></abbr></abbr></abbr></abbr></abbr></abbr></abbr></abbr></abbr></abbr> وذلك من خلال بناء مدير مهام من نوع خاص. لكن أولاً دعونا نأخذ أولاً فكرة عن قواعد البيانات وIndexedDB.</p><h2>ماهي IndexedDB ؟</h2><p>تعتبر IndexedDB مخزن للكائنات key-value كما أنها غير متزامنة ومرحلية. تحتوي IndexedDB على الكثير من الأفكار والتي يمكن شرحها بجملة واحدة، لكنيّ سأقوم بشرح كل واحدةٍ منها على حدى.</p><ul><li><strong>غير متزامنة:</strong> تعني بأن IndexedDB لاتحجب واجهة المستخدم. حيث أن العمليات تجري على نحوٍ لاحق، أي أنها ليست فورية. وهذا بالطبع يسمح لواجهة المستخدم بالإستجابة للأوامر الأخرى. وكمثال للمقارنة: يعتبر التخزين المحلي localStorage متزامنًا، أي أن العمليات تجري بشكل فوري وﻻ يحدث أي شيء حتى تكتمل العملية. وفي حال كان لدينا الكثير من أوامر القراءة والكتابة سيحدث بطؤُ ملحوظ في البرنامج.</li><li><strong>مرحلية:</strong> وتعني بأن جميع العمليات في IndexedDB يجب أن تتم جميعها أو لا تتم كليةً. يُمكن أن تفشل العملية للعديد من الأسباب عندها ستقوم قاعدة البيانات بالرجوع إلى حالتها السابقة. لأنه من غير الممكن أن يكون هناك أمر جزئي في قاعدة البيانات المُفَهرسَة IndexedDB.</li><li><strong>تخزين كائن key-value:</strong> تعني بأن كل أمر في قاعدة البيانات هو كائن بحد ذاته، أي أنه يُعارض مفهوم الصفوف (rows) في قاعدة البيانات. تُستخدم قواعد البيانات التقليدية نموذجًا منطقيًا، حيث أن البيانات يتم التعرّف عليها في جدول كما ترتبط بصلات بين قيمة جدول معين وأيضاً المفاتيح لجدول آخر. كما في الصورة1. </li></ul><p>من خلال عملية تخزين الكائن key-value كمفتاح وقيمة، يحتوي كل أمر على كائن مستقل خاص به. حيث لا يمكن الربط بين أي كائن وآخر، كما يمكن أن يكون في نفس مكان التخزين أكثر من كائن و كل كائن مختلفٌ نوعه عن الآخر.</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" rel="external nofollow" href="https://academy.hsoub.com/uploads/monthly_2015_04/image001.png.e62e6626b5ae2c039a193d64b3acad7a.png"><img data-fileid="1288" class="ipsImage ipsImage_thumbnailed" src="https://academy.hsoub.com/uploads/monthly_2015_04/image001.thumb.png.df8fd9d144151b0f406f2c4bad7ac024.png"></a></p><p style="text-align: center;"><span style="color:#808080;">الصورة 1: كائنات في نفس مكان التخزين ولا يتوجب أن تكون تلك الكائنات بنفس الخاصيات.</span></p><p><shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><stroke joinstyle="miter"><formulas><f eqn="if lineDrawn pixelLineWidth 0"><f eqn="sum @0 1 0"><f eqn="sum 0 0 @1"><f eqn="prod @2 1 2"><f eqn="prod @3 21600 pixelWidth"><f eqn="prod @3 21600 pixelHeight"><f eqn="sum @0 0 1"><f eqn="prod @6 1 2"><f eqn="prod @7 21600 pixelWidth"><f eqn="sum @8 21600 0"><f eqn="prod @7 21600 pixelHeight"><f eqn="sum @10 21600 0"></f></f></f></f></f></f></f></f></f></f></f></f></formulas><path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"><lock v:ext="edit" aspectratio="t"></lock></path></stroke></shapetype><shape id="Picture_x0020_1" o:spid="_x0000_i1029" type="#_x0000_t75" alt="Objects in the same store do not need to have all of the same properties"><imagedata src="indexdb_files/image001.png" o:title="Objects in the same store do not need to have all of the same properties"></imagedata></shape></p><p>يُعتبر هذا الاختلاف الأكبر من نوعه بين قواعد البيانات المفهرسة IndexedDB وبين قواعد البيانات الأخرى مثل SQL أو MySQL. فمثلاً يجب أن يحتوي كل حقل قيمة معينة في قواعد البيانات SQL حتى وإن كانت خالية <span style="font-family:courier new,courier,monospace;">NULL</span> ولكن باستخدام IndexedDB فإن بنية قاعدة البيانات يمكن أن تكون مرنة حسب احتياجك واستخدامك لها.</p><p>و أيضاً تحتوي IndexedDB على كمّية هائلة من تخزين البيانات تفوق التخزين المحلي localStorage والذي يفرض مساحة لاتقل عن 250 ميجابايت على معظم المتصفحات. حيث أن هذه المساحة أساسية مع المتصفح Internet Explorer ولكن تستخدم Google Opera وOpera نسبة مئوية للتخزين بينما غير معروف عن كيمة ومحدودية التخزين الذي يستخدمها فَيرفُكس.</p><p>بينما مع IndexedDB يمكن إنشاء تخزين ثنائي للبيانات وبكلمات أخرى تشبه هذه العملية تركيبة Javascript مع التعامل مع البيانات والقدرة على استيعاب قواعد بيانات الموقع.</p><h2>المتصفحات الداعمة الحالية</h2><p>للأسف تُعتبر IndexedDB غير مدعومة من جميع المتصفحات بعد. فقط مع متصفح Opera الاصدار 15 ومافوق وGoogle Chrome 24 ومافوق وفَيرفُكس15 ومافوق، أيضاُ Internet Explorer 10 ومافوق. بينما الاصدارات الأقدم من Chrome وفَيرفُكس يتم دعمها من خلال التجارب فقط التي تدعم واجهة التطبيقات البرمجية <abbr title="واجهة برمجية | Application Programming Interface"><abbr title="واجهة برمجية | Application Programming Interface"><abbr title="واجهة برمجية | Application Programming Interface"><abbr title="واجهة برمجية | Application Programming Interface"><abbr title="واجهة برمجية | Application Programming Interface"><abbr title="واجهة برمجية | Application Programming Interface"><abbr title="واجهة برمجية | Application Programming Interface"><abbr title="واجهة برمجية | Application Programming Interface"><abbr title="واجهة برمجية | Application Programming Interface"><abbr title="واجهة برمجية | Application Programming Interface"><abbr title="واجهة برمجية | Application Programming Interface"><abbr title="واجهة برمجية | Application Programming Interface"><abbr title="واجهة برمجية | Application Programming Interface"><abbr title="واجهة برمجية | Application Programming Interface">API</abbr></abbr></abbr></abbr></abbr></abbr></abbr></abbr></abbr></abbr></abbr></abbr></abbr></abbr>. ولن نتكلم عن هذا.</p><p>لا يدعم متصفح سفاري IndexedDB مطلقاً ولا نسخة Presto-based المدعومة من متصفح Opera اصدرات ماقبل نسخة 12. و لكن عوضاً عن ذلك فهو يدعم <a rel="external nofollow" href="http://www.w3.org/TR/webdatabase/">قاعدة بيانات الموقع القديم</a>. كما يدعم في معظم الأحيان <a rel="external nofollow" href="http://nparashuram.com/IndexedDBShim/">IndexedDBShim</a>. طبعاً و بالنسبة للمتصفحات التي لاتدعم أيًّا منهم فمن الأفضل البقاء على قواعد البيانات التي تعمل على الخادم.</p><h2>كيفية اختبار دعم IndexedDB</h2><p>يمكنك كتابة الشِفرة التالية لاختبار فيما إذا كان استخدام IndexedDB ممكناً:</p><pre data-pbcklang="javascript" data-pbcktabsize="4" class="javascript ipsCode prettyprint">var hasIDB = typeof window.indexedDB != 'undefined';</pre><p>أو يمكنك استخدام  <a rel="external nofollow" href="http://modernizr.com/">Modernizr</a>:</p><pre data-pbcklang="javascript" data-pbcktabsize="4" class="javascript ipsCode prettyprint">var hasIDB = Modernizr.indexeddb;</pre><p>كن متأكداً بأن هذه الاختبار فقط للمتصفحات الأخيرة الداعمة لـِ IndexedDB.</p><h2>إنشاء مدير مهام</h2><p>هذه الفقرة فقط لخبراء <a rel="external nofollow" href="http://webinista.github.io/IDBTaskList/">المشروع التجريبي</a>. لكن مع ذلك يمكنك <a rel="external nofollow" href="https://github.com/webinista/IDBTaskList">تحميل المصدر</a> وذلك للحصول على فهم أفضل حول عمل هذه الدوال في الكود.</p><p>باستخدام مدير المهام ستحصل على مايلي:</p><ul><li>حفظ المهمة.</li><li>ضبط بداية و نهاية التواريخ.</li><li>ضبط أولوية المهمة.</li><li>إضافة ملاحظة لكل مهمة.</li><li>ميزة البحث عن المهام و الملاحظات السابقة.</li></ul><p>أولاً لنبدأ بإنشاء نموذج والذي سنستخدمه لإضافة المهام الجديدة في قاعدة البيانات:</p><pre data-pbcklang="html" data-pbcktabsize="2" class="html ipsCode prettyprint">&lt;form id="addnew"&gt;
  &lt;div&gt;
    &lt;!-- Used for updates --&gt;
    &lt;input type="hidden" name="key" id="key" value=""&gt;
    &lt;label for="task"&gt;What do you need to do? (required)&lt;/label&gt;
    &lt;input type="text" name="task" id="task" value="" required&gt;
  &lt;/div&gt;
 
  &lt;div class="txtright"&gt;
    &lt;input type="checkbox" name="status" id="status"&gt;&lt;label for="status"&gt;Completed?&lt;/label&gt;
  &lt;/div&gt;
 
  &lt;div&gt;
    &lt;label for="start"&gt;Start date:&lt;/label&gt;
    &lt;input type="date" id="start" name="start" value=""&gt;
  &lt;/div&gt;
 
  &lt;div&gt;
    &lt;label for="due"&gt;Due date:&lt;/label&gt;
    &lt;input type="date" id="due" name="due" value=""&gt;
  &lt;/div&gt;
 
  &lt;div&gt;
    &lt;label for="priority"&gt;Priority:&lt;/label&gt;
    &lt;select id="priority" name="priority"&gt;
      &lt;option value="0"&gt;None&lt;/option&gt;
      &lt;option value="1"&gt;1 - High&lt;/option&gt;
      &lt;option value="2"&gt;2&lt;/option&gt;
      &lt;option value="3"&gt;3 - Medium&lt;/option&gt;
      &lt;option value="4"&gt;4&lt;/option&gt;
      &lt;option value="5"&gt;5 - Low&lt;/option&gt;
    &lt;/select&gt;
  &lt;/div&gt;
 
  &lt;div&gt;
    &lt;label for="tasknotes"&gt;Task notes&lt;/label&gt;
    &lt;textarea id="tasknotes" name="tasknotes" cols="30" rows="3"&gt;&lt;/textarea&gt;
    &lt;button type="submit" id="submit"&gt;Save entry&lt;/button&gt;
    &lt;button type="button" id="delete" class="hidden" &gt;Delete entry&lt;/button&gt;
  &lt;/div&gt;
&lt;/form&gt;</pre><p dir="RTL">تشرح الشِفرة البرمجية السابقة المؤلفة من HTML وبعضٍ من CSS إنشاء نموذج مشابه نوعاً ما للصورة2.</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" rel="external nofollow" href="https://academy.hsoub.com/uploads/monthly_2015_04/image002.png.3829dedf87db1774a78b43be483b4946.png"><img data-fileid="1289" class="ipsImage ipsImage_thumbnailed" src="https://academy.hsoub.com/uploads/monthly_2015_04/image002.thumb.png.b2eb754659d3fef955b27b0e82c456e2.png"></a></p><p><shape id="Picture_x0020_2" o:spid="_x0000_i1028" type="#_x0000_t75" alt="Our task manager form"><imagedata src="indexdb_files/image002.png" o:title="Our task manager form"></imagedata></shape></p><p dir="RTL" style="text-align: center;"><span style="color:#808080;">الصورة 2 : نموذج مدير المهام</span></p><p dir="RTL">ماذا تحتاج أن تفعل؟ كل ما تحتاجه يجب أن يكون ضمن حقول النموذج حيث ستستخدم النموذج أيضاً لاحقاً للإضافة والتحديث على المهام. وبما أننا شرحنا ما يجب علينا فعله سنقوم الآن ببناء قاعدة البيانات.</p><h2 dir="RTL">إنشاء قاعدة البيانات</h2><p dir="RTL">لإنشاء قاعدة بيانات IndexedDB يجب استخدام الطريقة <span style="font-family:courier new,courier,monospace;">()open</span> في كائن indexedDB.</p><pre data-pbcklang="javascript" data-pbcktabsize="4" class="javascript ipsCode prettyprint">var idb = indexedDB.open('IDBTaskManager', 1);</pre><p>في البداية يجب وضع اسم مناسب لقاعدة البيانات، وهذا إجباري، يجب أن يكون الاسم نصًا عاديًا. يمكن تسمية قاعدة البيانات لأي شيء تريده لكن فقط نص عادي. وبكل الأحوال يجب أن يكون كل اسم لقاعدة البيانات فريدًا و أصليًا. <strong>أصلي</strong> نعني به أن يكون مكونًا من <strong>البروتوكول:اسم المستضيف:المنفذ</strong> مثل <a rel="external nofollow" href="https://dev.opera.com">https://dev.opera.com</a> أو <a rel="external nofollow" href="http://www.example.com:80">http://www.example.com:80</a>.</p><p>ثانياً و اختيارياً يمكن وضع رقم اصدار قاعدة البيانات، بما أن هذا المشروع هو تجربتنا الأولى سنضع الرقم1.</p><p>استخدام رقم الاصدار مهم جداً لأن الدالة <span style="font-family:courier new,courier,monospace;">open</span> تقوم بإنشاء قاعدة اذا لم تكن موجودة من الأصل ووضع رقم الاصدار هو 1 وإذا لم تكن قاعدة البيانات موجودة سيتم إنشاء اتصال إليها.</p><p>يجب أن يكون رقم الاصدار <span style="font-family:courier new,courier,monospace;">integer</span> أي عبارة عن رقم فقط وأن يكون أكبر من الصفر. بينما الأرقام العشرية أو التي تحتوي على كسور سيتم حذف تلك الكسور لإرجاع الرقم الى رقم <span style="font-family:courier new,courier,monospace;">integer</span>. أي أن الرقم 2.5 سيصبح 2 فقط وأيضاً 0.8 سيصبح 0 (حيث يسبب ذلك خطأ برمجي). الحد الأعلى لرقم الاصدار هو 253 أو 9,007,199,254,740,992. و هذا الحد الأعلى أيضاً يمكن تطبيقه على موّلد المفاتيح.</p><p><strong>ملاحظة:</strong> يمكن من خلال متصفح الاوبرا استخدام فحص تخزين كائنات IndexedDB وأيضاً المفاتيح والقيم من خلال الخيار المصادر الموجود في خيارات المطورون في المتصفح.</p><p style="text-align: justify;">وبذلك سيتم إنجاز العملية والتي ستعيد الكائن <span style="font-family:courier new,courier,monospace;">IDBOpenDBRequest</span> كما سيتم نجاح الحدث. الآن دعونا نعرّف الأمر <span style="font-family:courier new,courier,monospace;">onsuccess</span> لهذا الحدث. سنقوم بتعيين الكائن <span style="font-family:courier new,courier,monospace;">IDBDatabase</span> مع <span style="font-family:courier new,courier,monospace;">event.target.result</span> والذي سيتم تحويله إلى متغير والذي يقوم بنشر هدف إلى الدوال الأخرى.</p><pre data-pbcklang="javascript" data-pbcktabsize="2" class="javascript ipsCode prettyprint" style="line-height: 22.3999996185303px;">// Define a global variable to hold our database object
var dbobject;

idb.onsuccess = function(evt){
  dbobject = evt.target.result;
}</pre><p>مع استخدام IndexedDB فإن كل خطوة أو عملية في قاعدة البيانات يجب أن تكون ضمن دالّة لأمر مرجعي. ولفعل ذلك يحتاج كائن قاعدة البيانات لأن يكون متوفرًا على كل دالة والتي تقوم بالعملية كاملة.</p><h2>نسخة قاعدة البيانات</h2><p>عندما تكون نسخة قاعدة البيانات أعلى من التي تم تخزينها مسبقاً من قبل المستخدم فإن المتصفح عندها سيطرد الحدث <span style="font-family:courier new,courier,monospace;">upgradeneeded</span>. وهذا يتضمن أول تشغيل للبرنامج عندما تكون النسخة الأولية هي صفر.</p><p>يعتبر إنشاء الحدث <span style="font-family:courier new,courier,monospace;">upgradeneeded</span> الطريقة الوحيدة لتغيير البنية الأصلية لقاعدة البيانات. تتضمن التغيرات الجذرية إنشاء وحذف تخزين الكائن أو اضافة فهرسات. يمكننا صنع هذه التغيرات ضمن الحدث المرجعي <span style="font-family:courier new,courier,monospace;">onupgradeneeded</span> كما في المثال التالي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">idb.onupgradeneeded = function (evt) {
  if (evt.oldVersion &lt; 1) {
    // Create our object store and define indexes.
  }
}
</pre><p dir="RTL">لو افترضنا إنشاء تخزين أو فهرسة كائن موجود مسبقاً عندها سيحدث خطأ. لكن يمكننا استخدام الخاصية <span style="font-family:courier new,courier,monospace;">oldVersion</span> التابعة للحدث <span style="font-family:courier new,courier,monospace;">upgradeneeded</span> للتحكم بهذه التغيرات كما سنشرح ذلك في هذه المقالة.</p><p>لكن عند طرده سيظهر الحدث <span style="font-family:courier new,courier,monospace;">upgradeneeded</span> قبل حدث نجاح الاتصال <span style="font-family:courier new,courier,monospace;">success</span>. و أيضاً لن يتم تعريف المتغير <span style="font-family:courier new,courier,monospace;">dbobject</span> عند استدعاء <span style="font-family:courier new,courier,monospace;">idb.onupgradeneeded</span>. فقط تذكر ذلك عند برمجة و تطوير التطبيقات.</p><h2>إنشاء تخزين الكائن</h2><p>لاقيمة لإنشاء قاعدة البيانات بمفردها. لحفظ و تعديل الأوامر ستحتاج أيضاً إلى إنشاء تخزين الكائن. تخزين الكائنات مشابهة لعملية الجداول في SQL وهي الوحدة التي تحمل جميع البيانات والصفوف.</p><p>تتغير البنية عند إنشاء تخزين الكائن ولهذا سنقوم بهذه الخطوة ضمن الأمر المرجعي <span style="font-family:courier new,courier,monospace;">onupgradeneeded</span>. الآن سنضيف تخزين الكائن وليكن اسمه <span style="font-family:courier new,courier,monospace;">tasks</span> باستخدام الطريقة <span style="font-family:courier new,courier,monospace;">createObjectStore</span>:</p><pre data-pbcklang="javascript" data-pbcktabsize="2" class="javascript ipsCode prettyprint">idb.onupgradeneeded = function(evt){
  var dbobject = evt.target.result;
  // Check our version number
  if (evt.oldVersion &lt; 1) {
    dbobject.createObjectStore('tasks',{autoIncrement: true});
  }
};</pre><p>الوسيطة الأولى للكائن <span style="font-family:courier new,courier,monospace;">createObjectStore</span> مطلوبة لأنها اسم تخزين الكائن بينما الوسيطة الثانية اختيارية. و مع ذلك يجب أن يكون هناك قاموس والذي يعرف خيارات المفتاح للمخزن.</p><p>تشبه القواميس كائنات Javascript حرفياً. و لكنهم بصراحة تم تخصيصهم للمصفوفات مع المفاتيح والقيم الخاصة بهم. تسمح لنا القواميس بتخطي الوسائط بدون قلق حول ترتيبهم. ومع <span style="font-family:courier new,courier,monospace;">createObjectStore</span> يُمكن أن يحتوي القاموس على الخاصيات والقيم التالية:</p><ul><li><span style="font-family:courier new,courier,monospace;">keyPath</span>: يحدد أيّ خاصية للكائن ينبغي استخدامها كمفتاح لكل صف . القيمة الافتراضية هي <span style="font-family:courier new,courier,monospace;">null</span>.</li><li><span style="font-family:courier new,courier,monospace;">autoIncrement</span>: هي قيمة منطقية و التي  تحدد فيما اذا يمكن توليد مفاتيح تلقائي في الصفوف أو لا . القيمة الافتراضية خطأ <span style="font-family:courier new,courier,monospace;">false</span>.</li></ul><p>يسمح لنا <span style="font-family:courier new,courier,monospace;">keyPath</span> بتحويل خاصية معينة إلى اجبارية. فعلى سبيل المثال استخدام: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">{keyPath: 'task'} </pre><p>تعني بأن كل كائن يتم إضافته للمخزن يجب أن يحتوي على الخاصية <span style="font-family:courier new,courier,monospace;">task</span>.</p><p>ستلاحظ من خلال المشروع التجريبي بأننا نستحدم <span style="font-family:courier new,courier,monospace;">autoIncrement</span>. و بإستخدام كلاً من <span style="font-family:courier new,courier,monospace;">autoIncrement</span> أو <span style="font-family:courier new,courier,monospace;">keyPath</span> لن نتمكن من تحديد الواسطة في الطرق <span style="font-family:courier new,courier,monospace;">add</span> أو <span style="font-family:courier new,courier,monospace;">put</span>.</p><p><strong>ملاحظة:</strong> يمكنك استخدام <span style="font-family:courier new,courier,monospace;">autoIncrement</span> و<span style="font-family:courier new,courier,monospace;">keyPath</span> سوياً حيث سيصبح المفاتيح رقمية كما أن الكائنات ستحصل على حقول إجبارية.</p><h2>العمل على التسجيلات</h2><p>يتألف العمل مع التسجيلات من أربع مراحل وهي الإضافة، التحديث، الحذف أو الاستعادة.</p><ol><li>إنشاء طريقة اتصال لكائن أو أكثر باستخدام <span style="font-family:courier new,courier,monospace;">readwrite</span> أو <span style="font-family:courier new,courier,monospace;">readonly</span>.</li><li>تحديد اي كائن سيقوم بالأمر مع طريقة الاستجابة.</li><li>إنشاء طلب باستخدام واحداً من طرق الطلبات أو تمرير كائن.</li><li>افعل شيئاً ما مع النتيجة باستخدام الأمر المرجعي <span style="font-family:courier new,courier,monospace;">onsuccess</span>.</li></ol><p>يعتبر صعباً العمل على صف واحد من قاعدة البيانات  من العمل مع مجموعة من الصفوف. وفي هذا القسم سنعمل على صف واحد باستخدام المؤشر لاسترجاع صفوف متعددة.</p><h2>إضافة صف/ تسجيل</h2><p>لإضافة صفٍ جديد لديك خياران: إما باستخدام <span style="font-family:courier new,courier,monospace;">()add</span> أو <span style="font-family:courier new,courier,monospace;">()put</span>. الفرق بينهما أن <span style="font-family:courier new,courier,monospace;">()add</span> يمكن استخدامها في حال اضافة صف جديد فقط بينما <span style="font-family:courier new,courier,monospace;">()put</span> تستخدم لإضافة أو تحديث صف معين. كلا الطريقتين تقبل نقاشين كحد أعلى.</p><ul><li><strong>Value</strong> (مطلوب): حفظ الكائن.</li><li><strong>Key</strong> (اختياري): مفتاح الكائن وهو ضروري فقط في حال كانت الحالة خاطئة للطريقة <span style="font-family:courier new,courier,monospace;">autoIncrement</span> ولم يتم تعريف <span style="font-family:courier new,courier,monospace;">keyPath</span>.</li></ul><p>الآن دعونا نحفظ المهمة في قاعدة البيانات عندما يقوم المستخدم بالضغط على ارسال النموذج:</p><pre data-pbcklang="javascript" data-pbcktabsize="2" class="javascript ipsCode prettyprint">var addnewhandler, addnew;
addnew = document.getElementById('addnew');

addnewhandler = function (evt) {
  'use strict';

  evt.preventDefault();
  var entry = {}, transaction, objectstore, request, fields = evt.target, o;

  // Build our task object.
  for (o in fields) {
    if ( fields.hasOwnProperty(o)) {
      entry[o] = fields[o].value;
    }
  }  

  // Open a transaction for writing
  transaction = dbobject.transaction(['tasks'], 'readwrite');
  objectstore = transaction.objectStore('tasks');
  // Save the entry object
  request = objectstore.add(entry);
  transaction.oncomplete = function (evt) {
    displaytasks(dbobject);
  };
  transaction.onerror = errorhandler; 
};

addnew.addEventListener('submit', addnewhandler);</pre><p>لانحتاج فعلاً لحذف تلك القيم بما أن المدخلات الضارة محدودة للمستخدم. يمكنك إدراج الأقواس <span style="font-family:courier new,courier,monospace;"><strong>&lt;</strong></span> و <span style="font-family:courier new,courier,monospace;"><strong>&gt;</strong></span> عند اظهار النتيجة. في حال أردت مزامنة بيانات IndexedDB مع قواعد بيانات السيرفر عندها كن متأكداً بفلترة وادراج مدخلات المستخدم كأولوية لقاعدة البيانات.</p><p>الخطوة التالية هي: فتح طريق اتصال لكائن قاعدة البيانات باستخدام الطريقة <span style="font-family:courier new,courier,monospace;">transaction</span>. حيث تقبل الطريقة <span style="font-family:courier new,courier,monospace;">transaction</span> نقاشين هما: تسلسل أسماء تخزين الكائن وأيضاً صيغة هذا الاتصال.</p><p>التسلسل هو قائمة من مخزن كائن واحد أو أكثر حيث ينتج اتصال  وهنا سنقوم فقط بفتح مخزن الكائن <span style="font-family:courier new,courier,monospace;">tasks</span>.</p><p>دعونا نفترض بأن التطبيق يسمح لنا بتعيين مهام للآخرين. يتم تخزين أولئك الأشخاص ووظائفهم في الكائن <span style="font-family:courier new,courier,monospace;">assignees</span>. إذا أردنا أيضاً استخدام وظائف القراءة والكتابة في <span style="font-family:courier new,courier,monospace;">assignees</span> عندها يجب استخدامهم معاً.</p><pre data-pbcklang="javascript" data-pbcktabsize="4" class="javascript ipsCode prettyprint">transaction = dbobject.transaction(['tasks', 'assignees'], 'readwrite');</pre><p><strong>ملاحظة:</strong> تستخدم الأقواس <span style="font-family:courier new,courier,monospace;"><strong>[</strong> </span>وَ <strong><span style="font-family:courier new,courier,monospace;">]</span></strong> بشكل اختياري في معظم اصدارات المتصفحات في حال أردت إنشاء اتصال لكائن واحد. لكن بعض الاصدارات القديمة للمتصفحات لاتزال تطلبهم. ولأفضل توافقية استخدم تلك الأقواس.</p><p>لدينا خياران مع صيغة نقاش وهما: <span style="font-family:courier new,courier,monospace;">readwrite</span> و<span style="font-family:courier new,courier,monospace;">readonly</span>. يسمح لنا <span style="font-family:courier new,courier,monospace;">readwrite</span> باسترجاع وإضافة وتحديث أو حذف الصفوف. وبكل الأحوال للحفاظ على سلامة البيانات يمكن استخدام <span style="font-family:courier new,courier,monospace;">readwrite</span> مرة واحدة.</p><p>لاسترجاع الصفوف لعرضها يمكنك فقط استخدام <span style="font-family:courier new,courier,monospace;">readonly</span>. يمكن تشغيل أكثر من <span style="font-family:courier new,courier,monospace;">readonly</span> مرة واحدة في نفس تخزين الكائن والذي بذلك يساعد على تحسين الأداء وبما أننا نضيف صفوف يجب أن نستخدم الصيغة readwrite.</p><p>الخطوة الثالثة وهي اختيار أي كائن سنستخدمه في طلب الأمر:</p><pre data-pbcklang="javascript" data-pbcktabsize="4" class="javascript ipsCode prettyprint">transaction.objectStore('tasks');</pre><p>أخيراً يكتب الأمر <span style="font-family:courier new,courier,monospace;">(request = objectstore.add(entry</span> طريقة ادخال الكائن إلى قاعدة البيانات. سيتم استدعاء الدالة <span style="font-family:courier new,courier,monospace;">displaytasks</span> عند اكتمال العملية.</p><p>لإضافة صفوف متعددة يمكنك استدعاء الطريقة <span style="font-family:courier new,courier,monospace;">()add</span> مرات عديدة باستخدام نفس طلب الكائن.</p><pre data-pbcklang="javascript" data-pbcktabsize="4" class="javascript ipsCode prettyprint">request = objectstore.add({object1:'Test object 1'});
request = objectstore.add({object2:'Test object 2'});
request = objectstore.add({object3:'Test object 3'});</pre><p>في هذه الحالة سيتم طرد الأحداث <span style="font-family:courier new,courier,monospace;">success</span> و<span style="font-family:courier new,courier,monospace;">complete</span> فور اكتمال جميع عمليات <span style="font-family:courier new,courier,monospace;">add</span> و<span style="font-family:courier new,courier,monospace;">put</span> عوضاً عن طردهم واحداً في كل مرة.</p><h2>تحديث الصف / التسجيل</h2><p>يجب استخدام الطريقة <span style="font-family:courier new,courier,monospace;">put</span> لجميع عمليات التحديث متضمنة مفتاح النقاش. ترك تلك الطريقة سيقوم بإنشاء صف جديد ولكن هذا ما لا نريده هنا.</p><p>يستخدم تطبيقنا نفس المظهر في كلاً من عمليات الإضافة والتعديل على المهام. سنقوم باستخدام الدالّة <span style="font-family:courier new,courier,monospace;">addnewhandler</span> للتعامل مع عمليات الإضافة والتعديل. فقط نحتاج تعديلها للتحرير بإضافة كود شرطي. يكون حقل <span style="font-family:courier new,courier,monospace;">key</span> خالياً في النموذج لهذا سنقوم بإضافة صف جديد. و إذا كان يحمل أي قيمة سنقوم بالتعديل باستخدام <span style="font-family:courier new,courier,monospace;">put</span>.</p><pre data-pbcklang="javascript" data-pbcktabsize="2" class="javascript ipsCode prettyprint">addnewhandler = function (evt) {

  evt.preventDefault();

  var entry = {}, transaction, objectstore, request, fields = evt.target, o;

  for (o in fields) {
    if ( fields.hasOwnProperty(o)) {
      entry[o] = fields[o].value;
     }
  }

  transaction = dbobject.transaction(['tasks'], 'readwrite');
  objectstore = transaction.objectStore('tasks');
  // Save the entry object with a key if one is available.
  if(fields.key.value){
    // +fields.key.value converts our key to a number
    request = objectstore.put(entry, +fields.key.value);
  } else {
    request = objectstore.add(entry);
  }

  transaction.oncomplete = function (evt) {
    displaytasks(dbobject);
  };

  transaction.onerror = errorhandler;
};</pre><h2>استرجاع الصفوف</h2><p>للتعديل على الصفوف تحتاج أولاً لاسترجاعها. وهنا يمكننا استخدام الطريقة get. سيتم إدراج الحدث <span style="font-family:courier new,courier,monospace;">hashchange</span> عند الضغط على قائمة المهام. سنقوم الآن بتعريف الدالّة <span style="font-family:courier new,courier,monospace;">hashchangehandler</span> لإستعادة العناصر المطابقة.</p><pre data-pbcklang="javascript" data-pbcktabsize="2" class="javascript ipsCode prettyprint">hashchangehandler = function (evt) {

  var transaction, objectstore, request, key;

  if (window.location.hash) {
    // Extract digit characters from the hash, and convert to a number.
    // Generated IndexedDB keys are numbers. String values won’t work.
    key = +window.location.hash.match(/\d/g).join('');
    // Run a read-only transaction on this object store.
    transaction = dbobject.transaction(['tasks'], 'readonly');
    objectstore = transaction.objectStore('tasks');
    // Retrieve the record by its key
    request = objectstore.get(key);
    // If it’s successful, update our form fields.
    request.onsuccess = function (successevent) {
      var o, data = successevent.target.result;
      for(o in data) {
        if( o == 'status') {
          addnew.status.checked = !!data.status;
        }
      
      addnew[o] = data[o];
    }
  };
  
  transaction.oncomplete = function (evt) {
    hide('#tasklist');
    show('#addnew');
  }
};</pre><p dir="RTL">تسترجع الطريقة <span style="font-family:courier new,courier,monospace;">get</span> الصفوف. كما أنها تقبل المُعامل (parameter) المفرد، أي سيتم استرجاع المفتاح كما أننا قمنا باستعادة الصف من خلال صيغة العمليات من خلال استخدام <span style="font-family:courier new,courier,monospace;">readonly</span>.</p><p><strong>ملاحظة:</strong> تعتبر مفاتيح IndexedDB محددة من خلال النوع كما أن مولد المفاتيح هو عيارة عن أرقام. في حال قمت بتخطي <span style="font-family:courier new,courier,monospace;">get</span> حتى ولو كان رقمي فإنه لن يعمل. ستحتاج إلى تحويل المُعامل إلى رقم كما فعلنا سابقاً.</p><p>إذا كان الطلب ناجحاً سنقوم بتزويد النموذج <span style="font-family:courier new,courier,monospace;">addnew#</span> بالنتيجة لعملية <span style="font-family:courier new,courier,monospace;">get</span>.</p><p>يجب تعريف الحدث <span style="font-family:courier new,courier,monospace;">onsuccess</span> في أي وقت عند ظهور نتيجة الطلب. لقد قمنا أيضاً بتعريف <span style="font-family:courier new,courier,monospace;">oncomplete</span> والذي سيتم إدراجه في حال اكتمال العملية. تنتهي العملية دوماً في حال فشل الطلب.</p><h2>حذف الصف</h2><p>سنقوم باستخدام طريقة مألوفة في حذف الصف كما فعلنا سابقاً مع استرجاع البيانات. ولكن هذه المرة سنقوم بحذف البيانات باستخدام الطريقة <span style="font-family:courier new,courier,monospace;">delete</span>. تتطلب الطريقة <span style="font-family:courier new,courier,monospace;">delete</span> مُعاملا واحدًا، ومفتاح الكائن سيقوم بحذف التخزين. أيضاً نحتاج لفتح عملية جديدة من خلال الصيغة <span style="font-family:courier new,courier,monospace;">readwrite</span>.</p><pre data-pbcklang="javascript" data-pbcktabsize="2" class="javascript ipsCode prettyprint">deletehandler = function (evt) {

  var transaction, objectstore, request, key;

  if (window.location.hash) {
    // Retrieve the key from the hash and convert it to a number
    key = +window.location.hash.match(/\d/g).join('');
    // Perform the transaction
    transaction = dbobject.transaction(['tasks'], 'readwrite');
    objectstore = transaction.objectStore('tasks');
    request = objectstore.delete(key);
    // Recreate the task list display
    transaction.oncomplete = function (evt) {
      tbody.innerHTML = '';
      displaytasks(dbobject);
    };
    transaction.onerror = errorhandler;
  }
};</pre><p>لقد عرفنا هنا المعالج <span style="font-family:courier new,courier,monospace;">oncomplete</span> للكائن <span style="font-family:courier new,courier,monospace;">transaction</span> وبما أن <span style="font-family:courier new,courier,monospace;">delete</span> لن يقدم نتيجة بعد.</p><h2>حذف الصفوف و مولّد المفاتيح</h2><p>كما في قواعد البيانات التقليدية فإن حذف الصف لا يعيد القيمة إلى مولد المفاتيح . يمكن أن ترى في الصورة 3 أن لدينا 16 صفًا في قاعدة البيانات. كما أن أعلى قيمة للمفتاح هي 30.</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" rel="external nofollow" href="https://academy.hsoub.com/uploads/monthly_2015_04/image003.png.30a5536f598e38f6b5e9060616c3e899.png"><img data-fileid="1290" class="ipsImage ipsImage_thumbnailed" src="https://academy.hsoub.com/uploads/monthly_2015_04/image003.thumb.png.3d1971dcd0d6b79efc533627c3bf9117.png"></a></p><p style="text-align: center;"><span style="color:#808080;">الصورة 3: لم يتم إعادة ضبط المفتاح بعد حذف الصف من قاعدة البيانات</span></p><p><shape id="Picture_x0020_3" o:spid="_x0000_i1027" type="#_x0000_t75" alt="The key generator isn’t reset when records are deleted from the database"><imagedata src="indexdb_files/image003.png" o:title="The key generator isn’t reset when records are deleted from the database"></imagedata></shape></p><p>من الممكن إعادة استخدام المفتاح للصف المحذوف. حيث يمكنك تخطي المفتاح المطلوب كما في المناقشة الثانية للعمليات <span style="font-family:courier new,courier,monospace;">add</span> أو <span style="font-family:courier new,courier,monospace;">put</span>.</p><h2>استخدام المؤشر لاستعادة صفوف متعددة</h2><p>تعتبر عملية استرجاع مجموعة من الصفوف مختلفة نوعاً ما. لهذا نحتاج إلى استخدام المؤشر. المؤشرات هي تقنيات عابرة تستخدم لإعادة مجموعة صفوف في قاعدة البيانات (المؤشرات معرفة تلقائياً من IndexedDB). يُبقي المؤشر امتداد العمليات المتزامنة حيث يتحرك بترتيب تصاعدي أو تنازلي معتمداً على وجهة فتح المؤشر. تستخدم المؤشرات عملية الدوران <span style="font-family:courier new,courier,monospace;">while</span>.</p><p>دعونا نلقي نظرة على كيفية استعادة مجموعة من النتائج مع المؤشر:</p><pre data-pbcklang="javascript" data-pbcktabsize="2" class="javascript ipsCode prettyprint">var displaytasks = function (database) {

  var transaction, objectstore, request;
  transaction = dbobject.transaction(['tasks'], 'readonly');
  objectstore = transaction.objectStore('tasks');
  request = objectstore.openCursor(IDBKeyRange.lowerBound(0), 'next');

  request.onsuccess = function (successevent) {
    var task, tbody = document.querySelector('#list tbody');
    if (request.result) {
      task = buildtask(request.result);
      tbody.appendChild(task);
      cursor.continue(); // advance to the next result
    }
  }
}</pre><p>مجدداً، قمنا بإنشاء عمليات للكائن واختيار تخزين الكائن. مافعلناه مختلفًا نوعاً ما لكن لفتح كائن المؤشر يمكن استخدام الطريقة <span style="font-family:courier new,courier,monospace;">openCursor</span>.</p><p>تقبل الطريقة <span style="font-family:courier new,courier,monospace;">openCursor</span> مُعاملين، كلاهما اختياري:</p><ul><li><strong>المدى <span style="font-family:courier new,courier,monospace;">range</span>:</strong> يجب أن يكون إما مفتاح أو مفتاح مدى.</li><li><strong>الاتجاه <span style="font-family:courier new,courier,monospace;">direction</span>:</strong> يجب أن يكون واحداً من الطرق <span style="font-family:courier new,courier,monospace;">'next'</span> أو <span style="font-family:courier new,courier,monospace;">'prev'</span> أو <span style="font-family:courier new,courier,monospace;">'nextunique'</span> أو <span style="font-family:courier new,courier,monospace;">'prevunique'</span>.</li></ul><h2>إنشاء مدى</h2><p>لإنشاء مفتاح مدى نحتاج إلى استخدام الواجهة <span style="font-family:courier new,courier,monospace;">IDBKeyRange</span> وجميع الطرق التي فيها ثابتة.</p><ul><li><span style="font-family:courier new,courier,monospace;">IDBKeyRange.lowerBound</span>: يحدد مفتاح منخفض فقط.</li><li><span style="font-family:courier new,courier,monospace;">IDBKeyRange.upperbound</span>: يحدد مفتاح مرتفع فقط.</li><li><span style="font-family:courier new,courier,monospace;">IDBKeyRange.bound</span>: يحدد مفتاح منخفض و مرتفع.</li><li><span style="font-family:courier new,courier,monospace;">IDBKeyRange.only</span>: يوافق على قيمة واحدة مشابهة تماماً لعملية get.</li></ul><p dir="RTL">لقد قمنا بتعيين أصغر قيمة مقيدة وهي الصفر باستخدام <span style="font-family:courier new,courier,monospace;">IDBKeyRange.lowerBound</span> ولم نقم بتعيين القيمة العليا. كل صف في قيمة المفتاح والتي هي اكبر من صفر سيتم إرجاعها وذلك في كل صف في مخزن الكائن <span style="font-family:courier new,courier,monospace;">tasks</span> ويتم ارجاع الأقدم أولاً.</p><p>يعيد <span style="font-family:courier new,courier,monospace;">IDBKeyRange.upperBound</span> جميع الكائنات مع قيمها والتي هي أقل مما هي عليه في المُعامل. على سبيل المثال يقوم  <span style="font-family:courier new,courier,monospace;">(IDBKeyRange.upperBound(20</span> بإعادة جميع الكائنات التي تحتوي على قيمة 20 أو أقل.</p><p>يعيد <span style="font-family:courier new,courier,monospace;">IDBKeyRange.bound</span> جميع قيم الكائنات المحددة المدى من أصغر تحديد الى الأعلى تحديداً. ولإعادة الصفوف بين 11 و20 على سبيل المثال نستخدم <span style="font-family:courier new,courier,monospace;">(IDBKeyRange.bound(11,20</span>.</p><p>لاتوجد أي طريقة تعيد عدد النتائج. و عوضاً عن ذلك تعيد المفاتيج ضمن المدى المحدد. دعونا نقول على سبيل المثال بأن مفاتيح تخزين الكائن هي 1, 2, 4, 8, 9, 11, 15, 16, 20, 21, 22,23. قد قمنا بحذف بعض الصفوف لذلك هناك فجوة في تسلسل المفاتيح.</p><ul><li>يعيد <span style="font-family:courier new,courier,monospace;">(IDBKeyRange.lowerBound(0</span> جميع الكائنات.</li><li>يعيد <span style="font-family:courier new,courier,monospace;">(IDBKeyRange.lowerBound(10</span> جميع الكائنات للمفاتيح 11, 15, 16, 20, 21, 22 , 23.</li><li>لا يعيد <span style="font-family:courier new,courier,monospace;">(IDBKeyRange.upperBound(0</span> أي كائن.</li><li>يعيد <span style="font-family:courier new,courier,monospace;">(IDBKeyRange.bound(0,20</span> جميع الكائنات ماعدا 21, 22, 23.</li></ul><p>بما أن مدى المفاتيح مقيد ضمن النتيجة فإنه من الممكن إظهارهم من خلال مناقشة جديدة باستخدام <span style="font-family:courier new,courier,monospace;">open</span>. يجب  أن تكون القيمة منطقية كما أن القيمة الافتراضية هي <span style="font-family:courier new,courier,monospace;">false</span>. لتخطي أول صف من النتيجة التي قمنا بها على سبيل المثال يمكن استخدام <span style="font-family:courier new,courier,monospace;">(IDBKeyRange.lowerBound(0, true</span>.</p><p>يختلف الأمر <span style="font-family:courier new,courier,monospace;">IDBKeyRange.bound</span> عن الآخرين إذ أنه يقبل مُعاملين إضافيين هُما: <span style="font-family:courier new,courier,monospace;">lowerOpen</span>  و<span style="font-family:courier new,courier,monospace;">upperOpen</span>. إذا أردنا عرض أول وآخر نتيجة من <span style="font-family:courier new,courier,monospace;">IDBKeyRange.bound</span> يجب علينا جعل القيمة صحيحة <span style="font-family:courier new,courier,monospace;">true</span> مرتين: <span style="font-family:courier new,courier,monospace;">(IDBKeyRange.bound(0, 10, true, true</span>.</p><h2>اختيار وجهة المؤشر</h2><p>يُشير المُعامل الثاني openCursor إلى وجهة المؤشر وأين يجب أن يتجه. باستخدام <span style="font-family:courier new,courier,monospace;">next</span> يعني بأن الصفوف سيتم ترتيبها حسب المفتاح بترتيب تصاعدي. أيضاً يمكننا إنشاء مفتاح مزدوج  باستخدام <span style="font-family:courier new,courier,monospace;">nextunique</span> و<span style="font-family:courier new,courier,monospace;">prevunique</span> وتعتبر هذه الطريقة مفيدة جداً عند العمل مع الخاصيات المفهرسة.</p><h2>إضافة علامة</h2><p>قمنا سابقاً باستعادة المُدخلات من خلال المفتاح ومدى المفتاح. ولكن لأجل عملية قائمة المهام يجب استعادة وترتيب الصفوف من خلال اسم المهمة والأولوية والتاريخ المستحق والحالة.</p><p><strong>ملاحظة:</strong> لاتدعم <span style="font-family:courier new,courier,monospace;">IndexedDBShim</span> فتح أو فهرسة المؤشرات. ستحتاج إلى وسلية أخرى لفعل ذلك.</p><p>فكر بالعلامات المفهرسة بطريقة سريعة ورتّب صفوفك في قاعدة البيانات. تسمح لك العلامات بمشاهدة الكائنات من خلال خصائصهم فضلاً عن مفاتيحهم.</p><p>لإضافة علامة لمخزن الكائن سنتحتاج الى استخدام طريقة <span style="font-family:courier new,courier,monospace;">createIndex</span>. ولأن إضافة العلامة تقوم بتغيير البنية سنحتاج إلى فعل ذلك يدوياً من خلال الحدث <span style="font-family:courier new,courier,monospace;">versionchange</span> واستخدام <span style="font-family:courier new,courier,monospace;">onupgradeneeded أيضا</span>. دعنا نقوم بتحديث الدالّة <span style="font-family:courier new,courier,monospace;">onupgradeneeded:</span></p><pre data-pbcklang="javascript" data-pbcktabsize="2" class="javascript ipsCode prettyprint">idb.onupgradeneeded = function (evt) {
  var tasks, transaction;
  dbobject = evt.target.result;

  if (evt.oldVersion &lt; 1) {
    tasks = dbobject.createObjectStore('tasks', {autoIncrement: true});
    // Create indexes on the object store.
    transaction = evt.target.transaction.objectStore('tasks');
    transaction.createIndex('by_task', 'task');
    transaction.createIndex('priority', 'priority');
    transaction.createIndex('status', 'status');
    transaction.createIndex('due', 'due');
    transaction.createIndex('start', 'start');
  }
};</pre><p>تقبل الطريقة <span style="font-family:courier new,courier,monospace;">createIndex</span> ثلاث مُعامِلات:</p><ul><li><span style="font-family:courier new,courier,monospace;"><strong>Name</strong></span> (مطلوب): اسم العلامة التي تريد اضافتها.</li><li><span style="font-family:courier new,courier,monospace;"><strong>keyPath</strong></span> (مطلوب): خاصية الكائن.</li><li><span style="font-family:courier new,courier,monospace;"><strong>optionalParameters</strong></span>: وهو قاموس يحتوي على الضبط يتكون من <span style="font-family:courier new,courier,monospace;">unique</span> و/أو <span style="font-family:courier new,courier,monospace;">multiEntry</span> للعلامة.</li></ul><p>أضفنا علامة مفهرسة للحقول <span style="font-family:courier new,courier,monospace;">task, priority, status, start, due</span>. يمكن أن تشارك هذه العلامات نفس الاسم و الخاصية التي تحملها.</p><p>يتم إدخال مخزن العلامات فقط للكائنات التي تحتوي خاصيات الفهرسة.</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" rel="external nofollow" href="https://academy.hsoub.com/uploads/monthly_2015_04/image004.png.8aa92910bcef2ecd843dc513214e92a3.png"><img data-fileid="1291" class="ipsImage ipsImage_thumbnailed" src="https://academy.hsoub.com/uploads/monthly_2015_04/image004.thumb.png.f1938e2a8e80f9be851d823c343f9d22.png"></a></p><p style="text-align: center;"><span style="color:#808080;">الصورة 4: انظر إلى علامة <span style="font-family:courier new,courier,monospace;">by_task</span> في الجدول في متصفح Opera</span></p><p><shape id="Picture_x0020_4" o:spid="_x0000_i1026" type="#_x0000_t75" alt="A look at the by_task index table in Opera"><imagedata src="indexdb_files/image004.png" o:title="A look at the by_task index table in Opera"></imagedata></shape></p><p>عند تغيير خاصية الصف عندها ستصبح تلك الخاصيات أكثر مرونة في الجدول، دعنا نلقي نظرة على الصفوف الأساسية في الفهرس. سنقوم بتحديث الدالّة <span style="font-family:courier new,courier,monospace;">displaytasks</span> من الأعلى.</p><h2>استعادة الصفوف من خلال علاماتهم</h2><p>سنقوم بفتح المؤشر لمخزن الكائن من خلال النسخة السابقة من الدالّة <span style="font-family:courier new,courier,monospace;">displaytasks</span>. وهنا سنحتاج لإضافة سطر جديد والذي سيعيد الفهرس <span style="font-family:courier new,courier,monospace;">by_task</span>. ثم سنقوم باستدعاء <span style="font-family:courier new,courier,monospace;">openCursor</span> كما في الشِفرة البرمجية التالية:</p><pre data-pbcklang="javascript" data-pbcktabsize="2" class="javascript ipsCode prettyprint">var displaytasks = function (database) {

  var transaction, objectstore, request, index;
  transaction = dbobject.transaction(['tasks'], 'readonly');
  objectstore = transaction.objectStore('tasks');
  // New line to select the index
  index = objectstore.index('by_task');
  // Our request opens a cursor on the index,
  // rather than the object store.
  request = index.openCursor(IDBKeyRange.lowerBound(0), 'next');
  request.onsuccess = function (successevent) {
    var task, tbody = document.querySelector('#list tbody');
    if (request.result) {
      task = buildtask(request.result);
      tbody.appendChild(task);
      cursor.continue();
    }
}</pre><p>ترتّب أيضاً العلامات القيم لكل خاصية. ستعيد الدالّة <span style="font-family:courier new,courier,monospace;">displaytasks</span> قائمة المهام مُرتبة أبجدياً.</p><h2>محدودية العلامات</h2><p>للأسف تفتقر IndexedDB لنوع البحث الذي يدعم جميع النصوص والذي يمكن أن تجده في قواعد البيانات SQL مثل MySQL وPostgreSQL. وعوضاً عن ذلك سنقوم بفلترة جميع النتائج لدينا باستخدام تعابير النمطية. دعنا نشاهد المثال الذي يستخدم نموذج بحث. سنقوم بانتزاع قيمة النموذج واستخدام تعبير نظامي عند الضغط على ارسال أمر البحث. ثم سنقوم باختبار المهمة للمطابقة.</p><pre data-pbcklang="javascript" data-pbcktabsize="2" class="javascript ipsCode prettyprint">var searchhandler, search = document.getElementById('search');

searchhandler = function (evt) {
  evt.preventDefault();
  var transaction, objectstore, index, request;
  transaction = dbobject.transaction(['tasks'], 'readwrite');
  objectstore = transaction.objectStore('tasks');
  index = objectstore.index('by_task');
  request = index.openCursor(IDBKeyRange.lowerBound(0), 'next');
  request.onsuccess = function (successevent) {
    var reg, cursor, task;
    reg = new RegExp(evt.target.find.value, "i");
    cursor = request.result;
    if (cursor !== null) {
      if (reg.test(cursor.value.task)) {
        task = buildtask(cursor);
      }
      cursor.continue();
    }
  }
}

search.addEventListener('submit', searchhandler);</pre><p><shape id="Picture_x0020_5" o:spid="_x0000_i1025" type="#_x0000_t75" alt="Filtering tasks with a regular expression search"><imagedata src="indexdb_files/image005.png" o:title="Filtering tasks with a regular expression search"></imagedata></shape></p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" rel="external nofollow" href="https://academy.hsoub.com/uploads/monthly_2015_04/image005.png.307c9ace778ceb64fc0dd28dd0be7032.png"><img data-fileid="1292" class="ipsImage ipsImage_thumbnailed" src="https://academy.hsoub.com/uploads/monthly_2015_04/image005.thumb.png.f69f650ccba40de80f4e066a79aef3c7.png"></a></p><p dir="RTL" style="text-align: center;"><span style="color:#808080;">الصورة 5 : فلترة المهام من خلال استخدام تعبير بسيط للبحث</span></p><p>تحتوي التعابير التي تقوم بالبحث على محدوديات. وبكل الأحوال البحث عن كلمة cafe لن يُطابق الكلمة café لأن الحرفان الأخيران في كلا الكلمتين غير متشابهين. و هنا يمكنك استخدام تقنية بسيطة لتخطي هذه المشكلة باستخدام تعبير نمطي ويقوم بالبحث تلقائياً عن caf فقط.</p><h2 dir="RTL">الخاتمة</h2><p>تقدم IndexedDB قدرة قاعدة البيانات الأساسية للمتصفح، كما تجعل بناء تطبيقات ويب تعمل في حالة الإتصال (online) وفي حالة الانفصال (offline) مُمكنا. يمكنك الاطلاع أكثر على هذا النوع من قواعد البيانات لأنه سيحسن كثيراً لديك فكرة عملهم.</p><p>في حال أردت تعلم أكثر حول المُدخلات والمخرجات لقاعدة البيانات IndexedDB. يمكنك قراءة <a rel="external nofollow" href="http://www.w3.org/TR/IndexedDB/">تخصيصات IndexedDB</a>. و هذا غير كافي للقراءة لأنه فقط مرجع تعريفي. يقدم أيضًا مطوروا شركة Mozilla بعض الشروحات حول <a rel="external nofollow" href="https://developer.mozilla.org/en-US/docs/IndexedDB/Basic_Concepts_Behind_IndexedDB">الفكرة من وراء IndexedDB</a> في حال كانت الفكرة من ورائها لا تزال مُبهمة لديك.</p><p> </p><p>ترجمة -وبتصرّف- للمقال: <a rel="external nofollow" href="https://dev.opera.com/articles/introduction-to-indexeddb/">An Introduction to IndexedDB</a> لصاحبته: <a rel="external nofollow" href="https://dev.opera.com/authors/tiffany-brown/">Tiffany Brown</a>.</p>
]]></description><guid isPermaLink="false">67</guid><pubDate>Sat, 18 Apr 2015 10:45:00 +0000</pubDate></item><item><title>&#x62A;&#x639;&#x631;&#x641; &#x639;&#x644;&#x649; &#x623;&#x643;&#x62B;&#x631; &#x627;&#x644;&#x623;&#x62E;&#x637;&#x627;&#x621; &#x634;&#x64A;&#x648;&#x639;&#x627; &#x644;&#x62F;&#x649; &#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; HTML5</title><link>https://academy.hsoub.com/programming/html/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A3%D9%83%D8%AB%D8%B1-%D8%A7%D9%84%D8%A3%D8%AE%D8%B7%D8%A7%D8%A1-%D8%B4%D9%8A%D9%88%D8%B9%D8%A7-%D9%84%D8%AF%D9%89-%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-html5-r7/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_03/html5-mistakes.jpg.e5641decac39dd71f1c2a9cbfea85a70.jpg" /></p>
<p dir="rtl">عادة ما يرتكب القادم الجديد إلى عالم HTML5 أخطاء عديدة ترجع إما لعدم فهمه للعناصر الجديدة أو الإفراط في استخدامها مكان العناصر القديمة. سنحاول في هذا المقال تسليط الضوء على أكثر الأخطاء شيوعا وكيفية تجنب الوقوع فيها.</p><h1 dir="rtl">لا تستخدم &lt;section&gt; كأداة للتغليف بدل &lt;div&gt;</h1><p dir="rtl">أحد أكثر الأخطاء شيوعا هو الاستبدال المفرط لكل عناصر &lt;div&gt; بعناصر &lt;section&gt; في شفرات HTML5 وخاصة لما يتعلق الأمر بعناصر &lt;div&gt; المستخدمة لأغراض تنسيقية styling. سابقا لدى استخدامنا لـ XHTML و HTML4 كنا نكتب الشفرات على النحو التالي:</p><p dir="rtl"> </p><pre class="html ipsCode prettyprint">&lt;!-- HTML 4-style code --&gt;
&lt;div id="wrapper"&gt;
  &lt;div id="header"&gt; 
    &lt;h1&gt;My super duper page&lt;/h1&gt;
    &lt;!-- Header content --&gt;
  &lt;/div&gt;
  &lt;div id="main"&gt;
    &lt;!-- Page content --&gt;
  &lt;/div&gt;
  &lt;div id="secondary"&gt;
    &lt;!-- Secondary content --&gt;
  &lt;/div&gt;
  &lt;div id="footer"&gt;
    &lt;!-- Footer content --&gt;
  &lt;/div&gt;
&lt;/div&gt;</pre><p>بعض ظهور HTML5 أصبح العديد يكتبونها على النحو التالي:</p><p> </p><pre class="html ipsCode prettyprint">&lt;!-- Don’t copy this code! It’s wrong! --&gt;
&lt;section id="wrapper"&gt;
  &lt;header&gt; 
    &lt;h1&gt;My super duper page&lt;/h1&gt;
    &lt;!-- Header content --&gt;
  &lt;/header&gt;
  &lt;section id="main"&gt;
    &lt;!-- Page content --&gt;
  &lt;/section&gt;
  &lt;section id="secondary"&gt;
    &lt;!-- Secondary content --&gt;
  &lt;/section&gt;
  &lt;footer&gt;
    &lt;!-- Footer content --&gt;
  &lt;/footer&gt;
&lt;/section&gt;</pre><p>وهو أمر خاطئ لأنه وبكل بساطة لا يعتبر عنصر &lt;section&gt; أداة تغليف wrapper، حيث أنه يتم استخدام هذا العنصر مع الأجزاء الدلالية للصفحة لبناء مخطط واضح المعالم لها، كما أنه من الواجب أن يحتوي على ترويسة heading. إن كان كل ما ترغب في القيام به هو إضافة نمط style لصفحتك فحاول أن تنفذه مباشرة على عنصر &lt;body&gt; ، أما لو احتجت عناصر إضافية للنمط الذي تود تنفيذه فعليك استخدام &lt;div&gt; في هذه الحالة وهو العنصر الأنسب لما يكون كل ما تحتاجه هو أداة لتنفيذ الأنماط.</p><p dir="rtl">بناء على ما سبق ذكره فإن الطريقة الصحيحة لكتابة الشفرة السابقة باستخدام HTML5 وبعض وظائف ARIA (ملاحظة: قد تحتاج إلى عنصر &lt;div&gt; واحد فقط بناء على التصميم الذي ترغب فيه) هو على النحو التالي:</p><pre class="html ipsCode prettyprint">&lt;body&gt;
  &lt;header&gt; 
    &lt;h1&gt;My super duper page&lt;/h1&gt;
    &lt;!-- Header content --&gt;
  &lt;/header&gt;
  &lt;div role="main"&gt;
    &lt;!-- Page content --&gt;
  &lt;/div&gt;
  &lt;aside role="complementary"&gt;
    &lt;!-- Secondary content --&gt;
  &lt;/aside&gt;
  &lt;footer&gt;
    &lt;!-- Footer content --&gt;
  &lt;/footer&gt;
&lt;/body&gt;</pre><p>إذا لم تكت تعلم ما هي العناصر التي يجب عليك استخدامها فيُمكنك الاستعانة بالصورة التالية التي ستسهل عليك الاختيار</p><p><a rel="external nofollow" href="http://www.webtuts.me/wp-content/uploads/2013/08/h5d-sectioning-flowchart.png"><img alt="h5d-sectioning-flowchart" src="http://www.webtuts.me/wp-content/uploads/2013/08/h5d-sectioning-flowchart.png"></a></p><h1 dir="rtl">لا تستخدم عنصر header ما لم يكن هناك حاجة إليه</h1><p dir="rtl">ملاحظة: في المقال الأصلي تم الحديث عن عنصري header و hgroup، وبما أنه تم <a rel="external nofollow" href="http://html5doctor.com/the-hgroup-element/">التخلص من هذا الأخير</a> من مواصفات HTML5  فلم أقم بتضمينه في الترجمة.</p><p dir="rtl">لا توجد أية معنى لإضافة عناصر إضافية إلى صفحتك ما لم يكن هناك حاجة لها، لكن رغم ذلك عادة ما نلحظ استخدام عنصر &lt;header&gt; لما لا تكون هناك أية حاجة إلى استخدامه. يُمكنك معرفة كيفية استخدام هذا العنصر بقراءتك <a rel="external nofollow" href="http://html5doctor.com/the-header-element/">لهذا المقال</a> والذي يُمكن تلخيصه في أن العنصر &lt;header&gt; يلعب دور عنصر مساعد أو مقدم لمحتوى الجزء الذي يحتويه.</p><p dir="rtl">وبما أنه يُمكن استخدام عنصر &lt;header&gt; أكثر من مرة واحدة في نفس الصفحة فإنه عادة ما تتم إساءة استخدامه على النحو التالي:</p><pre class="html ipsCode prettyprint">&lt;!-- Don’t copy this code! No need for header here --&gt;
&lt;article&gt;
  &lt;header&gt; 
    &lt;h1&gt;My best blog post&lt;/h1&gt;
  &lt;/header&gt;
  &lt;!-- Article content --&gt;
&lt;/article&gt;</pre><p>إن كان عنصر header الذي تستخدمه لا يحتوي سوى على عنصر رأسي heading element واحد فمن الأفضل تجنب استخدامه، حيث أن عنصر article سيضمن تضمين هذا العنصر الرأسي في مُخطط الصفحة document outline. وبما أنه سيحتوي عنصرا واحدا فقط (عكس ما تشير إليه مواصفات العنصر) فإنه من الأفضل كتابة الشفرة بشكل مبسط على النحو التالي:</p><pre class="html ipsCode prettyprint">&lt;article&gt; 
  &lt;h1&gt;My best blog post&lt;/h1&gt;
  &lt;!-- Article content --&gt;
&lt;/article&gt;</pre><h1>لا تُغلف كل قوائم الروابط باستخدام nav</h1><p dir="rtl">لم يعد من السهل -مع كل العناصر الجديدة التي تمت إضافتها إلى HTML5- اختيار العنصر الأنسب لكثرة الاختيارات المتاحة، لكنه في المقابل لا يجب علينا أن نُفرط في استخدام العناصر الدلالية الجديدة وهو أمر عادة ما نلاحظه مع العنصر nav والذي تنص مواصفاته على التالي:</p><blockquote><p dir="rtl">يُمثل عنصر nav قسما من الصفحة تقوم بالربط إلى صفحات أخرى أو إلى أجزاء أخرى من نفس الصفحة.</p><p dir="rtl">ملاحظة: لا يجب أن تكون كل مجموعات الروابط داخل عناصر &lt;div&gt;، يجب اقتصار استعمال هذا العنصر على كتل التصفح Navigation blocks الرئيسية فقط. فعلى سبيل المثال عادة ما يحتوي أسفل الصفحات footers على قوائم قصيرة لروابط لمختلف صفحات الموقع مثل قواعد استخدام المواقع، صفحة البداية وصفحة حقوق الملكية الفكرية. في مثل هذه الحالات يكفي استخدام عنصر footer لكنه يبقى استخدام عنصر nav ممكنا رغم أنه غير ضروري.</p><p dir="rtl"><a rel="external nofollow" href="http://www.whatwg.org/specs/web-apps/current-work/multipage/sections.html#the-nav-element">WHATWG HTML spec</a></p></blockquote><p dir="rtl">الكلمة المفتاحية في هذه المواصفات هي "الرئيسية"، قد نختلف فيما تعنيه هذه الكلمة على وجه التحديد، لكنه عادة ما يُقصد بها:</p><ul><li>روابط تصفح الموقع الرئيسية</li><li>محرك بحث الموقع</li><li>روابط تصفح الموقع الثانوية</li><li>روابط التنقل داخل الصفحة الواحدة (خاصة في الصفحات والمقالات الطويلة).</li></ul><p dir="rtl">بالرغم من أنه يصعب تمييز الصحيح من الخطأ في الكثير من الحالات إلا أنه يبدو بأنه من الأفضل تجنب استخدام nav في الحالات التالية:</p><ul><li>ترقيم الصفحات</li><li>الروابط الاجتماعية (قد يكون لهذا الأمر استثناءات خاصة إذا ما كانت هذه الروابط جزءا أساسيا في الصفحة مثلما هو الحال مع موقعي <a rel="external nofollow" href="https://about.me/">about me</a> و <a rel="external nofollow" href="http://flavors.me/">flavours</a>)</li><li>الوسوم أو التصنيفات في التدوينات</li><li>الروابط الثانوية</li><li>أسفل الصفحات (footers)</li></ul><p dir="rtl">إن لم تعرف ما إذا كان بإمكانك استخدام عنصر nav اسأل نفسك، هل الروابط التي تنوي تغليفها داخل عنصر nav هي وسيلة أساسية للانتقال داخل الصفحة أو داخل الموقع؟ يمكنك الاستعانة بالنقطتين التاليتين للإجابة على هذا السؤال:</p><ul><li>لا تستخدم nav ما لم تعتقد بأنه يُمكن استبدال الأمر بعنصر<a rel="external nofollow" href="http://krijnhoetmer.nl/irc-logs/whatwg/20091209#l-480"> &lt;section&gt; باستخدام عنصر hx</a></li></ul><ul><li>هل كنت ستضيف عنصر "اذهب مباشرة إلى" للوصول إليها لتحسين قابلية وصول الموقع؟</li></ul><p dir="rtl">إن كانت إجابتك بالنفي فإنه من الأجدر بك عدم استخدام عنصر nav.</p><h1 dir="rtl">أخطاء شائعة مع عنصر figure</h1><p dir="rtl">ليس من السهل إتقان استخدام عنصر figure (وعنصر figcaption الذي يلازمه). إليكم بعض الأخطاء الشائعة التي يقع الكثيرون لدى استعمالهما.</p><h2 dir="rtl">لا تستعمل figure مع جميع الصور</h2><p dir="rtl">كما سبق وأن أشرنا إليه ، لا توجد أية فائدة من كتابة شفرات إضافية ما لم يكن هناك داع لها، وهو نفس الأمر الذي يتكرر مع هذا العنصر أيضا. هناك من يقوم بتحويل جميع الصور إلى figure رغم أننا في غنى عن تغليف كل صورة في هذا العنصر، كلما تقوم به لدي قيامك بهذا الأمر هو إضافة شفرات إضافية لا تقدم أية إضافة للصفحة.</p><p dir="rtl">تحدد مواصفات HTML5 عنصر figure على النحو التالي:</p><blockquote><blockquote data-ipsquote="" data-cite="Quote" class="ipsQuote"><p dir="rtl">some flow content, optionally with a caption, that is self-contained and is typically referenced as a single unit from the main flow of the document.</p></blockquote></blockquote><p dir="rtl">بعبارة أخرى figure عبارة عن محتوى قائم بذاته يحتوي وصفا يتم إضافته إلى محتوى الصفحة رغم أنه ليس جزءا أساسيا فيها.</p><p dir="rtl">وهنا يبرز جمال عنصر figure حيث أنه بالإمكان تغيير مكانه في الصفحة إلى القائمة الجانبية sidebar مثلا دون الإخلال بمحتوى الصفحة.</p><p dir="rtl">إن كان ما تحاول وضعه داخل figure عبارة عن محتوى جمالي فقط لا يقدم أية إضافة للمحتوى، وإن لم يكن بالإمكان الإشارة إليه في محتوى صفحتك فإنه من المحتمل جدا أن لا يكون العنصر الواجب استخدامه هو figure. يُمكنك أيضا أن تسأل نفسك "هل هذه الصورة (أو غيرها) أساسية لفهم محتوى الصفحة" إن لم يكن جوابك بالإيجاب فقد لا يكون figure هو العنصر الأنسب لك (فكر في استخدام aside حينها). أما لو أجبت بالإيجاب فاسأل نفسك "هل يمكنني تغيير مكان هذه الصورة إلى ملف ملحق appendix ؟" إن كانت إجابتك بالنفي هنا أيضا فقد لا يكون عنصر figure هو الأنسب لك أيضا.</p><h2 dir="rtl">لا تستخدم figure مع شعار موقعك</h2><p dir="rtl">لا يصح أيضا استخدام figure مع شعارات المواقع أيضا. عادة ما نشاهد مثل هذه الشفرات الخاطئة في بعض المواقع:</p><pre class="html ipsCode prettyprint">&lt;!—Don't copy this code! It's wrong! --&gt;
&lt;header&gt;
  &lt;h1&gt;
    &lt;figure&gt;
      &lt;img src="/img/mylogo.png" alt="My company" /&gt;
    &lt;/figure&gt;
    My company name
  &lt;/h1&gt;
&lt;/header&gt;
&lt;!—Don't copy this code! It's wrong! --&gt;
&lt;header&gt; 
  &lt;figure&gt;
    &lt;img src="/img/mylogo.png" alt="My company" /&gt;
  &lt;/figure&gt;
&lt;/header&gt;</pre><p>ليس لدينا ما نقوله هنا سوى أن استخدام figure للشعارات هو استخدام خاطئ. يجب عليك تجنب استخدام figure ما لم تتم الإشارة إلى المحتوى المراد تغليفه في هذا العنصر داخل الصفحة. وبما أنه من السهل أن نجزم بأنه لن تتم الإشارة إلى شعار موقعك في أي جزء من أجزاء صفحتك، فإن كل ما تحتاجه هو:</p><pre class="html ipsCode prettyprint">&lt;header&gt; 
  &lt;h1&gt;My company name&lt;/h1&gt;
  &lt;!-- More stuff in here --&gt;
&lt;/header&gt;</pre><h2>لا يقتصر استخدام figure على الصور فقط</h2><p dir="rtl">الاعتقاد السائد هو أن استخدام عنصر figure يقتصر على الصور فقط وهو اعتقاد خاطئ حيث أنه من المُمكن استخدام figure مع الفيديوهات، الملفات الصوتية، الرسوم البيانية (على هيأة SVG مثلا)، الاقتباسات، الجداول، الشفرات المصدرية وغيرها. يعني أي محتوى يساعد على فهم المحتوى الرئيسي للصفحة وإعطاء تفاصيل إضافية حوله يصلح أن يكون داخل عنصر figure.</p><p dir="rtl">يُمكن معرفة المزيد حول عنصر figure بقراءتك <a rel="external nofollow" href="http://html5doctor.com/the-figure-figcaption-elements/">لهذا المقال</a>.</p><h1 dir="rtl">استخدام خاصية type غير الضرورية</h1><p dir="rtl">استخدام خاصية type شائعة جدا ما بين المبرمجين، رغم أنه ليس خطأ في حد ذاته، إلا أنه من الأفضل تجنبه.</p><p dir="rtl">ليس من الضروري لدى استخدام HTML5 التصريح بنوع عنصري script و style. قد لا يكون من السهل التخلص من الأمر خاصة إن كان إضافة هذه الخاصية يتم بشكل آلي خاصة لدى استخدام أنظمة إدارة المحتوى إلا أنه لا توجد أية حاجة ماسة لاستخدامها لما تقوم بكتابة كامل شفرة تطبيقك بشكل يدوي لأنه وبكل بساطة تتوقع جميع المتصفحات أن تكون السكربتات التي تستخدمها من نوع javascript وكل الأنماط من نوع css، وعليه فإنك لن تحتاج إلى كتابة التالي:</p><pre class="html ipsCode prettyprint">&lt;!-- Don’t copy this code! It’s attribute overload! --&gt;
&lt;link type="text/css" rel="stylesheet" href="css/styles.css" /&gt;
&lt;script type="text/javascript" src="js/scripts.js"&gt;&lt;/script&gt;</pre><p>بل كل ما تحتاجه هو</p><pre class="html ipsCode prettyprint">&lt;link rel="stylesheet" href="css/styles.css" /&gt;
&lt;script src="js/scripts.js"&gt;&lt;/script&gt;</pre><p>كما أننا لم نعد في حاجة إلى كتابة الكثير للإشارة إلى نوعية الترميز المستخدم في الصفحة character set إضافة إلى أمور أخرى لم يعد هناك حاجة إليها ستجدها مشروحة بشكل مفصل في <a rel="external nofollow" href="http://diveinto.html5doctor.com/semantics.html">هذا المقال</a>.</p><h1 dir="rtl">استخدامات خاطئة لبعض خصائص النماذج</h1><p dir="rtl">كما سبق وأن أشرنا إليه، يوفر <a rel="external nofollow" href="http://www.webtuts.me/html5-forms-introduction-new-attributes/">HTML5 خصائص عديدة للنماذج</a>، ويرافق استخدام هذه الخصائص أخطاء يجب تجنبها:</p><h3 dir="rtl">الخصائص المنطقية</h3><p dir="rtl">العديد من الخصائص الجديدة في نماذج HTML5 هي خصائص منطقية، ونعني بذلك بأنه تتم إضافة سلوك معين للنموذج أو لعنصر ما بمجرد إضافة هذا العنصر إليه، ومن بين هذه الخصائص المنطقية نجد كلا من autofocus، autocomplete و required.</p><p dir="rtl">قد لا يكون هذه المشكل كثير الشيوع، إلا أن هناك من يستخدم هذه الخصائص المنطقية (عنصر required مثلا) على النحو التالي:</p><pre class="html ipsCode prettyprint">&lt;!-- Don’t copy this code! It’s wrong! --&gt;
&lt;input type="email" name="email" required="true" /&gt;
&lt;!-- Another bad example --&gt;
&lt;input type="email" name="email" required="1" /&gt;</pre><p>لكن ماذا لو أردت "العبث" بالشفرة السابقة قليلا وأعطيت قيمة false لخاصية required، ما الذي تتوقع أن يقوم به المتصفح في هذه الحالة؟</p><pre class="html ipsCode prettyprint">&lt;!-- Don’t copy this code! It’s wrong! --&gt;
&lt;input type="email" name="email" required="false" /&gt;</pre><p>على غير ما تتوقع فإن المتصفح وبمجرد أن يلاحظ وجود خاصية required فإنه يقوم بجعل العنصر الذي تمت إضافته إليه ضروريا رغم أنك أعطيت الخاصية قيمة false.</p><p dir="rtl">هناك 3 صيغ لاستخدام الخصائص المنطقية مع HTML5 (يتم استخدام الصيغتين الثانية والثالثة مع XHTML):</p><pre class="html ipsCode prettyprint">required
required=""
required="required"</pre><p>وأفضل طريقة لكتابة الشفرة السابقة هي على النحو التالي:</p><pre>&lt;input type="email" name="email" required /&gt;</pre><h1 dir="rtl">خلاصة</h1><p dir="rtl">استعرضنا في هذا المقال بعضا من الأخطاء الأكثر شيوعا مع HTML5. بطبيعة الحال فإنه يستحيل حصر كل هذه الأخطاء، وبالتالي إن كانت هناك أخطاء أخرى سبق وأن شاهدتها أكثر من مرة فلا تتردد في مشاركتها معنا في التعليقات.</p><p dir="rtl">ترجمة -وبتصرف- للمقال <a rel="external nofollow" href="http://html5doctor.com/avoiding-common-html5-mistakes/">Avoiding common HTML5 mistakes</a> لصاحبه <a rel="external nofollow" href="https://twitter.com/Rich_Clark">Richard Clark</a></p>
]]></description><guid isPermaLink="false">7</guid><pubDate>Mon, 26 Aug 2013 15:13:00 +0000</pubDate></item><item><title>HTML5 &#x648;&#x627;&#x644;&#x648;&#x64A;&#x628; &#x627;&#x644;&#x62F;&#x644;&#x627;&#x644;&#x64A;</title><link>https://academy.hsoub.com/programming/html/html5-%D9%88%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%AF%D9%84%D8%A7%D9%84%D9%8A-r6/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_03/HTML5-Semantic-logos_480x300.png.c57e77e04614838fdde05a4f82ee3a1c.png" /></p>

<p dir="rtl">
	 أكثر الإثارة التي تصحب عادة الحديث حول HTML5 تدور عادة حول الواجهات البرمجية الجديدة ويتعلق الأمر بكل من Local Storage، Application Cache، WebWorkers، الرسم ثنائي الأبعاد وما شابه. لكن يجب علينا أن لا نتجاهل بأن HTML5  يحمل في طياته 30 عنصرا جديدا لتعليم mark up المُستندات والتطبيقات مما يرفع عدد العناصر المتوفرة بشكل كلي إلى أكثر من 100 عنصر.
</p>

<p dir="rtl">
	باستثناء بعض الأمثلة و<a href="http://www.brucelawson.co.uk/2011/html5-and-hollow-demos/" rel="external nofollow">العروض الجوفاء</a>، فإن أغلب التطبيقات المبنية بشكل أساسي على Javascript أو حتى التطبيقات المُغالية في مبادئ Web 2.0 ستحتوي على نصوص تحتاج أن يتم تعليمها بشكل حساس. دعونا نلقي نظرة على بعض العناصر الجديدة لتضمن بأن مشاريعك القادمة ستكون دلالية Sementic مثلما ستكون تفاعلية interactive.
</p>

<p dir="rtl">
	ما ستلاحظه طيلة هذا المقال هو أنه تم تصميم دلالية HTML5 لتقوم بتمديد ما يستطيع HTML القيام به، مع إتاحة مستخدمي المتصفحات القديمة الوصول إلى المُحتوى . سنرى أيضا بأن التعليمات الدلالية Sementic Markup ليس أمرا "من الجيد القيام به" فحسب وإنما يُعتبر حجز الزاوية لما يتعلق الأمر بتطوير تطبيقات الويب لأنها الآلية التي تسمح بتعزيز قابلية الوصول (Accessibility)، القابلية للبحث  (searchability)، التدويل (internationalization) والتشغيل البيني (interoperability).
</p>

<p dir="rtl">
	اللغات البشرية كالإنجليزية وبالرغم  من مفرداتها التي تُعد بالملايين فإنه لا يُمكنها أن تُعبر عن جميع الأفكار دون أن يكون هناك لُبس فيها، وبالتالي فإنه مع 100 مُفردة التي يُمكننا استخدامها في HTML فإننا سنجد أنفسها في حالات لا نعرف فيها على وجه اليقين أي عُنصر يجب علينا استخدامه لأي جزء من المُحتوى، في هذه الحالة كل ما عليك القيام به هو اختيار واحد واستخدامه بشكل متناسق في كامل الموقع.
</p>

<p dir="rtl">
	 
</p>

<h1 dir="rtl">
	بعض عناصر العرض لم يعد لها وجود
</h1>

<p dir="rtl">
	بعض عناصر العرض مثل center، font أو big أصبحت مهجورة في وقتنا الحاضر، حيث أنه تم استبدال أدوارها بـ CSS، لكن ذلك لا يعني بأنه يجب عليك أن تُسارع لإعادة كتابة كل تلك الصفحات القديمة التي كانت تستخدمها لأنه وبالرغم من كونها مهجورة ستقوم المُتصفحات بعرضها بشكل صحيح، حيث أن HTML5 دائما ما تهدف إلى توفير حلول جديدة دون أن تخل بالحلول الحالية.
</p>

<p dir="rtl">
	ولنفس الأسباب تم التخلص من بعض خصائص العرض التي كانت متوفرة من قبل في بعض العناصر مثلما هو عليه الحال مع خاصية align في عنصري img وtable ، خاصية background  في عنصر body وخاصية bgcolor في عنصر table.
</p>

<p dir="rtl">
	العنصر "الشرير" frame أيضا مُغيب في HTML5 حيث أنه كان يُسبب مشاكل في قابلية الاستخدام وقابلية الوصول، لكن لو كانت لديك حاجة ماسة إلى استخدامه فكل ما عليك القيام به هو استخدام DOCTYPE أقدم لتبقى صفحاتك صحيحة من حيث البنية.
</p>

<p dir="rtl">
	يُمكنك أن تجد قائمة كاملة بكل العناصر والخواص التي تم حذفها على <a href="http://www.w3.org/TR/html5-diff/#absent-elements" rel="external nofollow">موقع W3C</a>.
</p>

<h1 dir="rtl">
	تمت إعادة تعريف بعض عناصر العرض لتصبح دلالية
</h1>

<p dir="rtl">
	لم يتم التخلص من جميع عناصر العرض، خضع بعضها لبرنامج إعادة تأهيل شامل وخرجت منه بخواص دلالية جديدة. فعلى سبيل المثال لم يعد عنصر small يعني "استخدم حجم خط أصغر" رغم أنه سيتم عرضه على هذا النحو في ملفات الأنماط الخاصة بالمتصفحات، حيث أنه أصبح يُمثل <a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/text-level-semantics.html#the-small-element" rel="external nofollow">تعليقات جانبية</a>، مثل تعليقات Small Print:
</p>

<p dir="rtl">
	يتم استخدام Small print في كل من تصريحات إخلاء المسؤولية، المحاذير، القيود القانونية وحقوق الملكية الفكرية، كما تستخدم أيضا لنسب الأعمال إلى أصحابها أو فيما يتعلق بالتراخيص.
</p>

<p dir="rtl">
	بعض عمليات إعادة التعريف قد تبدو مبالغا فيها، فإن كان بإمكان تفهم إعادة تعريف عنصر  &lt;b&gt;(أو عنصر &lt;i&gt;) والذي تم بشكل في غاية الدقة (والذي تشوبه بعض الغرابة)، إلا أن إعادة تعريف <a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/text-level-semantics.html#the-u-element" rel="external nofollow">بعض العناصر</a> كعنصر &lt;u&gt; قد تصيبك بالدوار:
</p>

<blockquote>
	<p dir="rtl">
		The u element [now] represents a span of text with an unarticulated, though explicitly rendered, non-textual annotation, such as labeling the text as being a proper name in Chinese text (a Chinese proper name mark), or labeling the text as being misspelt.
	</p>
</blockquote>

<p dir="rtl">
	يُمكن قراءة المزيد <a href="http://www.w3.org/TR/html5-diff/#changed-elements" rel="external nofollow">حول العناصر والخصائص التي تم تحديثها</a> على موقع W3C.
</p>

<h1 dir="rtl">
	عناصر دلالية جديدة وجذابة
</h1>

<p dir="rtl">
	كلنا سمعنا عن عنصري video و audio الشهيرين. عنصر canvas أيضا شهير خاصة بسبب سماحه بتصميم <a href="http://dev.opera.com/articles/view/an-introduction-to-webgl/" rel="external nofollow">رسوم ثلاثية الأبعاد بالاستعانة بـ WebGL</a> والتي تسمح لمصممي الألعاب بنقل ألعابهم إلى الويب. ومثل عناصر img فإن هذه العناصر الجديدة تقوم بتضمين مُحتوى من مصادر أخرى سواء كانت ملفات، بيانات أو JavaScript.
</p>

<p dir="rtl">
	لكن على خلاف img فإن هذه العناصر لديها وسوم فتح وإغلاق مما يسمح بتوفير نوع من التراجع Fallback، وعليه فإنه سيكون بالإمكان توفير محتوى بديل للمتصفحات التي لا تدعم canvas ، ويُمكن لصورة مثلا أن تلعب دور التراجع لعنصر canvas، كما يُمكن لملف Flash أن يلعب دور التراجع لعنصر video وهذه التقنية تُسمى بتقنية "<a href="http://camendesign.com/code/video_for_everybody" rel="external nofollow">الفيديو للجميع</a>".
</p>

<p dir="rtl">
	عنصرا source و track هما عنصران فارغان (من دون أي وسم إغلاق) ويأتيان كذرية (children) لعنصري video أو audio.
</p>

<p dir="rtl">
	يتم إعطاء عنصر source ملفات بتراميز مُختلفة، ويستعمل كل عنصر منها ملفا مختلفا (WebM، MP4، Ogg Theora) وسيقوم المتصفح بتشغيل أول هذه الملفات التي يُحسن التعامل معها:
</p>

<pre class="html ipsCode prettyprint prettyprinted" style="">
<span class="tag">&lt;audio</span><span class="pln"> </span><span class="atn">controls</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;source</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">bieber.ogg</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">audio/ogg</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;source</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">bieber.mp3</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">audio/mp3</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="com">&lt;!-- fallback content: --&gt;</span><span class="pln">
    Download </span><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">bieber.ogg</span><span class="tag">&gt;</span><span class="pln">Ogg</span><span class="tag">&lt;/a&gt;</span><span class="pln"> or </span><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">bieber.mp3</span><span class="tag">&gt;</span><span class="pln">MP3</span><span class="tag">&lt;/a&gt;</span><span class="pln"> formats.
</span><span class="tag">&lt;/audio&gt;</span></pre>

<p>
	في هذا المثال، سيقوم كل من Opera، Firefox وChrome بتحميل وتشغيل ملف Ogg ، في حين سيفضل Internet Explorer و Safari ملف MP3. يُمكن لمتصفح Chrome أن يُشغل كلا من Ogg وMP3 لكن المتصفحات ستقوم بتشغيل أول ملف تُحسن التعامل معه حسب الترتيب الذي وردت عليه. التراجع الذي نوفره هنا والذي يظهر قبل وسم الإغلاق يُوفر رابطا لتحميل الملف وتشغيله على جهازك باستخدام قارئ الصوتيات المُفضل لديك، كما أنه لا يظهر شوى على المُتصفحات التي لا يُمكنها قراءة الوسائط المُتعددة بشكل مُباشر.
</p>

<p dir="rtl">
	أما فيما يخص الفيديوهات فإنه بإمكانك تضمين ملف Flash على Youtube كنوع من التراجع:
</p>

<pre class="html ipsCode prettyprint prettyprinted" style="">
<span class="tag">&lt;video</span><span class="pln"> </span><span class="atn">controls</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;source</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">best-video-ever.webm</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">video/webm</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;source</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">best-video-ever.mp4</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">video/mp4</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="com">&lt;!-- fallback content: --&gt;</span><span class="pln">
    </span><span class="tag">&lt;iframe</span><span class="pln"> </span><span class="atn">width</span><span class="pun">=</span><span class="atv">"480"</span><span class="pln"> </span><span class="atn">height</span><span class="pun">=</span><span class="atv">"360"</span><span class="pln">
      </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"http://www.youtube.com/embed/xzMUyqmaqcw?rel=0"</span><span class="pln">
      </span><span class="atn">frameborder</span><span class="pun">=</span><span class="atv">"0"</span><span class="pln"> </span><span class="atn">allowfullscreen</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="tag">&lt;/iframe&gt;</span><span class="pln">
</span><span class="tag">&lt;/video&gt;</span><span class="pln"> </span></pre>

<p dir="rtl">
	بهذه الطريقة سيصبح بإمكان مستخدمي المُتصفحات القديمة مثل IE6-8 أن يُشاهدوا الفيديو على Youtube (إن كانت مُتصفحاتهم تدعم Flash)، وسيكون بمقدورهم الوصول إلى تلك الفيديو. في حين سيحصل مستخدمو المتصفحات الأحدث على النسخة المُضمنة في الموقع من الفيديو، وبالتالي سيحصل الجميع على المحتوى الذي قدموا من أجله إلى موقعك.
</p>

<p dir="rtl">
	يُعتبر عنصر track إضافة جديدة إلى عائلة HTML5 وهو مدعوم على كل من Opera، Chrome وIE. يقوم هذا العنصر بالربط إلى ملف نصي يحتوي نصا وتوقيتا، يتم استخدامها لعرض الترجمة الفورية للفيديو وهي خاصية مفيدة جدا ليس فقط للذين يُعانون من مشاكل في السمع، بل أيضا للذين لا يتقنون اللغة التي تُعرض فيها الفيديو.
</p>

<h1 dir="rtl">
	الدلالية والتدويل
</h1>

<p dir="rtl">
	قد يبدو هذا الأمر أقل أهمية من الوسائط المُتعددة لكن الأمر ليس كذلك بحكم أن الشبكة العنكبوتية العالمية ليس مُجرد محتويات باللغة الإنجليزية، بل أنها تستعمل أيضا أنظمة كتابة مُختلفة عن نظام الكتابة في اللغة الانجليزية.
</p>

<p dir="rtl">
	فبعض اللغات كالعربية والعبرية هي لغات تكتب من اليمين إلى اليسار على عكس اللغات الأوروبية والتي تُكتب من اليسار إلى اليمين. قد لا يشكل هذا الأمر أي إشكال على الصفحات التي تحتوي نظام كتابة واحد، لكن الأمر مُختلف على الصفحات التي تحتوي نظامي الكتابة في آن واحد، حيث أنه يجب على المُتصفح أن يقرر أين يتوجب عليه أن وضع علامات التنقيط، أزرار القوائم وأرقامها وما إلى ذلك. عادة ما تُبلي المُتصفحات بلاء حسنا باستخدامها للخوارزميات ثنائية الاتجاه الخاصة بـ Unicode لكنها تخطئ في بعض الحالات، وهو ما يصعب من مهمة فهم المحتوى.
</p>

<p dir="rtl">
	يوفر HTML5 عنصر bdi والذي يسمح للكتاب أن يقوموا بتجاوز الخوارزمية ثنائية الاتجاه آنفة الذكر لجعل نصوصهم أكثر سهولة للفهم. لوصف أوفى للمشكل ولمعرفة الطريقة التي يقوم العنصر bdi بحلها ألق نظرة على هذا المقال <a href="http://rishida.net/blog/?p=564" rel="external nofollow">HTML5’s New bdi Element</a> لكاتبه <a href="https://twitter.com/r12a" rel="external nofollow">Richard Ishida</a> المسؤول عن التدويل لدى W3C.
</p>

<p dir="rtl">
	بعض اللغات لا تملك أبجديات تقليدية بالمرة، والتي تُعبر عن أفكار بدل الأصوات، في بعض الحالات سيحتاج الكاتب بهذه اللغات إلى إضافة تنبيهات لتسهيل قراءة الكلمات خاصة مع الكلمات الشاذة أو الأحرف الغريبة، ويتم ذلك عادة بتوفير نص موازٍ بخص صغير فوق الحرف المعني بالأمر. عادة ما كان يتم القيام بذلك في المطبوعات باستخدام خط صغير ذي حجم 5 نقاط يُسمى « ruby » ، ولهذا يُوفر HTML5 على 3 عناصر جديدة للقيام بذلك، ويتعلق الأمر بكل من ruby، rt وrp.
</p>

<p dir="rtl">
	للمزيد من المعلومات حول الأمر، أقرأ المقال التالي: <a href="http://daniemon.com/blog/the-html5-ruby-element/" rel="external nofollow">The HTML5 ruby Element in Words of One Syllable or Less</a>
</p>

<h1 dir="rtl">
	الدلالية الهيكلية
</h1>

<p dir="rtl">
	أغلب المُطورين على علم بأن HTML5 يوفر العديد من العناصر التي تسمح بوصف أجزاء مُختلفة من صفحات الويب مثل header، footer، nav، section، article، aside وغيرها. تم إنشاء هذه العناصر لأن المُطورين أمثالنا رغبوا في وجودها. قد تتساءل كيف عرف مطورو HTML5 العناصر التي نرغب فيها؟ كل ما في الأمر أن <a href="https://developers.google.com/webmasters/state-of-the-web/?csw=1" rel="external nofollow">Google قامت سنة 2005 بتحليل مليار صفحة</a> لمعرفة ما هي المُعرفات id والأصناف class التي كان المُطورون يستخدمونها مع عناصر div في تلك الصفحات. كما قامت <a href="http://dev.opera.com/articles/view/mama-markup-report-part-2/" rel="external nofollow">Opera MAMA</a>  سنة 2008 بتحليل 3 ملايين URL لمعرفة أكثر <a href="http://devfiles.myopera.com/articles/572/classlist-url.htm" rel="external nofollow">أسماء الأصناف انتشارا</a>  و<a href="http://devfiles.myopera.com/articles/572/idlist-url.htm" rel="external nofollow">المعرفات الأكثر شيوعا</a> على الإنترنت. كشفت هذه التحليلات بأن المطورين رغبوا في تعليم بعض أجزاء صفحاتهم لكن لم يكن لديهم خيار سوى استخدام عنصر div والذي أضافوا إليها أصنافا أو مُعرفات.
</p>

<p dir="rtl">
	كما سبق ذكره فإننا لن نتعمق في جميع هذه العناصر في هذا المقال، لكن يُمكنكم أن تجدوا تفاصيل كثيرة حولها على موقع <a href="http://html5doctor.com/article-archive/" rel="external nofollow">HTML5Doctor</a>.
</p>

<p dir="rtl">
	تم تصميم هذه العناصر الدلالية الجديدة لتوفر مبدأ التراجع الرشيق، فعلى سبيل المثال انظروا كيف يتم وصف عنصر  figure <a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/grouping-content.html#the-figure-element" rel="external nofollow">في مواصفات HTML5</a>:
</p>

<blockquote>
	<blockquote class="ipsQuote" data-cite="Quote" data-ipsquote="">
		<div class="ipsQuote_citation">
			اقتباس
		</div>

		<div class="ipsQuote_contents ipsClearfix">
			<p dir="rtl">
				The figure element represents some flow content, optionally with a caption, that is self-contained and is typically referenced as a single unit from the main flow of the document.
			</p>

			<p dir="rtl">
				The element can thus be used to annotate illustrations, diagrams, photos, code listings, etc…
			</p>
		</div>
	</blockquote>
</blockquote>

<p dir="rtl">
	 لم يأت هذا العنصر بأية أفكار جديدة حيث سبق لـ HTML3 أن اقترح <a href="http://www.w3.org/MarkUp/html3/figures" rel="external nofollow">عنصر fig</a>  لكنه لم يتم قبوله في مواصفات HTML3.2 والذي كان يُستعمل على النحو التالي:
</p>

<pre class="html ipsCode prettyprint prettyprinted" style="">
<span class="tag">&lt;FIG</span><span class="pln"> </span><span class="atn">SRC</span><span class="pun">=</span><span class="atv">"nicodamus.jpeg"</span><span class="tag">&gt;</span><span class="pln">
   </span><span class="tag">&lt;CAPTION&gt;</span><span class="pln">Ground dweller: </span><span class="tag">&lt;I&gt;</span><span class="pln">Nicodamus bicolor</span><span class="tag">&lt;/I&gt;</span><span class="pln"> builds silk snares</span><span class="tag">&lt;/CAPTION&gt;</span><span class="pln">
   </span><span class="tag">&lt;P&gt;</span><span class="pln">A small hairy spider.
   </span><span class="tag">&lt;CREDIT&gt;</span><span class="pln">J. A. L. Cooke/OSF</span><span class="tag">&lt;/CREDIT&gt;&lt;/P&gt;</span><span class="pln">
</span><span class="tag">&lt;/FIG&gt;</span></pre>

<p dir="rtl">
	هناك مُشكل كبير مع هذه الطريقة، حيث أنه وعلى المُتصفحات التي لا تدعم fig (ولا يوجد أي متصفح يدعمها) لن يتم عرض الصورة لأن  المتصفحات ستقوم بتجاهل عنصر fig بشكل كامل، بل كل ما سيتم عرضه هو مُحتوى عنصر credit لأنه عبارة عن نص، وبالتالي ستحصل على وصف دون الصورة في المتصفحات القديمة.
</p>

<p dir="rtl">
	لكن مع HTML5 الوضع مُختلف، حيث أننا سنقوم بكتابة نفس المثال على النحو التالي:
</p>

<pre class="html ipsCode prettyprint prettyprinted" style="">
<span class="tag">&lt;figure&gt;</span><span class="pln">
</span><span class="tag">&lt;img</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"nicodamus.jpeg"</span><span class="tag">&gt;</span><span class="pln">
   </span><span class="tag">&lt;figcaption&gt;</span><span class="pln">
      </span><span class="tag">&lt;p&gt;</span><span class="pln">Ground dweller: </span><span class="tag">&lt;i&gt;</span><span class="pln">Nicodamus bicolor</span><span class="tag">&lt;/i&gt;</span><span class="pln"> builds silk snares.</span><span class="tag">&lt;/p&gt;</span><span class="pln">
      </span><span class="tag">&lt;p&gt;</span><span class="pln">A small hairy spider.
      </span><span class="tag">&lt;small&gt;</span><span class="pln">J. A. L. Cooke/OSF&lt;/small&amp;gt</span><span class="tag">&lt;/p&gt;</span><span class="pln">
   </span><span class="tag">&lt;/figcaption&gt;</span><span class="pln">
</span><span class="tag">&lt;/figure&gt;</span></pre>

<p dir="rtl">
	على خلاف عنصر HTML3 الذي لم يتم قبوله فإن الطريقة التي نكتب بها المثال باستخدام HTML5 متوافقة مع الإصدارات القديمة من المُتصفحات، حيث أن المتصفحات التي لا "تعرف" عنصر figure ستقوم بعرض الصورة والنص الموجود في العنصر figcaption (مثلما كان سيتم عرض مُحتوى عنصر credit). لاحظوا بأننا نستخدم في هذا المثال عنصر small الذي تمت إعادة تعريفه بدل استحداث عنصر credit جديد. تذكروا دائما أنه يتم استعمال عنصر small <a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/text-level-semantics.html#the-small-element" rel="external nofollow">لنسب الأعمال إلى أصحابها</a>.
</p>

<p dir="rtl">
	يُوفر HTML5 عنصر figcaption جديدا. بداية كانت هناك رغبة لإعادة استخدام عنصر caption مثلما تم اقتراحه في HTML3، لكن كانت هناك مشاكل "إرثية" (Legacy problems) بحكم أن caption كانت تُستخدم سابقا كأحد ذرية عنصر table فقط.
</p>

<p dir="rtl">
	أحد مبادئ التصميم التي بُني عليها HTML5  هو أنه يجب على كل خاصية جديدة أن توفر تراجعا رشيقا، وإن لم يكن بإمكان العنصر القيام بذلك فإنه يجب عليه أن يسمح بتوفير محتوى تراجعي Fallback content، حيث أنه يتم تفضيل استخدام عناصر موجودة بدل استحداث عناصر جديدة، لكنه بحكم أن HTML5 لغة برمجية عملية فإنه لما يكون استحداث عنصر جديد أمرا ضروريا فإنها تقوم بذلك.
</p>

<h1 dir="rtl">
	دلالية تفاعلية
</h1>

<p dir="rtl">
	لا تؤثر العناصر الهيكلية لـ HTML5 على مظهر الصفحات في المتصفحات كثيرا، إلا أن التطبيقات التي تُبنى على المتصفحات (خاصة تطبيقات قراءة الشاشات) قد شرعت في استخدامها (للمزيد حول الأمر: <a href="http://accessibleculture.org/articles/2011/04/html5-aria-2011/" rel="external nofollow">" HTML5, ARIA Roles, and Screen Readers in March 2011</a>" و "<a href="http://www.accessibleculture.org/articles/2011/10/jaws-ie-and-headings-in-html5/" rel="external nofollow"> JAWS, IE and Headings in HTML5</a>.")
</p>

<p dir="rtl">
	بعض العناصر الأخرى لديها تأثير على شكل الصفحات، فعلى سبيل المثال العنصر details عبارة عن عنصر تفاعلي والذي يلعب دور نافذة صغيرة يحصل المستخدم لدى النقر عليها على بيانات أو خواص إضافية.
</p>

<p dir="rtl">
	ستقوم أغلب المُتصفحات إظهار هذا العنصر كصندوق قابل للتوسع، بعبارة أخرى لما يقوم المُستخدم بالنقر على أيقونة يقوم المُتصفح بتوليدها (كمثلث أو كسهم تحميل) أو حتى على كلمة "تفاصيل" (والتي سيكون بإمكان المُطور استبدالها في العنصر summary الذي سيكون ابنا مُباشرا للعنصر details)، وسيتم فتح الصندوق بشكل منسدل مظهرا التفاصيل التي يحتويها. من المُمكن أن يكون المحتوى عبارة عن وصف كامل للصورة أو للرسم البياني، وصفا لجدول مركب، خصائص للتحكم في نموذج بحث، أو أية معلومات أخرى. تُعتبر هذه الخاصية إحدى الخصائص الضرورية للويب الحديث، وبفضل HTML5 أصبح بالإمكان القيام بذلك من دون الحاجة إلى أي JavaScript.
</p>

<p dir="rtl">
	أغلبنا سبق لك أن شاهد مُختلف <a href="http://dev.opera.com/articles/view/new-form-features-in-html5/" rel="external nofollow">الخواص الدلالية الجديدة لنماذج HTML5</a> (تعرف على <a href="http://www.webtuts.me/html5-forms-input-types/" rel="external nofollow">العناصر</a> و<a href="http://www.webtuts.me/html5-forms-introduction-new-attributes/" rel="external nofollow">الخصائص الجديدة</a> لنماذج HTML5)، والتي أغلبها عبارة عن خصائص للعنصر input والتي توفر تراجعا رشيقا إلى &lt;input type=text&gt; في المتصفحات الأقدم. من بين العناصر الجديدة نجد أيضا كلا من datalist، output، progress و meter.
</p>

<h1 dir="rtl">
	هل نملك العناصر الدلالية الأنسب؟
</h1>

<p dir="rtl">
	كما رأينا فإننا نملك عناصر دلالية جديدة عديدة، لكن السؤال الذي يجب أن نطرحه هو: هل فعلا نملك العناصر الدلالية الأنسب لاستعمالاتنا؟ مثلما رأينا فإن دراسة Google التي بُني عليها الأمر تعود إلى عدة سنوات خلت (2005)، ومن المُحتمل أن تكون الدلالية التي نعمل عليها متأخرة بعدة سنوات عن احتياجاتنا الحقيقية، كما لاحظنا فإن هذه العناصر تدور كلها هو مفهوم المُستند ومحتوياته document-centric وليست مبنية حول التطبيقات application-centric. هل نحتاج إلى عناصر دلالية تدول حول التطبيقات مثل login أو share، أو حتى Modal.
</p>

<p dir="rtl">
	ليس من السهل الإجابة على هذا السؤال، لكن كون HTML معيارا حيا living standard فإنه من المُمكن إضافة مثل هذه العناصر لاحقا لو تم اقتراح حالات استخدام قوية للـ Working Group.
</p>

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

<pre class="html ipsCode prettyprint prettyprinted" style="">
<span class="tag">&lt;picture</span><span class="pln"> </span><span class="atn">alt</span><span class="pun">=</span><span class="atv">"angry pirate"</span><span class="tag">&gt;</span><span class="pln">
   </span><span class="tag">&lt;source</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">hires.png</span><span class="pln"> </span><span class="atn">media</span><span class="pun">=</span><span class="atv">"min-width:800px"</span><span class="tag">&gt;</span><span class="pln">
   </span><span class="tag">&lt;source</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">midres.png</span><span class="pln"> </span><span class="atn">media</span><span class="pun">=</span><span class="atv">"min-width:480px"</span><span class="tag">&gt;</span><span class="pln">
   </span><span class="tag">&lt;source</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">lores.png</span><span class="tag">&gt;</span><span class="pln">
      </span><span class="com">&lt;!-- fallback for browsers without support --&gt;</span><span class="pln">
      </span><span class="tag">&lt;img</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">midres.png</span><span class="pln"> </span><span class="atn">alt</span><span class="pun">=</span><span class="atv">"angry pirate"</span><span class="tag">&gt;</span><span class="pln">
</span><span class="tag">&lt;/picture&gt;</span></pre>

<p dir="rtl">
	هذا العنصر سيعرض hire.png على الشاشات الكبيرة، midres.png على الشاشات التي يتراوح عرضها ما بين 480 و800 بكسل، و lores.png لباقي الشاشات. وهو ما قد يجيب أيضا على التساؤل الذي يطرحه عادة المصممون على أنفسهم: "هل يجب علي أن أطلب من جميع المتصفحات تحميل صورة عالية الجودة ومن ثم أقوم بتصغيرها للشاشات الصغيرة مما يعني بأنني سأقوم بتحميل بيانات زائدة، أم أقوم بتحميل صورة منخفضة الجودة ومن ثم أقوم بتكبيرها على الشاشات الكبيرة وبالتالي فإنني سأضحي بجودة الصور".
</p>

<p dir="rtl">
	وقياسا على ما سبق وأن رأيناه من عناصر دلالية شائعة فإنه يُمكن أيضا أن نوفر تراجعا رشيقا، والذي سيكون في هذه الحالة عنصرا من نوع img وبالتالي سيحصل الجميع على المحتوى الأصح.
</p>

<p dir="rtl">
	لا يزال إرسال الصورة بالحجم الأنسب أحد أعقد المشاكل فيما يتعلق بالتصاميم العبارة للأجهزة cross-device design  وللتصاميم المتجاوبة responsive design. قد نجد حلا لها مع HTML6، لكن إلى غاية ذلك الحين تبقى أفضل الحلول -والتي من ضمنها حلا <a href="http://adaptive-images.com/" rel="external nofollow">Adaptive Images</a> و <a href="https://github.com/filamentgroup/Responsive-Images" rel="external nofollow">Responsive Images</a>- تحتاج إلى JavaScript  وإلى بعض التعديلات على ملف htaccess من جانب الخادوم. لكن أسوأ الحلول الحالية تتطلب تقنيات عفا عنها الزمن، كـ<a href="http://farukat.es/journal/2011/02/499-lest-we-forget-or-how-i-learned-whats-so-bad-about-browser-sniffing" rel="external nofollow">" اشتمام المتصفحات" Browser-sniffing</a>، والذي تم تغيير اسمه ليصبح "اكتشاف الأجهزة" device detection رغم أنها تستعمل نفس التقنيات القديمة المتعلقة بالتحقق من user-agent والتي هي عبارة عن <a href="http://webaim.org/blog/user-agent-string-history/" rel="external nofollow">تقنية هشة جدا</a>، لا تصلح مع التقنيات المستقبلية، كما أنها غير قابلة للتحجيم Scalable، دون أن ننسى بأنها تُذكرنا بالأيام التي كنا نشاهد فيها "لأفضل عرض استخدم متصفح netscape بدقة 800x600" على صفحات المواقع.
</p>

<h1 dir="rtl">
	متى، أين ومن؟
</h1>

<p dir="rtl">
	تحتاج الكثير من البيانات إلى المعلومات التالية: متى، أين ومن.
</p>

<p dir="rtl">
	يُوفر HTML5 عنصرtime  (والذي <a href="http://www.brucelawson.co.uk/2011/goodbye-html5-time-hello-data/" rel="external nofollow">أسال الكثير من الحبر</a>) والذي يسمح لك بإرفاق التواريخ التي يُمكن لنا أن نقرها من دون صعوبة human-readable  بتواريخ على هيأة قابلة للتحليل بشكل آلي machine-readable. لا يهم النص الذي تضعه ما بين وسمين الفتح والإغلاق، لأن ذلك النص هو الذي سيظهر للقراء، وبالتالي فإنه يُمكن استخدام أي من الصيغتين التاليتين:
</p>

<pre class="html ipsCode prettyprint prettyprinted" style="">
<span class="tag">&lt;time</span><span class="pln"> </span><span class="atn">datetime</span><span class="pun">=</span><span class="atv">"1982-07-18"</span><span class="tag">&gt;</span><span class="pln">The day the woman I love was born</span><span class="tag">&lt;/time&gt;</span><span class="pln">

</span><span class="tag">&lt;time</span><span class="pln"> </span><span class="atn">datetime</span><span class="pun">=</span><span class="atv">"1982-07-18"</span><span class="tag">&gt;</span><span class="pln">Priyanka Chopra’s birthday</span><span class="tag">&lt;/time&gt;</span></pre>

<p dir="rtl">
	أيا كانت الصيغة التي تختارها فإنه يمكن للآلة قراءة التاريخ بشكل صحيح مادام تم توفير التاريخ على شكل YYYY-MM-DD. إن أردت إضافة الوقت فإنه يمكنك ذلك لكن يجب عليك أن تفصله عن التاريخ بـ T وأن تستخدم وقتا من 24 ساعة (وليس من 12 ساعة) وتختمه بـ Z إضافة إلى أي اختلاف في الحزمة الزمنية. وبالتالي 2011-11-13T20:00Z تُمثل الساعة 8  مساء من يوم 13 نوفمبر سنة 2011 بالتوقيت العالمي UTC، في حين 2011-11-13T23:26.083Z-05.00  تُمثل الساعد 11 ليلا و26 دقيقة و83 جزء من الألف من الثانية في الحزمة الساعية التي تتواجد 5 ساعات قبل التوقيت العالمي. يُمكن مثلا لمتصفح في سيريلانكا أن يقوم بتحويل هذه المعلومة بشكل آلي إلى توقيت حسب التوقيت البوذي، كما أن مُحركات البحث قادرة على استخدام timestamps لتحديد مدى <a href="http://www.googleblog.blogspot.com/2011/11/giving-you-fresher-more-recent-search.html" rel="external nofollow">طزاجة نتائج البحث</a>.
</p>

<p dir="rtl">
	رغم الانتشار الكبير لخدمات تحديد الأماكن الجغرافية <a href="http://dev.opera.com/articles/view/how-to-use-the-w3c-geolocation-api/" rel="external nofollow">geolocation</a>  إلا أننا لا نملك أي عنصر لتمثيلها والذي يقبل 3 خصائص: خطوط الطول، دوائر العرض، إضافة إلى الارتفاع (بشكل اختياري). وسيكون رائعا لو كان بإمكاننا كتابة شيء مثل التالي:
</p>

<pre class="html ipsCode prettyprint prettyprinted" style="">
<span class="tag">&lt;location</span><span class="pln"> </span><span class="atn">lat</span><span class="pun">=</span><span class="atv">51.502064</span><span class="pln"> </span><span class="atn">long</span><span class="pun">=</span><span class="atv">-0.131981</span><span class="tag">&gt;</span><span class="pln">London SW1A 4WW</span><span class="tag">&lt;/location&gt;</span></pre>

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

<p dir="rtl">
	احتوى <a href="http://www.w3.org/MarkUp/html3/logical.html" rel="external nofollow">HTML3 على عنصر person</a>  تم استخدامه لأسماء الأفراد وذلك للتمكن من استخراجها بشكل آلي من طرف تطبيقات الأرشفة، لكنه لم يتم استخدامها. في HTML4 كان بالإمكان استخدام <a href="http://www.w3.org/TR/html401/struct/text.html#h-9.2.1" rel="external nofollow">العنصر cite</a>  لتغليف أسماء الأشخاص، لكنه تم التخلص منه في HTML5 بشكل <a href="http://24ways.org/2009/incite-a-riot/" rel="external nofollow">مثير للجدل</a>، وبالتالي فإنه مع HTML5 لا نملك أية وسيلة لتحديد أسماء الأفراد بشكل واضح لا لُبس فيه. في المقابل فإن أسماء الأفراد يُعتبر مشكلا في غاية التعقيد، فإن كان للأوقات والتواريخ صيغ قياسية للتعبير عنها (YYYY-MM-DD للأولى و HH :MM :SS,mmm للثانية) وإن كان يتم تمثيل الأماكن الجغرافية دائما بخطوط الطول ودوائر العرض، فإن الأسماء أصعب للتحليل وللتقسيم إلى وحدات صغيرة يسهل التعامل معها، فعلى سبيل المثال هناك أسماء العائلات الروسية، <a href="http://en.wikipedia.org/wiki/Indonesian_names#Example_1:_Single_word_name" rel="external nofollow">الأسماء الإندونيسية أحادية الكلمات</a>، الأسماء التي تحتوي على عدة أسماء للعائلة، دون أن ننسى الألقاب التايلاندية. يُمكنكم الاطلاع على مدى تعقيد الأمر  بقراءة هذا المقال: <a href="http://www.w3.org/International/questions/qa-personal-names" rel="external nofollow">Personal Names Around the World</a>.
</p>

<p dir="rtl">
	يملك عنصر <a href="http://html5doctor.com/time-and-data-element/" rel="external nofollow">date الجديد</a> -والذي استبدل عنصر time- خاصية تحدد قيمة الوقت الذي يُمكن قراءته بشكل آلي (machine-readable information)، لكنه لا يتطلب أو يتضمن صيغة خاصة للقيام بذلك، وبالتالي فإنه لا يُمكن لمحركات البحث مثلا أن تعلم إن كان 1936-10-19 تاريخا، جزءا من رقم، أو حتى رمزا بريديا.
</p>

<h1 dir="rtl">
	Microdata
</h1>

<p dir="rtl">
	HTML5 تماما مثل سابقه HTML4 عبارة عن معيار قابل للتمديد extensible (لكنه ليس قابلا للتمديد على طريقة XML التي يذمها الـ Working Group). بإمكانك أن تستخدم الـ microformat التي سبق وأن تمت تجربتها واختبارها والتي تستعمل أصناف HTML (HTML classes) أو مواصفات RDFa الكاملة والتي لا يُمكنها أن تتجاوز اختبارات التحقق validation في كل من HTML4 أو HTML5. يتم اعتبار RDFa صعبة المراس، حيث أن Google أجرت  بحثا بين بأنه يتم <a href="http://lists.w3.org/Archives/Public/public-vocabs/2011Oct/0113.html" rel="external nofollow">ارتكاب 30% أكثر من الأخطاء لدى استخدام RDFa</a> مقارنة بغيرها من الصيغ). أما microdata فعبارة عن آلية لإضافة طبقة دلالية إضافية باستخدام مجموعة من الوسوم التي تم التفاهم عليها مُسبقا. يُمكنكم إيجاد المزيد حول الأمر على موقع <a href="http://html5doctor.com/microdata/" rel="external nofollow">HTML5doctor</a>.
</p>

<p dir="rtl">
	مثلما هو عليه الحال مع microformat و RDFa، فإن الوسوم الدلالية التي نضيفها لن يكون لديها أي معنى ما لم يكن لدينا "وثيقة" تدلنا على المعنى الذي يحمله كل وسم. بعبارة أخرى هذه البيانات تحتاج إلى أن تربط إلى قاموس مفردات تُخبر التطبيقات الزاحفة crawler بأي طريقة يجب عليه أن يفسر البيانات التي يجدها. ولمن أراد استخدام microdata هناك موقع <a href="http://www.schema.org/" rel="external nofollow">schema.org</a>  والذي يجمع مخططات/وسوم HTML يُمكن للمطورين استخدامها بطريقة تتعرف عليها كبريات مُحركات البحث.
</p>

<h1 dir="rtl">
	هل للويب الدلالي أي فائدة؟
</h1>

<p dir="rtl">
	بما أنه توليد الكثير من الوسوم أصبح يتم بشكل آلي عبر JavaScript فإن هناك من يعتقد بأن الدلالية لم يعد لها فائدة، عادة ما نُشاهد منتجات يتم التسويق لها على أساس أنها مُنتجات HTML5 لكنها بكل بساطة عبارة عن تطبيقات تقوم بجعل مجموعة من عناصر div "تطير" من مكان إلى آخر من الصفحة باستخدام JavaScript بنفس الطريقة المُتبعة مع DHTML منذ عشرية.
</p>

<p dir="rtl">
	بل أصبح هناك العديد من المُطورين الذين يطلقون تطبيقات لا تحتوي على أية وسوم، وهناك بعض أطر العمل التي تنتج هياكل HTML تحتوي على وسم body فارغ ومن ثم تقوم بحقنه بوسوم HTML باستخدام JavaScript. إن كنت ممكن يقومون بالقيام بذلك فأنت أقرب ما تكون من Flash منك إلى الويب.
</p>

<p dir="rtl">
	ومثلما أن هناك من يعتقد بأن قضاء 47 دقيقة (والتي قد يبدو بأنها مُدة طويلة) لبناء تصميم CSS هي مدة طويلة جدا ويتجهون مباشرة إلى استخدام الجداول في صفحاتهم، فإن هناك أيضا من يعتقد بأن قضاء بعض الوقت في التفكير في أي عنصر يجب استخدامه هو أيضا مضيعة وقت.
</p>

<p dir="rtl">
	هناك حجة أفضل والتي تقول بأنه لا يوجد أية تطبيقات تهتم أو تستهلك المحتويات الدلالية، فلماذا الاهتمام بها؟ رغم أن هذه الحجة ليس صحيحة لأن العمل جار على <a href="http://blog.paciellogroup.com/2011/11/html5-semantics-and-accessibility/" rel="external nofollow">ربط تقنيات قابلية الوصول accessibility مع الدلالية الحديثة</a>. لكن حتى لو كانت هذه الحجة صحيحة فإنها تتجاهل بأن المشكل الحالي هو مشكل مشابه لمشكل من أتى أولى، الدجاجة أم البيضة؟ لأنها تفترض بأنه لن تظهر أية محركات بحث جديدة يكون بمقدورها استخدام العناصر الجديدة، أو أن المتصفحات لن تطلق أية إصدارات جديدة تقوم باستغلال الدلالية فيها، أو أن المطورين لن يكتبوا أية إضافات للمتصفحات للقيام بذلك. باختصار هذه الحجة تفترض بأن دورة تطور الويب قد اكتملت.
</p>

<p dir="rtl">
	للويب الدلالي فائدة، لأن الدلالية تحمل معنى وبمجرد أن يتم اعتماد ذلك فإنه يُمكن للآلات أن تقوم باستغلال تلك البيانات من دون الحاجة إلى كتابة أو تطوير خوارزميات لتخمن معناها. سيكون بإمكان إضافة للمتصفح أن تسمح للمستخدم بالانتقال مباشرة إلى nav بنقرة زر واحدة لأنها ستقوم بالبحث عن nav مباشرة بدل البحث في كامل عناصر div وتخمن ما إذا كان المعرف id أو الصنف class الذي تحمله يوحي بأنها عبارة عن nav، هذا إن افترضنا أن المطور سيسمي هذا العنصر بأسماء لها معنى كـ nav، navigation، sidebar أو menu. كما أنه على موقع مطعم مثلا فإن div يحمل المعرف menu قد يحتوي على قائمة المأكولات المتوفرة بدل أمر آخر، وهو ما يذكرنا من جديد في مقدار الغموض الذي يلتبس لغاتنا الحية. وسيصبح مثلا بإمكان تطبيق زاحف crawler أن يجمع المقالات حسب ترتيبها الزمي مثلا. باختصار هناك الكثير من الحالات التي يُمكن التفكير فيها بناء على ذلك.
</p>

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

<p dir="rtl">
	يمكن لهذا أن يحدث لو تم وسم المحتوى من أجل إعطاء معنى له، ولو كان للغة وسوم يُمكن استخدامها كجزء من مفرداتنا. ما يقوم به HTML5 هو توسيع لدائرة المفردات التي نستعملها، بطبيعة الحال سنحتاج إلى مفردات إضافية والتي ستأتي مع HTML6.
</p>

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

<p dir="rtl">
	ترجمة –وبتصرف- للمقال <a href="http://coding.smashingmagazine.com/2011/11/18/html5-semantics/" rel="external nofollow">HTML5 Semantics</a> لصاحبه <a href="https://twitter.com/brucel" rel="external nofollow">Bruce Lawson</a>.
</p>

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

<ul>
<li>
		<a href="https://academy.hsoub.com/programming/html/%D8%AA%D8%B9%D9%84%D9%85-%D9%84%D8%BA%D8%A9-html-r1702/" rel="">دليل تعلم لغة HTML</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-r662/" rel="">دليل تعلم البرمجة</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">6</guid><pubDate>Wed, 31 Jul 2013 14:52:00 +0000</pubDate></item><item><title>&#x62A;&#x639;&#x631;&#x641; &#x639;&#x644;&#x649; &#x623;&#x646;&#x648;&#x627;&#x639; &#x627;&#x644;&#x62D;&#x642;&#x648;&#x644; &#x627;&#x644;&#x62C;&#x62F;&#x64A;&#x62F;&#x629; &#x641;&#x64A; &#x646;&#x645;&#x627;&#x630;&#x62C; HTML5</title><link>https://academy.hsoub.com/programming/html/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D8%A7%D9%84%D8%AD%D9%82%D9%88%D9%84-%D8%A7%D9%84%D8%AC%D8%AF%D9%8A%D8%AF%D8%A9-%D9%81%D9%8A-%D9%86%D9%85%D8%A7%D8%B0%D8%AC-html5-r5/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_03/HTML5-forms_480x300.png.5b7e4fd40a81cdc9d525e24d6d298459.png" /></p>
<p dir="rtl">تطرقنا في <a rel="external nofollow" href="http://www.webtuts.me/html5-forms-introduction-new-attributes/">المقال السابق</a> إلى نبذة عن تاريخ نماذج HTML5 إضافة إلى جُملة من خصائصها الجديدة. سنتطرق في هذا المقال إلى أنواع الحقول الجديدة التي أضافتها HTML5 إلى النماذج. مثلما سنلاحظه طيلة هذا المقال أيضا فإن هذه المميزات الجديدة ستُسهل المهمة على المُطورين وستقدم تجربة أفضل للمستخدم. وكما سبق وأن أشرنا إليه في المقال السابق فإنه يُمكن الشروع في استخدام كل هذه الميزات منذ الآن.</p><h1 dir="rtl">أنواع الحقول الجديدة</h1><p dir="rtl">أضافت HTML5 13 نوعا جديدًا من الحقول، سنقوم باستعراضها أولا ومن ثم سنشرح لماذا يجب عليك الشروع في استخدامها في مشاريعك. لاستخدام هذه الحقول الجديدة فائدتان، أولاهما هو تقليص زمن التطوير الذي تحتاجه لإنهاء تطبيقك، وثانيهما هو تقديم تجربة استخدام أفضل. الحقول الجديدة التي سنستعرضها في هذا المقال هي كالتالي:</p><p dir="rtl"> </p><ul><li>search</li><li>email</li><li>url</li><li>tel</li><li>number</li><li>range</li><li>date</li><li>month</li><li>week</li><li>time</li><li>datetime</li><li>datetime-local</li><li>color</li></ul><h1 dir="rtl">search</h1><p dir="rtl">لا يوجد أفضل من هذا الحقل للشروع في استعراض خواص هذه الحقول الجديدة. ليس المقصود بالبحث هنا المحركات الشهيرة كـ Google، Yahoo أو Bing، بل نقصد حقل البحث الذي استعملته على أحد مواقع التجارة الإلكترونية، على ويكيبيديا أو على مُدونتك الشخصية. وقد تكون هذه الحقول (حقول البحث بشكل عام) هي الحقول الأكثر استعمالا على الويب، إلا أننا نستعملها بشكل لا يدل فعليا على وظيفتها، حيث أننا ألفنا إنشاء حقول البحث على النحو التالي:</p><pre class="html ipsCode prettyprint">&lt;input type="text" name="search"&gt;</pre><p> </p><p dir="rtl">لكن ماذا لو كان بإمكاننا القيام كتابتها على النحو التالي:</p><pre class="html ipsCode prettyprint">&lt;input type="search" name="search"&gt;</pre><p> </p><p dir="rtl">وهو ما يُمكن فعلا القيام به باستخدام HTML5، وهو ما يبدو أفضل بكثير، أليس كذلك؟ تظهر المُتصفحات حقول البحث بنفس مظهر الحقول النصية إلى غاية أن تشرع في الكتابة فيها، وحينها ستظهر علامة x صغيرة على الجانب الأيمن للحقل، والذي يسمح لك بمسح الحقل بمجرد النقر عليه، وهو أمر مماثل لما يحدث مع حقل البحث في مُتصفح Safari.</p><div><dl><dt><a rel="external nofollow" href="http://www.webtuts.me/wp-content/uploads/2013/06/type-search-as-displayed-in-safari-for-windows.png"><img alt="type-search-as-displayed-in-safari-for-windows" src="http://www.webtuts.me/wp-content/uploads/2013/06/type-search-as-displayed-in-safari-for-windows.png"></a></dt><dd>حقل البحث كما يظهر على مُتصفح Safari على نظام Windows.</dd></dl></div><p dir="rtl">الوضع على الهواتف الذكية أفضل بكثير، ألق نظرة على الصورة التالية والتي تُظهر حقل بحث على هاتف iPhone. لدى انتقال التركيز Focus إلى خانة البحث فإن لوحة مفاتيح خاصة تظهر، لاحظ زر search في الزاوية اليُمنى أسفل الشاشة، والتي تُعوض زر Go لما يكون الحقل نصيا فقط.</p><div><dl><dt><a rel="external nofollow" href="http://www.webtuts.me/wp-content/uploads/2013/06/type-search-on-the-iPhone.png"><img alt="حقل البحث على هاتف iPhone" src="http://www.webtuts.me/wp-content/uploads/2013/06/type-search-on-the-iPhone.png"></a></dt><dd>حقل البحث على هاتف iPhone</dd></dl></div><p dir="rtl">كما سبق وأن لاحظناه مع الخصائص الجديدة في المقال السابق فإن المُتصفحات التي لا تفهم/تدعم هذا الحقل تُوفر تراجعا رشيقا له graceful degradation، وهو ما يحدث مع جميع الحقول التي سنتطرق إليها في هذا المقال. إذا لم يستطع المُتصفح فهم  type="search" فإنه سيقوم بتعويضه بـ type="text"، وهو ما يعني بأنك لن تخسر أي شيء باستخدامك لهذا الحقل، بل العكس كل العكس، حيث أنك تُوفر تحسينا تدريجيا progressive enhancement وتُوفر لزوار موقعك تجربة مُستخدم أفضل. كما نعلم جميعا فإن ملء حقول نموذج ليس بالأمر المُمتع وبالتالي فإن أي تحسين يُمكن أن ندخله عليها مُرحب به.</p><h1 dir="rtl">email</h1><p dir="rtl">من حيث المظهر لا يملك التفريق ما بين حقل email وما بين الحقول النصية العادية، ويستعمل هذا الحقل لإدخال عنوان بريد إلكتروني (أو أكثر). لكن من حيث الاستخدام ولدى إضافة خاصية required إلى هذا الحقل فإن المُتصفح سيقوم حينها من التحقق من أن النص الذي تم إدخاله هو فعلا عُنوان بريد إلكتروني صحيح من حيث بُنيته. بطبيعة الحال التحقق الذي يقوم به المُتصفح هو مُجرد تحقق بدائي حيث يتحقق من وجود كل من @ و النقطة في العنوان كما أنه لا يسمح بوجود المسافات. يدعم هذه الخاصية كل من Opera 9.5+، Firefox 4+، IE10 وChrome 5+، وتُظهر المُتصفحات رسالة خطأ إن كان العنوان الذي تم إدخاله غير صحيح البُنية. بإمكانك التحكم في مظهر الحقل بعد ملئه وذلك باستخدام أشباه الفئة :valid و :invalid أو :required مثلما يشرحه <a rel="external nofollow" href="http://html5doctor.com/css3-pseudo-classes-and-html5-forms/">هذا المقال</a>.</p><pre class="html ipsCode prettyprint">&lt;input type="email" name="email" required&gt;</pre><div><dl><dt><a rel="external nofollow" href="http://www.webtuts.me/wp-content/uploads/2013/06/Opera-email-address-error-messaging.png"><img alt="رسالة خطأ في حقل email كما يظهر على مُتصفح Opera." src="http://www.webtuts.me/wp-content/uploads/2013/06/Opera-email-address-error-messaging.png"></a></dt><dd>رسالة خطأ في حقل email كما يظهر على مُتصفح Opera.</dd></dl></div><p>تُشير مواصفات HTML5 إلى أنه يُمكن إدخال أكثر من عنوان بريد إلكتروني في هذا الحقل، مما يعني بأن يُمكنك استخدام خاصية multiple مع حقول البريد الإلكتروني (type="email") أيضا، وهو ما يذكرك بمقدار شفرات JavaScript التي كان يتوجب عليك كتابتها بنفسك لو كنت تقوم بعمليات التحقق هذه بنفسك.</p><p dir="rtl">لمزيد من التفاصيل حول التحكم في مظهر حقول النماذج بالاستعانة بأشباه الأصناف pseudo-classes يُرجى الاطلاع على <a rel="external nofollow" href="http://alistapart.com/article/forward-thinking-form-validation">هذا المقال على موقع A List Apart</a>.</p><p dir="rtl">ملاحظة: لدى كتابة هذه السطور لا تزال بعض المُتصفحات تُعاني من نقائص لدى التحقق من عناوين البريد الإلكتروني التابعة لأسماء نطاقات تستعمل حروفا غير لاتينية (كبعض أسماء النطاقات اليابانية)، حيث أن بعض المُتصفحات تعتبرها غير صحيحة البُنية.</p><p dir="rtl">خذ على سبيل المثال التالي:</p><pre class="html ipsCode prettyprint">&lt;input type="email" name="email" value="gordo@日本.jp"&gt;</pre><p dir="rtl">والتي تعتبرها كل من متصفحات Firefox (تم تصحيح الوضع في Firefox)، Safari، IE أو Chrome غير صحيحة البُنية (يقبل مُتصفح Opera هذا العنوان)، إلا أن Kyle Barrow وجد طريقة لحل هذا المُشكل وذلك باستخدام حقل نصي عادي والاستعانة بخاصية pattern على النحو التالي:</p><pre class="html ipsCode prettyprint">&lt;input type="text" name="email" value="gordo@日本.jp" pattern="[^ @]*@[^ @]*"&gt;</pre><p dir="rtl">هناك حل آخر إن أردت الإبقاء على type="email" وذلك باستخدام formnovalidate مع زر إرسال النموذج على النحو التالي (هذه الطريقة ستضمن بأن المُتصفح لن يقوم بالتحقق مما يتم إدخاله في حقل البريد الإلكتروني وهو ما أمر قد لا ترغب فيه):</p><pre class="html ipsCode prettyprint">&lt;form action="process.php"&gt;
&lt;label for="email"&gt;Email:&lt;/label&gt;
&lt;input type="email" name="email" value="gordo@日本.jp"&gt;
&lt;input type="submit" formnovalidate value="Submit"&gt;</pre><p>كما يُمكن استخدام خاصية novalidate مع النموذج على النحو التالي:</p><pre class="html ipsCode prettyprint">&lt;form action="process.php" novalidate&gt; &lt;label for="email"&gt;Email:&lt;/label&gt;
&lt;input type="email" name="email" value="gordo@日本.jp"&gt;
&lt;input type="submit" value="Submit"&gt;</pre><p dir="rtl">دعونا من هذه المشكل ولنعد إلى ما سبق وأن تحدثنا عنه بخصوص منافع حقول HTML5 الجديدة، والتي هي –كما سبق ذكره أيضا- تقليص وقت التطوير وتحسين تجربة المُستخدم. ألقوا نظرة على المثال السابق لكن باستخدام iPhone مثلا، سيظهر لك أمر مماثل للصورة التالية:</p><div><dl><dt><a rel="external nofollow" href="http://www.webtuts.me/wp-content/uploads/2013/06/The-iPhone-displays-a-custom-keyboard-when-using-type-email.png"><img alt="يُظهر iPhone لوحة مفاتيح خاصة مع حقول البريد الإلكتروني" src="http://www.webtuts.me/wp-content/uploads/2013/06/The-iPhone-displays-a-custom-keyboard-when-using-type-email.png"></a></dt><dd>يُظهر iPhone لوحة مفاتيح خاصة مع حقول البريد الإلكتروني</dd></dl></div><p dir="rtl">هل لاحظت الاختلاف هذه المرة؟ ركز على السطر السُفلي في لوحة المفاتيح ستجد بأن هناك زرا خاصا بـ @ وآخر خاصا بالنقطة . وهما زران ستحتاجهما لدى كتابة عناوين بريد إلكتروني. وكما سبق ذكره مع حقول search فإنه لا يوجد أي جانب سلبي لاستخدام هذا الحقل (type="email") من الآن، حيث أن المُتصفحات التي لا تدعمه ستقوم بتعويضه بحقل نصي عادي (type="text")، وفي باقي المُتصفحات سيحصل الزائر على تجربة مستخدم أفضل.</p><h1 dir="rtl">url</h1><p dir="rtl">تُخصص حقول url مثلما قد تتوقعه لعناوين الويب. تقبل هذه الحقول استخدام خاصية multiple معها للسماح بإدخال أكثر من عنوان واحد. ومثلما هو الحال مع حقول البريد الإلكتروني فإن المُتصفحات تقوم بعملية تحقق بسيطة من مُحتوى هذا الحقل، ومن ثم تعرض رسالة خطأ إن كان بُنية العنوان غير صحيحة، ويتم ذلك عبر التحقق من وجود بعض المحارف الخاصة كـ / ، النقاط، المسافات مع إمكانية التحقق من لاحقة العنوان top-level domain كـ .com مثلا.</p><p dir="rtl">يتم استخدام حقول url على النحو التالي:</p><pre class="html ipsCode prettyprint">&lt;input type="url" name="url" required&gt;</pre><p dir="rtl">ومن جديد سنلقي نظرة على نتيجة صفحة تحتوي هذا الحقل باستخدام iPhone. مثلما تلاحظونه في الصورة التالية فإن المُتصفح يُظهر لوحة مفاتيح خاصة ليسهل مهمة الكتابة على المُستخدم، حيث تم استبدال زر المسافة بأزرار لكل من الـ /، النقطة و زر خاص بـ .com (يكفي الضغط مطولا عليه لتظهر لواحق أُخرى كـ .org أو .net).</p><div><dl><dt><a rel="external nofollow" href="http://www.webtuts.me/wp-content/uploads/2013/06/type-url-activates-a-URL-specific-keyboard-on-the-iPhone.png"><img alt="يُظهر iPhone لوحة مفاتيح خاصة مع حقول عناوين الويب" src="http://www.webtuts.me/wp-content/uploads/2013/06/type-url-activates-a-URL-specific-keyboard-on-the-iPhone.png"></a></dt><dd>يُظهر iPhone لوحة مفاتيح خاصة مع حقول عناوين الويب</dd></dl></div><h1 dir="rtl">tel</h1><p dir="rtl">تختلف حقول tel عن حقول email أو url بكونها لا تعتمد أي نمط مُعين بحكم أن أرقام الهواتف تختلف باختلاف بلدانها وهو ما يجعل من مهمة التحقق من الأرقام في غاية الصعوبة، عدى السماح باستخدام الأرقام فقط مع إمكانية استخدام مُحرف +. بطبيعة الحال يبقى بإمكانك التحقق من رقم الهاتف إن أردت إن كنت تعرف بأن الأرقام التي سيتم إدخالها تتبع نمطا مُعينا، لكن يجب عليك القيام بذلك على جانب الخادوم من تطبيقك. يتم استخدام حقول tel على النحو التالي:</p><pre class="html ipsCode prettyprint">&lt;input type="tel" name="tel" id="tel" required&gt;</pre><p dir="rtl">من جديد فإن هواتف iPhone تتعرف على حقول أرقام الهواتف لكن هذه المرة يستعرض المُتصفح لوحة مفاتيح مُختلفة كُلية، حيث يتم استخدام لوحة أرقام الهواتف، وهو ما يحدث أيضا على بعض هواتف Android (مثل هاتف HTC Desire والذي يظهر في الصورة أدناه). ظهور لوحة أرقام الهاتف ستمكن المُستخدم من إدخال رقم هاتفه بشكل أسرع.</p><div><dl><dt><a rel="external nofollow" href="http://www.webtuts.me/wp-content/uploads/2013/06/type-tel-on-the-iPhone-and-some-Android-devices-dynamically-changes-the-keyboard-to-a-numeric-keypad.png"><img alt="يقوم iPhone وبعض هواتف Android  بتغيير لوحة المفاتيح بشكل كبير لدى استخدام حقول أرقام الهواتف." src="http://www.webtuts.me/wp-content/uploads/2013/06/type-tel-on-the-iPhone-and-some-Android-devices-dynamically-changes-the-keyboard-to-a-numeric-keypad.png"></a></dt><dd>يقوم iPhone وبعض هواتف Android بتغيير لوحة المفاتيح بشكل كبير لدى استخدام حقول أرقام الهواتف.</dd></dl></div><h1 dir="rtl">number</h1><p dir="rtl">مثلما هو ظاهر من اسمه، يتم استخدام حقل number مع الأرقام. ومثلما هو عليه الحال مع أغلب هذه الحقول الجديدة فلقد كان مُتصفح Opera السباق في دعمها. يظهر هذا الحقل على كل من Opera، Safari وChrome على هيئة spinbox حيث أنه يمكن النقر على سهمي فوق وتحت لتغيير قيمة الحقل. أما على Firefox وIE10 فيظهر الحقل كمجرد حقل نصي عادي.</p><div><dl><dt><a rel="external nofollow" href="http://www.webtuts.me/wp-content/uploads/2013/06/type-number-in-Opera.png"><img alt="حقل number كما يظهر على مُتصفح Opera" src="http://www.webtuts.me/wp-content/uploads/2013/06/type-number-in-Opera.png"></a></dt><dd>حقل number كما يظهر على مُتصفح Opera</dd></dl></div><p dir="rtl">يُمكن استخدام خصائص min، max وstep مع الحقول الرقمية ما يسمح بالتحكم في القيم القصوى والدنيا للحقل إضافة إلى "الخطوة" التي يتم الانتقال بها لدى النقر على زري فوق وتحت، إضافة إلى إمكانية التحكم في القيمة القياسية عبر استخدام خاصية value. المثال التالي يُوضح كيفية القيام بذلك:</p><pre class="html ipsCode prettyprint">&lt;input type="number" min="5" max="18" step="0.5" value="9" name="shoe-size"&gt;</pre><p>في هذا المثال يُمثل min القيمة الدنيا المُمكنة التي يُمكن للحقل قبولها، max تُمثل القيمة القصوى المُمكنة. لدى الوصول إلى هاتين القيميتن فإنه سيتم تعطيل السهم المسؤول عن ذلك وبالتالي فإنه لا مجال للذهاب أعلى القيمة القُصوى أو أدنى من القيمة الدنيا*. أما step فهي الخُطوة التي يتم الانتقال بها لدى النقر على السهمين والتي تأخذ 1 كقيمة قياسية، وهو ما يعني بأنه يمكن استخدام قيم سالبة أو استخدام خطوات مثل 0.5 أو5**. أما value فهي خاصية ألفنا استخدامها مع HTML4. كل هذه الخواص ليست إجبارية.</p><p dir="rtl">*: لم يتم تعطيل الأسهم لدى تجربتي للحقل على كل من Safari وOpera.</p><p dir="rtl">**:  لدى تجربتي لقيم سالبة قام كل من Opera وSafari باستخدام القيمة القياسية 1 للخطوة بدل القيمة السالبة.</p><p dir="rtl">في مقابل طريقة عرض Opera للحقول الرقمية، لا يقوم كل من iPhone و بعض هواتف Android بعرضها سوى كحقول نصية عادية، لكن يقوم كلاهما باستخدام لوحة مفاتيح خاصة.</p><div><dl><dt><a rel="external nofollow" href="http://www.webtuts.me/wp-content/uploads/2013/06/type-number-on-iPhone-and-Android-HTC-Desire.png"><img alt="type-number-on-iPhone-and-Android-HTC-Desire" src="http://www.webtuts.me/wp-content/uploads/2013/06/type-number-on-iPhone-and-Android-HTC-Desire.png"></a></dt><dd>حقل number كما يظهر على كل من iPhone وHTC Desire</dd></dl></div><p dir="rtl">لجعل iPhone يستخدم لوحة أرقام الهواتف مثلما رأينا مع حقول الهواتف، اكتشف Chris Coyier صاحب موقع CSS Tricks خدعة تساعد في القيام بذلك، حيث أنه بدل استخدام type="number"  فإنه يكفي استخدام حقل نصي type="text" وإضافة خاصية pattern بحيث نجعله لا يقبل سوى الأرقام مثلما هو موضح في المثال التالي. هذا الحل ليس مثاليا، لكنه يحل الُمشكل. يُمكنكم الإطلاع على نتيجة ذلك في هذه <a rel="external nofollow" href="http://www.youtube.com/watch?v=NmikW6QqaDo">الفيديو القصيرة</a>.</p><pre class="html ipsCode prettyprint">&lt;input type="text" pattern="[0-9]*" name="shoe-size"&gt;</pre><p dir="rtl">هذه التقنية من شأنها أن تصبح "مهجورة" obsolete بعد اعتماد خاصية inputmode والتي تمت إضافتها مؤخرا إلى مواصفات HTML5. هذه الخاصية من شأنها أن تُحدد طريقة ملء الحقل الأنسب للمستخدم. لدى استخدام هذه الخاصية فإنه سيصبح بالإمكان الاختيار ما بين الأرقام، الحروف اللاتينية، عناوين البريد الإلكتروني أو Kana (والتي يبدو بأنها خاصة باللغة اليابانية).</p><h1 dir="rtl">range</h1><p dir="rtl">حقل range  مُشابه لحقل number مع نكهة إضافية، حيث أنه يُمثل قيمة عددية محصورة ضمن نطاق مُعين (range). قد تتساءل عن الفرق ما بين هذين الحقلين، الفرق بسيط وهو أن قيمة الحقل ليست بتلك الأهمية التي هي عليها قيمة الحقل مع number، كما أن المُتصفح يوفر آلية أكثر سهولة في التحكم فيه. يتم إظهار حقل range على كل من مُتصفحات Opera، Safari، IE10 وChrome على هيئة slider (انظر الصورة أدناه). يُظهر مُتصفح IE10 لدى تحريك زر الحقل القيمة التي تم اختيارها. يقوم مُتصفح Opera بإظهار الـ slider بشكل عمودي إن تم إعطاء قيمة للطول أكبر من قيمة العُرض له في ملف CSS.</p><p dir="rtl">المثال التالي يُوضح كيفية استخدام حقل rang للقيام مثلا بتحديد مدى مهارة المُستخدم في مجال مُعين على سُلم من 1 إلى 100، حيث نقوم بتحديد القيم الدنيا والقُصوى من خلال الخاصيتين min وmax. بإمكاننا أيضا تحديد قيمة قياسية لهذا الحقل بالاستعانة بخاصية value.</p><pre class="html ipsCode prettyprint">&lt;input id="skill" type="range" min="1" max="100" value="0"&gt;</pre><div><dl><dt><a rel="external nofollow" href="http://www.webtuts.me/wp-content/uploads/2013/06/type-range-in-Chrome.png"><img alt="حقل range على مُتصفح Chrome" src="http://www.webtuts.me/wp-content/uploads/2013/06/type-range-in-Chrome.png"></a></dt><dd>حقل range على مُتصفح Chrome</dd></dl></div><p dir="rtl">ملاحظة: إن كنت تبحث عن طريقة لتوفير تراجع رشيق لحقول rang على المُتصفحات التي لا تدعمها، فيُمكنك القيام بذلك باستخدام <a rel="external nofollow" href="http://remysharp.com/2011/07/18/input-range-polyfill/">هذه الطريقة</a> التي أتى بها Remy Sharp.</p><h1 dir="rtl">dates و times</h1><p dir="rtl">إن سبق لك أن حجزت أو اشتريت تذاكر على الإنترنت فإنك من دون شك قد تعاملت مع data picker لاختيار التاريخ الذي توده، وربما قد سبق لك وأن استخدمت ذلك في أحد مشاريعك. عادة ما يتم توفير ذلك باستخدام JavaScript وبالتحديد مكتبة jQuery، Dojo أو YUI. قد يكون تحميل مكتبة بأكملها وإحدى إضافاتها من أجل القيام بذلك قرارًا غير صائب، لكن مع HTML5 فإنه يُمكن القيام بذلك من دون أية إضافات. ليس هذا فحسب فما تُقدمه HTML5 لا تسمح باختيار التاريخ فقط، بل يُمكن أيضا اختيار الأسبوع، الشهر، الوقت، التاريخ، وحتى التاريخ التابع لمنطقة زمنية مُعيّنة.</p><p dir="rtl">يُمكن القيام بذلك على النحو التالي:</p><pre class="html ipsCode prettyprint">&lt;input id="dob" name="dob" type="date"&gt;</pre><p dir="rtl">يُمكنك الذهاب إلى أبعد من ذلك باستخدام خاصيتي min وmax لتضمن بأن التاريخ الذي يختاره المُستخدم يقع ضمن نطاق تقوم بتحديده.</p><pre class="html ipsCode prettyprint">&lt;input id="startdate" name="startdate" min="2012-01-01" max="2013-01-01" type="date"&gt;</pre><p dir="rtl">وكما حول الحال مع العديد من أنواع الحقول فإن مُتصفح Opera يتميز عن غيره بدعمها لهذا الحقل بشكل جيد. دعونا نلقي نظرة على الكيفية التي تظهر فيها هذه الحقول على مُتصفح Opera:</p><h2 dir="rtl">date</h2><p dir="rtl">الصورة التالية تُبين الحالة التي يظهر عليها حقل date على الإصدار 10.5 من مُتصفح Opera</p><p dir="rtl"><a rel="external nofollow" href="http://www.webtuts.me/wp-content/uploads/2013/06/type-date-in-Opera-10.5.png"><img alt="type-date-in-Opera-10.5" src="http://www.webtuts.me/wp-content/uploads/2013/06/type-date-in-Opera-10.5.png"></a></p><p dir="rtl">لا يقتصر استخدام هذا الحقل على الأجهزة المكتبية فقط، تقوم أجهزة BlackBerry ومتصفح Chrome على نظام Android باستخدام date pickerالخاص بها لدى استخدام حقل date.</p><p dir="rtl"><a rel="external nofollow" href="http://www.webtuts.me/wp-content/uploads/2013/06/type-date-on-Blackberry.png"><img alt="type-date-on-Blackberry" src="http://www.webtuts.me/wp-content/uploads/2013/06/type-date-on-Blackberry.png"></a></p><h3 dir="rtl">month</h3><p dir="rtl">الصورة التالية توضح كيف تظهر حقول month على مُتصفح Opera والتي يُمكن استخدامها مثلا لإدخال شهر انتهاء صلاحية بطاقة دفع إلكتروني.</p><p dir="rtl">يُمكن استخدام حقل month على النحو التالي:</p><pre class="html ipsCode prettyprint">&lt;input id="expiry" name="expiry" type="month" required&gt;</pre><p><a rel="external nofollow" href="http://www.webtuts.me/wp-content/uploads/2013/06/type-month-in-Opera-10.5.png"><img alt="type-month-in-Opera-10.5" src="http://www.webtuts.me/wp-content/uploads/2013/06/type-month-in-Opera-10.5.png"></a></p><h3 dir="rtl">week</h3><p dir="rtl">يُمكن أيضا تمكين المُستخدم من اختيار أسبوع مُعين في الشهر على النحو التالي:</p><pre class="html ipsCode prettyprint">&lt;input id="vacation" name="vacation" type="week"&gt;</pre><p dir="rtl">لاحظوا في الصورة التالية كيف يقوم مُتصفح Opera بإبراز/تظليل الأسبوع الذي يتم اختياره.</p><p dir="rtl"><a rel="external nofollow" href="http://www.webtuts.me/wp-content/uploads/2013/06/type-week-in-Opera-10.5.png"><img alt="type-week-in-Opera-10.5" src="http://www.webtuts.me/wp-content/uploads/2013/06/type-week-in-Opera-10.5.png"></a></p><h3 dir="rtl">time</h3><p dir="rtl">الصورة التالية تُبين الحالة التي يظهر عليها حقل time على متصفح Opera والذي يُمكن استخدامه على النحو التالي:</p><pre class="html ipsCode prettyprint">&lt;input id="exit-time" name="exit-time" type="time"&gt;</pre><p dir="rtl"><a rel="external nofollow" href="http://www.webtuts.me/wp-content/uploads/2013/06/type-time-in-Opera-10.5.png"><img alt="type-time-in-Opera-10.5" src="http://www.webtuts.me/wp-content/uploads/2013/06/type-time-in-Opera-10.5.png"></a></p><h3 dir="rtl">datetime</h3><p dir="rtl">يُمكن دمج كلا من حقلي date وtime لينتج لنا حقل datetime والذي يُستعمل لتحديد التاريخ والوقت معا على النحو التالي:</p><pre class="html ipsCode prettyprint">&lt;input id="entry-day-time" name="entry-day-time" type="datetime"&gt;</pre><p dir="rtl"><a rel="external nofollow" href="http://www.webtuts.me/wp-content/uploads/2013/06/type-datetime-in-Opera-10.5.png"><img alt="type-datetime-in-Opera-10.5" src="http://www.webtuts.me/wp-content/uploads/2013/06/type-datetime-in-Opera-10.5.png"></a></p><p dir="rtl">datetime-local</p><p dir="rtl">وأخيرا وليس آخرا، تظهر الصورة التالية كيف يسمح HTML5 لنا بالتحكم بشكل أدق في آلية اختيار التاريخ والوقت ضمن المنطقة الزمنية المحلية باستخدام datetime-local على النحو التالي:</p><pre>&lt;input id="arrival-time" name="arrival-time " type="datetime-local"&gt;</pre><p><a rel="external nofollow" href="http://www.webtuts.me/wp-content/uploads/2013/06/type-datetime-local-in-Opera-10.5.png"><img alt="type-datetime-local-in-Opera-10.5" src="http://www.webtuts.me/wp-content/uploads/2013/06/type-datetime-local-in-Opera-10.5.png"></a></p><h3 dir="rtl">مشاكل مع date و time</h3><p dir="rtl">هناك على الأقل مشكلان رئيسيان مع حقول الوقت والتاريخ. الأول يخص عدم التمكن من كتابة التاريخ يدويا بشكل مباشر (على المتصفحات التي تدعمها) رغم أنه يمكن التحكم في هذه الحقول باستخدام لوحة المفاتيح، حيث أنه وفي الحالات التي يقوم المستخدم بملء نفس النموذج عدة مرات فإنه هذه العملية ستكون أسرع لو تم تمكينه من كتابة التواريخ يدويا.</p><p dir="rtl">المشكل الثاني يكمن في عدم مقدرتنا في التحكم في مظهر الـ data Picker. الاعتقاد السائد هو أن هذا الأمر محمود، حيث سيحصل المستخدم على نفس تجربة المستخدم ونفس المظهر على جميع المواقع التي يزورها، إلا أن الشركات -ومن دون شك- سترغب في توفير Data Picker خاص بها. قامت كل من Safari5 و Chrome5 بدعم هذه الحقول إلا أن مظهرها ليس جيدا.</p><p dir="rtl">يجب أن تكون حقول date على الشكل التالي: YYYY-MM-DD وحقول datetime على الشكل الغريب التالي: YYYYMM-DDT00:00Z.</p><p dir="rtl">ومثلما هو عليه الحال مع باقي أنواع الحقول الأخرى تقوم المتصفحات التي لا تدعم هذه الحقول بتجاهلها وتعويضها بحقول نصية عادية type="text".</p><h1 dir="rtl">color</h1><p dir="rtl">تسمح حقول color باختيار لون مُعين وإرجاع قيمته الست عُشرية Hex value. من المفترض أن يكون المُستخدم قادرا على إدخال قيمة اللون الذي اختاره أو أن يقوم باختيار اللون من لوحة Color Picker والتي يمكن أن تكون إما لوحة اختيار الألوان الخاصة بنظام التشغيل أو لوحة اختيار الألوان الخاصة بالمُتصفح.  قام مُتصفح Opera 11 بدعم حقل الألوان بتوفيره جملة من الألوان القياسية إضافية إلى زر يوفر إمكانية اختيار ألوان أخرى، والذي -بمجرد النقر عليه- يُظهر لوحة اختيار الألوان الخاصة بنظام التشغيل.</p><pre class="html ipsCode prettyprint">&lt;input id="color" name="color" type="color"&gt;</pre><div><dl><dt><a rel="external nofollow" href="http://www.webtuts.me/wp-content/uploads/2013/06/type-color-in-Opera-on-the-left-and-the-result-of-clicking-Other-shown-on-the-right.png"><img alt="حقل الألوان على مُتصفح Opera  على اليسار ونتيجة النقر على زر other على اليمين." src="http://www.webtuts.me/wp-content/uploads/2013/06/type-color-in-Opera-on-the-left-and-the-result-of-clicking-Other-shown-on-the-right.png"></a></dt><dd>حقل الألوان على مُتصفح Opera على اليسار ونتيجة النقر على زر other على اليمين.</dd></dl></div><p dir="rtl">في المقابل توفر بعض أجهزة BlackBerry دعما لحقول color حيث تقوم بإظهار لوحة اختيار الألوان المُبنية في الصورة التالية:</p><p dir="rtl"><a rel="external nofollow" href="http://www.webtuts.me/wp-content/uploads/2013/06/type-color-on-Blackberry.png"><img alt="type-color-on-Blackberry" src="http://www.webtuts.me/wp-content/uploads/2013/06/type-color-on-Blackberry.png"></a></p><h1 dir="rtl">خلاصة</h1><p dir="rtl">باستخدامك للحقول الجديدة الخاصة بـ HTML5 فأنت تقدم تجربة مستخدم أفضل لزوار موقعك، تحضر موقعك للعمل حسب معايير المستقبل، وتسهل من مهمة التطوير عليك. بطبيعة الحال ليس من المُمكن أن نتجاهل المُتصفحات التي لا تدعم هذه الخواص، إلا أنه من الممكن توفير دعم لها باستخدام JavaScript (ستجد تفاصيل حول الأمر بقراءتك للفصل السادس من كتاب  <a rel="external nofollow" href="http://thewebevolved.com/">Beginning HTML5 and CSS3</a>).</p><p dir="rtl">يُمكن لك أن تجد نموذجا تجريبيا يستخدم بعضا من الأمثلة التي استعرضناها في هذا المقال <a rel="external nofollow" href="http://webtuts.me/codes/forms/forms-example.html">هنا</a>.</p><p dir="rtl">أشرنا خلال هذا المقال إلى المتصفحات التي تدعم كل من الحقول التي استعرضناها، لكن مع الإصدارات الجديدة لكل متصفح والتي يتم إطلاقها بوتيرات متسارعة فإنه من الصعب معرفة ما الذي يدعمه هذا المتصفح وما الذي لا يدعمه ذاك المتصفح، لكن إن أردت البقاء على اطلاع على ذلك فإنه يُمكنك ذلك عبر المواقع التالية: <a rel="external nofollow" href="http://caniuse.com/">can I use …</a>، <a rel="external nofollow" href="http://fmbip.com/litmus/">FindMeByIP</a> ومحرك بحث <a rel="external nofollow" href="http://www.wufoo.com/html5/">Wufoo الخاص بالـ HTML5</a>.</p><p dir="rtl">إذا فاتتك قراءة المقال السابق الذي يتحدث عن مختلف الخصائص الجديدة في نماذج HTML5 فيُمكن إيجاده <a rel="external nofollow" href="http://www.webtuts.me/html5-forms-introduction-new-attributes/">هنا</a>.</p><p dir="rtl">ترجمة –وبتصرف- للمقال <a rel="external nofollow" href="http://html5doctor.com/html5-forms-input-types/">HTML5 forms input types</a> لصاحبه <a rel="external nofollow" href="https://twitter.com/Rich_Clark">Richard Clark</a>.</p>
]]></description><guid isPermaLink="false">5</guid><pubDate>Sat, 15 Jun 2013 15:05:00 +0000</pubDate></item></channel></rss>
