<?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/2/?d=2</link><description>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;: HTML</description><language>ar</language><item><title>&#x625;&#x636;&#x627;&#x641;&#x629; &#x645;&#x62D;&#x62A;&#x648;&#x649; &#x633;&#x645;&#x639;&#x64A; &#x648;&#x645;&#x631;&#x626;&#x64A; &#x641;&#x64A; &#x635;&#x641;&#x62D;&#x629; HTML</title><link>https://academy.hsoub.com/programming/html/%D8%A5%D8%B6%D8%A7%D9%81%D8%A9-%D9%85%D8%AD%D8%AA%D9%88%D9%89-%D8%B3%D9%85%D8%B9%D9%8A-%D9%88%D9%85%D8%B1%D8%A6%D9%8A-%D9%81%D9%8A-%D8%B5%D9%81%D8%AD%D8%A9-html-r1825/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_12/63987a086fb55_------html.jpg.05a7b75951d3938e9ddd073a36e06d85.jpg" /></p>

<p>
	حان الوقت لإدراج مشغلات الفيديو والصوتيات ضمن صفحات HTML بعد أن امتلكنا بعض الخبرة في إدراج الصور ضمن صفحات الويب، إذ سيشرح مقالنا هذا الأمر باستخدام العنصرين <a href="https://wiki.hsoub.com/HTML/video" rel="external"><code>&lt;video&gt;</code></a> و <a href="https://wiki.hsoub.com/HTML/audio" rel="external"><code>&lt;audio&gt;</code></a> ثم سيلقي الضوء في النهاية على طريقة إضافة الشروحات أو الكلام الوارد في هذه المقاطع إلى <a href="https://academy.hsoub.com/devops/servers/%D8%A7%D9%84%D9%81%D8%B1%D9%82-%D8%A8%D9%8A%D9%86-%D8%B5%D9%81%D8%AD%D8%A9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D9%88%D9%85%D9%88%D9%82%D8%B9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D9%88%D8%AE%D8%A7%D8%AF%D9%85-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D9%88%D9%85%D8%AD%D8%B1%D9%83-%D8%A7%D9%84%D8%A8%D8%AD%D8%AB-r572/" rel="">صفحات ويب</a>.
</p>

<p>
	لا بدّ قبل البدء بهذا المقال أن تكون على دراية بأساسيات عمل الحاسوب وطريقة تثبيت البرمجيات الأساسية ودراية بطريقة عمل الملفات، ولا بد أيضًا من الدراية بأساسيات اللغة HTML كما عرضناها في مقال <a href="https://academy.hsoub.com/programming/html/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%84%D8%BA%D8%A9-html-r1752/" rel="">تعرَّف على HTML</a>، وطريقة <a href="https://academy.hsoub.com/programming/html/%D8%A5%D8%B6%D8%A7%D9%81%D8%A9-%D8%A7%D9%84%D8%B5%D9%88%D8%B1-%D9%81%D9%8A-%D8%B5%D9%81%D8%AD%D8%A9-html-r1824/" rel="">إضافة الصور في صفحة HTML</a>.
</p>

<h2>
	مقاطع الصوت والفيديو في الويب
</h2>

<p>
	أراد مطورو الويب استخدام المقاطع الصوتية والفيديوهات منذ بداية هذا القرن -القرن الحادي والعشرين- مع ازدياد سرعة الاتصال <a href="https://academy.hsoub.com/devops/networking/%D8%A2%D9%84%D9%8A%D8%A9-%D8%B9%D9%85%D9%84-%D8%B4%D8%A8%D9%83%D8%A9-%D8%A7%D9%84%D8%A5%D9%86%D8%AA%D8%B1%D9%86%D8%AA-r571/" rel="">بالإنترنت</a> وزيادة عرض حزم التراسل بشكل كاف لدعم أنواع من مقاطع الفيديو (ملفات الفيديو أكبر حجمًا من النصوص والصور)، ولم تتمكن التقنيات الأساسية للويب مثل HTML في البدايات من إدراج الفيديوهات ومقاطع الصوت في صفحات الويب، لذلك ظهرت تقنيات مبنية على الإضافات plug-in مثل تقنية الفلاش Flash وبعدها سيلفرلايت Silverlight وكلاهما قد خرج من الخدمة الآن وقد تصدَّرتا الواجهة في عرض هذا النوع من المحتوى، كما عملت هذه التقنيات جيدًا لكن المشاكل سرعان ما واجتها مثل عدم توافق عملها مع ميزات HTML و <a href="https://academy.hsoub.com/programming/css/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%84%D8%BA%D8%A9-css-r1688/" rel="">CSS</a> إضافة إلى مشاكل أمنية ومشاكل في سهولة الوصول.
</p>

<p>
	كان استخدام الحلول الأصلية هو السبيل الأساسي إذا جرى ذلك بالصورة الصحيحة، ولم يتأخر الأمر كثيرًا مع ظهور مواصفات HTML5 التي أضافت ميزات إدراج الفيديو والصوت من خلال العنصرين <code>&lt;video&gt;</code> و <code>&lt;audio&gt;</code> وبعض الواجهات البرمجية <a href="https://academy.hsoub.com/programming/javascript/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%84%D8%BA%D8%A9-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA-r1689/" rel="">بلغة جافاسكربت</a> للتحكم بهما، ولن نتحدث عن جافاسكربت في المقال وإنما فقط العمليات الأساسية التي يمكن إنجازها باستخدام HTML، كما لن نتعلم في مقالنا كيفية إنتاج ملفات الفيديو والصوت فالأمر يتطلب مجموعة مختلفة من المهارات، ولهذا سنستخدِم <a href="https://github.com/mdn/learning-area/tree/main/html/multimedia-and-embedding/video-and-audio-content" rel="external nofollow">مجموعةً من ملفات الوسائط المتعددة</a> وشيفرة تدريبية لتجرب العمل عليها إذا لم تستطع التعامل مع ما لديك.
</p>

<p>
	<strong>ملاحظة</strong>: عليك أن تعرف قبل البدء هنا بوجود العديد من مزودِي خدمة الفيديو على الإنترنت online video providers -أو OVP اختصارًا- مثل اليوتيوب وديلي موشن وفيميو، بالإضافة إلى مزودِي خدمات الصوت مثل ساوند كلاود، إذ تقدِّم لك هذه الشركات طريقةً سهلةً لاستضافة وتشغيل الفيديوهات دون أن تلق بالًا لاستنزاف حجم حزمة التراسل، كما تزوّدك هذه الشركات بشيفرة جاهزة لإدراج مقاطع الفيديو أو الصوت في صفحاتك، فإذا قررت استخدام هذا المسار، فيمكنك الابتعاد عن الكثير من النقاط الصعبة التي نناقشها في هذا المقال، إذ سنناقش هذا النوع من الخدمات لاحقًا.
</p>

<h2>
	العنصر <code>&lt;video&gt;</code>
</h2>

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

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7158_12" style="">
<span class="tag">&lt;video</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"rabbit320.webm"</span><span class="pln"> </span><span class="atn">controls</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;p&gt;</span><span class="pln">Your browser doesn't support HTML5 video. Here is a </span><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"rabbit320.webm"</span><span class="tag">&gt;</span><span class="pln">link to the video</span><span class="tag">&lt;/a&gt;</span><span class="pln"> instead.</span><span class="tag">&lt;/p&gt;</span><span class="pln">
</span><span class="tag">&lt;/video&gt;</span></pre>

<p>
	تجدر ملاحظة الميزات التالية:
</p>

<ul>
<li>
		<code>src</code>: سمة مشابهة تمامًا لتلك الموجودة في <a href="https://wiki.hsoub.com/HTML/img" rel="external">العنصر &lt;img&gt;</a>، وتضم المسار إلى مقطع الفيديو الذي تريد إدراجه.
	</li>
	<li>
		<code>controls</code>: ينبغي أن يكون المستخدِم قادرًا على التحكم بتشغيل وإيقاف الفيديو، لذلك قد تستخدِم هذه السمة لإضافة الواجهة الخاصة بالمتصفح للتحكم بالفيديو، أو أن تبني الواجهة الخاصة بك باستخدام واجهة جافاسكربت برمجية مناسبة، ولا بدّ من ضم الواجهة آلية لبدء وإيقاف تشغيل المقطع على الأقل، وكذلك ضبط مستوى الصوت.
	</li>
	<li>
		الفقرة النصية داخل العنصر <code>&lt;video&gt;</code>: وُتدعى الخطة البديلة fallback، إذ يُعرَض محتواها إذا لم يدعم المتصفح المستخدَم العنصر <code>&lt;video&gt;</code>، مما يسمح بوجود بديل للمتصفحات القديمة، ولا يوجد أسلوب محدَّد لتنظيم الخطة البديلة، فقد زودنا المستخدِم في حالتنا برابط إلى ملف الفيديو لكي يتمكن من الوصول إليه بصرف النظر عن المتصفح الذي يستخدِمه.
	</li>
</ul>
<p>
	سيبدو مقطع الفيديو بعد إدراجه مشابهًا للصورة التالية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="113777" href="https://academy.hsoub.com/uploads/monthly_2022_12/01_embedded_video.png.86aa46ee80dbd333506c1e6c57f2e30e.png" rel=""><img alt="ظهور مقاطع الفيديو عند إضافتها عبر html" class="ipsImage ipsImage_thumbnailed" data-fileid="113777" data-unique="9yzrz3fto" src="https://academy.hsoub.com/uploads/monthly_2022_12/01_embedded_video.png.86aa46ee80dbd333506c1e6c57f2e30e.png" style="width: 450px; height: auto;"></a>
</p>

<p>
	بإمكانك أيضًا <a href="https://mdn.github.io/learning-area/html/multimedia-and-embedding/video-and-audio-content/simple-video.html" rel="external nofollow">تجريب الصفحة مباشرةً</a>، وألق نظرةً على <a href="https://github.com/mdn/learning-area/blob/master/html/multimedia-and-embedding/video-and-audio-content/simple-video.html" rel="external nofollow">الشيفرة المصدرية</a>.
</p>

<h3>
	استخدام تنسيقات مصدرية مختلفة لتحسين التوافقية
</h3>

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

<h4>
	محتوى ملف الوسائط
</h4>

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

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

<p style="text-align: center;">
	<img alt="محتوى ملف الوسائط" class="ipsImage ipsImage_thumbnailed" data-fileid="113778" data-unique="k8zd5axh7" src="https://academy.hsoub.com/uploads/monthly_2022_12/02_wemb_format_diagram.png.90fc8075f12102a8ba8fe44342f90753.png" style="width: 559px; height: auto;"></p>

<p>
	تحمل مسارات الفيديو والمسارات الصوتية داخل الحاوية بيانات بالتنسيق الذي يوافق المرمّز المستخدَم في ترميز هذه الوسائط، إذ تستخدَم عدة تنسيقات لتخزين مسارات الصوت لتتماشى مع مسارات الفيديو، كما يرمّز كل مسار صوتي باستخدام مرمِّز صوتي وترمّز مسارات الفيديو باستخدام مرمِّز فيديو، كما تدعم المتصفحات المختلفة تنسيقات فيديو مختلفة وتنسيق حاويات مختلف مثل MP3 و MP4 و WebM والتي تحتوي بدورها على تنسيقات مختلفة للفيديو والصوتيات، فعلى سبيل المثال:
</p>

<ul>
<li>
		تحزِم حاوية WebM تقليديًا مسارات الصوت بتنسيق Vorbis أو Opus مع مسارات فيديو بتنسيق VP8 و VP9، كما تدعم كل المتصفحات الحديثة هذه التنسيقات، لكنها قد لا تعمل مع المتصفحات القديمة.
	</li>
	<li>
		تحزِم حاوية MP4 عادةً مسارات الصوت بتنسيق MP3 و AAC مع مسار فيديو بتنسيق <code>H.246</code>، كما تدعم كل المتصفحات الحديثة هذه التنسيقات كما يدعمها إنترنت إكسبلورر.
	</li>
	<li>
		تميل حاويات Ogg إلى حزم مسارات الصوت بتنسيق Vorbis مع مسار فيديو بتنسيق Theora، كما تدعم هذه الحاوية متصفحات فايرفوكس وكروم، لكن تُستبدل بحاويات WebM ذات الجودة الأعلى.
	</li>
</ul>
<p>
	تظهر بعض الحالات الخاصة التي تُخزّن فيها بيانات المرمز الصوتي لبعض المسارات الصوتية دون حاوية أو ضمن حاوية بسيطة. مثل المرمزات FLAC التي تُخزّن البيانات عادةً في ملفات بامتداد <code>FLAC.</code> وهي مجرد مسارات خام لبيانات هذا المرمز.
</p>

<p>
	توجد حالة أخرى وهي ملفات MP3 دائمة الشعبية وهي المسار أو الطبقة الصوتية الثالثة لتنسيق MPEG-1 مخزّنةً ضمن حاوية MPEG أو MPEG-2، وتظهر أهمية الأمر عندما نعرف أن معظم المتصفحات لا تدعم ملفات الوسائط بتنسيق MPEG من خلال العنصرين <code>&lt;video&gt;</code> و <code>&lt;audio&gt;</code>، لكنها قد تستمر بدعم MP3 نظرًا لشعبيته.
</p>

<p>
	تميل مشغلات الصوت إلى تشغيل المسارات الصوتية مثل MP3 و Ogg مباشرةً دون الحاجة إلى الحاويات في هذه الحالة.
</p>

<h4>
	دعم ملفات الوسائط المتعددة في المتصفحات
</h4>

<p>
	<strong>ملاحظة</strong>: ما الذي خلق مشكلة التوافق؟ الجواب هو وجود تنسيقات شعبية مثل MP3 و MP4/H.246 التي تتمتع بأداء ممتاز لكنها خاضعة لبراءات الاختراع التي تغطي بعضًا من التكنولوجيا التي تستند إليها أو كلها، فقد غطت براءة الاختراع MP3 حتى عام 2017 وستغطِّي H.246 حتى 2027 على الأقل، ونظرًا لوجود براءات الاختراع، فلا بد من دفع المتصفحات ضرائب كبيرة إذا أرادت إضافة دعم لهذه المرمزات، بالإضافة إلى ذلك، يفضِّل الكثيرون تحاشي القيود على البرمجيات واستخدام التنسيقات <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%A7-%D8%A7%D9%84%D9%85%D9%82%D8%B5%D9%88%D8%AF-%D8%A8%D9%85%D8%B5%D8%B7%D9%84%D8%AD-%D9%85%D9%81%D8%AA%D9%88%D8%AD-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-open-source%D8%9F-r885/" rel="">مفتوحة المصدر</a>، ولهذه الأسباب قد يضطر المطورون إلى دعم تنسيقات مختلفة للوصول إلى جمهور أوسع.
</p>

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

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

<p>
	<strong>ملاحظة</strong>: تعرَّف على طريقة اختيار حاوية الوسائط المناسبة بالاطلاع على المقال <a href="https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Containers" rel="external nofollow">تنسيقات حاويات الوسائط المتعددة</a>، وطريقة اختيار المرمز الصوتي المناسب في مقال <a href="https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Audio_codecs#choosing_an_audio_codec" rel="external nofollow">دليلك إلى مرمزات الملفات الصوتية في الويب</a>، وطريقة اختيار مرمز الفيديو المناسب في مقال <a href="https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Video_codecs" rel="external nofollow">دليلك إلى مرمزات الفيديو في الويب</a>.
</p>

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

<p>
	إذًا كيف سننجز الأمر؟ لنلق نظرةً على المثال التالي، ويمكنك <a href="https://mdn.github.io/learning-area/html/multimedia-and-embedding/video-and-audio-content/multiple-video-formats.html" rel="external nofollow">تجريبه مباشرةً</a> أيضًا:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7158_18" 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">"rabbit320.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="tag">&lt;source</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"rabbit320.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;p&gt;</span><span class="pln">Your browser doesn't support HTML5 video. Here is a </span><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"rabbit320.mp4"</span><span class="tag">&gt;</span><span class="pln">link to the video</span><span class="tag">&lt;/a&gt;</span><span class="pln"> instead.</span><span class="tag">&lt;/p&gt;</span><span class="pln">
</span><span class="tag">&lt;/video&gt;</span></pre>

<p>
	لقد أخرجنا في الشيفرة السابقة السمة <code>src</code> من العنصر <code>&lt;video&gt;</code> ووضعناها داخل عنصر مستقل هو <code>&lt;source&gt;</code> الذي يشير إلى موارد خاصة به، إذ سينتقل المتصفح في هذه الحالة إلى مجموعة العناصر <code>&lt;source&gt;</code> ويشغِّل المورد في أول عنصر يمتلك مرمزه، وبوجود الحاويتين WebM و MP4 ستضمن تشغيل ملفك على معظم المنصات والمتصفحات الموجودة حاليًا.
</p>

<p>
	يمتلك كل <a href="https://wiki.hsoub.com/HTML/source" rel="external">عنصر &lt;source&gt;</a> السمة <code>type</code> وهي اختيارية لكننا ننصح باستخدامها، كما تتضمن هذه السمة نوع الوسائط المتعددة MIME للملف الذي يحدده العنصر <code>&lt;source&gt;</code>، إذ يستخدِمها المتصفح لتجاوز الفيديوهات التي لا يفهمها، فإذا لم تُحدد قيمة لهذه السمة، فسيحمِّل المتصفح كل ملف ويحاول تشغيله حتى يجد الملف الذي يعمل، وهذا ما يستغرق وقتًا ويسبب هدرًا في استخدام الموارد.
</p>

<p>
	<strong>ملاحظة</strong>: عُد إلى مقال <a href="https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Containers" rel="external nofollow">دليلك إلى أنواع ملفات الوسائط وتنسيقاتها</a> لاختيار أنسب مرمز وأنسب حاوية لاستخداماتك ولتتعرف أيضًا على أنواع الوسائط المتعددة MIME التي تعرِّف كل حاوية.
</p>

<h3>
	ميزات أخرى
</h3>

<p>
	هنالك عدد من الميزات التي يمكنك إضافتها عند عرض فيديوهات HTML، وإليك مثالًا كما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7158_21" style="">
<span class="tag">&lt;video</span><span class="pln"> </span><span class="atn">controls</span><span class="pln"> </span><span class="atn">width</span><span class="pun">=</span><span class="atv">"400"</span><span class="pln"> </span><span class="atn">height</span><span class="pun">=</span><span class="atv">"400"</span><span class="pln">
       </span><span class="atn">autoplay</span><span class="pln"> </span><span class="atn">loop</span><span class="pln"> </span><span class="atn">muted</span><span class="pln"> </span><span class="atn">preload</span><span class="pun">=</span><span class="atv">"auto"</span><span class="pln">
       </span><span class="atn">poster</span><span class="pun">=</span><span class="atv">"poster.png"</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">"rabbit320.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="tag">&lt;source</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"rabbit320.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;p&gt;</span><span class="pln">Your browser doesn't support HTML video. Here is a </span><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"rabbit320.mp4"</span><span class="tag">&gt;</span><span class="pln">link to the video</span><span class="tag">&lt;/a&gt;</span><span class="pln"> instead.</span><span class="tag">&lt;/p&gt;</span><span class="pln">
</span><span class="tag">&lt;/video&gt;</span></pre>

<p>
	ستبدو نتيجة تنفيذ هذه الشيفرة للمستخدِم كما يلي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="113779" href="https://academy.hsoub.com/uploads/monthly_2022_12/03_html5_video.png.48d4bbea57b5afff4e753cdab1424892.png" rel=""><img alt="03_html5_video.png" class="ipsImage ipsImage_thumbnailed" data-fileid="113779" data-unique="9ich80sje" src="https://academy.hsoub.com/uploads/monthly_2022_12/03_html5_video.png.48d4bbea57b5afff4e753cdab1424892.png"></a>
</p>

<p>
	لنلق نظرةً على الميزات الجديدة:
</p>

<ul>
<li>
		<code>width</code> و <code>height</code>: يمكنك التحكم بأبعاد الفيديو باستخدام هاتين السمتَين أو من خلال <a href="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/" rel="">تنسيقات CSS</a>، إذ يحافظ الفيديو في كلتا الحالتين على النسبة الأصلية للعرض إلى الطول أو كما تسمى النسبة الباعية أو نسبة البُعدَين aspect ratio، فإذا لم تتحقق هذه النسبة عندما تضبط بنفسك الطول والعرض، فسيغطي الفيديو الصفحة أفقيًا وتُملأ المنطقة غير المشغولة بالفيديو بخلفية ملونة مستمرة.
	</li>
	<li>
		<code>autoplay</code>: تسبب تشغيل الفيديو أو الصوت مباشرةً، في حين لا تزال بقية المحتوى قيد التحميل، كما لا ننصحك باستخدام هذه السمة للفيديو أو ملفات الصوت ضمن موقعك لأنه أمر مزعج لكثير من المستخدِمين.
	</li>
	<li>
		<code>loop</code>: تسبب تشغيل الفيديو او الصوت عند انتهائه، وقد يكون الأمر مزعجًا، لذا لا تستخدِمه إلا إذا كان ذلك ضروريًا.
	</li>
	<li>
		<code>muted</code>: تشغّل مقطع الفيديو افتراضيًا بدون صوت.
	</li>
	<li>
		<code>poster</code>: تضم <a href="https://academy.hsoub.com/programming/general/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%B9%D9%86%D9%88%D8%A7%D9%86-url-%D9%88%D8%A3%D9%86%D9%88%D8%A7%D8%B9%D9%87-r1435/" rel="">عنوان URL</a> للصورة التي تُعرَض قبل تشغيل الفيديو، وهي معدَّة للاستخدام مع الشاشات التمهيدية splash screen أو الشاشات الدعائية.
	</li>
	<li>
		<code>preload</code>: تستخدَم للتخزين المؤقت للملفات الضخمة، كما تأخذ أحد القيم الثلاث التالية: <code>"none"</code> وتعني لا تخزين مؤقت، أو <code>"auto"</code> وتعني ضرورة التخزين المؤقت للملف، أو <code>"metadata"</code> لتخزين البيانات الوصفية فقط للملف.
	</li>
</ul>
<p>
	يمكنك تجريب المثال السابق <a href="https://mdn.github.io/learning-area/html/multimedia-and-embedding/video-and-audio-content/extra-video-features.html" rel="external nofollow">مباشرةً على جيت-هاب</a>، كما يمكنك الاطلاع على <a href="https://github.com/mdn/learning-area/blob/gh-pages/html/multimedia-and-embedding/video-and-audio-content/extra-video-features.html" rel="external nofollow">الشيفرة المصدرية</a> أيضًا، ولاحظ عدم استخدام السمة <code>autoplay</code> في النسخة المباشرة، إذ لن ترى صورة البداية إذا بدأ الفيديو قبل انتهاء تحميل الصفحة.
</p>

<h2>
	العنصر <code>&lt;audio&gt;</code>
</h2>

<p>
	يشابه العنصر <code>&lt;[video](https://wiki.hsoub.com/HTML/video)&gt;</code> مع بعض الاختلافات كما سنوضح لاحقًا، وإليك مثالًا عن استخدام العنصر:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7158_25" 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">"viper.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="tag">&lt;source</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"viper.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;p&gt;</span><span class="pln">Your browser doesn't support HTML5 audio. Here is a </span><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"viper.mp3"</span><span class="tag">&gt;</span><span class="pln">link to the audio</span><span class="tag">&lt;/a&gt;</span><span class="pln"> instead.</span><span class="tag">&lt;/p&gt;</span><span class="pln">
</span><span class="tag">&lt;/audio&gt;</span></pre>

<p>
	تمثل الصورة التالية نتيجة تنفيذ الشيفرة:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="113780" href="https://academy.hsoub.com/uploads/monthly_2022_12/04_audio_player.png.58147cb6ce9fcde66126de9f7986865c.png" rel=""><img alt="العنصر &lt;audio&gt;" class="ipsImage ipsImage_thumbnailed" data-fileid="113780" data-unique="e1ol75t7c" src="https://academy.hsoub.com/uploads/monthly_2022_12/04_audio_player.png.58147cb6ce9fcde66126de9f7986865c.png" style="width: 500px; height: auto;"></a>
</p>

<p>
	<strong>ملاحظة</strong>: يمكنك تشغيل المثال السابق <a href="https://mdn.github.io/learning-area/html/multimedia-and-embedding/video-and-audio-content/multiple-audio-formats.html" rel="external nofollow">مباشرةً عبر جيت-هاب</a>، كما يمكنك الاطلاع على <a href="https://github.com/mdn/learning-area/blob/gh-pages/html/multimedia-and-embedding/video-and-audio-content/multiple-audio-formats.html" rel="external nofollow">الشيفرة المصدرية</a> لمشغل الصوت.
</p>

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

<ul>
<li>
		لا يدعم العنصر <code>&lt;audio&gt;</code> السمتين <code>width</code> و <code>height</code> لعدم وجود مكوّن مرئي، وبالتالي لا حاجة إلى تحديد طول أو عرض.
	</li>
	<li>
		لا يدعم أيضًا السمة <code>poster</code>.
	</li>
</ul>
<p>
	ما عدا ذلك، يدعم العنصر <code>&lt;audio&gt;</code> جميع الميزات التي يدعمها العنصر <code>&lt;video&gt;</code>.
</p>

<h2>
	عرض المسارات النصية لفيديو
</h2>

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

<ul>
<li>
		قد يعاني البعض من مشاكل سمعية مثل الطرش أو صعوبة السمع، وبالتالي لن يسمع الصوت بوضوح وقد لا يسمعه إطلاقًا.
	</li>
	<li>
		قد لا يسمع آخرون الصوت لكونهم في بيئات كثيرة الضجيج مثل مقهى مزدحم عند عرض مباراة رياضية.
	</li>
	<li>
		في البيئات التي يُمنع فيها إصدار الأصوات كما في المكتبات أو عندما يحاول أحدهم النوم إلى جوارك، إذ سيكون وجود الشروحات أو كلمات المقطع أمرًا مفيدًا.
	</li>
	<li>
		قد يرغب الناس الذين لا يتحدثون لغة الفيديو بوجود كلمات المقطع مكتوبةً أو مترجمةً لفهم ما يدور فيه.
	</li>
</ul>
<p>
	من الجيد في حالات مثل هذه وجود نص يعرض ما يُقال في الفيديو أو المقطع الصوتي، وهذا ما يتيحه العنصر <code>&lt;video&gt;</code> في HTML، ولإنجاز الأمر، سنستخدِم ملفًا بتنسيق WebVTT والعنصر <code>&lt;track&gt;</code>.
</p>

<p>
	يُعَدّ WebVTT هو تنسيق لكتابة ملفات نصية تضم إضافةً إلى المقاطع النصية بيانات وصفية مثل توقيت عرض كل عبارة نصية ومعلومات محدودة عن موقع وتنسيق تلك العبارات النصية.
</p>

<p>
	تُدعى العبارات النصية بالأنساق Cues وتُصنَّف وفق أنواع مختلفة تخدم غايات مختلفة:
</p>

<ul>
<li>
		<strong>الترجمات Subtitles</strong>: وذلك للمقاطع التي تتحدث بلغات مختلفة لا يستطيع فهمها من لا يجيد اللغة.
	</li>
	<li>
		<strong>شروحات (تعليقات) captions</strong>: نصوص تتزامن مع حوار أو وصف لأصوات ملفتة لكي تساعد من لديه صعوبة في السمع على فهم ما يجري.
	</li>
	<li>
		<strong>شروحات متزامنة timed descriptions</strong>: نصوص يلفظها مشغل الوسائط المتعددة لتصف مشاهد لذوي المشاكل البصرية أو فاقدي البصر.
	</li>
</ul>
<p>
	سيبدو ملف WebVTT نمطيًا كما يلي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7158_28" style="">
<span class="pln">WEBVTT

</span><span class="lit">1</span><span class="pln">
</span><span class="lit">00</span><span class="pun">:</span><span class="lit">00</span><span class="pun">:</span><span class="lit">22.230</span><span class="pln"> </span><span class="pun">--&gt;</span><span class="pln"> </span><span class="lit">00</span><span class="pun">:</span><span class="lit">00</span><span class="pun">:</span><span class="lit">24.606</span><span class="pln">
</span><span class="typ">This</span><span class="pln"> is the first subtitle</span><span class="pun">.</span><span class="pln">

</span><span class="lit">2</span><span class="pln">
</span><span class="lit">00</span><span class="pun">:</span><span class="lit">00</span><span class="pun">:</span><span class="lit">30.739</span><span class="pln"> </span><span class="pun">--&gt;</span><span class="pln"> </span><span class="lit">00</span><span class="pun">:</span><span class="lit">00</span><span class="pun">:</span><span class="lit">34.074</span><span class="pln">
</span><span class="typ">This</span><span class="pln"> is the second</span><span class="pun">.</span><span class="pln">

  </span><span class="pun">...</span></pre>

<p>
	لكي تعرض محتويات هذا الملف مع مشغِّلات الوسائط التي تقدمها HTML سنحتاج إلى:
</p>

<ol>
<li>
		حفظ الملف بالامتداد <code>vtt.</code>.
	</li>
	<li>
		ربط الصفحة بملف <code>vtt.</code> مستخدِمًا العنصر <code>&lt;track&gt;</code> الذي ينبغي وضعه ضمن العنصر <code>&lt;video&gt;</code> أو العنصر <code>&lt;audio&gt;</code> لكن بعد جميع العناصر <code>&lt;source&gt;</code>.
	</li>
	<li>
		استخدام السمة <code>kind</code> للعنصر <code>&lt;track&gt;</code> لتحديد نوع الأنساق إذا كانت <code>"subtitles"</code> أو <code>"captions"</code> أو <code>"descriptions"</code>.
	</li>
	<li>
		استخدام السمة <code>srclang</code> لإخبار المتصفح عن اللغة التي يجب أن يعرض بها الأنساق، واستخدام السمة <code>label</code> لمساعدة المستخدِم في تحديد اللغة التي يبحث عنها.
	</li>
</ol>
<p>
	إليك مثالًا:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7158_30" 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">"example.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="tag">&lt;source</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"example.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;track</span><span class="pln"> </span><span class="atn">kind</span><span class="pun">=</span><span class="atv">"subtitles"</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"subtitles_es.vtt"</span><span class="pln"> </span><span class="atn">srclang</span><span class="pun">=</span><span class="atv">"es"</span><span class="pln"> </span><span class="atn">label</span><span class="pun">=</span><span class="atv">"Spanish"</span><span class="tag">&gt;</span><span class="pln">
</span><span class="tag">&lt;/video&gt;</span></pre>

<p>
	ستكون النتيجة مقطع فيديو مع الترجمة كما يلي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="113781" href="https://academy.hsoub.com/uploads/monthly_2022_12/05_video_captions.png.15bf181d175f27db6f9f25721509c529.png" rel=""><img alt="إضافة مقطع فيديو مع ترجمته عبر html" class="ipsImage ipsImage_thumbnailed" data-fileid="113781" data-unique="o9ynem00j" src="https://academy.hsoub.com/uploads/monthly_2022_12/05_video_captions.png.15bf181d175f27db6f9f25721509c529.png" style="width: 589px; height: auto;"></a>
</p>

<p>
	<strong>ملاحظة</strong>: تساعد المسارات النصية في <a href="https://academy.hsoub.com/marketing/search-engine-optimisation/%D8%AA%D8%AD%D8%B3%D9%8A%D9%86-%D9%85%D8%AD%D8%B1%D9%83%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%AD%D8%AB-seo-%D9%88%D8%A3%D9%87%D9%85%D9%8A%D8%AA%D9%87%D8%A7-%D9%84%D9%85%D9%88%D9%82%D8%B9%D9%83-%D8%A7%D9%84%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A-r490/" rel="">تحسين محركات البحث</a> كونها متعطشة للعبارات النصية، إذ تسمح المسارات النصية لمحركات البحث بربط النتيجة بلحظة معينة في الفيديو.
</p>

<h3>
	تطبيق: إدراج مقطع الفيديو أو الصوت الخاص بك
</h3>

<p>
	نشجعك في هذا التمرين على الخروج وتسجيل مقطع فيديو أو مقطع صوتي لما يجري في محيطك، إذ يمكنك ببساطة استخدام هاتفك المحمول لسهولة استخدامه في التصوير وفي نقل المقاطع المسجلة إلى الحاسوب، وقد تضطر إلى تحويل الملفات المسجلة لتصبح حاويات MP4 أو WebM في حال سجلت مقطع فيديو، و MP3 أو Ogg في حال تسجيلك لمقطع صوتي، كما ستجد الكثير من البرمجيات التي تساعدك في إنجاز الأمر دون عناء كبير مثل Miro Video Converter و Audacity.
</p>

<p>
	إذا لم تشأ أن تسجِّل بنفسك، فلك كامل الحرية في اختيار <a href="https://github.com/mdn/learning-area/tree/master/html/multimedia-and-embedding/video-and-audio-content" rel="external nofollow">عينات الفيديو والصوت</a> التي جهزناها لهذا التمرين، كما يمكنك استخدام شيفرتنا المصدرية على أساس مرجع.
</p>

<p>
	نطلب منك:
</p>

<ol>
<li>
		حفظ ملفات الفيديو والصوت في مجلد جديد على حاسوبك
	</li>
	<li>
		إنشاء ملف HTML جديد في المجلد نفسه باسم index.html.
	</li>
	<li>
		أضف العنصرين <code>&lt;video&gt;</code> و <code>&lt;audio&gt;</code> إلى الصفحة واجعلهما يعرضان أدوات التحكم الافتراضية للمتصفح.
	</li>
	<li>
		أضف السمة <code>source</code> إلى كل منهما لكي تجد المتصفحات التنسيق الصوتي الذي تدعمه، ولا بد في هذه الحالة من استخدام السمة <code>type</code> أيضًا.
	</li>
	<li>
		أضف صورة بداية poster إلى العنصر <code>&lt;video&gt;</code> كي تعرض قبل تشغيل المقطع.
	</li>
</ol>
<p>
	لكي تضع لنفسك نقاطًا إضافيةً، حاول الاطلاع أكثر على المسارات النصية وإضافة بعض الشروحات إلى الفيديو الخاص بك.
</p>

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

<p>
	نكون هكذا قد وصلنا إلى نهاية المقال وقد اطلعنا على الأسلوب الدلالي في إدراج مقاطع الفيديو والمقاطع الصوتية في صفحتك، وسنتابع في المقال التالي موضوع إدراج محتوى من ويب ضمن صفحاتك باستخدام تقنيات مثل العنصر <code>&lt;iframe&gt;</code>.
</p>

<p>
	ترجمة -وبتصرُّف- للمقال <a href="https://developer.mozilla.org/en-US/docs/Learn/HTML/Multimedia_and_embedding/Video_and_audio_content" rel="external nofollow">Video and audio content</a>.
</p>

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

<ul>
<li>
		<a href="https://academy.hsoub.com/programming/html/%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%B5%D9%88%D8%B1-%D9%85%D8%AA%D8%AC%D8%A7%D9%88%D8%A8%D8%A9-r687/" rel="">إعداد صور متجاوبة</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/html/%D8%A5%D8%B6%D8%A7%D9%81%D8%A9-%D8%A7%D9%84%D8%B5%D9%88%D8%B1-%D9%81%D9%8A-%D8%B5%D9%81%D8%AD%D8%A9-html-r1824/" rel="">إضافة الصور في صفحات HTML</a>
	</li>
	<li>
		<a href="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/" rel="">إضافة مقاطع الفيديو عبر العنصر &lt;video&gt; في HTML5</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1825</guid><pubDate>Tue, 13 Dec 2022 13:38:20 +0000</pubDate></item><item><title>&#x625;&#x636;&#x627;&#x641;&#x629; &#x627;&#x644;&#x635;&#x648;&#x631; &#x641;&#x64A; &#x635;&#x641;&#x62D;&#x629; HTML</title><link>https://academy.hsoub.com/programming/html/%D8%A5%D8%B6%D8%A7%D9%81%D8%A9-%D8%A7%D9%84%D8%B5%D9%88%D8%B1-%D9%81%D9%8A-%D8%B5%D9%81%D8%AD%D8%A9-html-r1824/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_12/639873e19a2e7_---html.png.a23cbf07c4751c2c8fcd09275abc11e6.png" /></p>
<p>
	كانت الويب في بداياتها مجرد نصوص عدَّها الكثيرون مملةً، ولحسن الحظ لم يتأخر استخدام الصور -وغيرها من المحتوى الأكثر إمتاعًا- كثيرًا ضمن صفحات الويب، كما هناك الكثير من أنواع الوسائط المتعددة التي يمكن التفكير بها، لكن من المنطقي أن نبدأ مع العنصر المتواضع <a href="https://wiki.hsoub.com/HTML/img" rel="external"><code>&lt;img&gt;</code></a> الذي يُستخدَم في إدراج صور بسيطة في الصفحة، إذ سنطلع في هذا المقال على طريقة استخدام العنصر بتفاصيل أكثر بما في ذلك الأساسيات وطريقة إدراج شرح للصورة باستخدام العنصر <a href="https://wiki.hsoub.com/HTML/figure" rel="external"><code>&lt;figure&gt;</code></a> وكيفية ربطه بصور الخلفية في <a href="https://wiki.hsoub.com/CSS" rel="external">CSS</a>.
</p>

<p>
	لا بدّ قبل البدء بقراءة هذا المقال أن تكون على دراية بأساسيات عمل الحاسوب وطريقة تثبيت البرمجيات الأساسية ودراية بطريقة عمل الملفات، كما لا بدّ أيضًا من الدراية بأساسيات اللغة HTML كما عرضناها في مقال <a href="https://academy.hsoub.com/programming/html/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%84%D8%BA%D8%A9-html-r1752/" rel="">تعرَّف على HTML</a>.
</p>

<h2>
	كيف تضع صورة في صفحة ويب
</h2>

<p>
	نستخدِم العنصر <code>&lt;img&gt;</code> لإدراج صورة في موقع ويب، إذ يُعَدّ هذا العنصر فارغًا، أي لا يضم أيّ محتوى نصي أو وسم نهاية، كما يتطلب على الأقل سمةً واحدةً لكي يعمل بصورة صحيحة وهي <code>src</code> وتُقرأ source، كما تحتوي قيمة هذه السمة على المسار الذي يدل على موقع الصورة التي تريد إدراجها في الصفحة والذي قد يكون عنوان URL نسبيًا relative أو مطلقًا absolute ومشابهةً تمامًا لقيمة السمة <code>href</code> الخاصة بالعنصر <a href="https://wiki.hsoub.com/HTML/a" rel="external"><code>&lt;a&gt;</code></a>.
</p>

<p>
	<strong>ملاحظة</strong>: عليك الاطلاع على مقال <a href="https://academy.hsoub.com/programming/general/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%B9%D9%86%D9%88%D8%A7%D9%86-url-%D9%88%D8%A3%D9%86%D9%88%D8%A7%D8%B9%D9%87-r1435/" rel="">أساسيات عنوان URL وأنواعه</a> وخاصة فقرة "عناوين URL المطلقة والنسبية" لتتذكَّر مفهومَي العنوان المطلق والعنوان النسبي قبل المتابعة.
</p>

<p>
	إذا كان اسم صورتك dinosaur.jpg مثلًا وتتواجد في المجلد نفسه الذي يوجد فيه ملف HTML، فستدرِج صورتك كما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4505_6" style=""><span class="tag">&lt;img</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"dinosaur.jpg"</span><span class="tag">&gt;</span></pre>

<p>
	أما إذا كانت الصورة في مجلد فرعي يُدعى images يتواجد في المجلد نفسه الذي يوجد فيه ملف HTML، فستدرِج صورتك كما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4505_8" style=""><span class="tag">&lt;img</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"images/dinosaur.jpg"</span><span class="tag">&gt;</span></pre>

<p>
	وهكذا.
</p>

<p>
	<strong>ملاحظة</strong>: تقرأ محركات البحث أسماء ملفات الصور ويؤثر ذلك من ناحية <a href="https://academy.hsoub.com/marketing/search-engine-optimisation/%D8%AA%D8%AD%D8%B3%D9%8A%D9%86-%D9%85%D8%AD%D8%B1%D9%83%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%AD%D8%AB-seo-%D9%88%D8%A3%D9%87%D9%85%D9%8A%D8%AA%D9%87%D8%A7-%D9%84%D9%85%D9%88%D9%82%D8%B9%D9%83-%D8%A7%D9%84%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A-r490/" rel="">تحسين محركات البحث سيو SEO</a>، لهذا السبب لا بدّ من تسمية الصور بأسماء وصفية معبرة، فالاسم dinosaur.jpg أفضل بالتأكيد من image835.png.
</p>

<p>
	بإمكانك إدراج الصورة أيضًا باستخدام عنوان URL مطلق، وإليك مثالًا كما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4505_11" style=""><span class="tag">&lt;img</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"https://www.example.com/images/dinosaur.jpg"</span><span class="tag">&gt;</span></pre>

<p>
	لكن هذا الأمر عديم الجدوى في حالتنا وسيدفع المتصفح إلى مزيد من العمل للبحث عن عنوان آي بي IP لخادم دي إن إس DNS من جديد، فما تفعله على الدوام تقريبًا هو وضع الصور المستخدَمة في الموقع على <a href="https://academy.hsoub.com/devops/servers/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%AE%D8%A7%D8%AF%D9%85-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r574/" rel="">الخادم</a> نفسه الذي يستضيف صفحات HTML.
</p>

<p>
	<strong>تحذير</strong>: تمتلك معظم الصور حقوق نشر، فلا تعرض صورةً على موقع ما لم:
</p>

<ul>
	<li>
		تكن إحدى صورك.
	</li>
	<li>
		تحصل على تصريح خطِّي من مالكها.
	</li>
	<li>
		تكن على يقين تام بأنها صورة تندرِج في نطاق الصور العامة.
	</li>
</ul>

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

<p>
	ستعطي الشيفرة السابقة النتيجة التالية:
</p>

<p style="text-align: center;">
	<img alt="كيف تضع صورة في صفحة ويب" class="ipsImage ipsImage_thumbnailed" data-fileid="113773" data-unique="5ccpvlazj" style="width: 500px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2022_12/01_dinosaur.png.6f39092970bbcd3f09f4e4cc760ef160.png">
</p>

<p>
	<strong>ملاحظة</strong>: يُشار أحيانًا إلى العنصرين <code>&lt;img&gt;</code> و <code><a href="https://wiki.hsoub.com/HTML/video" rel="external">&lt;video&gt;</a></code> بأنهما عنصران قابلان للاستبدال Replaced elements، لأن ما يُعرِّف محتواهما وحجمهما هي موارد خارجية مثل ملف صورة أو ملف فيديو، وليس من قِبَل محتواهما مباشرةً.
</p>

<p>
	<strong>ملاحظة</strong>: يمكنك الاطلاع على المثال بصيغته النهائية ضمن <a href="https://mdn.github.io/learning-area/html/multimedia-and-embedding/images-in-html/index.html" rel="external nofollow">المستودع المخصص له على جيت-هاب</a>، كما يمكنك الاطلاع على <a href="https://github.com/mdn/learning-area/blob/master/html/multimedia-and-embedding/images-in-html/index.html" rel="external nofollow">الشيفرة المصدرية</a> أيضًا.
</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://sndian.com/" rel="external">أطلق موقعك الآن</a>
		</div>
	</div>
</div>

<h3>
	النص البديل
</h3>

<p>
	ما سنتحدث عنه الآن هو السمة <code>alt</code>، ومن المفترض أن تكون قيمة هذه السمة نصًا يُظهر وصفًا للصورة وذلك لاستخدامه في الحالات التي لا تُعرض فيها، أو الحالات التي تستغرق فيها الصورة وقتًا طويلًا حتى يصيّرها المتصفح نظرًا لبطء الاتصال <a href="https://academy.hsoub.com/devops/networking/%D8%A2%D9%84%D9%8A%D8%A9-%D8%B9%D9%85%D9%84-%D8%B4%D8%A8%D9%83%D8%A9-%D8%A7%D9%84%D8%A5%D9%86%D8%AA%D8%B1%D9%86%D8%AA-r571/" rel="">بالإنترنت</a>، كما يمكن مثلًا تعديل الشيفرة التي عرضناها سابقًا لتصبح كما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4505_16" style=""><span class="tag">&lt;img</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"images/dinosaur.jpg"</span><span class="pln">
     </span><span class="atn">alt</span><span class="pun">=</span><span class="atv">"The head and torso of a dinosaur skeleton;
          it has a large head with long sharp teeth"</span><span class="tag">&gt;</span></pre>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="113774" href="https://academy.hsoub.com/uploads/monthly_2022_12/02_alter_text.png.90af8ef10093cf580c1dcb028e3253fa.png" rel=""><img alt="اختبار ظهور النص البديل في html" class="ipsImage ipsImage_thumbnailed" data-fileid="113774" data-unique="i6l0ls2px" style="width: 500px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2022_12/02_alter_text.png.90af8ef10093cf580c1dcb028e3253fa.png"></a>
</p>

<p>
	لماذا إذًا ستحتاج إلى النص البديل؟ إليك بعض الأسباب:
</p>

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

<p>
	ما الذي ينبغي كتابته ضمن السمة <code>alt</code>؟ يعتمد الأمر على سبب استخدامك للصورة، أو بمعنى آخر ما الذي ستخسره إذا لم تُعرض الصورة؟:
</p>

<ul>
	<li>
		<strong>ديكور للصفحة</strong>: عليك استعمال صور الخلفية في <a href="https://academy.hsoub.com/programming/css/%d8%aa%d8%b9%d8%b1%d9%91%d9%81-%d8%b9%d9%84%d9%89-%d8%a3%d8%b3%d8%a7%d8%b3%d9%8a%d8%a7%d8%aa-css-r70/" rel="">CSS</a> لأغراض الديكور، لكن إذا كان عليك استخدام HTML، فأضف السمة فارغةً <code>" "=alt</code>، فإذا لم تكن الصورة جزءًا من المحتوى، فلن تهدر قارئات الشاشة الوقت في نطقها.
	</li>
	<li>
		<strong>محتوى ضمن الصفحة</strong>: إذا قدَّمت الصورة معلومات هامةً، فعليك إضافة المعلومات نفسها لكن بإيجاز إلى السمة <code>alt</code> أو إلى النص الرئيسي للصفحة كي يراه الجميع وهذا هو الحل الأفضل، ولا تكتب نصًا بديلًا مكررًا عن المحتوى الرئيسي فالأمر مزعج بالنسبة للمستخدِم صحيح البصر، فإذا كانت الصورة مشروحةً شرحًا وافيًا ضمن النص الرئيسي، فأضف سمة النص البديل فارغةً <code>" "=alt</code>.
	</li>
	<li>
		<strong>رابط إلى محتوى آخر</strong>: إذا وضعت صورةً ضمن <a href="https://wiki.hsoub.com/HTML/a" rel="external">العنصر &lt;a&gt;</a> لكي تحوِّل الصورة إلى رابط، فلا بدّ أن تزوِّد الرابط بنص واضح، وفي هذه الحالة يمكنك كتابته ضمن العنصر <code>&lt;a&gt;</code> أو على أساس قيمة للسمة <code>alt</code> العائدة للعنصر <code>&lt;img&gt;</code> أيًا ما يخدم حالتك.
	</li>
	<li>
		<strong>محتوى نصي</strong>: لا يجب وضع نص ضمن صورة، فإذا احتجت لأن تعرض ظلًا لعنوانك الرئيسي مثلًا، فاستخدم تنسيقات CSS بدلًا من وضع النص ضمن الصورة؛ أما إذا كنت مضطرًا كثيرًا، فضع النص داخل السمة <code>alt</code>.
	</li>
</ul>

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

<h3>
	أبعاد الصورة
</h3>

<p>
	يمكن استخدام السمتَين <code>width</code> و <code>height</code> لتحديد بُعدَي الصورة أي العرض والارتفاع، كما بإمكانك معرفة هذين البعدين بطرق عديدة، إذ يمكنك مثلًا الضغط على المفتاحين I+Cmd في ماك لعرض المعلومات عن ملف الصورة، وبالعودة إلى مثالنا السابق يمكن كتابة التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4505_22" style=""><span class="tag">&lt;img</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"images/dinosaur.jpg"</span><span class="pln">
     </span><span class="atn">alt</span><span class="pun">=</span><span class="atv">"The head and torso of a dinosaur skeleton;
          it has a large head with long sharp teeth"</span><span class="pln">
     </span><span class="atn">width</span><span class="pun">=</span><span class="atv">"400"</span><span class="pln">
     </span><span class="atn">height</span><span class="pun">=</span><span class="atv">"341"</span><span class="tag">&gt;</span></pre>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="113775" href="https://academy.hsoub.com/uploads/monthly_2022_12/03_image_dim.png.e251ea0180e9d2056a47acfdc52be409.png" rel=""><img alt="أبعاد الصورة في html" class="ipsImage ipsImage_thumbnailed" data-fileid="113775" data-unique="4kenm0c3b" style="width: 500px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2022_12/03_image_dim.png.e251ea0180e9d2056a47acfdc52be409.png"></a>
</p>

<p>
	سيفيدك هذا الأمر في تحميل الصفحة بسرعة وأكثر سلاسةً.
</p>

<p>
	لكن عليك تفادي تغيير أبعاد الصورة مستخدمًا سمات HTML، فإذا كبّرت حجم الصورة كثيرًا، فسينتهي الأمر بإظهار الصورة خشنة وضبابية، وإذا صغّرتها كثيرًا، فستهدِر حجم تراسل البيانات في تنزيل صورة لا تلبي حاجات المستخدِم، كما قد تبدو الصورة مشوهةً إذا لم تحافظ على تناسق الأبعاد، لذلك عليك استخدام محرر صور لضبط الأبعاد ضبطًا صحيحًا قبل إدراجها في <a href="https://academy.hsoub.com/devops/servers/%D8%A7%D9%84%D9%81%D8%B1%D9%82-%D8%A8%D9%8A%D9%86-%D8%B5%D9%81%D8%AD%D8%A9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D9%88%D9%85%D9%88%D9%82%D8%B9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D9%88%D8%AE%D8%A7%D8%AF%D9%85-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D9%88%D9%85%D8%AD%D8%B1%D9%83-%D8%A7%D9%84%D8%A8%D8%AD%D8%AB-r572/" rel="">صفحة الويب</a>.
</p>

<p>
	<strong>ملاحظة</strong>: إذا كنت مضطرًا لتغيير أبعاد الصورة، فعليك استخدام تنسيق CSS كبديل عن تغيير الأبعاد من خلال العنصر <code>&lt;img&gt;</code> مباشر.
</p>

<h3>
	عناوين الصور
</h3>

<p>
	بإمكانك إضافة عناوين إلى صورك باستخدام السمة <code>title</code> لإضافة معلومات دعم إضافية عند الحاجة، وبالعودة إلى مثالنا السابق يمكننا كتابة ما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4505_26" style=""><span class="tag">&lt;img</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"images/dinosaur.jpg"</span><span class="pln">
     </span><span class="atn">alt</span><span class="pun">=</span><span class="atv">"The head and torso of a dinosaur skeleton;
          it has a large head with long sharp teeth"</span><span class="pln">
     </span><span class="atn">width</span><span class="pun">=</span><span class="atv">"400"</span><span class="pln">
     </span><span class="atn">height</span><span class="pun">=</span><span class="atv">"341"</span><span class="pln">
     </span><span class="atn">title</span><span class="pun">=</span><span class="atv">"A T-Rex on display in the Manchester University Museum"</span><span class="tag">&gt;</span></pre>

<p>
	سيعرِض ذلك نص العنوان الذي اخترته عندما تمرر مؤشر الفأرة فوق الصورة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="113776" href="https://academy.hsoub.com/uploads/monthly_2022_12/04_image_title_tooltip.png.75dca14b7ae4182c5aa73e5e4015b308.png" rel=""><img alt="عرِض نص العنوان عند تمرير مؤشر الفأرة فوق الصورة في html" class="ipsImage ipsImage_thumbnailed" data-fileid="113776" data-unique="qosxnn639" style="width: 401px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2022_12/04_image_title_tooltip.png.75dca14b7ae4182c5aa73e5e4015b308.png"></a>
</p>

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

<h2>
	استخدام عنصري الشكل <code>&lt;figure&gt;</code> والشرح <code>&lt;figcaption&gt;</code> مع الصور
</h2>

<p>
	هنالك طرق عدة لإضافة شروحات إلى الصورة، وإليك مثالًا كما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4505_31" style=""><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"figure"</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/dinosaur.jpg"</span><span class="pln">
       </span><span class="atn">alt</span><span class="pun">=</span><span class="atv">"The head and torso of a dinosaur skeleton;
            it has a large head with long sharp teeth"</span><span class="pln">
       </span><span class="atn">width</span><span class="pun">=</span><span class="atv">"400"</span><span class="pln">
       </span><span class="atn">height</span><span class="pun">=</span><span class="atv">"341"</span><span class="tag">&gt;</span><span class="pln">

  </span><span class="tag">&lt;p&gt;</span><span class="pln">A T-Rex on display in the Manchester University Museum.</span><span class="tag">&lt;/p&gt;</span><span class="pln">
</span><span class="tag">&lt;/div&gt;</span></pre>

<p>
	تُعَدّ هذه الطريقة مقبولةً باستخدام <a href="https://wiki.hsoub.com/HTML/div" rel="external">العنصر &lt;div&gt;</a>، فهي تعرض المحتوى الذي تحتاجه بطريقة يمكن تنسيقها باستخدام CSS، لكن المشكلة هنا هي عدم وجود ربط دلالي semantical بين الصورة وشرحها مما سيسبب المشاكل عند استخدام قارئات الشاشة، فعند وجود 50 صورة مثلًا مع شروحها، فلا يمكن تمييز أيّ شرح لأيّ صورة.
</p>

<p>
	الطريقة الأفضل هي استخدام العنصرين <code><a href="https://wiki.hsoub.com/HTML/figure" rel="external">&lt;figure&gt;</a></code> و <code><a href="https://wiki.hsoub.com/HTML/figcaption" rel="external">&lt;figcaption&gt;</a></code>، وهما عنصران خاصَّان بالنسخة 5 من HTML، فقد ظهرت هذه العناصر خصيصًا لهذا الغرض، أي لإيجاد حاضنة دلالية للأشكال تربط جليًا بين الصورة وشرحها، ويمكن كتابة المثال السابق على سبيل المثال كما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4505_36" 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">"images/dinosaur.jpg"</span><span class="pln">
       </span><span class="atn">alt</span><span class="pun">=</span><span class="atv">"The head and torso of a dinosaur skeleton;
            it has a large head with long sharp teeth"</span><span class="pln">
       </span><span class="atn">width</span><span class="pun">=</span><span class="atv">"400"</span><span class="pln">
       </span><span class="atn">height</span><span class="pun">=</span><span class="atv">"341"</span><span class="tag">&gt;</span><span class="pln">

  </span><span class="tag">&lt;figcaption&gt;</span><span class="pln">A T-Rex on display in the Manchester University Museum.</span><span class="tag">&lt;/figcaption&gt;</span><span class="pln">
</span><span class="tag">&lt;/figure&gt;</span></pre>

<p>
	يخبر العنصر <code>&lt;figcaption&gt;</code> المتصفح والتقنيات المساعدة أنّ الشرح الذي يضمَّه سيكون مخصصًا للصورة التي يضمها العنصر <code>&lt;figure&gt;</code>.
</p>

<p>
	<strong>ملاحظة</strong>: لكل من النص البديل <code>alt</code> والشروحات captions دورًا مختلفًا من وجهة نظر الوصول السهل. إذ يستفيد جميع المستخدِمين من الشروحات بمن فيهم من يراها، لكن تقتصر رؤية محتوى السمة <code>alt</code> التي تؤدي المهمة ذاتها على الحالة التي لا تُعرض فيها الصورة، لهذا يجب ألا يتشابه محتوى الشرح ومحتوى النص البديل لأنّ كلاهما سيظهر عند غياب الصورة، لذا حاول أن تمنع متصفحك من عرض الصور وراقب ما سيحدث.
</p>

<p>
	لا حاجة ليكون الشكل -أي العنصر <code>&lt;figure&gt;</code>- صورةً حصرًا، فهو حاوية مستقلة يمكن أن:
</p>

<ul>
	<li>
		تعبِّر عما تعنيه بطريقة مختصرة وسهلة الفهم.
	</li>
	<li>
		تتواجد في أماكن عدة ضمن تسلسل العناصر السطرية في الصفحات.
	</li>
	<li>
		تزوّد الصفحة بمعلومات أساسية تدعم النص الرئيسي لها.
	</li>
</ul>

<p>
	قد يضم الشكل عدة صور أو شذرات (مقاطع) من الشيفرة أو ملفات فيديو أو ملفات صوتية أو جداول أو غير ذلك.
</p>

<h2>
	إدراج صور للخلفية باستخدام CSS
</h2>

<p>
	يمكنك أيضًا استخدام CSS في إدراج الصور ضمن صفحات الويب وشيفرة جافاسكربت أيضًا، لكنه موضوع مختلف، إذ تُستخدّم الخاصية <code>background-image</code> وغيرها من خواص الخلفية <code>background-image</code> التي تبدأ بالكلمة <code>*-background</code> للتحكم في موضع خلفية الصفحة، فإذا أردت مثلًا وضع الخلفية لكل فقرة نصية، فكل ما عليك فعله هو كتابة ما يلي:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_4505_38" style=""><span class="pln">p </span><span class="pun">{</span><span class="pln">
  background</span><span class="pun">-</span><span class="pln">image</span><span class="pun">:</span><span class="pln"> url</span><span class="pun">(</span><span class="str">"images/dinosaur.jpg"</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

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

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

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

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

<p>
	ترجمة -وبتصرُّف- للمقال <a href="https://developer.mozilla.org/en-US/docs/Learn/HTML/Multimedia_and_embedding/Images_in_HTML" rel="external nofollow">Images in HTML</a>.
</p>

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

<ul>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/html/%D8%AA%D9%86%D9%82%D9%8A%D8%AD-%D8%B4%D9%8A%D9%81%D8%B1%D8%A9-html-r1812/" rel="">تنقيح شيفرة HTML </a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/html/%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%B5%D9%88%D8%B1-%D9%85%D8%AA%D8%AC%D8%A7%D9%88%D8%A8%D8%A9-r687/" rel="">إعداد صور متجاوبة</a>
	</li>
	<li>
		<a href="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/" rel="">إضافة مقاطع الفيديو عبر العنصر &lt;video&gt; في HTML5</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1824</guid><pubDate>Thu, 15 Dec 2022 16:09:00 +0000</pubDate></item><item><title>&#x62A;&#x646;&#x642;&#x64A;&#x62D; &#x634;&#x64A;&#x641;&#x631;&#x629; HTML</title><link>https://academy.hsoub.com/programming/html/%D8%AA%D9%86%D9%82%D9%8A%D8%AD-%D8%B4%D9%8A%D9%81%D8%B1%D8%A9-html-r1812/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_12/63906de848930_--html.jpg.271594398df65af531ccea63818e3e71.jpg" /></p>

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

<p>
	عليك قبل البدء في قراءة هذا المقال الاطلاع على أساسيات HTML التي أوردناها في مقال <a href="https://academy.hsoub.com/programming/html/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%84%D8%BA%D8%A9-html-r1752/" rel="">تعرَّف على HTML</a> وكذلك <a href="https://academy.hsoub.com/programming/html/%D9%87%D9%8A%D9%83%D9%84%D8%A9-%D8%A7%D9%84%D9%86%D8%B5%D9%88%D8%B5-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%84%D8%BA%D8%A9-html-r1754/" rel="">هيكلة النصوص في HTML</a> وطريقة <a href="https://academy.hsoub.com/programming/html/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D8%A7%D9%84%D8%B1%D9%88%D8%A7%D8%A8%D8%B7-%D8%A7%D9%84%D8%AA%D8%B4%D8%B9%D8%A8%D9%8A%D8%A9-%D9%81%D9%8A-html-r1755/" rel="">إنشاء الروابط التشعبية في HTML</a>.
</p>

<h2>
	تنقيح الشيفرة ليس أمرا صعبا
</h2>

<p>
	تبقى الأمور عند كتابة شيفرة واضحةً وسلسةً حتى يقع خطأ ما، فقد ارتكبت خطأً ما فجاةً، ولم تَعُد تعمل الشيفرة إطلاقًا أو لم تَعُد تعمل بالطريقة المطلوبة، ويُظهِر الشكل التالي مثالًا عن خطأ يظهر عند ترجمة برنامج بسيط مكتوب بلغة <a href="https://academy.hsoub.com/programming/rust/%D8%AA%D8%B9%D9%84%D9%85-%D9%84%D8%BA%D8%A9-%D8%B1%D8%B3%D8%AA-rust-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A7%D8%AA-r1764/" rel="">رست Rust</a>.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="113471" href="https://academy.hsoub.com/uploads/monthly_2022_12/01_compiler_error.png.09ffcf94516a695916ec9b6c092f3fed.png" rel=""><img alt="تنقيح الشيفرات" class="ipsImage ipsImage_thumbnailed" data-fileid="113471" data-unique="j6im8kyuf" src="https://academy.hsoub.com/uploads/monthly_2022_12/01_compiler_error.png.09ffcf94516a695916ec9b6c092f3fed.png" style="width: 591px; height: auto;"></a>
</p>

<p>
	يسهل فهم الخطأ الذي يظهر في الصورة وهو نص بين مزدوجتين غير مغلقتين unterminated double quote string، فإذا نظرت إلى قائمة الأخطاء، فسترى الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1075_8" style="">
<span class="pln">println</span><span class="pun">!(</span><span class="pln">hello</span><span class="pun">,</span><span class="pln"> world</span><span class="pun">!</span><span class="str">");</span></pre>

<p>
	يفتقد فيها النص <code>!hello, world</code> إلى إشارة تنصيص البداية، لكن ستتعقد هذه الرسائل وسيصعب فهمها عندما يكبر البرنامج، إذ ستبدو الحالات البسيطة مخيفةً لشخص لا يعرف شيئًا عن لغة Rust.
</p>

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

<h2>
	تنقيح اللغة HTML
</h2>

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

<h3>
	شيفرة متساهلة
</h3>

<p>
	ماذا نعني بالمتساهل permissive إذًا؟ ما يحصل عادةً عند ارتكاب أخطاء في الشيفرة هو ظهور نوعَين من رسائل الخطأ:
</p>

<ul>
<li>
		<strong>أخطاء الصياغة syntax error</strong>: تنتج عن أخطاء في كتابة التعليمات أو علامات الوصول في الشيفرة مما يتسبب في إيقاف تنفيذ البرنامج كما في الخطأ الذي عرضناه في برنامج Rust السابق (نسيان إشارة تنصيص)، إذ تُعَدّ هذه الأخطاء سهلة الحل إذا كنت ملمًا بقواعد اللغة المستخدَمة وما تعنيه رسائل الخطأ.
	</li>
	<li>
		<strong>الأخطاء المنطقية logical errors</strong>: لا تقع عند حدوث أخطاء صياغة، لكن عندما لا تعطيك الشيفرة النتيجة المطلوبة، بمعنى ان البرنامج يعمل بطريقة غير صحيحة، فهذه الأخطاء صعبة الحل نظرًا لعدم وجود رسالة خطأ توجهك إلى مصدره.
	</li>
</ul>
<p>
	لن تجد في HTML أخطاءً في الصياغة لأن المتصفح يتساهل في تفسيرها، أي ستعرض الصفحة نتيجة تفسير الشيفرة حتى بوجود هذه الأخطاء، إذ تُبنى المتصفحات على قواعد تتيح لها أن تقرِّر طريقة تفسير الشيفرة غير الصحيحة لكي تعرضها حتى بصورة تخالف التوقعات، ويُعَدّ هذا الأمر مشكلةً أيضًا.
</p>

<p>
	<strong>ملاحظة</strong>: يعود تفسير HTML بصورة متساهلة إلى بدايات الويب، إذ اتخذ قرار عندها بأنّ إيصال المحتوى إلى المستخدِم أكثر أهميةً من صحة الصياغة، وربما لم تغدو الويب بهذه الشعبية الآن إذا كانت أكثر تشددًا في بداياتها.
</p>

<h3>
	تطبيق: دراسة شيفرة متساهلة
</h3>

<p>
	حان الوقت لدراسة الطبيعة المتساهلة التي تُفسَّر بها شيفرة HTML.
</p>

<p>
	نزّل أولًا <a href="https://github.com/mdn/learning-area/blob/main/html/introduction-to-html/debugging-html/debug-example.html" rel="external nofollow">ملفات مثال التنقيح التجريبي</a> واحفظها على جهازك، إذ كُتِب المثال ليضم قصدًا أخطاءً لكي نستكشفها، ونقول عندها بأنّ شيفرة HTML سيئة التوصيف badly-formed على نقيض أن تكون حسنة التوصيف well-formed.
</p>

<p>
	افتح الملف بواسطة المتصفح، إذ ستبدو لك النتيجة كما يلي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="113472" href="https://academy.hsoub.com/uploads/monthly_2022_12/02_example_code.png.6aef48686cd01b9a1e46398dcb85124b.png" rel=""><img alt="Image Title   Used in place of the image for accessibility" class="ipsImage ipsImage_thumbnailed" data-fileid="113472" data-unique="d3hy7dksk" src="https://academy.hsoub.com/uploads/monthly_2022_12/02_example_code.png.6aef48686cd01b9a1e46398dcb85124b.png" style="width: 450px; height: auto;"></a>
</p>

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

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1075_11" style="">
<span class="tag">&lt;h1&gt;</span><span class="pln">HTML debugging examples</span><span class="tag">&lt;/h1&gt;</span><span class="pln">

</span><span class="tag">&lt;p&gt;</span><span class="pln">What causes errors in HTML?

</span><span class="tag">&lt;ul&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">Unclosed elements: If an element is </span><span class="tag">&lt;strong&gt;</span><span class="pln">not closed properly,
      then its effect can spread to areas you didn't intend

  </span><span class="tag">&lt;li&gt;</span><span class="pln">Badly nested elements: Nesting elements properly is also very important
      for code behaving correctly. </span><span class="tag">&lt;strong&gt;</span><span class="pln">strong </span><span class="tag">&lt;em&gt;</span><span class="pln">strong emphasized?</span><span class="tag">&lt;/strong&gt;</span><span class="pln">
      what is this?</span><span class="tag">&lt;/em&gt;</span><span class="pln">

  </span><span class="tag">&lt;li&gt;</span><span class="pln">Unclosed attributes: Another common source of HTML problems. Let's
      look at an example: </span><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"https://www.mozilla.org/&gt;</span><span class="pln">link to Mozilla
      homepage</span><span class="tag">&lt;/a&gt;</span><span class="pln">
</span><span class="tag">&lt;/ul&gt;</span></pre>

<p>
	لنبحث عن المشاكل:
</p>

<ul>
<li>
		لا توجد وسوم نهاية لعنصر الفقرة <a href="https://wiki.hsoub.com/HTML/p" rel="external"><code>&lt;p&gt;</code></a> ولعناصر القائمة <a href="https://wiki.hsoub.com/HTML/li" rel="external"><code>&lt;li&gt;</code></a>، لكن بالنظر إلى النتيجة، سنجد أنها لم تؤثر سلبًا على تصيير الشيفرة، وذلك لأنّ المتصفح سيستدِل بسهولة على نهاية كل عنصر وبداية الآخر.
	</li>
	<li>
		لا يوجد وسم نهاية لأول عنصر <a href="https://wiki.hsoub.com/HTML/strong" rel="external"><code>&lt;strong&gt;</code></a>، وهذا قد يسبب مشكلةً لأنه من الصعب أن يقرِّر المتصفح متى سينتهي تأثير هذا العنصر، ولاحظ أنّ بقية النص قد كُتب بصورة بارزة.
	</li>
	<li>
		لاحظ التوصيف السيئ للقسم التالي للشيفرة، إذ لا يمكن أبدًا توقُّع كيف سيعرض المتصفح هذه الشيفرة نظرًا لمشكلة التداخل السابقة.
	</li>
</ul>
<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1075_19" style="">
<span class="pln">  </span><span class="tag">&lt;strong&gt;</span><span class="pln">strong </span><span class="tag">&lt;em&gt;</span><span class="pln">strong emphasized?</span><span class="tag">&lt;/strong&gt;</span><span class="pln">
  what is this?</span><span class="tag">&lt;/em&gt;</span></pre>

<ul>
<li>
		<p>
			تفتقد قيمة الصفة <code>href</code> للرابط في نهايتها إلى إشارة تنصيص مزدوجة، وهذا ما يبدو أنه المسبب الأكبر للمشكلة فلم يُصيّر الرابط أبدًا.
		</p>
	</li>
</ul>
<p>
	لنلق نظرةً الآن على الشيفرة التي صيّرها المتصفح مقابل الشيفرة المصدرية، إذ سنستخدم <a href="https://academy.hsoub.com/programming/workflow/%D9%85%D8%A7-%D9%87%D9%8A-%D8%A3%D8%AF%D9%88%D8%A7%D8%AA-%D9%85%D8%B7%D9%88%D8%B1%D9%8A-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D9%85%D8%AF%D9%85%D8%AC%D8%A9-%D9%81%D9%8A-%D8%A7%D9%84%D9%85%D8%AA%D8%B5%D9%81%D8%AD%D8%A7%D8%AA%D8%9F-r1439/" rel="">أدوات مطورِي ويب المدمجة في المتصفح</a>.
</p>

<p>
	سترى الشيفرة التي صيّرها المتصفح ضمن فاحص <a href="https://academy.hsoub.com/programming/javascript/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-dom-r644/" rel="">DOM</a>:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="113473" href="https://academy.hsoub.com/uploads/monthly_2022_12/03_rendered_code.png.629fef99d2ef36fc3684f555b78dc122.png" rel=""><img alt="الشيفرات ضمن فاحص DOM" class="ipsImage ipsImage_thumbnailed" data-fileid="113473" data-unique="61jadlxb6" src="https://academy.hsoub.com/uploads/monthly_2022_12/03_rendered_code.png.629fef99d2ef36fc3684f555b78dc122.png" style="width: 550px; height: auto;"></a>
</p>

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

<ul>
<li>
		أضاف المتصفح وسوم نهاية للفقرات ولعناصر القائمة.
	</li>
	<li>
		من غير الواضح أين سينتهي أول <a href="https://wiki.hsoub.com/HTML/strong" rel="external">عنصر &lt;strong&gt;</a>، لذلك غلَّف المتصفح كل كتلة نصية منفصلة ضمن عنصر <code>&lt;strong&gt;</code> منفصل حتى نهاية المستند.
	</li>
	<li>
		حلّ المتصفح مشكلة التداخل الخاطئ للعناصر كما يلي:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1075_23" style="">
<span class="pln">     </span><span class="tag">&lt;strong&gt;</span><span class="pln">strong
       </span><span class="tag">&lt;em&gt;</span><span class="pln">strong emphasized?</span><span class="tag">&lt;/em&gt;</span><span class="pln">
     </span><span class="tag">&lt;/strong&gt;</span><span class="pln">
     </span><span class="tag">&lt;em&gt;</span><span class="pln"> what is this?</span><span class="tag">&lt;/em&gt;</span></pre>

<ul>
<li>
		أما الرابط الذي تنقصه إشارة تنصيص مزدوجة، فقد حذفه المتصفح بالكامل، وأصبح آخر عنصر في قائمة العناصر كما يلي:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1075_27" style="">
<span class="pln">     </span><span class="tag">&lt;li&gt;</span><span class="pln">
       </span><span class="tag">&lt;strong&gt;</span><span class="pln">Unclosed attributes: Another common source of HTML problems.
       Let's look at an example: </span><span class="tag">&lt;/strong&gt;</span><span class="pln">
     </span><span class="tag">&lt;/li&gt;</span></pre>

<h3>
	التحقق من شيفرة HTML
</h3>

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

<p>
	إنّ أفضل استراتيجية قد تبدأ بها هي استخدام خدمة التحقق من شيفرة HTML المعروفة باسم <a href="https://validator.w3.org/" rel="external nofollow">Markup Validation Service</a> التي ابتكرتها وتصونها منظمة W3C المسؤولة عن تعريف مواصفات HTML و CSS وغيرها من تقنيات الويب، إذ تُعَدّ هذه الخدمة تطبيق ويب يقبل ملف HTML في الدخل ثم يتفحص محتواه ثم يعطيك تقريرًا بما هو خاطئ:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="113474" href="https://academy.hsoub.com/uploads/monthly_2022_12/04_markup_vallidation_service.png.bc297dea888e77329294d5e62b3333b3.png" rel=""><img alt="خدمة التحقق من شيفرة HTML من منظمة W3C" class="ipsImage ipsImage_thumbnailed" data-fileid="113474" data-unique="40c5gs54e" src="https://academy.hsoub.com/uploads/monthly_2022_12/04_markup_vallidation_service.png.bc297dea888e77329294d5e62b3333b3.png" style="width: 600px; height: auto;"></a>
</p>

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

<h3>
	تطبيق: التحقق من ملف HTML
</h3>

<p>
	لنحاول استخدام <a href="https://github.com/mdn/learning-area/blob/main/html/introduction-to-html/debugging-html/debug-example.html" rel="external nofollow">الملف البسيط</a> الذي ناقشناه سابقًا:
</p>

<ol>
<li>
		حمِّل <a href="https://validator.w3.org/" rel="external nofollow">خدمة التحقق من التوصيف</a> في المتصفح إذا لم تكن قد فعلت ذلك.
	</li>
	<li>
		انتقل إلى نافذة التحقق من دخل مباشر <a href="https://validator.w3.org/#validate_by_input" rel="external nofollow">Validate by Direct Input</a>.
	</li>
	<li>
		انسخ شيفرة الملف بالكامل ثم الصقها في مربع النص الكبير الظاهر في النافذة.
	</li>
	<li>
		انقر الزر "تحقق Check".
	</li>
</ol>
<p>
	من المفترض أن تظهر قائمة من الأخطاء بالإضافة إلى معلومات أخرى.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="113475" href="https://academy.hsoub.com/uploads/monthly_2022_12/05_validation_results.png.6ea28a7c20314b98a4ae63914ad2bde7.png" rel=""><img alt="كيفية التحقق من ملف HTML" class="ipsImage ipsImage_thumbnailed" data-fileid="113475" data-unique="gukk3d3uc" src="https://academy.hsoub.com/uploads/monthly_2022_12/05_validation_results.png.6ea28a7c20314b98a4ae63914ad2bde7.png" style="width: 700px; height: auto;"></a>
</p>

<h4>
	تفسير رسائل الخطأ
</h4>

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

<ul style="&#13;
    direction: ltr;&#13;
    text-align: left;&#13;
">
<li>
		<div style="direction: ltr;">
			Consider adding a `lang` attribute to the `html` start tag to declare the language of this document
		</div>
	</li>
</ul>
<p>
	أي فكّر في استخدام الصفة <code>lang</code> ضمن وسم بداية العنصر <a href="https://wiki.hsoub.com/HTML/html" rel="external"><code>html</code></a> لتحديد لغة المستند: هذه ليست رسالة خطأ وإنما تنبيه، إذ تشير التوصيات إلى ضرورة تحديد لغة الصفحة دائمًا وهذا ما ترشدك إليه هذه الرسالة.
</p>

<ul style="&#13;
    direction: ltr;&#13;
    text-align: left;&#13;
">
<li>
		<div style="dir=ltr">
			End tag `li` implied, but there were open elements
		</div>
	</li>
</ul>
<p>
	أي وسم النهاية للعنصر <code>li</code> موجود لكن هناك وسوم بداية لعناصر (وردت مرتين): تشير الرسالة إلى عنصر مفتوح ورد وسم بداية له وينبغي إغلاقه، إذ وجدت الخدمة وسم النهاية لكنه ليس في المكان الصحيح، ويشير رقمَي السطر والعمود إلى السطر الأول الذي يلي المكان الذي ينبغي وجود وسم النهاية فيه، وهذا دليل واضح لفهم الخطأ الحاصل.
</p>

<ul style="&#13;
    direction: ltr;&#13;
    text-align: left;&#13;
">
<li>
		<div style="dir=ltr">
			Unclosed element `strong`
		</div>
	</li>
</ul>
<p>
	أي عنصر <code>strong</code> غير مغلق: الرسالة واضحة، ويشير رقمَي السطر والعمود مباشرةً إلى مكان الخطأ.
</p>

<ul style="&#13;
    direction: ltr;&#13;
    text-align: left;&#13;
">
<li>
		<div style="dir=ltr">
			End tag `strong` violates nesting rules
		</div>
	</li>
</ul>
<p>
	أي يخالف وسم نهاية العنصر <code>strong</code> قواعد التداخل: تشير الرسالة إلى تداخل خاطئ للعناصر، ويشير رقمَي السطر والعمود مباشرةً إلى موقع المشكلة.
</p>

<ul style="&#13;
    direction: ltr;&#13;
    text-align: left;&#13;
">
<li>
		<div style="dir=ltr">
			End of file reached when inside an attribute value. Ignoring tag
		</div>
	</li>
</ul>
<p>
	أي الوصول إلى نهاية الملف ولانزال ضمن قيمة سمة. إهمال الوسم: هذه الرسالة مشفّرة نوعًا ما، وتشير إلى وجود سمة في مكان ما لم تكتب قيمتها بصورة صحيحة وربما قرب نهاية الملف لأن نهايته ظهرت داخل قيمة السمة، وطالما أنّ المتصفح لم يصيّر الرابط، فسيدلنا ذلك على مصدر الخطأ.
</p>

<ul style="&#13;
    direction: ltr;&#13;
    text-align: left;&#13;
">
<li>
		<div style="dir=ltr">
			End of file seen and there were open elements
		</div>
	</li>
</ul>
<p>
	أي الوصول إلى نهاية الملف مع وجود عناصر مفتوحة: هذه الرسالة غامضة، لكنها تشير مبدئيًا إلى وجود عناصر مفتوحة لابد من إغلاقها بطريقة صحيحة، إذ يشير رقم السطر إلى السطور الأخيرة في الملف، كما تأتي الرسالة مع سطر من الشيفرة يشير إلى مثال عن عنصر مفتوح:
</p>

<pre class="ipsCode">
example: &lt;a href="https://www.mozilla.org/&gt;link to Mozilla homepage&lt;/a&gt; ↩ &lt;/ul&gt;↩ &lt;/body&gt;↩&lt;/html&gt;
</pre>

<p>
	<strong>ملاحظة</strong>: قد ينتج عن سمة لم تغلق بإشارة تنصيص عنصر مفتوح لأنّ بقية المستند ستفسر على أنها محتوى لقيمة السمة.
</p>

<ul style="&#13;
    direction: ltr;&#13;
    text-align: left;&#13;
">
<li>
		<div style="dir=ltr">
			Unclosed element `ul`
		</div>
	</li>
</ul>
<p>
	أي عنصر <a href="https://wiki.hsoub.com/HTML/u" rel="external"><code>ul</code></a> غير مغلق: لن تقدِّم لك هذه الرسالة فائدةً كبيرةً لأن العنصر مغلق بصورة صحيحة، لكن سبب رسالة الخطأ هو إشارة التنصيص المفقودة.
</p>

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

<p>
	ستعرف أنك أصلحت جميع الأخطاء عندما تشاهد الشريط التالي في خرج الخدمة:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="113476" href="https://academy.hsoub.com/uploads/monthly_2022_12/06_problems_fixed.png.c45ffd20a8d01bc329c1ea2df0ffdf65.png" rel=""><img alt="06_problems_fixed.png" class="ipsImage ipsImage_thumbnailed" data-fileid="113476" data-unique="vvbekn0ny" src="https://academy.hsoub.com/uploads/monthly_2022_12/06_problems_fixed.thumb.png.4793b90d8c920ce80624992fdc94eed6.png"></a>
</p>

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

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

<p>
	ترجمة -وبتصرُّف- للمقال <a href="https://developer.mozilla.org/en-US/docs/Learn/HTML/Introduction_to_HTML/Debugging_HTML" rel="external nofollow">Debugging HTML</a>.
</p>

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

<ul>
<li>
		<a href="https://academy.hsoub.com/programming/javascript/%D8%AA%D9%86%D9%82%D9%8A%D8%AD-%D8%A3%D8%AE%D8%B7%D8%A7%D8%A1-%D8%B4%D9%8A%D9%81%D8%B1%D8%A9-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA-%D9%81%D9%8A-chrome-r784/" rel="">تنقيح أخطاء شيفرة جافاسكربت في Chrome</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/cpp/%D8%A7%D8%AE%D8%AA%D8%A8%D8%A7%D8%B1-%D8%A7%D9%84%D9%88%D8%AD%D8%AF%D8%A7%D8%AA-%D9%88%D8%A3%D8%AF%D9%88%D8%A7%D8%AA-%D8%AA%D9%86%D9%82%D9%8A%D8%AD-%D8%A7%D9%84%D8%B4%D9%8A%D9%81%D8%B1%D8%A7%D8%AA-%D9%88%D8%AA%D8%B5%D8%AD%D9%8A%D8%AD-%D8%A7%D9%84%D8%A3%D8%AE%D8%B7%D8%A7%D8%A1-%D9%81%D9%8A-cpp-r1190/" rel="">اختبار الوحدات وأدوات تنقيح الشيفرات وتصحيح الأخطاء في Cpp</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1812</guid><pubDate>Thu, 08 Dec 2022 16:01:00 +0000</pubDate></item><item><title>&#x647;&#x64A;&#x643;&#x644;&#x629; &#x635;&#x641;&#x62D;&#x627;&#x62A; &#x648;&#x645;&#x648;&#x627;&#x642;&#x639; &#x627;&#x644;&#x648;&#x64A;&#x628;</title><link>https://academy.hsoub.com/programming/html/%D9%87%D9%8A%D9%83%D9%84%D8%A9-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D9%88%D9%85%D9%88%D8%A7%D9%82%D8%B9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r1804/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_12/63884ab80b414_-----html.png.19e0087df5ab40282feba532513b0892.png" /></p>
<p>
	تقدِّم <a href="https://wiki.hsoub.com/HTML" rel="external">HTML</a> إضافةً إلى العناصر التي تحدد أجزاءً مستقلةً في الصفحة -مثل الفقرات النصية والصور- عددًا من العناصر الكتلية Block elements لتحدد مناطق كاملة ضمن <a href="https://academy.hsoub.com/devops/servers/%D8%A7%D9%84%D9%81%D8%B1%D9%82-%D8%A8%D9%8A%D9%86-%D8%B5%D9%81%D8%AD%D8%A9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D9%88%D9%85%D9%88%D9%82%D8%B9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D9%88%D8%AE%D8%A7%D8%AF%D9%85-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D9%88%D9%85%D8%AD%D8%B1%D9%83-%D8%A7%D9%84%D8%A8%D8%AD%D8%AB-r572/" rel="">صفحة ويب</a> مثل ترويسة الصفحة Header أو قوائم التنقل Navigation menu أو أعمدة المحتوى الأساسي main content columns، إذ سيبحث هذا المقال في كيفية التخطيط لوضع هيكلية بسيطة لموقع ويب وكتابة شيفرة HTML المناسبة.
</p>

<p>
	عليك قبل البدء في قراءة هذا المقال الاطلاع على أساسيات HTML التي أوردناها في مقال <a href="https://academy.hsoub.com/programming/html/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%84%D8%BA%D8%A9-html-r1752/" rel="">تعرَّف على HTML</a> وكذلك <a href="https://academy.hsoub.com/programming/html/%D9%87%D9%8A%D9%83%D9%84%D8%A9-%D8%A7%D9%84%D9%86%D8%B5%D9%88%D8%B5-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%84%D8%BA%D8%A9-html-r1754/" rel="">هيكلة النصوص في HTML</a> ومقال <a href="https://academy.hsoub.com/programming/html/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D8%A7%D9%84%D8%B1%D9%88%D8%A7%D8%A8%D8%B7-%D8%A7%D9%84%D8%AA%D8%B4%D8%B9%D8%A8%D9%8A%D8%A9-%D9%81%D9%8A-html-r1755/" rel="">طريقة إنشاء الروابط التشعبية</a>.
</p>

<h2>
	الأقسام الأساسية لصفحة ويب
</h2>

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

<ul>
	<li>
		الترويسة Header: يظهر عادة على أساس شريط واسع أعلى الصفحة يضم عنوانًا عريضًا وشعارًا، كما يبقى هذا القسم نفسه في كل صفحات الموقع على الأغلب.
	</li>
	<li>
		شريط التنقل Navigation bar: يرتبط بالأقسام الرئيسية للموقع ويُعرض على هيئة أزرار أو روابط أو نوافذ ضمنية tabs، كما يبقى عادةً محتوى هذا الشريط كما هو في جميع صفحات الموقع تمامًا مثل محتوى الترويسة، فعدم وجود هذا الشريط في صفحة ما سيربك المستخدِم ويدفعه إلى ترك الموقع، كما يعتقد الكثير من المصممين أنّ أشرطة القوائم لا بد وأن تكون جزءًا من الترويسة، لكنها تبقى مجرد رؤية غير ملزمة، لأن البعض يجادل أيضًا في أفضلية وجودهما مستقلين من منظور <a href="https://academy.hsoub.com/programming/html/%D8%A7%D9%84%D8%AA%D8%AD%D9%82%D9%82-%D9%85%D9%86-%D8%B3%D9%87%D9%88%D9%84%D8%A9-%D8%A7%D9%84%D9%88%D8%B5%D9%88%D9%84-%D9%84%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r1328/" rel="">سهولة الوصول</a> أو الشمولية accessibility، إذ يمكن لقارئات الشاشة أن تقرأهما بصورة أفضل في حال كانا منفصلين.
	</li>
	<li>
		المحتوى الرئيسي main content: يُعَدّ منطقةَ واسعةَ منتصف الصفحة تتضمن المحتوى الخاص بصفحة الويب، مثل الفيديو الذي تريد مشاهدته أو القصة التي تريد قراءتها أو الخرائط التي تريد رؤيتها أو عناوين الأخبار أو غير ذلك، وهذا القسم بالتحديد سيختلف بكل تأكيد من صفحة لأخرى.
	</li>
	<li>
		الشريط الجانبي sidebar: يضم بعض المعلومات على أطراف الصفحة مثل الروابط أو الاقتباسات أو الإعلانات وغيرها، يتعلق محتوى هذا القسم بما يرد في المحتوى الرئيسي عادةً، فقد تجد في الشريط الجانبي لمحةً عن صاحب الصفحة أو روابط إلى مواضيع مشابهة، كما قد تجد أحيانًا بعض العناصر الاحتياطية مثل قوائم تنقل إضافية.
	</li>
	<li>
		تذييل الصفحة footer: شريط يمتد أسفل الصفحة ويضم عادة رسومات دقيقة وملاحظات عن حقوق النشر أو معلومات التواصل، ويُستخدَم هذا القسم لإدراج معلومات عامة كما هو حال الترويسة، لكن هذه المعلومات ليست حيويةً أو مكملة لما يعرضه الموقع، كما يُستخدَم التذييل أحيانًا لأغراض <a href="https://academy.hsoub.com/marketing/search-engine-optimisation/%D8%AA%D8%AD%D8%B3%D9%8A%D9%86-%D9%85%D8%AD%D8%B1%D9%83%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%AD%D8%AB-seo-%D9%88%D8%A3%D9%87%D9%85%D9%8A%D8%AA%D9%87%D8%A7-%D9%84%D9%85%D9%88%D9%82%D8%B9%D9%83-%D8%A7%D9%84%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A-r490/" rel="">تحسين محركات البحث Search Engine Optimization</a>، إذ يعرض أحيانًا روابط سريعة للوصول إلى محتوى ذو شعبية كبيرة على الويب.
	</li>
</ul>

<p>
	قد يُبنى هيكل موقع ويب نموذجي مشابه لما تعرضه الصورة التالية:
</p>

<p style="text-align: center;">
	<img alt="هيكل موقع ويب نموذجي" class="ipsImage ipsImage_thumbnailed" data-fileid="113138" data-unique="oia2pt3rm" style="width: 720px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2022_12/01_typical_website.png.6f11bb9bc8e855e000bb3654712ae39d.png">
</p>

<h2>
	استخدام HTML في هيكلة المحتوى
</h2>

<p>
	لا يُعَدّ النموذج في الصورة السابقة جميلًا لكنه جيد في توضيح تخطيط موقع ويب نموذجي، إذ تحتوي بعض المواقع على أعمدة أكثر وبعضها يبدو أعقد، لكن الفكرة واضحة، كما تستطيع من خلال <a href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%AA%D9%86%D8%B3%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-%D9%84%D9%84%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-%D9%81%D9%8A-css-r1054/" rel="">تنسيقات CSS</a> استخدام أية عناصر تريد لتغلف بها أيّ قسم ليبدو بالصورة الذي تريدها، لكن وكما تحدثنا سابقًا لا بد من احترام دلالات عناصر HTML واستخدام العنصر الصحيح للغاية الصحيحة.
</p>

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

<p>
	<strong>ملاحظة</strong>: يُقدَّر عدد المصابين بعمى الألوان من الذكور بحدود 8% ومن النساء بحدود 0.5%، أي رجل من بين 12 وامرأة من بين 200، في حين ويمثِّل المصابون بالعمى وأصحاب المشاكل البصرية الجادة نسبة 4-5% من تعداد البشر، وقد كان عددهم قرابة 285 مليون عالميًا عام 2012 عندما كان تعداد سكان الأرض سبعة مليارات.
</p>

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

<p>
	تقدِّم لك HTML مجموعةَ من العناصر لإنجاز هيكلية دلالية تعكس وظيفة كل قسم منها:
</p>

<ul>
	<li>
		<strong>الترويسة header</strong>: يمثلها العنصر <a href="https://wiki.hsoub.com/HTML/header" rel="external"><code>&lt;header&gt;</code></a>.
	</li>
	<li>
		<strong>شريط التنقل navigation bar</strong>: يمثله العنصر <a href="https://wiki.hsoub.com/HTML/header" rel="external"><code>&lt;nav&gt;</code></a>.
	</li>
	<li>
		<strong>المحتوى الرئيسي main content</strong>: يمثله العنصر <a href="https://wiki.hsoub.com/HTML/main" rel="external"><code>&lt;main&gt;</code></a>، بالإضافة إلى العديد من العناصر التي تمثل أقسامًا فرعيةً للمحتوى الرئيسي مثل <a href="https://wiki.hsoub.com/HTML/section" rel="external"><code>&lt;section&gt;</code></a> و <a href="https://wiki.hsoub.com/HTML/div" rel="external"><code>&lt;div&gt;</code></a>.
	</li>
	<li>
		<strong>الشريط الجانبي sidebar</strong>: يمثله العنصر <a href="https://wiki.hsoub.com/HTML/aside" rel="external"><code>&lt;aside&gt;</code></a>.
	</li>
	<li>
		<strong>التذييل footer</strong>: يمثله العنصر <a href="https://wiki.hsoub.com/HTML/footer" rel="external"><code>&lt;footer&gt;</code></a>.
	</li>
</ul>

<h3>
	تطبيق: فهم شيفرة الصفحة النموذجية السابقة
</h3>

<p>
	تمثِّل الشيفرة التالية شيفرة الموقع النموذجي الذي عرضنا صورته سابقًا، ويمكنك تنزيلها أيضًا من <a href="https://github.com/mdn/learning-area/blob/master/html/introduction-to-html/document_and_website_structure/index.html" rel="external nofollow">المستودع المخصص للمثال</a> على جيت-هب GitHub، كما نطلب منك إلقاء نظرة على الشيفرة ومن ثم العودة إلى القائمة في الأسفل لتحديد أجزاء الشيفرة وما تمثله من أقسام.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_27_15" 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">My page title</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">"https://fonts.googleapis.com/css?family=Open+Sans+Condensed:300|Sonsie+One"</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">type</span><span class="pun">=</span><span class="atv">"text/css"</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">"style.css"</span><span class="tag">&gt;</span><span class="pln">

    </span><span class="com">&lt;!--الدلالية في النسخ HTML5 الأسطر الثلاث التالية هي طريقة لتعمل عناصر 
    الأقدم من متصفح إنترنت إكسبلورر--&gt;</span><span class="pln">
    </span><span class="com">&lt;!--[if lt IE 9]&gt;
      &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv.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="com">&lt;!-- الترويسة الرئيسية التي ستستخدم في جميع صفحات الموقع --&gt;</span><span class="pln">

    </span><span class="tag">&lt;header&gt;</span><span class="pln">
      </span><span class="tag">&lt;h1&gt;</span><span class="pln">Header</span><span class="tag">&lt;/h1&gt;</span><span class="pln">
    </span><span class="tag">&lt;/header&gt;</span><span class="pln">

    </span><span class="tag">&lt;nav&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">Home</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">Our team</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">Projects</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">Contact</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="com">&lt;!-- استمارة بحث وهو أسلوب غير مباشر للتنقل عبر الموقع --&gt;</span><span class="pln">

       </span><span class="tag">&lt;form&gt;</span><span class="pln">
         </span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"search"</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"q"</span><span class="pln"> </span><span class="atn">placeholder</span><span class="pun">=</span><span class="atv">"Search query"</span><span class="tag">&gt;</span><span class="pln">
         </span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"submit"</span><span class="pln"> </span><span class="atn">value</span><span class="pun">=</span><span class="atv">"Go!"</span><span class="tag">&gt;</span><span class="pln">
       </span><span class="tag">&lt;/form&gt;</span><span class="pln">
     </span><span class="tag">&lt;/nav&gt;</span><span class="pln">

    </span><span class="com">&lt;!-- المحتوى الرئيسي للموقع --&gt;</span><span class="pln">
    </span><span class="tag">&lt;main&gt;</span><span class="pln">

      </span><span class="com">&lt;!-- يتضمن مقالة--&gt;</span><span class="pln">
      </span><span class="tag">&lt;article&gt;</span><span class="pln">
        </span><span class="tag">&lt;h2&gt;</span><span class="pln">Article heading</span><span class="tag">&lt;/h2&gt;</span><span class="pln">

        </span><span class="tag">&lt;p&gt;</span><span class="pln">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Donec a diam lectus. Set sit amet ipsum mauris. Maecenas congue ligula as quam viverra nec consectetur ant hendrerit. Donec et mollis dolor. Praesent et diam eget libero egestas mattis sit amet vitae augue. Nam tincidunt congue enim, ut porta lorem lacinia consectetur.</span><span class="tag">&lt;/p&gt;</span><span class="pln">

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

        </span><span class="tag">&lt;p&gt;</span><span class="pln">Donec ut librero sed accu vehicula ultricies a non tortor. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aenean ut gravida lorem. Ut turpis felis, pulvinar a semper sed, adipiscing id dolor.</span><span class="tag">&lt;/p&gt;</span><span class="pln">

        </span><span class="tag">&lt;p&gt;</span><span class="pln">Pelientesque auctor nisi id magna consequat sagittis. Curabitur dapibus, enim sit amet elit pharetra tincidunt feugiat nist imperdiet. Ut convallis libero in urna ultrices accumsan. Donec sed odio eros.</span><span class="tag">&lt;/p&gt;</span><span class="pln">

        </span><span class="tag">&lt;h3&gt;</span><span class="pln">Another subsection</span><span class="tag">&lt;/h3&gt;</span><span class="pln">

        </span><span class="tag">&lt;p&gt;</span><span class="pln">Donec viverra mi quis quam pulvinar at malesuada arcu rhoncus. Cum soclis natoque penatibus et manis dis parturient montes, nascetur ridiculus mus. In rutrum accumsan ultricies. Mauris vitae nisi at sem facilisis semper ac in est.</span><span class="tag">&lt;/p&gt;</span><span class="pln">

        </span><span class="tag">&lt;p&gt;</span><span class="pln">Vivamus fermentum semper porta. Nunc diam velit, adipscing ut tristique vitae sagittis vel odio. Maecenas convallis ullamcorper ultricied. Curabitur ornare, ligula semper consectetur sagittis, nisi diam iaculis velit, is fringille sem nunc vet mi.</span><span class="tag">&lt;/p&gt;</span><span class="pln">
      </span><span class="tag">&lt;/article&gt;</span><span class="pln">

      </span><span class="com">&lt;!-- يمكن للمحتوى الجانبي أن يتداخل مع المحتوى الرئيسي --&gt;</span><span class="pln">
      </span><span class="tag">&lt;aside&gt;</span><span class="pln">
        </span><span class="tag">&lt;h2&gt;</span><span class="pln">Related</span><span class="tag">&lt;/h2&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">Oh I do like to be beside the seaside</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">Oh I do like to be beside the sea</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">Although in the North of England</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">It never stops raining</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">Oh well...</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;/aside&gt;</span><span class="pln">

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

    </span><span class="com">&lt;!-- التذييل الرئيسي الذي سيستخدم في جميع صفحات الموقع --&gt;</span><span class="pln">

    </span><span class="tag">&lt;footer&gt;</span><span class="pln">
      </span><span class="tag">&lt;p&gt;</span><span class="pln">©Copyright 2050 by nobody. All rights reversed.</span><span class="tag">&lt;/p&gt;</span><span class="pln">
    </span><span class="tag">&lt;/footer&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 ومن ثم إبرازه عبر تنسيق CSS.
</p>

<h2>
	تفاصيل عناصر تخطيط HTML
</h2>

<p>
	من الجيد فهم المعنى العام لجميع العناصر التي تعرّف الأقسام المختلفة في صفحة HTML، وهذا ما ستعمل عليه لاحقًا عندما تكتسب خبرةَ أكبر في <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>، لكن ما عليك استيعابه الآن هي التعريفات التالية:
</p>

<ul>
	<li>
		العنصر <code><a href="https://wiki.hsoub.com/HTML/main" rel="external">&lt;main&gt;</a></code>: يستخدَم لإدراج المحتوى الفريد للصفحة، وينبغي استخدام هذا العنصر مرةً واحدةً في الصفحة، كما يوضَع مباشرةً ضمن العنصر <code>&lt;body&gt;</code>، ولا يجب أن يتداخل هذا العنصر مع عناصر أخرى.
	</li>
	<li>
		العنصر <code><a href="https://wiki.hsoub.com/HTML/article" rel="external">&lt;article&gt;</a></code>: يغلِّف كتلًا من المحتوى المترابط القائم بذاته والذي لا يتعلق بمحتوى بقية الأقسام مثل المنشورات المستقلة.
	</li>
	<li>
		العنصر <code><a href="https://wiki.hsoub.com/HTML/section" rel="external">&lt;section&gt;</a></code>: يشابه العنصر <code>&lt;article&gt;</code> لكنه يستخدَم لتحضير جزء من الصفحة ليقدّم وظيفةً بمفرده مثل خريطة صغيرة أو مجموعة من العناوين أو الملخصات لمقالات أو ليقدم موضوعًا محددًا، كما يُعَدّ استخدام عناصر العناوين في بداية كل عنصر <code>&lt;section&gt;</code> ممارسةً جيدةً، وتجدر الملاحظة أنه بالإمكان تجزئة محتوى العنصر <code>&lt;article&gt;</code> إلى أقسام مختلفة وتجزئة القسم <code>&lt;section&gt;</code> إلى مقالات مختلفة وفقًا للسياق.
	</li>
	<li>
		العنصر <code><a href="https://wiki.hsoub.com/HTML/aside" rel="external">&lt;aside&gt;</a></code>: يضم محتوًى لا يتعلق مباشرةً بالمحتوى الرئيسي للصفحة لكنه يزوِّد الصفحة بمعلومات إضافية مثل مدخلات مختصرة أو سيرة ذاتية للمؤلف أو روابط متعلقة بالمحتوى وغيرها.
	</li>
	<li>
		العنصر <code><a href="https://wiki.hsoub.com/HTML/header" rel="external">&lt;header&gt;</a></code>: يضم محتوًى تعريفيًا للصفحة، فإذا كان هذا العنصر ابنًا للعنصر <code>&lt;body&gt;</code>، فسيمثل الترويسة العامة للصفحة، في حيم إذا كان ابنًا للعنصر <code>&lt;section&gt;</code>، فسيمثل ترويسةً خاصةً بهذا القسم، وحاول عدم الخلط بين الترويسة وعنوان صفحة والعناوين الأخرى.
	</li>
	<li>
		العنصر <code><a href="https://wiki.hsoub.com/HTML/nav" rel="external">&lt;nav&gt;</a></code>: يؤمن وظيفة التنقل الأساسية في الصفحة، ولا يضم روابط ثانوية وما شابهها.
	</li>
	<li>
		العنصر <code><a href="https://wiki.hsoub.com/HTML/footer" rel="external">&lt;footer&gt;</a></code>: يضم محتوًى مناسبًا لتذييل الصفحة.
	</li>
</ul>

<p>
	يمكنك الاطلاع على كل عنصر من العناصر السابقة بالعودة إلى <a href="https://wiki.hsoub.com/HTML" rel="external">توثيق HTML</a> العربي في موسوعة حسوب.
</p>

<h3>
	عناصر غير دلالية
</h3>

<p>
	قد لا تجد في بعض الأحيان عنصرًا دلاليًا مناسبًا لتغليف محتوى معيّن، وقد ترغب في أحيان أخرى ضم مجموعة من العناصر مع بعضها لكي تتعامل معها على أساس كيان واحد عند استخدام <a href="https://wiki.hsoub.com/CSS" rel="external">CSS</a> أو جافاسكربت، إذ تقدِّم HTML في حالات مثل هذه العنصر <code><a href="https://wiki.hsoub.com/HTML/div" rel="external">&lt;div&gt;</a></code> الذي يُفضَّل استخدامه مع السمة <code>class</code> لكي تعطيه تسميةً محددةً فيسهل استهدافه، كما يُعَدّ العنصر <code><a href="https://wiki.hsoub.com/HTML/span" rel="external">&lt;span&gt;</a></code> عنصرًا سطريًا غير دلالي ينبغي استخدامه فقط إذا لم تجد عنصرًا دلاليًا مناسبًا لتغليف المحتوى المطلوب أو لم ترد إعطاء معنى محدد لهذا المحتوى، وإليك مثالًا كما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_27_29" style=""><span class="tag">&lt;p&gt;</span><span class="pln">، دخل الملك إلى غرفته مترنحًا في الواحدة ليلًا لم يساعده الدواء كثيرًا وجر نفسه عبر الباب </span><span class="tag">&lt;span</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"editor-note"</span><span class="tag">&gt;</span><span class="pln">[ملاحظة للمحرر: في هذه اللحظة ينبغي تخفيض الأضواء]</span><span class="tag">&lt;/span&gt;</span><span class="pln">.</span><span class="tag">&lt;/p&gt;</span></pre>

<p>
	يُفترَض في هذه الحالة أن تقدِّم ملاحظة المحرر الموسومة بالصنف "editor-note" توجيهات إضافيةً للقارئ بما أنها لا تحمل أي دلالة إضافية، ويمكن حل هذا الموضوع ببساطة باستخدام CSS أيضًا، وذلك بإزاحة الملاحظة قليلًا عن النص الرئيسي.
</p>

<p>
	يُعَدّ العنصر <code>&lt;div&gt;</code> عنصرًا كتليًا غير دلالي ينبغي استخدامه فقط إذا لم تجد عنصرًا دلاليًا كتليًا مناسبًا لتغليف المحتوى المطلوب أو لم ترد إعطاء معنى محدد لهذا المحتوى، فتخيل على سبيل المثال قائمة تسوّق يمكنك طلبها في أيّ وقت من موقع تجاري:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_27_31" style=""><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"shopping-cart"</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;h2&gt;</span><span class="pln">Shopping cart</span><span class="tag">&lt;/h2&gt;</span><span class="pln">
  </span><span class="tag">&lt;ul&gt;</span><span class="pln">
    </span><span class="tag">&lt;li&gt;</span><span class="pln">
      </span><span class="tag">&lt;p&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;&lt;strong&gt;</span><span class="pln">Silver earrings</span><span class="tag">&lt;/strong&gt;&lt;/a&gt;</span><span class="pln">: $99.95.</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">"../products/3333-0985/thumb.png"</span><span class="pln"> </span><span class="atn">alt</span><span class="pun">=</span><span class="atv">"Silver earrings"</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="tag">&lt;/li&gt;</span><span class="pln">
    </span><span class="tag">&lt;li&gt;</span><span class="pln">
      ...
    </span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;/ul&gt;</span><span class="pln">
  </span><span class="tag">&lt;p&gt;</span><span class="pln">Total cost: $237.89</span><span class="tag">&lt;/p&gt;</span><span class="pln">
</span><span class="tag">&lt;/div&gt;</span></pre>

<p>
	لا تُعَدّ هذه القائمة محتوىً جانبيًا <code>&lt;aside&gt;</code> في الواقع، فقد لا تتعلق بالضرورة بالمحتوى الرئيسي للصفحة وتريدها أن تظهر في أيّ مكان ضمن الموقع، كما ليس من المجدي استخدام العنصر <code>&lt;section&gt;</code> لكونها لا تمثل جزءًا من المحتوى الرئيسي، وبالتالي يكون استخدام العنصر <code>&lt;div&gt;</code> في هذه الحالة مناسبًا، كما استخدمنا معه عنوانًا لمساعدة قارئات الشاشة على إيجاده.
</p>

<p>
	<strong>تنبيه</strong>: يُعَدّ استخدام العنصر <code>&lt;div&gt;</code> مريحًا وسهلًا للغاية، فهو لا يحمل أيّ معنى دلالي، وإنما يُجمّع شيفرة HTML ضمن كيان واحد، ولكن انتبه إلى استخدامها فقط عندما لا تجد عنصرًا دلاليًا مناسبًا، وحاول التقليل من استخدامه إلى الحد الأدنى كي لا تعاني في صيانة الموقع لاحقًا.
</p>

<h3>
	بادئات الأسطر الجديدة والخطوط الأفقية
</h3>

<p>
	يوجد عنصران ستستخدمهما في مناسبات عدة ولا بد من الاطلاع عليهما:
</p>

<ul>
	<li>
		<strong>عنصر الانتقال إلى سطر جديد <code><a href="https://wiki.hsoub.com/HTML/br" rel="external">&lt;br&gt;</a></code></strong>: يدرِج هذا العنصر سطرًا جديدًا ضمن فقرة نصية، ويُعَدّ هذا العنصر الأسلوب الوحيد لتقسيم كتلة نصية أو بنية محددة إلى سلسلة من الأسطر القصيرة مثل حالة عنوان بريدي أو قصيدة شعرية، وإليك مثالًا كما يلي:
	</li>
</ul>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_27_33" style=""><span class="tag">&lt;p&gt;</span><span class="pln">There once was a man named O'Dell</span><span class="tag">&lt;br&gt;</span><span class="pln">
Who loved to write HTML</span><span class="tag">&lt;br&gt;</span><span class="pln">
But his structure was bad, his semantics were sad</span><span class="tag">&lt;br&gt;</span><span class="pln">
and his markup didn't read very well.</span><span class="tag">&lt;/p&gt;</span></pre>

<p>
	سيُصيَّر أو يُعرَض النص في الفقرات على صورة خط طويل دون استخدام العنصر <code>&lt;br&gt;</code>، أما بوجوده، فسيصيِّر المتصفح الفقرة النصية على الصورة التالية:
</p>

<p style="text-align: center;">
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="181939" data-ratio="26.63" data-unique="sx5f0rj13" width="383" alt="image.png" src="https://academy.hsoub.com/uploads/monthly_2026_03/image.png.2aa7d2bb7b79a414d2e055392c6e542c.png">
</p>

<ul>
	<li>
		<strong>عنصر إدراج سطر أفقي <code><a href="https://wiki.hsoub.com/HTML/hr" rel="external">&lt;hr&gt;</a></code></strong>: يُنشئ العنصر خطًا أفقيًا في الصفحة لكي يعرض تغيرًا في سمة النص مثل تغير الموضوع أو المشهد، وإليك مثالًا كما يلي:
	</li>
</ul>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_27_38" style=""><span class="tag">&lt;p&gt;</span><span class="pln">Ron was backed into a corner by the marauding
   netherbeasts. Scared, but determined to protect his friends, he raised his
   wand and prepared to do battle, hoping that his distress call had made it through.</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">Meanwhile, Harry was sitting at home, staring at his royalty statement
  and pondering when the next spin off series would come out, when an enchanted
  distress letter flew through his window and landed in his lap. He read it
  hazily and sighed; "better get back to work then", he mused.</span><span class="tag">&lt;/p&gt;</span></pre>

<p>
	إذ سيصيَّر كما يلي:
</p>

<p style="text-align: center;">
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="181940" data-ratio="18.29" data-unique="koexr1s8m" width="853" alt="image.png" src="https://academy.hsoub.com/uploads/monthly_2026_03/image.png.bb1da368212f0badaf4dd6dee93da88a.png">
</p>

<h2>
	التخطيط لموقع ويب بسيط
</h2>

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

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

<h3>
	تطبيق: أنشئ خريطة موقع خاصة بك
</h3>

<p>
	حاول إنشاء خريطة لموقعك، ما الذي تريده من موقعك؟
</p>

<p>
	<strong>ملاحظة</strong>: احفظ عملك في مكان مناسب، فقد تحتاج إليه لاحقًا.
</p>

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

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

<p>
	ترجمة -وبتصرُّف- للمقال <a href="https://developer.mozilla.org/en-US/docs/Learn/HTML/Introduction_to_HTML/Document_and_website_structure" rel="external nofollow">Document and website structure</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/design/general/%d9%87%d9%8a%d9%83%d9%84%d8%a9-%d9%88%d8%aa%d9%88%d8%b2%d9%8a%d8%b9-%d9%85%d8%ad%d8%aa%d9%88%d9%89-%d8%b5%d9%81%d8%ad%d8%a7%d8%aa-%d8%a7%d9%84%d9%88%d9%8a%d8%a8-r43/" rel="">هيكلة وتوزيع محتوى صفحات الويب</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/design/user-experience/%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D9%87%D9%8A%D9%83%D9%84-%D8%B5%D9%81%D8%AD%D8%A9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D9%88%D8%A7%D9%84%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-%D9%81%D9%8A-%D9%85%D8%AC%D8%A7%D9%84-%D8%AA%D8%AC%D8%B1%D8%A8%D8%A9-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-r252/" rel="">تصميم هيكل صفحة الويب والعناصر الأساسية في مجال تجربة المستخدم</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/servers/%D8%A7%D9%84%D9%81%D8%B1%D9%82-%D8%A8%D9%8A%D9%86-%D8%B5%D9%81%D8%AD%D8%A9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D9%88%D9%85%D9%88%D9%82%D8%B9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D9%88%D8%AE%D8%A7%D8%AF%D9%85-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D9%88%D9%85%D8%AD%D8%B1%D9%83-%D8%A7%D9%84%D8%A8%D8%AD%D8%AB-r572/" rel="">الفرق بين صفحة الويب وموقع الويب وخادم الويب ومحرك البحث</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1804</guid><pubDate>Thu, 01 Dec 2022 16:04:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x62A;&#x646;&#x633;&#x64A;&#x642; &#x627;&#x644;&#x645;&#x62A;&#x642;&#x62F;&#x645; &#x644;&#x644;&#x646;&#x635;&#x648;&#x635; &#x641;&#x64A; HTML</title><link>https://academy.hsoub.com/programming/html/%D8%A7%D9%84%D8%AA%D9%86%D8%B3%D9%8A%D9%82-%D8%A7%D9%84%D9%85%D8%AA%D9%82%D8%AF%D9%85-%D9%84%D9%84%D9%86%D8%B5%D9%88%D8%B5-%D9%81%D9%8A-html-r1756/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_10/635e55a57cb6f_----html.jpg.afb2eb2c062dd2ffba5d3b62f6a7791f.jpg" /></p>
<p>
	تجد في <a href="https://wiki.hsoub.com/HTML" rel="external">HTML</a> الكثير من العناصر المستخدَمة في تنسيق النصوص ولم نأت على ذكرها في <a href="https://academy.hsoub.com/programming/html/%D9%87%D9%8A%D9%83%D9%84%D8%A9-%D8%A7%D9%84%D9%86%D8%B5%D9%88%D8%B5-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%84%D8%BA%D8%A9-html-r1754/" rel="">مقال هيكلة النصوص باستخدام لغة HTML</a>، فليست جميع العناصر التي سنذكرها في هذا المقال معروفةً جيدًا، لكن من الجيد الاطلاع عليها (مع ذلك لن تكتمل قائمة العناصر كلها!)، إذ سنتعلم في مقالنا التعامل مع الاقتباسات وقوائم الوصف وطريقة عرض الشيفرات البرمجية والنصوص المتعلقة بها بالإضافة إلى كتابة نصوص مرتفعة عن نسق الكتابة الرئيسي superscript أو منخفضة عنه subscript، وكذلك عرض معلومات التواصل وغيرها.
</p>

<p>
	لا بد قبل الشروع في قراءة المقال الاطلاع على أساسيات HTML كما تحدثنا عنها في <a href="https://academy.hsoub.com/programming/html/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%84%D8%BA%D8%A9-html-r1752/" rel="">مقال تعرَّف على لغة HTML</a> وكذلك <a href="https://academy.hsoub.com/programming/html/%D9%87%D9%8A%D9%83%D9%84%D8%A9-%D8%A7%D9%84%D9%86%D8%B5%D9%88%D8%B5-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%84%D8%BA%D8%A9-html-r1754/" rel="">هيكلة النصوص باستخدام لغة HTML</a>.
</p>

<h2>
	قوائم الوصف Description lists
</h2>

<p>
	تعلمنا في مقالات سابقة طريقة إنشاء قوائم HTML بسيطة، لكننا لم نذكر النوع الثالث الذي قد نصادفه أحيانًا وهي قوائم الوصف description lists، إذ يُعَدّ الغرض الرئيسي لهذه القوائم هو تعداد مجموعة من العناصر وإدراج وصف لها أيضًا مثل المصطلحات وتعريفاتها أو الأسئلة وأجوبتها، وإليك مثالًا عن مجموعة من المصطلحات وتعريفها:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2570_11" style=""><span class="pln">soliloquy
In drama, where a character speaks to themselves, representing their inner thoughts or feelings and in the process relaying them to the audience (but not to other characters.)
monologue
In drama, where a character speaks their thoughts out loud to share them with the audience and any other characters present.
aside
In drama, where a character shares a comment only with the audience for humorous or dramatic effect. This is usually a feeling, thought or piece of additional background information</span></pre>

<p>
	تُغلَّف عناصر هذه القائمة داخل عنصر قوائم مختلف وهو <code><a href="https://wiki.hsoub.com/HTML/dl" rel="external">&lt;dl&gt;</a></code>، كما يُغلَّف كل من عناصرها <a href="https://wiki.hsoub.com/HTML/dt" rel="external">بالعنصر &lt;dt&gt;</a>، في حين يوضَع وصف أو تعريف كل عنصر ضمن <a href="https://wiki.hsoub.com/HTML/dd" rel="external">العنصر &lt;dd&gt;</a> بعده مباشرةً.
</p>

<h3>
	مثال عن قائمة وصف
</h3>

<p>
	سنستخدِم قائمة الوصف لتنسيق النص السابق:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2570_15" style=""><span class="tag">&lt;dl&gt;</span><span class="pln">
  </span><span class="tag">&lt;dt&gt;</span><span class="pln">soliloquy</span><span class="tag">&lt;/dt&gt;</span><span class="pln">
  </span><span class="tag">&lt;dd&gt;</span><span class="pln">In drama, where a character speaks to themselves, representing their inner thoughts or feelings and in the process relaying them to the audience (but not to other characters.)</span><span class="tag">&lt;/dd&gt;</span><span class="pln">
  </span><span class="tag">&lt;dt&gt;</span><span class="pln">monologue</span><span class="tag">&lt;/dt&gt;</span><span class="pln">
  </span><span class="tag">&lt;dd&gt;</span><span class="pln">In drama, where a character speaks their thoughts out loud to share them with the audience and any other characters present.</span><span class="tag">&lt;/dd&gt;</span><span class="pln">
  </span><span class="tag">&lt;dt&gt;</span><span class="pln">aside</span><span class="tag">&lt;/dt&gt;</span><span class="pln">
  </span><span class="tag">&lt;dd&gt;</span><span class="pln">In drama, where a character shares a comment only with the audience for humorous or dramatic effect. This is usually a feeling, thought, or piece of additional background information.</span><span class="tag">&lt;/dd&gt;</span><span class="pln">
</span><span class="tag">&lt;/dl&gt;</span></pre>

<p>
	يعرض المتصفح قائمة الوصف افتراضيًا بحيث ينزاح فيه وصف أو تعريف العنصر قليلًا عن مستوى المصطلح.
</p>

<p style="text-align: center;">
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="181929" data-ratio="31.82" data-unique="9uet4all6" width="707" alt="image.png" src="https://academy.hsoub.com/uploads/monthly_2026_03/image.png.84b848e8fa12e82757f1008917e0d247.png">
</p>

<h3>
	تعريفات متعددة لمصطلح واحد
</h3>

<p>
	يُسمح في قوائم الوصف وجود أكثر من وصف أو تعريف لمصطلح، وإليك مثالًا:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2570_19" style=""><span class="tag">&lt;dl&gt;</span><span class="pln">
  </span><span class="tag">&lt;dt&gt;</span><span class="pln">aside</span><span class="tag">&lt;/dt&gt;</span><span class="pln">
  </span><span class="tag">&lt;dd&gt;</span><span class="pln">In drama, where a character shares a comment only with the audience for humorous or dramatic effect. This is usually a feeling, thought, or piece of additional background information.</span><span class="tag">&lt;/dd&gt;</span><span class="pln">
  </span><span class="tag">&lt;dd&gt;</span><span class="pln">In writing, a section of content that is related to the current topic, but doesn't fit directly into the main flow of content so is presented nearby (often in a box off to the side.)</span><span class="tag">&lt;/dd&gt;</span><span class="pln">
</span><span class="tag">&lt;/dl&gt;</span></pre>

<p style="text-align: center;">
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="181930" data-ratio="14.91" data-unique="yao33x8zz" width="805" alt="image.png" src="https://academy.hsoub.com/uploads/monthly_2026_03/image.png.0a2b5bb740c70ab50af65da2cc49f224.png">
</p>

<h2>
	الاقتباسات Quotations
</h2>

<p>
	تتيح <a href="https://academy.hsoub.com/programming/html/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%84%D8%BA%D8%A9-html-r1687/" rel="">لغة HTML</a> عناصر للدلالة على الاقتباسات quotations، ويختلف العنصر المُستخدَم لإنشاء اقتباس إذا كنت توصِّف اقتباسًا مأخوذًا من عنصر كتلي Block أو سطري Inline.
</p>

<h3>
	الاقتباسات الكتلية
</h3>

<p>
	إذا اقتُبس جزء من محتوى عنصر كتلي مثل فقرة نصية أو عدة فقرات أو قائمة من مكان ما، فلا بد من تضمينه داخل <a href="https://wiki.hsoub.com/HTML/blockquote" rel="external">العنصر &lt;blockquote&gt;</a> لإظهاره على أساس فقرة وإضافة <a href="https://academy.hsoub.com/programming/general/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%B9%D9%86%D9%88%D8%A7%D9%86-url-%D9%88%D8%A3%D9%86%D9%88%D8%A7%D8%B9%D9%87-r1435/" rel="">عنوان URL</a> إلى مصدر الاقتباس بواسطة السمة <code>cite</code>، ويعرض المثال التالي محتوًى مأخوذًا من صفحة العنصر <code>&lt;blockquote&gt;</code> على شبكة مطورِي موزيللا MDN:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2245_16" style=""><span class="tag">&lt;p&gt;</span><span class="pln">
  The </span><span class="tag">&lt;strong&gt;</span><span class="pln">HTML </span><span class="tag">&lt;code&gt;</span><span class="pln">&amp;lt;blockquote&amp;gt;</span><span class="tag">&lt;/code&gt;</span><span class="pln"> Element</span><span class="tag">&lt;/strong&gt;</span><span class="pln"> (or
  </span><span class="tag">&lt;em&gt;</span><span class="pln">HTML Block Quotation Element</span><span class="tag">&lt;/em&gt;</span><span class="pln">) indicates that the enclosed text is an
  extended quotation.
</span><span class="tag">&lt;/p&gt;</span></pre>

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

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2245_19" style=""><span class="tag">&lt;p&gt;</span><span class="pln">Here is a blockquote:</span><span class="tag">&lt;/p&gt;</span><span class="pln">
</span><span class="tag">&lt;blockquote</span><span class="pln">
  </span><span class="atn">cite</span><span class="pun">=</span><span class="atv">"https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/blockquote"</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;p&gt;</span><span class="pln">
    The </span><span class="tag">&lt;strong&gt;</span><span class="pln">HTML </span><span class="tag">&lt;code&gt;</span><span class="pln">&amp;lt;blockquote&amp;gt;</span><span class="tag">&lt;/code&gt;</span><span class="pln"> Element</span><span class="tag">&lt;/strong&gt;</span><span class="pln"> (or
    </span><span class="tag">&lt;em&gt;</span><span class="pln">HTML Block Quotation Element</span><span class="tag">&lt;/em&gt;</span><span class="pln">) indicates that the enclosed text is
    an extended quotation.
  </span><span class="tag">&lt;/p&gt;</span><span class="pln">
</span><span class="tag">&lt;/blockquote&gt;</span></pre>

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

<p style="text-align: center;">
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="181932" data-ratio="14.25" data-unique="wt0asfr1a" width="821" alt="image.png" src="https://academy.hsoub.com/uploads/monthly_2026_03/image.png.c8e44969a64e0b635421678cdaa84321.png">
</p>

<h3>
	الاقتباس السطري
</h3>

<p>
	يعمل بطريقة مماثلة للاقتباس عن عنصر كتلي إلا أنه يستخدِم <a href="https://wiki.hsoub.com/HTML/q" rel="external">العنصر &lt;q&gt;</a>، إذ يعرض المثال التالي محتوًى مأخوذًا من صفحة العنصر <code>&lt;q&gt;</code> على شبكة مطورِي موزيللا وحوّلناه إلى اقتباس سطري:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2245_22" style=""><span class="tag">&lt;p&gt;</span><span class="pln">
  The quote element — </span><span class="tag">&lt;code&gt;</span><span class="pln">&amp;lt;q&amp;gt;</span><span class="tag">&lt;/code&gt;</span><span class="pln"> — is
  </span><span class="tag">&lt;q</span><span class="pln">
    </span><span class="atn">cite</span><span class="pun">=</span><span class="atv">"https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/q"</span><span class="tag">&gt;</span><span class="pln">
    intended for short quotations that don't require paragraph breaks.
  </span><span class="tag">&lt;/q&gt;</span><span class="pln">
</span><span class="tag">&lt;/p&gt;</span></pre>

<p>
	سيعرض المتصفح هذه الاقتباس على صورة نص عادي محاط بإشارتَي تنصيص مزدوجتين على السطر نفسه:
</p>

<p style="text-align: center;">
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="181934" data-ratio="7.51" data-unique="lr9mk04g5" width="732" alt="image.png" src="https://academy.hsoub.com/uploads/monthly_2026_03/image.png.bd3780591c488cc4370325f18f5ba179.png">
</p>

<h3>
	الاقتباسات المرجعية Citations
</h3>

<p>
	على الرغم من أنّ محتوى السمة <code>cite</code> يبدو مفيدًا إلّا أنّ المتصفحات وقارئات الشاشة لا يعيرانه اهتمامًا، إذ لا توجد طريقة مباشرة تطلب بها من المتصفح إظهار محتوى هذه السمة سوى بابتكار حلول خاصة بك من خلال استخدام <a href="https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D8%B3%D8%B1%D9%8A%D8%B9-%D8%A5%D9%84%D9%89-%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D9%8A%D8%A8%D8%AA-javascript-r550/" rel="">جافاسكربت</a> أو <a href="https://academy.hsoub.com/programming/css/%d8%aa%d8%b9%d8%b1%d9%91%d9%81-%d8%b9%d9%84%d9%89-%d8%a3%d8%b3%d8%a7%d8%b3%d9%8a%d8%a7%d8%aa-css-r70/" rel="">CSS</a>، فإذا أردت إتاحة مصدر الاقتباس للعرض أو الاستخدام، فعليك إظهاره ضمن نص أو رابط أو أية طريقة ملائمة أخرى، كما يوجد أيضًا العنصر <code><a href="https://wiki.hsoub.com/HTML/cite" rel="external">&lt;cite&gt;</a></code>، إلا أنّ الغاية منه هو احتواء عنوان المصدر الذي أُخذ منه الاقتباس مثل اسم كتاب، لكن لا يوجد أبدًا ما يمنع ربط النص الموجود داخل هذا العنصر بمصدر الاقتباس بطريقة أو بأخرى:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2245_26" style=""><span class="tag">&lt;p&gt;</span><span class="pln">
  According to the
  </span><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"/en-US/docs/Web/HTML/Reference/Elements/blockquote"</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="tag">&lt;cite&gt;</span><span class="pln">MDN blockquote page</span><span class="tag">&lt;/cite&gt;&lt;/a&gt;</span><span class="pln">:
</span><span class="tag">&lt;/p&gt;</span><span class="pln">

</span><span class="tag">&lt;blockquote</span><span class="pln">
  </span><span class="atn">cite</span><span class="pun">=</span><span class="atv">"https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/blockquote"</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;p&gt;</span><span class="pln">
    The </span><span class="tag">&lt;strong&gt;</span><span class="pln">HTML </span><span class="tag">&lt;code&gt;</span><span class="pln">&amp;lt;blockquote&amp;gt;</span><span class="tag">&lt;/code&gt;</span><span class="pln"> Element</span><span class="tag">&lt;/strong&gt;</span><span class="pln"> (or
    </span><span class="tag">&lt;em&gt;</span><span class="pln">HTML Block Quotation Element</span><span class="tag">&lt;/em&gt;</span><span class="pln">) indicates that the enclosed text is
    an extended quotation.
  </span><span class="tag">&lt;/p&gt;</span><span class="pln">
</span><span class="tag">&lt;/blockquote&gt;</span><span class="pln">

</span><span class="tag">&lt;p&gt;</span><span class="pln">
  The quote element — </span><span class="tag">&lt;code&gt;</span><span class="pln">&amp;lt;q&amp;gt;</span><span class="tag">&lt;/code&gt;</span><span class="pln"> — is
  </span><span class="tag">&lt;q</span><span class="pln"> </span><span class="atn">cite</span><span class="pun">=</span><span class="atv">"https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/q"</span><span class="tag">&gt;</span><span class="pln">
    intended for short quotations that don't require paragraph breaks.
  </span><span class="tag">&lt;/q&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">"/en-US/docs/Web/HTML/Reference/Elements/q"</span><span class="tag">&gt;&lt;cite&gt;</span><span class="pln">MDN q page</span><span class="tag">&lt;/cite&gt;&lt;/a&gt;</span><span class="pln">.
</span><span class="tag">&lt;/p&gt;</span></pre>

<p>
	تُعرَض الاقتباسات المرجعية افتراضيًا بخط مائل.
</p>

<p style="text-align: center;">
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="181935" data-ratio="15.85" data-unique="2o27lklmg" width="852" alt="image.png" src="https://academy.hsoub.com/uploads/monthly_2026_03/image.png.93edeceb355f6396975daf2616544283.png">
</p>

<h2>
	الاختصارات
</h2>

<p>
	تُعَدّ الاختصارات Abbreviations عناصر شائعة الاستخدام نوعًا ما في ويب وتميزها بالوسم <code><a href="https://wiki.hsoub.com/HTML/abbr" rel="external">&lt;abbr&gt;</a></code>، إذ تستخدَم للدلالة على اختصارات لمصطلحات أو نحوت من عدة كلمات، فالنحت هو الأخذ بأوائل الحروف في كلمات جملة، كما تعطي الاختصارات وصفًا للمصطلح عند تمرير مؤشر الفأرة فوقه عند استخدام السمة <code>title</code>.
</p>

<h3>
	مثال عن الاختصارات
</h3>

<p>
	لنلق نظرةً على المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2570_39" style=""><span class="tag">&lt;p&gt;</span><span class="pln">We use </span><span class="tag">&lt;abbr</span><span class="pln"> </span><span class="atn">title</span><span class="pun">=</span><span class="atv">"Hypertext Markup Language"</span><span class="tag">&gt;</span><span class="pln">HTML</span><span class="tag">&lt;/abbr&gt;</span><span class="pln"> to structure our web documents.</span><span class="tag">&lt;/p&gt;</span><span class="pln">

</span><span class="tag">&lt;p&gt;</span><span class="pln">I think </span><span class="tag">&lt;abbr</span><span class="pln"> </span><span class="atn">title</span><span class="pun">=</span><span class="atv">"Reverend"</span><span class="tag">&gt;</span><span class="pln">Rev.</span><span class="tag">&lt;/abbr&gt;</span><span class="pln"> Green did it in the kitchen with the chainsaw.</span><span class="tag">&lt;/p&gt;</span></pre>

<p>
	ستكون النتيجة مشابهةً للتالي:
</p>

<p style="text-align: center;">
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="181936" data-ratio="19.96" data-unique="zqr9jivyd" width="461" alt="image.png" src="https://academy.hsoub.com/uploads/monthly_2026_03/image.png.dd973994a1aae110d7075640d008d2f6.png">
</p>

<p>
	<strong>ملاحظة</strong>: دعمَت النسخ الأولى من HTML العنصر <code>&lt;acronym&gt;</code>، لكنه حُذِف ليحل محله <code>&lt;abbr&gt;</code> الذي يُستخدَم للدلالة على الاختصارات والنحوت معًا.
</p>

<h2>
	الدلالة على معلومات التواصل
</h2>

<p>
	يُستخدَم <a href="https://wiki.hsoub.com/HTML/address" rel="external">العنصر &lt;address&gt;</a> في <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>لإدراج معلومات التواصل مع مسؤول الصفحة أو الموقع، إليك مثالًا كما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2570_44" style=""><span class="tag">&lt;address&gt;</span><span class="pln">
  Chris Mills, Manchester, The Grim North, UK
</span><span class="tag">&lt;/address&gt;</span></pre>

<p>
	يمكن احتواء العنصر على عناصر أخرى أو نموذج للتواصل لإدراج معلومات أكثر، وإليك مثالًا كما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2570_46" style=""><span class="tag">&lt;address&gt;</span><span class="pln">
  </span><span class="tag">&lt;p&gt;</span><span class="pln">
    Chris Mills</span><span class="tag">&lt;br&gt;</span><span class="pln">
    Manchester</span><span class="tag">&lt;br&gt;</span><span class="pln">
    The Grim North</span><span class="tag">&lt;br&gt;</span><span class="pln">
    UK
  </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;</span><span class="pln">Tel: 01234 567 890</span><span class="tag">&lt;/li&gt;</span><span class="pln">
    </span><span class="tag">&lt;li&gt;</span><span class="pln">Email: me@grim-north.co.uk</span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;/ul&gt;</span><span class="pln">
</span><span class="tag">&lt;/address&gt;</span></pre>

<p>
	يمكنك تنظيم المعلومات ضمن العنصر <code>&lt;address&gt;</code> بالصورة التالية أيضًا:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2570_48" style=""><span class="tag">&lt;address&gt;</span><span class="pln">
  Page written by </span><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"../authors/chris-mills/"</span><span class="tag">&gt;</span><span class="pln">Chris Mills</span><span class="tag">&lt;/a&gt;</span><span class="pln">.
</span><span class="tag">&lt;/address&gt;</span></pre>

<p>
	<strong>ملاحظة</strong>: يجب ألا يستخدَم العنصر <code>&lt;address&gt;</code> سوى لإدراج معلومات التواصل في الصفحة أسفل أقرب عنصر مقال <code>&lt;article&gt;</code> أو أسفل جسم الصفحة <code><a href="https://wiki.hsoub.com/HTML/body" rel="external">&lt;body&gt;</a></code>، ومن الصحيح أيضًا وضعه في تذييل الصفحة لتُعرض معلومات التواصل في جميع صفحات الموقع، أو داخل عنصر المقال لعرض معلومات التواصل مع مؤلفه، لكن لا تستخدِمه لإدراج قائمة من العناوين التي لا تتعلق بمحتوى الصفحة.
</p>

<h2>
	إزاحة الكتابة أعلى النسق أو أسفله
</h2>

<p>
	نحتاج أحيانًا إلى رفع بعض الاحرف إلى أعلى نسق الكتابة أو أسفلها عندما نتعامل مع تواريخ مثلًا أو صيغ المواد الكيميائية أو المعادلات الرياضية لكي تشير إلى المعنى الحقيقي، إذ يُستخدم العنصران <code><a href="https://wiki.hsoub.com/HTML/sup" rel="external">&lt;sup&gt;</a></code> و <code><a href="https://wiki.hsoub.com/HTML/sub" rel="external">&lt;sub&gt;</a></code> لإنجاز الأمر، وإليك مثالًا كما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2570_53" style=""><span class="tag">&lt;p&gt;</span><span class="pln">My birthday is on the 25</span><span class="tag">&lt;sup&gt;</span><span class="pln">th</span><span class="tag">&lt;/sup&gt;</span><span class="pln"> of May 2001.</span><span class="tag">&lt;/p&gt;</span><span class="pln">
</span><span class="tag">&lt;p&gt;</span><span class="pln">Caffeine's chemical formula is C</span><span class="tag">&lt;sub&gt;</span><span class="pln">8</span><span class="tag">&lt;/sub&gt;</span><span class="pln">H</span><span class="tag">&lt;sub&gt;</span><span class="pln">10</span><span class="tag">&lt;/sub&gt;</span><span class="pln">N</span><span class="tag">&lt;sub&gt;</span><span class="pln">4</span><span class="tag">&lt;/sub&gt;</span><span class="pln">O</span><span class="tag">&lt;sub&gt;</span><span class="pln">2</span><span class="tag">&lt;/sub&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">If x</span><span class="tag">&lt;sup&gt;</span><span class="pln">2</span><span class="tag">&lt;/sup&gt;</span><span class="pln"> is 9, x must equal 3 or -3.</span><span class="tag">&lt;/p&gt;</span></pre>

<p>
	سيعرِض المتصفح النتيجة على الصورة التالية:
</p>

<p style="text-align: center;">
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="181937" data-ratio="36.11" data-unique="2h7qifm0n" width="360" alt="image.png" src="https://academy.hsoub.com/uploads/monthly_2026_03/image.png.db0df5d4be4969e0815b9d25700d4d57.png">
</p>

<h2>
	إدراج شيفرة برمجية
</h2>

<p>
	تقدِّم HTML مجموعةً من العناصر لعرض الشيفرات البرمجية بطريقة مميزة:
</p>

<ul>
	<li>
		<a href="https://wiki.hsoub.com/HTML/code" rel="external">العنصر &lt;code&gt;</a>: للدلالة على أن المحتوى هو مقتطفات من شيفرة برمجية.
	</li>
	<li>
		<a href="https://wiki.hsoub.com/HTML/pre" rel="external">العنصر &lt;pre&gt;</a>: الذي يُبقي على المسافات الفارغة الزائدة في المحتوى والتي قد تكون إزاحةً للشيفرة، إذ يتجاهل المتصفح المسافات الفارغة الزائدة في النصوص العادية، لكن عند تغليف النص داخل هذا العنصر، فسيعرضه المتصفح كما هو تمامًا دون إهمال أيّ شيء.
	</li>
	<li>
		<a href="https://wiki.hsoub.com/HTML/var" rel="external">العنصر &lt;var&gt;</a>: ويستخدَم للدلالة على المتغيرات على وجه الخصوص.
	</li>
	<li>
		<a href="https://wiki.hsoub.com/HTML/kbd" rel="external">العنصر &lt;kbd&gt;</a>: ويستخدَم للدلالة على مدخلات لوحة المفاتيح أو غيرها من المدخلات إلى الحاسوب.
	</li>
	<li>
		<a href="https://wiki.hsoub.com/HTML/samp" rel="external">العنصر &lt;samp&gt;</a>: ويستخدَم للدلالة على خرج برنامج حاسوبي.
	</li>
</ul>

<p>
	لنلق نظرةً على بعض الأمثلة، كما عليك التجريب بنفسك، ولهذا ننصح بتنزيل نسخة من الملف <a href="https://github.com/mdn/learning-area/blob/master/html/introduction-to-html/advanced-text-formatting/other-semantics.html" rel="external nofollow">other-semantics.html</a>.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2570_60" style=""><span class="tag">&lt;pre&gt;&lt;code&gt;</span><span class="pln">var para = document.querySelector('p');

para.onclick = function() {
  alert('Owww, stop poking me!');
}</span><span class="tag">&lt;/code&gt;&lt;/pre&gt;</span><span class="pln">

</span><span class="tag">&lt;p&gt;</span><span class="pln">You shouldn't use presentational elements like </span><span class="tag">&lt;code&gt;&lt;font&gt;&lt;/code&gt;</span><span class="pln"> and </span><span class="tag">&lt;code&gt;&lt;center&gt;&lt;/code&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">In the above JavaScript example, </span><span class="tag">&lt;var&gt;</span><span class="pln">para</span><span class="tag">&lt;/var&gt;</span><span class="pln"> represents a paragraph element.</span><span class="tag">&lt;/p&gt;</span><span class="pln">

</span><span class="tag">&lt;p&gt;</span><span class="pln">Select all the text with </span><span class="tag">&lt;kbd&gt;</span><span class="pln">Ctrl</span><span class="tag">&lt;/kbd&gt;</span><span class="pln">/</span><span class="tag">&lt;kbd&gt;</span><span class="pln">Cmd</span><span class="tag">&lt;/kbd&gt;</span><span class="pln"> + </span><span class="tag">&lt;kbd&gt;</span><span class="pln">A</span><span class="tag">&lt;/kbd&gt;</span><span class="pln">.</span><span class="tag">&lt;/p&gt;</span><span class="pln">

</span><span class="tag">&lt;pre&gt;</span><span class="pln">$ </span><span class="tag">&lt;kbd&gt;</span><span class="pln">ping mozilla.org</span><span class="tag">&lt;/kbd&gt;</span><span class="pln">
</span><span class="tag">&lt;samp&gt;</span><span class="pln">PING mozilla.org (63.245.215.20): 56 data bytes
64 bytes from 63.245.215.20: icmp_seq=0 ttl=40 time=158.233 ms</span><span class="tag">&lt;/samp&gt;&lt;/pre&gt;</span></pre>

<p>
	ستُعرض الشيفرة السابقة في المتصفح كما يلي:
</p>

<p style="text-align: center;">
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="181938" data-ratio="54.68" data-unique="oky5va3j1" width="470" alt="image.png" src="https://academy.hsoub.com/uploads/monthly_2026_03/image.png.34e205eae7fe245081fc13a10ec8d28a.png">
</p>

<h2>
	الدلالة على الوقت والتاريخ
</h2>

<p>
	تقدِّم لغة HTML العنصر <a href="https://wiki.hsoub.com/HTML/time" rel="external"><code>&lt;time&gt;</code></a> لتوصيف الوقت والتاريخ بطريقة يمكن للآلة قراءتها، وإليك مثالًا كما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2570_62" style=""><span class="tag">&lt;time</span><span class="pln"> </span><span class="atn">datetime</span><span class="pun">=</span><span class="atv">"2016-01-20"</span><span class="tag">&gt;</span><span class="pln">20 January 2016</span><span class="tag">&lt;/time&gt;</span></pre>

<p>
	ما الفائدة من هذا العنصر؟ يستخدِم البشر طرقًا مختلفةً لكتابة التاريخ، فقد يُكتب التاريخ في المثال السابق على الصورة:
</p>

<ul>
	<li>
		20 January 2016
	</li>
	<li>
		20th January 2016
	</li>
	<li>
		Jan 20 2016
	</li>
	<li>
		20/01/16
	</li>
	<li>
		01/20/16
	</li>
	<li>
		The 20th of next month
	</li>
	<li>
		20e Janvier 2016
	</li>
	<li>
		20 كانون الثاني 2016
	</li>
	<li>
		وغير ذلك.
	</li>
</ul>

<p>
	لكن لا تستطيع الحواسب التمييز بسهولة بين طرق الكتابة تلك، فماذا إذا أردت الحصول تلقائيًا على تواريخ جميع المناسبات في صفحة ويب وإضافتها إلى التقويم الخاص بك؟ لهذا السبب، يُستخدَم <a href="https://wiki.hsoub.com/HTML/time" rel="external">العنصر &lt;time&gt;</a> لإضافة تنسيق للوقت والتاريخ، بحيث يكون مفهومًا بالنسبة إلى الحواسيب وغيرها من الآلات، كما يعرض لك المثال السابق تاريخًا بسيطًا يمكن للآلة فهمه، لكن هناك خيارات عدة أخرى، وإليك بعض الأمثلة:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2570_65" style=""><span class="com">&lt;!-- تاريخ بسيط بصيغة معيارية --&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">"2016-01-20"</span><span class="tag">&gt;</span><span class="pln">20 January 2016</span><span class="tag">&lt;/time&gt;</span><span class="pln">
</span><span class="com">&lt;!--فقط السنة و الشهر--&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">"2016-01"</span><span class="tag">&gt;</span><span class="pln">January 2016</span><span class="tag">&lt;/time&gt;</span><span class="pln">
</span><span class="com">&lt;!-- فقط الشهر و اليوم --&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">"01-20"</span><span class="tag">&gt;</span><span class="pln">20 January</span><span class="tag">&lt;/time&gt;</span><span class="pln">
</span><span class="com">&lt;!-- الوقت فقط، ساعات ودقائق --&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">"19:30"</span><span class="tag">&gt;</span><span class="pln">19:30</span><span class="tag">&lt;/time&gt;</span><span class="pln">
</span><span class="com">&lt;!-- يمكنك إضافة الثواني وأجزاء الثواني --&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">"19:30:01.856"</span><span class="tag">&gt;</span><span class="pln">19:30:01.856</span><span class="tag">&lt;/time&gt;</span><span class="pln">
</span><span class="com">&lt;!-- الوقت والتاريخ --&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">"2016-01-20T19:30"</span><span class="tag">&gt;</span><span class="pln">7.30pm, 20 January 2016</span><span class="tag">&lt;/time&gt;</span><span class="pln">
</span><span class="com">&lt;!-- الوقت والتاريخ مع إزاحة زمنية حسب خطوط الزمن--&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">"2016-01-20T19:30+01:00"</span><span class="tag">&gt;</span><span class="pln">7.30pm, 20 January 2016 is 8.30pm in France</span><span class="tag">&lt;/time&gt;</span><span class="pln">
</span><span class="com">&lt;!-- استدعاء أسبوع محدَّد من السنة وفق رقمه --&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">"2016-W04"</span><span class="tag">&gt;</span><span class="pln">The fourth week of 2016</span><span class="tag">&lt;/time&gt;</span></pre>

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

<p>
	نكون بهذا قد أنهينا دراسة دلالة العناصر التي تنسِّق النصوص في HTML، وتذكَّر تمامًا أنّ العناصر التي تعرَّفت عليها في سلسلة المقالات لا تمثِّل القائمة كلها، فقد حاولنا تغطية الأساسية منها أو بعض العناصر التي يشيع استخدامها أو التي رأينا بأنك ستجدها مهمةً، ويمكنك العودة إلى <a href="http://wiki.hsoub.com/HTML" rel="external">توثيق لغة HTML</a> باللغة العربية أو <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element" rel="external nofollow">شبكة مطوري موزيللا</a> للاطلاع على بقية العناصر، كما سنتحدث في المقال التالي عن عناصر لغة HTML التي نستخدِمها في هيكلة الأجزاء المختلفة من <a href="https://academy.hsoub.com/devops/servers/%D8%A7%D9%84%D9%81%D8%B1%D9%82-%D8%A8%D9%8A%D9%86-%D8%B5%D9%81%D8%AD%D8%A9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D9%88%D9%85%D9%88%D9%82%D8%B9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D9%88%D8%AE%D8%A7%D8%AF%D9%85-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D9%88%D9%85%D8%AD%D8%B1%D9%83-%D8%A7%D9%84%D8%A8%D8%AD%D8%AB-r572/" rel="">صفحة ويب</a>.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://developer.mozilla.org/en-US/docs/Learn/HTML/Introduction_to_HTML/Advanced_text_formatting" rel="external nofollow">Advanced text formatting</a>.
</p>

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

<ul>
	<li>
		<a href="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/" rel="">HTML و CSS للمبتدئين: مقدمة إلى تنسيقات CSS</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%D8%AA%D9%86%D8%B3%D9%8A%D9%82-%D9%86%D8%B5%D9%88%D8%B5-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-css-r251/" rel="">تنسيق نصوص صفحات الويب باستخدام CSS</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/php/%D8%AA%D9%86%D8%B3%D9%8A%D9%82-%D8%A7%D9%84%D9%86%D8%B5%D9%88%D8%B5-%D9%88%D8%AA%D8%AD%D9%84%D9%8A%D9%84%D9%87%D8%A7-%D9%81%D9%8A-php-r1077/" rel="">تنسيق النصوص وتحليلها في PHP</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/python/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D9%86%D8%B3%D9%8A%D9%82-%D8%A7%D9%84%D9%86%D8%B5%D9%88%D8%B5-%D9%81%D9%8A-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-3-r409/" rel="">كيفية تنسيق النصوص في بايثون 3</a>
	</li>
</ul>

<p><a href="https://academy.hsoub.com/uploads/monthly_2026_03/image.png.422616f4804322628321011565d66b68.png" class="ipsAttachLink ipsAttachLink_image" ><img data-fileid="181933" src="https://academy.hsoub.com/uploads/monthly_2026_03/image.png.422616f4804322628321011565d66b68.png" data-ratio="7.79" width="706" class="ipsImage ipsImage_thumbnailed" alt="image.png"></a></p>]]></description><guid isPermaLink="false">1756</guid><pubDate>Mon, 28 Nov 2022 16:00:00 +0000</pubDate></item><item><title>&#x625;&#x646;&#x634;&#x627;&#x621; &#x627;&#x644;&#x631;&#x648;&#x627;&#x628;&#x637; &#x627;&#x644;&#x62A;&#x634;&#x639;&#x628;&#x64A;&#x629; &#x641;&#x64A; HTML</title><link>https://academy.hsoub.com/programming/html/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D8%A7%D9%84%D8%B1%D9%88%D8%A7%D8%A8%D8%B7-%D8%A7%D9%84%D8%AA%D8%B4%D8%B9%D8%A8%D9%8A%D8%A9-%D9%81%D9%8A-html-r1755/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_10/635e4fb88ae49_----html.jpg.0e792917c738b24d1dbe43c4748bce36.jpg" /></p>
<p>
	تمتلك الروابط التشعبية أهميةً كبيرةً، فهي العناصر التي تجعل من الويب شبكة حقيقية، إذ نستعرض في هذا المقال الصيغة القواعدية اللازمة لإنشاء رابط، ونناقش أفضل الممارسات المتبعة في إنشائها، كما لا بد قبل المتابعة في قراءة هذا المقال الاطلاع على أساسيات HTML التي تحدثنا عنها في مقال <a href="https://academy.hsoub.com/programming/html/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%84%D8%BA%D8%A9-html-r1752/" rel="">تعرَّف على لغة HTML</a>، وطريقة تنسيق صفحة HTML وهيكلة محتواها كما ورد في مقال <a href="https://academy.hsoub.com/programming/html/%D9%87%D9%8A%D9%83%D9%84%D8%A9-%D8%A7%D9%84%D9%86%D8%B5%D9%88%D8%B5-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%84%D8%BA%D8%A9-html-r1754/" rel="">هيكلة النصوص باستخدام لغة HTML</a>.
</p>

<h2>
	ما هو الرابط التشعبي؟
</h2>

<p>
	تُعَدّ الروابط التشعبية واحدةً من أكثر الابتكارات أهميةً في عالم الويب، فهي من أولى ميزات الويب منذ انطلاقها وهي بالفعل ما يجعل الويب شبكةً حقيقيةً، إذ تسمح لنا الروابط التشعبية بربط الصفحات بصفحات أخرى أو بأجزاء محددة منها أو بغيرها من الموارد أو الوصول إلى تطبيقات موجودة على عنوان ويب محدَّد، كما يمكن لأيّ محتوى التحول إلى رابط ينقل المستخدِم عند النقر عليه إلى عنوان ويب آخر <a href="https://academy.hsoub.com/programming/general/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%B9%D9%86%D9%88%D8%A7%D9%86-url-%D9%88%D8%A3%D9%86%D9%88%D8%A7%D8%B9%D9%87-r1435/" rel="">URL</a>.
</p>

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

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

<p style="text-align: center;">
	<img alt="الروابط في الصفحة الرئيسية لشبكة BBC" class="ipsImage ipsImage_thumbnailed" data-fileid="110792" data-unique="tpte3ktb0" style="width: 696px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2022_10/01_link_in_site.jpg.99effbbed0eeddeb9946d81adc7b6b44.jpg">
</p>

<h2>
	تشريح الرابط التشعبي
</h2>

<p>
	ننشئ الرابط بأبسط أشكاله بتغليف نص أو محتوى معيَّن داخل <a href="https://wiki.hsoub.com/HTML/a" rel="external">العنصر &lt;a&gt;</a>، ثم نستخدِم <a href="https://wiki.hsoub.com/HTML/a#href" rel="external">السمة href</a> التي تُعرَف أيضًا باسم مرجع النص التشعبي أو الهدف، والتي تحتوي على العنوان الوجهة.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4518_11" style=""><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">"https://academy.hsoub.com"</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></pre>

<p>
	ستكون نتيجة الشيفرة السابقة ما يلي: سينقلك هذا الرابط إلى <a href="https://academy.hsoub.com" rel="external">أكاديمية حسوب</a>.
</p>

<h3>
	إضافة معلومات داعمة من خلال السمة title
</h3>

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

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4518_14" style=""><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">"https://www.mozilla.org/en-US/"</span><span class="pln">
   </span><span class="atn">title</span><span class="pun">=</span><span class="atv">"أكاديمية حسوب هو موقع تعليمي عربي يهدف إلى توجيه المهتمين العرب بمجال البرمجة و التقنية إلى 
مادة علمية صحيحة و باللغة العربية"</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></pre>

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

<h3>
	تطبيق: إنشاء رابط خاص بك
</h3>

<p>
	أنشئ ملف HTML باستخدام <a href="https://academy.hsoub.com/programming/html/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%84%D8%BA%D8%A9-html-r1752/" rel="">القالب الذي نزّلته في مقال تعرف على لغة HTML</a> ومحرِّر الشيفرة على حاسوبك، ثم نفّذ التعديلات التالية:
</p>

<ol>
	<li>
		أضف <a href="https://wiki.hsoub.com/HTML/p" rel="external">فقرةً نصيةً &lt;p&gt;</a> أو أكثر داخل <a href="https://wiki.hsoub.com/HTML/body" rel="external">العنصر &lt;body&gt;</a>، أو غير ذلك من العناصر التي تعلمتها.
	</li>
	<li>
		حوّل أجزاءً من المحتوى إلى روابط.
	</li>
	<li>
		أضف عناوين إلى هذه الروابط باستخدام السمة <code>title</code>.
	</li>
</ol>

<h3>
	تحويل العناصر البنائية إلى روابط
</h3>

<p>
	يمكن تحويل كما ذكرنا سابقًا أيّة عناصر إلى روابط حتى العناصر البنائية Block elements، فإذا أردت مثلًا تحويل صورة إلى رابط، فاستخدم العنصر <code>&lt;a&gt;</code> ثم <a href="https://wiki.hsoub.com/HTML/img" rel="external">العنصر &lt;img&gt;</a> للدلالة على الصورة.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4518_20" style=""><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"https://www.mozilla.org/en-US/"</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">"mozilla-image.png"</span><span class="pln"> </span><span class="atn">alt</span><span class="pun">=</span><span class="atv">"mozilla logo that links to the mozilla homepage"</span><span class="tag">&gt;</span><span class="pln">
</span><span class="tag">&lt;/a&gt;</span></pre>

<h2>
	جولة سريعة على عناوين URL والمسارات
</h2>

<p>
	ستحتاج إلى استيعاب عناوين URL ومسارات الملفات لكي تفهم تمامًا وجهة الروابط التشعبية، وهذا ما سنفعله في هذه الفقرة.
</p>

<p>
	يُعَدّ محدد موقع المورد Uniform Resource Locator أو URL اختصارًا- سلسلةً نصيةً تُحدِّد مكان تواجد غرض ما على ويب، فالصفحة الرئيسية لموقع حسوب موجودة على العنوان <a href="https://www.hsoub.xn--com-nwe" ipsnoembed="false" rel="external nofollow">https://www.hsoub.com،</a> إذ تستخدِم عناوين URL المسارات لإيجاد الملفات، في حين تحدد المسارات الموقع الذي يوجد فيه الملف ضمن نظام الملفات، ولنلق نظرةً على هيكلية مجلد:
</p>

<p style="text-align: center;">
	<img alt="هيكلية المجلدات" class="ipsImage ipsImage_thumbnailed" data-fileid="110783" data-unique="ifpg5615j" style="width: 658px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2022_10/02_file_system.png.de92712fceec5b3d8a0257a41d1e6bb3.png">
</p>

<p>
	يُدعى المجلد الجذري creating-hyperlinks.
</p>

<p>
	سيقع الموقع بأكمله ضمن مجلد واحد عندما نعمل محليًا على <a href="https://academy.hsoub.com/devops/servers/%D8%A7%D9%84%D9%81%D8%B1%D9%82-%D8%A8%D9%8A%D9%86-%D8%B5%D9%81%D8%AD%D8%A9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D9%88%D9%85%D9%88%D9%82%D8%B9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D9%88%D8%AE%D8%A7%D8%AF%D9%85-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D9%88%D9%85%D8%AD%D8%B1%D9%83-%D8%A7%D9%84%D8%A8%D8%AD%D8%AB-r572/" rel="">موقع ويب</a>، إذ ستجد ضمن المجلد الجذري الملفَين index.html و contacts.html، بحيث سيمثل الملف index.html في موقع الويب الحقيقي الصفحة الرئيسية أو <a href="https://academy.hsoub.com/questions/13022-%D9%85%D8%A7-%D9%87%D9%8A-%D8%B5%D9%81%D8%AD%D8%A9-%D8%A7%D9%84%D9%87%D8%A8%D9%88%D8%B7-landing-page-%D9%88-%D8%A8%D9%85%D8%A7%D8%B0%D8%A7-%D8%AA%D9%81%D9%8A%D8%AF/" rel="">صفحة الهبوط</a>، أي الصفحة التي تُعَدّ نقطة البداية لموقع ويب أو لقسم محدد منه.
</p>

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

<ul>
	<li>
		<strong>ملفات في المجلد نفسه</strong>: إذا أردت وضع رابط ضمن index.html الأول -أي الأعلى مستوى- يشير إلى الملف contacts.html، فضع اسم هذا الملف فقط لأن كلاهما يعود إلى المستوى نفسه ضمن نظام ترتيب الملفات، وسيكون عنوان URL المستخدم هو contacts.html:
	</li>
</ul>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4518_25" style=""><span class="tag">&lt;p&gt;</span><span class="pln">Want to contact a specific staff member?
Find details on our </span><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"contacts.html"</span><span class="tag">&gt;</span><span class="pln">contacts page</span><span class="tag">&lt;/a&gt;</span><span class="pln">.</span><span class="tag">&lt;/p&gt;</span></pre>

<ul>
	<li>
		<strong>ملفات في مجلدات فرعية</strong>: إذا أردت وضع رابط ضمن index.html الأول -أي الأعلى مستوى- يشير إلى الملف projects/index.html، فعليك الانتقال أولًا إلى المجلد projects ثم الإشارة إلى الملف الذي تريد إنشاء رابط إليه، ويكون ذلك بتحديد اسم المجلد يليه المحرف <code>/</code> ثم اسم الملف، وسيكون عنوان URL الصحيح في هذه الحالة هو projects/index.html:
	</li>
</ul>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4518_27" style=""><span class="tag">&lt;p&gt;</span><span class="pln">Visit my </span><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"projects/index.html"</span><span class="tag">&gt;</span><span class="pln">project homepage</span><span class="tag">&lt;/a&gt;</span><span class="pln">.</span><span class="tag">&lt;/p&gt;</span></pre>

<ul>
	<li>
		<strong>ملفات في المجلدات الآباء</strong>: إذا أردت وضع رابط ضمن الملف projects/index.html يشير إلى الملف pdfs/project-brief.pdf، فعليك الانتقال إلى المستوى الأعلى مباشرةً ثم الانتقال ثانيةً إلى داخل المجلد pdfs، واستخدم نقطتين متتاليتين <code>..</code> للانتقال إلى مستوى واحد أعلى، وسيكون العنوان الصحيح هو pdfs/project-brief.pdf/..:
	</li>
</ul>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4518_29" style=""><span class="tag">&lt;p&gt;</span><span class="pln">A link to my </span><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"../pdfs/project-brief.pdf"</span><span class="tag">&gt;</span><span class="pln">project brief</span><span class="tag">&lt;/a&gt;</span><span class="pln">.</span><span class="tag">&lt;/p&gt;</span></pre>

<p>
	<strong>ملاحظة</strong>: يمكنك الدمج بين الطرق السابقة لكتابة عناوين URL مركّبة عند الحاجة مثل:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4518_31" style=""><span class="pln">../../../complex/path/to/my/file.html</span></pre>

<h2>
	الانتقال إلى قسم من صفحة HTML
</h2>

<p>
	يمكن أن تستهدف من خلال الرابط التشعبي جزءًا محددًا من صفحة HTML -أو ما يعرف بتجزئة الصفحة document fragment- بدلًا من الانتقال إلى أعلى الصفحة، ولإنجاز الأمر لا بد من استخدام السمة <code>id</code> في العنصر الذي ستنتقل إليه في الصفحة المستهدَفة، ومن المنطقي أن تنشئ رابطًا إلى عنصر عنوان مثلًا، إذ سيبدو ذلك قريبًا من التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4518_33" style=""><span class="tag">&lt;h2</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"Mailing_address"</span><span class="tag">&gt;</span><span class="pln">Mailing address</span><span class="tag">&lt;/h2&gt;</span></pre>

<p>
	نضع بعد ذلك قيمة <code>id</code> للعنصر الذي سننتقل إليه في نهاية عنوان URL للصفحة المستهدَفة مسبوقًا بالمحرف <code>#</code>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4518_35" style=""><span class="tag">&lt;p&gt;</span><span class="pln">Want to write us a letter? Use our </span><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"contacts.html#Mailing_address"</span><span class="tag">&gt;</span><span class="pln">mailing address</span><span class="tag">&lt;/a&gt;</span><span class="pln">.</span><span class="tag">&lt;/p&gt;</span></pre>

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

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4518_37" style=""><span class="tag">&lt;p&gt;</span><span class="pln">The </span><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"#Mailing_address"</span><span class="tag">&gt;</span><span class="pln">company mailing address</span><span class="tag">&lt;/a&gt;</span><span class="pln"> can be found at the bottom of this page.</span><span class="tag">&lt;/p&gt;</span></pre>

<h3>
	عناوين URL المطلقة والنسبية
</h3>

<p>
	ستصادف أثناء تجوالك في ويب مصطلحَي عنوان URL مطلق absolute URL وعنوان URL نسبي relative URL.
</p>

<h4>
	عنوان URL مطلق
</h4>

<p>
	يشير إلى موقع محَّدد عن طريق مساره المطلق أو الكامل بما في ذلك الجزء الذي يحدد البروتوكول واسم النطاق. فلو كان الملف index.html ضمن المجلد projects الموجود ضمن المجلد الجذري لموقع ويب التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4518_47" style=""><span class="pln">https://www.example.com</span></pre>

<p>
	فسيكون العنوان المطلق إلى هذا الملف هو:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4518_42" style=""><span class="pln">https://www.example.com/projects/index.html</span></pre>

<p>
	أو يمكن أن يُكتب فقط على الصورة التالية:
</p>

<pre class="ipsCode">https://www.example.com/projects/
</pre>

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

<h4>
	عنوان URL نسبي
</h4>

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

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4518_49" style=""><span class="pln">https://www.example.com/projects/index.html</span></pre>

<p>
	والملف project-brief.pdf الذي يقع في المجلد نفسه، فسيكون العنوان النسبي هو اسم الملف الهدف كما هو، في حين إذا كان هذا الملف في مجلد فرعي يُدعى pdfs ضمن المجلد نفسه project، فسيكون العنوان النسبي له <code>pdfs/project-brief.pdf</code>، ولاحظ أن المسار المطلق لنفس الملف هو:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4518_51" style=""><span class="pln">https://www.example.com/projects/pdfs/project-brief.pdf</span></pre>

<p>
	كما تشير العناوين النسبية إلى مواقع مختلفة تبعًا لموقع الملف الذي سيرتبط بها، فإذا نقلت الملف index.html في مثالنا السابق إلى المجلد الجذري، فسيشير عنوان URL النسبي <code>pdfs/project-brief.pdf</code> إلى الملف الموجود على العنوان التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4518_53" style=""><span class="pln">https://www.example.com/pdfs/project-brief.pdf</span></pre>

<p>
	وليس إلى الملف الموجود على العنوان التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4518_56" style=""><span class="pln">https://www.example.com/projects/pdfs/project-brief.pdf</span></pre>

<p>
	لم يتغير بالطبع موقع الملف project-brief.pdf ولا موقع المجلد pdfs عندما نقلنا الملف index.html، لكن كل ما هنالك أنّ العنوان النسبي سيشير في هذه الحالة إلى المكان الخاطئ ولن يعمل الرابط عند النقر عليه، فعليك الحذر إذًا.
</p>

<h2>
	أفضل الممارسات لإنشاء الروابط التشعبية
</h2>

<p>
	توجد بعض الممارسات الممتازة التي يجدر بك تعلمها لكتابة روابط تشعبية جيدة، لنلق نظرةً عليها.
</p>

<h3>
	استخدم كلمات واضحة تدل على الرابط
</h3>

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

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

<p>
	الرابط التالي جيد مثلًا:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4518_58" style=""><span class="tag">&lt;p&gt;&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"https://firefox.com/"</span><span class="tag">&gt;</span><span class="pln">
  Download Firefox
</span><span class="tag">&lt;/a&gt;&lt;/p&gt;</span></pre>

<p>
	أما هذا، فسيّئ:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4518_60" style=""><span class="tag">&lt;p&gt;&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"https://firefox.com/"</span><span class="tag">&gt;</span><span class="pln">
  Click here
</span><span class="tag">&lt;/a&gt;</span><span class="pln">
to download Firefox</span><span class="tag">&lt;/p&gt;</span></pre>

<p>
	<strong>تلميحات أخرى</strong>:
</p>

<ul>
	<li>
		لا تضع عنوان URL لرابط ضمن نص الرابط، إذ سيبدو سيئًا ويصبح أسوأ عندما ينطقه قارئ الشاشة حرفًا حرفًا.
	</li>
	<li>
		لا تكتب "رابط" أو "رابط إلى" ضمن نص الرابط لأنه أمر عبثي، إذ تخبر قارئات الشاشة المستخدِم بأنه رابط، كما يعلم بكل بساطة من يقرأ النص بأنه رابط لأنه سيظهر عمومًا بتنسيق مختلف وبسطر تحته.
	</li>
	<li>
		حاول أن يكون نص الرابط أقصر ما يمكن، فهذا مفيد لمستخدمِي قارئات الشاشة لأنها ستقرأ النص بأكمله.
	</li>
	<li>
		قلل الحالات التي تستخدِم فيها نص الرابط نفسه للدلالة على أماكن مختلفة، فقد يسبب ذلك مشاكل لمستخدمِي قارئات الشاشات إذا ظهرت قائمة من الروابط المتلاحقة التي تقول "انقر هنا".
	</li>
</ul>

<h3>
	الارتباط بمورد مختلف عن صفحات HTML
</h3>

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

<ul>
	<li>
		قد يكون حجم باقة التراسل bandwidth connection لديك صغيرًا ثم تنقر فجأةً على رابط لتتفاجأ بتنزيل عدة ميغابايتات لم تتوقعها.
	</li>
	<li>
		قد لا يكون مشغل مقاطع فلاش مثبّتًا على جهازك ثم تنقر رابطًا يأخذك إلى صفحة تتطلب مشغل فلاش.
	</li>
</ul>

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

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4518_62" style=""><span class="tag">&lt;p&gt;&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"https://www.example.com/large-report.pdf"</span><span class="tag">&gt;</span><span class="pln">
(PDF ، 10MB) حمل تقرير المبيعات
</span><span class="tag">&lt;/a&gt;&lt;/p&gt;</span><span class="pln">

</span><span class="tag">&lt;p&gt;&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"https://www.example.com/video-stream/"</span><span class="pln"> </span><span class="atn">target</span><span class="pun">=</span><span class="atv">"_blank"</span><span class="tag">&gt;</span><span class="pln">
(HD سيُعرض في نافذة منفصل وبدقة)‎ شاهد الفيديو
</span><span class="tag">&lt;/a&gt;&lt;/p&gt;</span><span class="pln">
</span><span class="tag">&lt;p&gt;&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"https://www.example.com/car-game"</span><span class="tag">&gt;</span><span class="pln">
(يتطلب مشغل فلاش‎) ‎‎شغِّل لعبة السيارة‎
</span><span class="tag">&lt;/a&gt;&lt;/p&gt;</span></pre>

<h3>
	استخدم السمة download عندما ترتبط بمورد لتنزيله
</h3>

<p>
	يمكن استخدام السمة <code>download</code> عندما تحاول إنشاء رابط إلى مورد لكي يُنزَّل بدلًا من أن يُفتَح في المتصفح، وذلك لكي تزوّد المستخدِم باسم لحفظ الملف، وإليك مثالًا عن رابط لتحميل آخر إصدارات فايرفوكس لنظام التشغيل ويندوز:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4518_64" style=""><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"https://download.mozilla.org/?product=firefox-latest-<abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">ssl</abbr>&amp;os=win64&amp;lang=en-US"</span><span class="pln">
   </span><span class="atn">download</span><span class="pun">=</span><span class="atv">"firefox-latest-64bit-installer.exe"</span><span class="tag">&gt;</span><span class="pln">
  Download Latest Firefox for Windows (64-bit) (English, US)
</span><span class="tag">&lt;/a&gt;</span></pre>

<h2>
	تطبيق: إنشاء قائمة للتنقل
</h2>

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

<p>
	عليك تخزين نسخ من الملفات التالية على حاسوبك وفي المجلد نفسه، كما يمكنك الحصول على جميع هذه الملفات من <a href="https://github.com/mdn/learning-area/tree/master/html/introduction-to-html/navigation-menu-start" rel="external nofollow">مستودع جيت-هاب المخصص للتمرين</a>:
</p>

<ul>
	<li>
		<a href="https://github.com/mdn/learning-area/blob/master/html/introduction-to-html/navigation-menu-start/index.html" rel="external nofollow">index.html</a>.
	</li>
	<li>
		<a href="https://github.com/mdn/learning-area/blob/master/html/introduction-to-html/navigation-menu-start/projects.html" rel="external nofollow">projects.html</a>.
	</li>
	<li>
		<a href="https://github.com/mdn/learning-area/blob/master/html/introduction-to-html/navigation-menu-start/pictures.html" rel="external nofollow">pictures.html</a>.
	</li>
	<li>
		<a href="https://github.com/mdn/learning-area/blob/master/html/introduction-to-html/navigation-menu-start/social.html" rel="external nofollow">social.html</a>.
	</li>
</ul>

<p>
	عليك:
</p>

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

<p>
	سيبدو الحل عندما تنتهي منه قريبًا من الصفحة التالية:
</p>

<p style="text-align: center;">
	<img alt="إنشاء قائمة للتنقل باستخدام لغة HTML" class="ipsImage ipsImage_thumbnailed" data-fileid="110784" data-unique="f811huu6u" style="width: 549px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2022_10/03_navigation_list.png.ad563b2803b5f1b3603f3b7be28b8bc2.png">
</p>

<p>
	<strong>ملاحظة</strong>: إذا لم تستطع المتابعة أو لم تكن واثقًا من عملك، فيمكن التحقق من الحل في <a href="https://github.com/mdn/learning-area/tree/master/html/introduction-to-html/navigation-menu-marked-up" rel="external nofollow">المستودع المخصص للتمرين على جيت-هاب</a>.
</p>

<h2>
	روابط البريد الإلكتروني
</h2>

<p>
	من الممكن إنشاء روابط أو أزرار تَفتح عند النقر عليها نموذجًا أو تطبيقًا لكتابة رسالة بريد إلكتروني بدلًا من الانتقال إلى مورد معين. يُستخدم العنصر <code>&lt;a&gt;</code> لهذه الغاية بالإضافة إلى بروتوكول <code>mailto:‎</code>، إذ يشير البروتوكول <code>:mailto</code> في أكثر الحالات بساطةً وشيوعًا إلى عنوان البريد الإلكتروني للمستقبِل:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4518_68" style=""><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"mailto:nowhere@mozilla.org"</span><span class="tag">&gt;</span><span class="pln">Send email to nowhere</span><span class="tag">&lt;/a&gt;</span></pre>

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

<h3>
	تحديد بعض التفاصيل
</h3>

<p>
	يمكن إضافة معلومات أخرى إلى عنوان البريد الإلكتروني، إذ يمكن إضافة أية حقول مستخدَمة في ترويسة البريد الإلكتروني إلى <code>:mailto</code>، وأكثر هذه المعلومات شيوعًا هي الموضوع Subject ونسخة إلى cc وجسم الرسالة body الذي لا يمثل حقلًا فعليًا لنص الرسالة، لكن بالإمكان استخدامه لكتابة محتوى قصير للرسالة، كما يُحدَّد كل حقل مع قيمته بأسلوب الاستعلام، وإليك مثالًا كما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4518_70" style=""><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"mailto:nowhere@mozilla.org?cc=name2@rapidtables.com&amp;bcc=name3@rapidtables.com&amp;subject=The%20subject%20of%20the%20email&amp;body=The%20body%20of%20the%20email"</span><span class="tag">&gt;</span><span class="pln">
  Send mail with cc, bcc, subject and body
</span><span class="tag">&lt;/a&gt;</span></pre>

<p>
	<strong>ملاحظة</strong>: ينبغي أن تكون القيم في كل حقل مكتوبةً وفق ترميز عنوان URL، أي دون محارف لا تطبع شيئًا مثل محارف السطر الجديد والجدولة ودون فراغات، ولاحظ أيضًا استخدام إشارة الاستفهام <code>?</code> في الفصل بين عنوان URL الرئيسي عن قيم الحقول والمحرف <code>&amp;</code> للفصل بين الحقول، إذ تُعَدّ هذه الرموز رموزًا معياريةً لاستعلام URL، وإليك بعض الأمثلة عن عناوين <code>:mailto</code> بسيطة أخرى:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4518_72" style=""><span class="pln">mailto:
mailto:nowhere@mozilla.org
mailto:nowhere@mozilla.org,nobody@mozilla.org
mailto:nowhere@mozilla.org?cc=nobody@mozilla.org
mailto:nowhere@mozilla.org?cc=nobody@mozilla.org&amp;subject=This%20is%20the%20subject</span></pre>

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

<p>
	هذا كل ما تحتاجه عن الروابط، وسنعود إلى الروابط لاحقًا في سلسلة مقالاتنا عندما نتحدث عن أساليب التنسيق، كما سنتحدث في المقال التالي عن الدلالات التي تقدمها عناصر HTML، وسنطلع على بعض الميزات المتقدمة أو غير المألوفة والتي قد تعُدّها مفيدة، لذا سيكون التنسيق المتقدم للنصوص في لغة HTML هو خطوتنا التالية.
</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://khamsat.com/create-website" rel="external">أنشئ موقعك الآن</a>
		</div>
	</div>
</div>





<p>
	ترجمة -وبتصرف- للمقال <a href="https://developer.mozilla.org/en-US/docs/Learn/HTML/Introduction_to_HTML/Creating_hyperlinks" rel="external nofollow">Creating hyperlinks</a>.
</p>

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

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D9%85%D9%81%D9%87%D9%88%D9%85-%D8%A7%D9%84%D8%B1%D9%88%D8%A7%D8%A8%D8%B7-%D8%A7%D9%84%D8%AA%D8%B4%D8%B9%D8%A8%D9%8A%D8%A9-%D9%81%D9%8A-%D9%85%D9%88%D8%A7%D9%82%D8%B9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r1434/" rel="">مفهوم الروابط التشعبية في مواقع الويب</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/apps/productivity/office/microsoft-powerpoint/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B1%D8%AA%D8%A8%D8%A7%D8%B7%D8%A7%D8%AA-%D8%A7%D9%84%D8%AA%D8%B4%D8%B9%D8%A8%D9%8A%D8%A9-hyperlinks-%D9%88%D8%A7%D9%84%D8%A5%D8%AC%D8%B1%D8%A7%D8%A1%D8%A7%D8%AA-actions-%D9%81%D9%8A-microsoft-powerpoint-r86/" rel="">كيفية إنشاء الارتباطات التشعبية (Hyperlinks) والإجراءات (Actions) في Microsoft PowerPoint</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/html/%D8%AA%D8%B1%D9%88%D9%8A%D8%B3%D8%A9-%D8%A7%D9%84%D8%B5%D9%81%D8%AD%D8%A9-%D9%88%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D8%B5%D9%81%D9%8A%D8%A9-%D9%81%D9%8A-html-r1753/" rel="">ترويسة الصفحة والبيانات الوصفية في HTML </a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1755</guid><pubDate>Tue, 22 Nov 2022 16:04:00 +0000</pubDate></item><item><title>&#x647;&#x64A;&#x643;&#x644;&#x629; &#x627;&#x644;&#x646;&#x635;&#x648;&#x635; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x644;&#x63A;&#x629; HTML</title><link>https://academy.hsoub.com/programming/html/%D9%87%D9%8A%D9%83%D9%84%D8%A9-%D8%A7%D9%84%D9%86%D8%B5%D9%88%D8%B5-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%84%D8%BA%D8%A9-html-r1754/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_10/635e29036595c_---html.jpg.cd0b347f252f3d5e203eadd8a733d4d7.jpg" /></p>
<p>
	أحد المهام الرئيسية للغة HTML هي هيكلة النص لكي يتمكن المتصفح من عرض صفحات ويب بالطريقة التي يريدها المطوّر، إذ يصف هذا المقال طريقة استخدام <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> لهيكلة صفحة نصية بإضافة عناوين وفقرات وإبراز بعض العبارات والكلمات وإنشاء قوائم وغير ذلك.
</p>

<p>
	لا بدّ قبل الشروع في القراءة من الاطلاع على أساسيات لغة HTML التي يغطيها المقال <a href="https://academy.hsoub.com/programming/html/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%84%D8%BA%D8%A9-html-r1752/" rel="">تعرَّف على لغة HTML</a>
</p>

<h2>
	التعامل مع الأساسيات: العناوين الرئيسية والفقرات
</h2>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="110781" href="https://academy.hsoub.com/uploads/monthly_2022_10/01_text_newspaper.png.a7cc9c5425fe3f92f51be538baa280bc.png" rel="" data-fileext="png"><img alt="شكل النصوص المهيكلة في نوع من النصوص المهمة" class="ipsImage ipsImage_thumbnailed" data-fileid="110781" data-unique="ouykk9m89" style="width: 599px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2022_10/01_text_newspaper.png.a7cc9c5425fe3f92f51be538baa280bc.png"></a>
</p>

<p>
	تسهل النصوص المهيكلة تجربة القراءة وتزيد المتعة، وتُنظَّم النصوص ضمن فقرات في <a href="https://wiki.hsoub.com/HTML" rel="external">لغة HTML</a> بتغليف النص داخل عنصر الفقرة النصية <a href="https://wiki.hsoub.com/HTML/p" rel="external"><code>&lt;p&gt;</code></a> كما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3426_11" style=""><span class="tag">&lt;p&gt;</span><span class="pln">أكتب حاليًا فقرة نصية</span><span class="tag">&lt;/p&gt;</span></pre>

<p>
	بينما لا بد من استخدام عنصر عنوان مثل العنوان الرئيسي <code><a href="https://wiki.hsoub.com/HTML/h1-h6" rel="external">&lt;h1&gt;</a></code> لإبراز النص على أساس عنوان للمحتوى الذي تعرضه الصفحة:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3426_15" style=""><span class="tag">&lt;h1&gt;</span><span class="pln">هذا عنوان المقال</span><span class="tag">&lt;/h1&gt;</span></pre>

<p>
	تقدّم لغة HTML ستة مستويات للعناوين ابتداءً من الأعلى مستوى <code>&lt;h1&gt;</code> وانتهاءً بالأدنى<code>&lt;h6&gt;</code>، إذ يمثِّل العنصر <code>&lt;h1&gt;</code> العنوان الرئيسي ويمثِّل <code>&lt;h2&gt;</code> العناوين الفرعية للعنوان الرئيسي و<code>&lt;h3&gt;</code> العناوين الفرعية للعناوين الفرعية وهكذا، انظر توثيقها -<a href="https://wiki.hsoub.com/HTML/h1-h6" rel="external">العناصر h1-h6</a>- في موسوعة حسوب.
</p>

<h3>
	إنجاز الهيكلية المتدرجة لمحتوى صفحة HTML
</h3>

<p>
	سنستخدِم في القصة التي نراها تاليًا العنصر <code>&lt;h1&gt;</code> ليمثل عنوان القصة و<code>&lt;h2&gt;</code> ليمثل عنوان كل فصل، بينما سيمثل العنصر <code>&lt;h3&gt;</code> الأقسام الفرعية لكل فصل.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3426_19" style=""><span class="tag">&lt;h1&gt;</span><span class="pln">The Crushing Bore</span><span class="tag">&lt;/h1&gt;</span><span class="pln">

</span><span class="tag">&lt;p&gt;</span><span class="pln">By Chris Mills</span><span class="tag">&lt;/p&gt;</span><span class="pln">

</span><span class="tag">&lt;h2&gt;</span><span class="pln">Chapter 1: The dark night</span><span class="tag">&lt;/h2&gt;</span><span class="pln">

</span><span class="tag">&lt;p&gt;</span><span class="pln">It was a dark night. Somewhere, an owl hooted. The rain lashed down on the ...</span><span class="tag">&lt;/p&gt;</span><span class="pln">

</span><span class="tag">&lt;h2&gt;</span><span class="pln">Chapter 2: The eternal silence</span><span class="tag">&lt;/h2&gt;</span><span class="pln">

</span><span class="tag">&lt;p&gt;</span><span class="pln">Our protagonist could not so much as a whisper out of the shadowy figure ...</span><span class="tag">&lt;/p&gt;</span><span class="pln">

</span><span class="tag">&lt;h3&gt;</span><span class="pln">The specter speaks</span><span class="tag">&lt;/h3&gt;</span><span class="pln">

</span><span class="tag">&lt;p&gt;</span><span class="pln">Several more hours had passed, when all of a sudden the specter sat bolt upright and exclaimed, "Please have mercy on my soul!"</span><span class="tag">&lt;/p&gt;</span></pre>

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

<ul>
	<li>
		يفضَّل استخدام عنوان رئيسي <code>&lt;h1&gt;</code> واحد في كل صفحة، فهو العنوان ذو المستوى الأعلى وتتدرج تحته بقية العناصر.
	</li>
	<li>
		تأكد من استخدام عناصر العناوين بالترتيب الصحيح في الهيكلية المتدرجة للصفحة، فلا تستخدِم مثلًا <code>&lt;h3&gt;</code> ليشير إلى عنوان فرعي ثم تستخدم بعده <code>&lt;h2&gt;</code> ليمثل عنوانًا فرعيًا لعنوان فرعي، فهذا أمر غير منطقي وسيقود إلى نتائج غريبة.
	</li>
	<li>
		حاول عدم استخدام أكثر من ثلاثة مستويات في كل صفحة إلا إذا كان الأمر ضروريًا، فقد قَلَّ انتشار المستندات التي تعتمد هيكلية ذات مستويات عميقة نظرًا لصعوبة التنقل بين مستوياتها، ويفضل في حالات مثل هذه توزيع المحتوى ضمن صفحات عدة.
	</li>
</ul>

<h3>
	ما فائدة إعطاء الصفحة هيكلية معينة؟
</h3>

<p>
	للإجابة على هذا السؤال، دعنا نلقي نظرةً على الملف <a href="https://github.com/mdn/learning-area/blob/master/html/introduction-to-html/html-text-formatting/text-start.html" rel="external nofollow">text-start.html</a> الذي سيكون نقطة انطلاق في تطبيقات هذا المقال (وصفة حمُّص جيدة)، لذلك انسخ هذا الملف وضعه على حاسوبك لأنك ستحتاجه لاحقًا، كما يحتوي جسم المستند محتوًى مكوّنًا من أجزاء مختلفة لم تُنظَّم بعد في هيكلية محددة، لكنها مفصولة عن بعضها بمحارف الأسطر الجديدة، فعندما تفتح الملف عبر المتصفح، فستجد أنّ النص قطعة واحدة كبيرة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="110782" href="https://academy.hsoub.com/uploads/monthly_2022_10/02_text_not_structured.png.8f3bebfaf21c5b0adeb6788708b5cf40.png" rel="" data-fileext="png"><img alt="إعطاء صفحة ويب هيكلية معينة باستخدام HTML " class="ipsImage ipsImage_thumbnailed" data-fileid="110782" data-unique="01yq7h5ru" style="width: 550px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2022_10/02_text_not_structured.png.8f3bebfaf21c5b0adeb6788708b5cf40.png"></a>
</p>

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

<ul>
	<li>
		يستعرض الزائر النص بسرعة بحثًا عن المحتوى الأساسي ويكتفي عادةً بقراءة العناوين ليختار نقطة البداية، إذ يقضي المستخدِم عادةً فترةً قصيرةً جدًا ضمن صفحة الويب، فإذا لم يستطع الزائر إيجاد أيّ شيء واضح أو مفيد خلال ثوان معدودة، فعلى الغالب سيتوقف عن القراءة ويغادر الصفحة.
	</li>
	<li>
		تفهرِس محركات البحث الصفحات آخذةً بالحسبان محتوى العناوين على أنها كلمات مفتاحية مهمة تؤثِّر على ترتيب نتائج البحث، فدون العناوين إذًا لن تُعَدّ صفحتك جيدةً وفق معايير السيو SEO أو <a href="https://academy.hsoub.com/marketing/search-engine-optimisation/%D8%AA%D8%AD%D8%B3%D9%8A%D9%86-%D9%85%D8%AD%D8%B1%D9%83%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%AD%D8%AB-seo-%D9%88%D8%A3%D9%87%D9%85%D9%8A%D8%AA%D9%87%D8%A7-%D9%84%D9%85%D9%88%D9%82%D8%B9%D9%83-%D8%A7%D9%84%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A-r490/" rel="">تحسين محركات البحث Search Engine Optimization</a>.
	</li>
	<li>
		لا يقرأ الزوار ذوو المشاكل البصرية الحادة صفحات ويب بأنفسهم، وإنما يستمعون إلى محتواها عن طريق برمجيات تُدعى قارئات الشاشة، إذ تتيح هذه البرمجيات الوصول السريع إلى محتوى نصي محدد، وتجري هذه العملية بطرق عدة منها تحديد خطوط عريضة للمحتوى بقراءة العناوين، مما يسمح للمستخدِم بإيجاد المعلومات التي يريدها بسرعة، فإذا لم تكن العناوين موجودةً، فسيضطر المستخدِم إلى الاستماع إلى النص بأكمله.
	</li>
	<li>
		إذا أردت تنسيق الصفحة باستخدام <a href="https://academy.hsoub.com/programming/css/%d8%aa%d8%b9%d8%b1%d9%91%d9%81-%d8%b9%d9%84%d9%89-%d8%a3%d8%b3%d8%a7%d8%b3%d9%8a%d8%a7%d8%aa-css-r70/" rel="">CSS</a> أو جعلها تفاعليةً أكثر عن طريق <a href="https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D8%B3%D8%B1%D9%8A%D8%B9-%D8%A5%D9%84%D9%89-%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D9%8A%D8%A8%D8%AA-javascript-r550/" rel="">جافاسكربت</a>، فلا بد من تغليف المحتوى المطلوب بواسطة عناصر HTML لكي تستهدفه شيفرات CSS أو جافاسكربت بفعالية أكبر.
	</li>
</ul>

<p>
	لهذه الأسباب وغيرها سنحتاج إلى هيكلة محتوى الصفحة.
</p>

<h3>
	لماذا نحتاج إلى الدلالات؟
</h3>

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

<p>
	لا بد في السياق عينه أن نتأكد من استخدام العناصر الصحيحة لكي نعطي المحتوى المعنى والوظيفة والمظهر الصحيح، فوفقًا لهذه المقاربة، فإن العنصر <code>&lt;h1&gt;</code> هو عنصر دلالي يعطي المحتوى الذي يغلفه صفة عنوان رئيسي لصفحتك بأعلى مستوى.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3426_26" style=""><span class="tag">&lt;h1&gt;</span><span class="pln">This is a top level heading</span><span class="tag">&lt;/h1&gt;</span></pre>

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

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3426_28" style=""><span class="tag">&lt;span</span><span class="pln"> </span><span class="atn">style</span><span class="pun">=</span><span class="atv">"</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">32px</span><span class="pun">;</span><span class="pln"> margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">21px</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> display</span><span class="pun">:</span><span class="pln"> block</span><span class="pun">;</span><span class="atv">"</span><span class="tag">&gt;</span><span class="pln">Is this a top level heading?</span><span class="tag">&lt;/span&gt;</span></pre>

<p>
	ليس <a href="https://wiki.hsoub.com/HTML/span" rel="external">للعنصر &lt;span&gt;</a> أية دلالات، ويستخدَم لتطبيق تنسيق <a href="https://academy.hsoub.com/programming/css" rel="">لغة CSS</a> على محتوى محدد أو جزء منه أو استهدافه بشيفرة جافاسكربت دون أن يدل ذلك على معنى جديد، وقد طبقنا في الشيفرة السابقة بعض التنسيقات على محتوى ليبدو تمامًا على أنه عنوان رئيسي، لكنك لن تجني أيّ فوائد أخرى من هذه العملية لأنّ هذا العنصر غير دلالي ولا يحمل معنًى محددًا، لذلك من الأفضل دائمًا استخدام عناصر HTML المخصصة لأداء وظيفة معينة.
</p>

<h2>
	القوائم
</h2>

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

<h3>
	القوائم غير المرتبة
</h3>

<p>
	تستخدَم القوائم غير المرتبة Unordered list لوصف مجموعة عناصر لا أولوية لترتيبها ضمن القائمة، ومن الأمثلة عليها قائمة التسوق:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3426_32" style=""><span class="pln">milk
eggs
bread
hummus</span></pre>

<p>
	تبدأ القائمة غير المرتبة بالعنصر <code><a href="https://wiki.hsoub.com/HTML/ul" rel="external">&lt;ul&gt;</a></code> الذي يغلف جميع العناصر:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3426_35" style=""><span class="tag">&lt;ul&gt;</span><span class="pln">
milk
eggs
bread
hummus
</span><span class="tag">&lt;/ul&gt;</span></pre>

<p>
	وينبغي أن نغلف عناصر القائمة <a href="https://wiki.hsoub.com/HTML/li" rel="external">بالعنصر &lt;li&gt;</a>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3426_39" style=""><span class="tag">&lt;ul&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">milk</span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">eggs</span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">bread</span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">hummus</span><span class="tag">&lt;/li&gt;</span><span class="pln">
</span><span class="tag">&lt;/ul&gt;</span></pre>

<h3>
	القوائم المرتبة
</h3>

<p>
	تستخدَم القوائم المرتبة ordered list لوصف مجموعة عناصر ينبغي ترتيبها ضمن القائمة، ومن الأمثلة عليها الاتجاهات التي يجب أن تسلكها لتصل إلى مكان معيَّن:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3426_41" style=""><span class="pln">Drive to the end of the road
Turn right
Go straight across the first two roundabouts
Turn left at the third roundabout
The school is on your right, 300 meters up the road</span></pre>

<p>
	توصَّف القائمة المرتبة بأسلوب القوائم غير المرتبة نفسه باستثناء العنصر المستخدَم في تغليف العناصر الذي سيكون في هذه الحالة <code><a href="https://wiki.hsoub.com/HTML/ol" rel="external">&lt;ol&gt;</a></code> بدلًا من <code><a href="https://wiki.hsoub.com/HTML/ul" rel="external">&lt;ul&gt;</a></code>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3426_44" style=""><span class="tag">&lt;ol&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">Drive to the end of the road</span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">Turn right</span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">Go straight across the first two roundabouts</span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">Turn left at the third roundabout</span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">The school is on your right, 300 meters up the road</span><span class="tag">&lt;/li&gt;</span><span class="pln">
</span><span class="tag">&lt;/ol&gt;</span></pre>

<h3>
	القوائم المتداخلة
</h3>

<p>
	من الممكن جدًا أن تتداخل القوائم، فقد تحتاج إلى قائمة فرعية تحت أحد عناصر قائمة أخرى، ولنأخذ القائمة الثانية من مثال وصفة الطعام:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3426_49" style=""><span class="tag">&lt;ol&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">Remove the skin from the garlic, and chop coarsely.</span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">Remove all the seeds and stalk from the pepper, and chop coarsely.</span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">Add all the ingredients into a food processor.</span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">Process all the ingredients into a paste.</span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">If you want a coarse "chunky" hummus, process it for a short time.</span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">If you want a smooth hummus, process it for a longer time.</span><span class="tag">&lt;/li&gt;</span><span class="pln">
</span><span class="tag">&lt;/ol&gt;</span></pre>

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

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3426_51" style=""><span class="tag">&lt;ol&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">Remove the skin from the garlic, and chop coarsely.</span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">Remove all the seeds and stalk from the pepper, and chop coarsely.</span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">Add all the ingredients into a food processor.</span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">Process all the ingredients into a paste.
    </span><span class="tag">&lt;ul&gt;</span><span class="pln">
      </span><span class="tag">&lt;li&gt;</span><span class="pln">If you want a coarse "chunky" hummus, process it for a short time.</span><span class="tag">&lt;/li&gt;</span><span class="pln">
      </span><span class="tag">&lt;li&gt;</span><span class="pln">If you want a smooth hummus, process it for a longer time.</span><span class="tag">&lt;/li&gt;</span><span class="pln">
    </span><span class="tag">&lt;/ul&gt;</span><span class="pln">
  </span><span class="tag">&lt;/li&gt;</span><span class="pln">
</span><span class="tag">&lt;/ol&gt;</span></pre>

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

<h3>
	إبراز النص والإشارة إلى أهميته
</h3>

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

<h3>
	إبراز محتوى
</h3>

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

<ul>
	<li>
		سعيد لأنك لم تتأخر
	</li>
	<li>
		<em>سعيد</em> لأنك لم <em>تتاخر</em>
	</li>
</ul>

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

<p>
	نستخدِم في HTML <a href="https://wiki.hsoub.com/HTML/em" rel="external">العنصر &lt;em&gt;</a> لتوصيف حالات مثل هذه وزيادة المتعة أثناء قراءة النص، كما تُميِّز قارئات الشاشة هذه العناصر وتنطقها بنبرة صوتية مختلفة، وتعرض المتصفحات محتوى هذا العنصر بخط مائل افتراضيًا، لكن انتبه إلى استخدام العنصر لمجرد عرض النص مائلًا، وعليك عندها استخدام <a href="https://wiki.hsoub.com/HTML/i" rel="external">العنصر &lt;i&gt;</a> أو أن تطبق تنسيق <a href="https://wiki.hsoub.com/CSS" rel="external">CSS</a> مع عنصر <span> بصنف محدد.</span>
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3426_56" style=""><span class="tag">&lt;p&gt;</span><span class="pln">I am </span><span class="tag">&lt;em&gt;</span><span class="pln">glad</span><span class="tag">&lt;/em&gt;</span><span class="pln"> you weren't </span><span class="tag">&lt;em&gt;</span><span class="pln">late</span><span class="tag">&lt;/em&gt;</span><span class="pln">.</span><span class="tag">&lt;/p&gt;</span></pre>

<h3>
	إظهار أهمية محتوى
</h3>

<p>
	لإبراز أهمية بعض الكلمات، فإننا نشدِّد عليها عند لفظها أو نكتبها بخط ثخين Bold مثل هذا السائل <strong>عالي السميّة</strong>.
</p>

<p>
	نستخدِم في HTML <a href="https://wiki.hsoub.com/HTML/strong" rel="external">العنصر &lt;strong&gt;</a> لإظهار أهمية الكلمات، إذ يعرض المتصفح محتوى هذا العنصر بخط ثخين افتراضيًا، كما تميزه قارئات الشاشة وتنطقها بنبرة صوتية مختلفة، ولا تحاول أيضًا استخدام العنصر لمجرد عرضه بخط ثخين، وعليك عندها استخدام <a href="https://wiki.hsoub.com/HTML/b" rel="external">العنصر &lt;b&gt;</a> أو تطبيق تنسيق CSS مع عنصر <span> بصنف محدد.</span>
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3426_59" style=""><span class="tag">&lt;p&gt;</span><span class="pln">This liquid is </span><span class="tag">&lt;strong&gt;</span><span class="pln">highly toxic</span><span class="tag">&lt;/strong&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">I am counting on you. </span><span class="tag">&lt;strong&gt;</span><span class="pln">Do not</span><span class="tag">&lt;/strong&gt;</span><span class="pln"> be late!</span><span class="tag">&lt;/p&gt;</span></pre>

<p>
	يمكنك أيضًا المزج بين العنصرين <code>&lt;strong&gt;</code> و <code>&lt;em&gt;</code>.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3426_61" style=""><span class="tag">&lt;p&gt;</span><span class="pln">This liquid is </span><span class="tag">&lt;strong&gt;</span><span class="pln">highly toxic</span><span class="tag">&lt;/strong&gt;</span><span class="pln"> —
if you drink it, </span><span class="tag">&lt;strong&gt;</span><span class="pln">you may </span><span class="tag">&lt;em&gt;</span><span class="pln">die</span><span class="tag">&lt;/em&gt;&lt;/strong&gt;</span><span class="pln">.</span><span class="tag">&lt;/p&gt;</span></pre>

<h3>
	خط مائل أو ثخين أو تحته سطر
</h3>

<p>
	تتميز العناصر التي تحدثنا عنها سابقًا بدلالات معنوية محددة، لكن حالة العناصر <code>&lt;b&gt;</code> و <code>&lt;i&gt;</code> و <code>&lt;u&gt;</code> أعقد قليلًا، فقد وضعت هذه العناصر كي يكتب الأشخاص كلمات محددة بخط ثخين أو مائل أو ليظهر تحتها سطر، وذلك في حقبة لم تكن تنسيقات CSS مدعومة أو كانت محدودة الدعم، إذ تؤثر هذه العناصر على طريقة العرض وليس على الدلالة، وتُعرف حاليًا بعناصر العرض presentational elements، كما لا ينبغي استخدام هذه العناصر حاليًا لأنها غير دلالية، وقد رأينا أهمية الدلالات على أصعدة مختلفة مثل سهولة الوصول accessibility وتحسين محركات البحث أو سيو SEO.
</p>

<p>
	أعادت <a href="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/" rel="">HTML5</a> تعريف هذه العناصر مانحةً إياها دلالات قد تبدو مربكةً نوعًا ما، وإليك قاعدة مهمة جدًا: قد يكون استخدام العناصر <code>&lt;b&gt;</code> أو <code>&lt;i&gt;</code> أو <code><a href="https://wiki.hsoub.com/HTML/u" rel="external">&lt;u&gt;</a></code> ملائمًا لإيصال معنى محدد يمكن إيصاله تقليديًا بإمالة الخط أو تثخينه أو وضع سطر تحته إذا لم توجد عناصر أخرى مناسبة، لكن عليك أن تبقي في حساباتك مفهوم سهولة الوصول أو الشمولية accessibility، فليس استخدام الخط المائل في غير سياقه مفيدًا لمستخدمِي قارئات الشاشة أو للأشخاص الذين يستخدِمون أبجديات مختلفة عن اللاتينية.
</p>

<ul>
	<li>
		<code>&lt;i&gt;</code>: يُستخدَم لإيصال معنى يمكن إيصاله تقليديًا بخط مائل مثل كلمات أجنبية، مرادفات، تصميم، مصطلحات تقنية، أفكار…
	</li>
	<li>
		<code>&lt;b&gt;</code>: يُستخدَم لإيصال معنى يمكن إيصاله تقليديًا بخط ثخين مثل كلمات مفتاحية، أسماء منتجات، جملة افتتاحية..
	</li>
	<li>
		<code>&lt;u&gt;</code>: يُستخدَم لإيصال معنى يمكن إيصاله تقليديًا بخط تحته سطر مثل الأخطاء الإملائية والنحوية.
	</li>
</ul>

<p>
	<strong>ملاحظة</strong>: يربط الناس جدًا بين الكلمات التي تحتها سطر والروابط التشعبية، لذلك يفضَّل في صفحات الويب أن لا تضع سطرًا تحت محتوى ما لم يكن رابطًا، واستخدم <code>&lt;u&gt;</code> عندما تجد أنّ دلالته صحيحة، وفكّر دائمًا باستخدام CSS لتغيير المحتوى الذي تحته سطر إلى شكل أكثر ملاءمةً لويب، كما يشرح المثال التالي ما يمكن فعله:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_3426_68" style=""><span class="com">&lt;!-- مصطلحات علمية --&gt;</span><span class="pln">
</span><span class="tag">&lt;p&gt;</span><span class="pln">
  الطنان ياقوتي الحنجري (</span><span class="tag">&lt;i&gt;</span><span class="pln">Archilochus colubris</span><span class="tag">&lt;/i&gt;</span><span class="pln">)
  هو الطنان الأكثر انتشارًا في أمريكا الشمالية.
</span><span class="tag">&lt;/p&gt;</span><span class="pln">

</span><span class="com">&lt;!-- كلمات أجنبية --&gt;</span><span class="pln">
</span><span class="tag">&lt;p&gt;</span><span class="pln">
  كانت القائمة بحرًا من الكلمات الغريبة </span><span class="tag">&lt;i</span><span class="pln"> </span><span class="atn">lang</span><span class="pun">=</span><span class="atv">"uk-latn"</span><span class="tag">&gt;</span><span class="pln">vatrushka</span><span class="tag">&lt;/i&gt;</span><span class="pln">,
  </span><span class="tag">&lt;i</span><span class="pln"> </span><span class="atn">lang</span><span class="pun">=</span><span class="atv">"id"</span><span class="tag">&gt;</span><span class="pln">nasi goreng</span><span class="tag">&lt;/i&gt;</span><span class="pln"> و </span><span class="tag">&lt;i</span><span class="pln"> </span><span class="atn">lang</span><span class="pun">=</span><span class="atv">"fr"</span><span class="tag">&gt;</span><span class="pln">soupe à l'oignon</span><span class="tag">&lt;/i&gt;</span><span class="pln">.
</span><span class="tag">&lt;/p&gt;</span><span class="pln">

</span><span class="com">&lt;!-- أخطاء إملائية غير معروفة --&gt;</span><span class="pln">
</span><span class="tag">&lt;p&gt;</span><span class="pln">
  Someday I'll learn how to </span><span class="tag">&lt;u</span><span class="pln"> </span><span class="atn">style</span><span class="pun">=</span><span class="atv">"</span><span class="pln">text</span><span class="pun">-</span><span class="pln">decoration</span><span class="pun">-</span><span class="pln">line</span><span class="pun">:</span><span class="pln"> underline</span><span class="pun">;</span><span class="pln"> text</span><span class="pun">-</span><span class="pln">decoration</span><span class="pun">-</span><span class="pln">style</span><span class="pun">:</span><span class="pln"> wavy</span><span class="pun">;</span><span class="atv">"</span><span class="tag">&gt;</span><span class="pln">spel</span><span class="tag">&lt;/u&gt;</span><span class="pln"> better.
</span><span class="tag">&lt;/p&gt;</span><span class="pln">

</span><span class="com">&lt;!-- تظليل كلمات عند عرض إرشادات --&gt;</span><span class="pln">
</span><span class="tag">&lt;ol&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">
    </span><span class="tag">&lt;b&gt;</span><span class="pln">شرِّح</span><span class="tag">&lt;/b&gt;</span><span class="pln"> قطعتين من الخبز
  </span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">
    </span><span class="tag">&lt;b&gt;</span><span class="pln">أدخل</span><span class="tag">&lt;/b&gt;</span><span class="pln"> شريحة طماطم وورقة خس بين شريحتي الخبز
  </span><span class="tag">&lt;/li&gt;</span><span class="pln">
</span><span class="tag">&lt;/ol&gt;</span></pre>

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

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

<p>
	ترجمة -وبتصرف- للمقال <a href="https://developer.mozilla.org/en-US/docs/Learn/HTML/Introduction_to_HTML/HTML_text_fundamentals" rel="external nofollow">HTML text fundamentals</a>.
</p>

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

<ul>
	<li>
		<a href="https://academy.hsoub.com/design/general/%d9%87%d9%8a%d9%83%d9%84%d8%a9-%d9%88%d8%aa%d9%88%d8%b2%d9%8a%d8%b9-%d9%85%d8%ad%d8%aa%d9%88%d9%89-%d8%b5%d9%81%d8%ad%d8%a7%d8%aa-%d8%a7%d9%84%d9%88%d9%8a%d8%a8-r43/" rel="">هيكلة وتوزيع محتوى صفحات الويب</a>
	</li>
	<li>
		<a href="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/" rel="">HTML و CSS للمبتدئين: كيف تصمم أول صفحة ويب لك</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/html/%D8%AA%D8%B1%D9%88%D9%8A%D8%B3%D8%A9-%D8%A7%D9%84%D8%B5%D9%81%D8%AD%D8%A9-%D9%88%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D8%B5%D9%81%D9%8A%D8%A9-%D9%81%D9%8A-html-r1753/" rel="">ترويسة الصفحة والبيانات الوصفية في HTML</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1754</guid><pubDate>Tue, 15 Nov 2022 16:00:00 +0000</pubDate></item><item><title>&#x62A;&#x631;&#x648;&#x64A;&#x633;&#x629; &#x627;&#x644;&#x635;&#x641;&#x62D;&#x629; &#x648;&#x627;&#x644;&#x628;&#x64A;&#x627;&#x646;&#x627;&#x62A; &#x627;&#x644;&#x648;&#x635;&#x641;&#x64A;&#x629; &#x641;&#x64A; HTML</title><link>https://academy.hsoub.com/programming/html/%D8%AA%D8%B1%D9%88%D9%8A%D8%B3%D8%A9-%D8%A7%D9%84%D8%B5%D9%81%D8%AD%D8%A9-%D9%88%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D8%B5%D9%81%D9%8A%D8%A9-%D9%81%D9%8A-html-r1753/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_10/635e20bdbb610_-----html.jpg.58024d45be27e82ad7d5b8c25a4ea133.jpg" /></p>

<p>
	تُعَدّ الترويسة الجزء الذي لا تعرضه متصفحات ويب من الصفحة عند تحميلها، وتضم معلومات مثل عنوان الصفحة وروابط إلى ملفات <a href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D8%B3%D8%B1%D9%8A%D8%B9-%D8%A5%D9%84%D9%89-%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%AA%D9%86%D8%B3%D9%8A%D9%82-css-r551/" rel="">تنسيق CSS</a> إذا أردت تنسيق محتوى صفحتك، بالإضافة إلى روابط إلى أيقوناتك المفضلة وغيرها من البيانات الوصفية مثل المؤلف والكلمات المفتاحية الهامة التي تصف الصفحة، كما تستخدِم المتصفحات البيانات الموجودة في الترويسة لتصيير صفحة HTML بصورة صحيحة، وسنناقش في هذا المقال كل النقاط السابقة لتقف على ركيزة قوية عندما تعمل مع HTML.
</p>

<p>
	لا بد قبل متابعة القراءة أن تطلع على أساسيات HTML التي ذكرناها في مقال <a href="https://academy.hsoub.com/programming/html/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%84%D8%BA%D8%A9-html-r1752/" rel="">تعرّف على لغة HTML</a>.
</p>

<h2>
	ما هي ترويسة صفحة HTML
</h2>

<p>
	لنراجع صفحة HTML البسيطة التي عرضناها في المقال السابق:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_92_9" 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">My test page</span><span class="tag">&lt;/title&gt;</span><span class="pln">
  </span><span class="tag">&lt;/head&gt;</span><span class="pln">
  </span><span class="tag">&lt;body&gt;</span><span class="pln">
    </span><span class="tag">&lt;p&gt;</span><span class="pln">This is my page</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>
	الترويسة هي محتوى <a href="https://wiki.hsoub.com/HTML/head" rel="external">العنصر &lt;head&gt;</a>، ولا تُعرض محتويات الترويسة على خلاف محتوى <a href="https://wiki.hsoub.com/HTML/body" rel="external">العنصر &lt;body&gt;</a> الذي يعرضه المتصفح، لأن وظيفتها هي احتواء معلومات وصفية عن الصفحة، كما إنّ محتوى الترويسة في المثال السابق قليل كما نرى:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_92_11" style="">
<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">My test page</span><span class="tag">&lt;/title&gt;</span><span class="pln">
</span><span class="tag">&lt;/head&gt;</span></pre>

<p>
	لكن في الصفحات الكبيرة قد يغدو محتوى الترويسة أكبر، وحاول فتح بعض الصفحات الكبيرة التي تفضلها ثم استخدام <a href="https://academy.hsoub.com/programming/workflow/%D9%85%D8%A7-%D9%87%D9%8A-%D8%A3%D8%AF%D9%88%D8%A7%D8%AA-%D9%85%D8%B7%D9%88%D8%B1%D9%8A-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D9%85%D8%AF%D9%85%D8%AC%D8%A9-%D9%81%D9%8A-%D8%A7%D9%84%D9%85%D8%AA%D8%B5%D9%81%D8%AD%D8%A7%D8%AA%D8%9F-r1439/" rel="">أدوات مطوري ويب</a> لتطلع على محتويات الترويسة، كما أننا لا نهدف في هذا المقال إلى استعراض كل ما يمكن وضعه ضمن الترويسة، وإنما لتتعلم استخدام العناصر الرئيسية التي ستجد أن إدراجها ضمن الترويسة ضروري ولتعتاد على ذلك. لنبدأ إذًا.
</p>

<h2>
	إضافة عنوان للصفحة
</h2>

<p>
	رأينا سابقًا عمل العنصر <code>&lt;title&gt;</code> والذي يُستخدَم لإضافة عنوان إلى مستند HTML، لكنك قد تخلط بينه وبين العنوان الرئيسي <code>&lt;h1&gt;</code> الذي يُستخدَم في إضافة عنوان رئيسي لمحتوى الصفحة المرئي ضمن العنصر <code>&lt;body&gt;</code>، كما يُدعى <a href="https://wiki.hsoub.com/HTML/h1-h6" rel="external">العنصر &lt;h1&gt;</a> أحيانًا باسم عنوان الصفحة، وتتلخص الاختلافات بما يلي:
</p>

<ul>
<li>
		يظهر العنصر <code>&lt;h1&gt;</code> على صفحة الويب عند تحميلها ضمن المتصفح، ومن المفترض أن يُستخدَم مرةً واحدةً في الإشارة إلى العنوان الرئيسي لمحتوى الصفحة، أي عنوان قصة أو عنوان رئيسي لنشرة إخبارية وغير ذلك.
	</li>
	<li>
		يُعَدّ <a href="https://wiki.hsoub.com/HTML/title" rel="external">العنصر &lt;title&gt;</a> عنصرًا وصفيًا يمثل عنوان مستند HTML برمته وليس عنوان المحتوى المرئي للصفحة.
	</li>
</ul>
<h3>
	تطبيق: تفحص مثال بسيط
</h3>

<p>
	لتبدأ العمل عليك تنزيل نسخة عن الملف "title-example.html" من المستودع المخصص على جيت-هاب بإحدى الطريقتين التاليتين:
</p>

<ol>
<li>
		انسخ محتوى الملف ثم الصقه ضمن ملف نصي جديد باستخدام محرِّر النصوص المتوفر لديك، ثم احفظه في مكان مناسب.
	</li>
	<li>
		اضغط الزر "Raw" في صفحة جيت-هاب لتظهر الشيفرة (ربما في نافذة جديدة للمتصفح)، ثم اختر ملف File ثم حفظ الصفحة باسم Save Page As، واختر بعد ذلك مكانًا مناسبًا لتخزين الملف.
	</li>
</ol>
<p>
	افتح بعد ذلك الملف باستخدام المتصفح وسيبدو بالصورة التالية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="110773" href="https://academy.hsoub.com/uploads/monthly_2022_10/01_h1_title.png.a1d8c3dab95ecff99354a257856c943b.png" rel=""><img alt="تفحص نتائج إضافة عنوان على صفحة الويب في لغة HTML" class="ipsImage ipsImage_thumbnailed" data-fileid="110773" data-unique="e4svc0lzq" src="https://academy.hsoub.com/uploads/monthly_2022_10/01_h1_title.png.a1d8c3dab95ecff99354a257856c943b.png" style="width: 520px; height: auto;"></a>
</p>

<p>
	من الواضح الآن أين سيظهر عنوان الصفحة <code>&lt;h1&gt;</code> وعنوان المستند <code>&lt;title&gt;</code>.
</p>

<p>
	جرب بعدها أيضًا فتح الشيفرة ضمن المحرِّر النصي وتعديل محتوى هذين العنصرين، ثم حدّث المحتوى المعروض ضمن المتصفح.
</p>

<p>
	يُستخدَم محتوى العنصر <code>&lt;title&gt;</code> بطرق أخرى، فإذا أردت مثلًا إضافة علامةً مرجعيةً إلى صفحة، فستجد أنّ هذا المحتوى سيكون الاسم المقترح لهذه العلامة، كما يُستخدَم في نتائج البحث كما سنرى لاحقًا.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="110774" href="https://academy.hsoub.com/uploads/monthly_2022_10/02_bookmark.png.edaf0034b4ebf0ab3236b6cd121e6dbe.png" rel=""><img alt="إضافة علامة مرجعية إلى صفحة باستخدام HTML" class="ipsImage ipsImage_thumbnailed" data-fileid="110774" data-unique="s3qqj061l" src="https://academy.hsoub.com/uploads/monthly_2022_10/02_bookmark.png.edaf0034b4ebf0ab3236b6cd121e6dbe.png" style="width: 520px; height: auto;"></a>
</p>

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

<p>
	تعتمد HTML طريقةً رسميةً في إضافة البيانات الوصفية metadata إلى المستند من خلال العنصر <code>&lt;meta&gt;</code>، كما يمكن أن تُعدَّ بقية الأمور التي نتحدث عنها في هذا المقال بيانات وصفية أيضًا، فهنالك أنواع عديدة للبيانات الوصفية تُضاف إلى جانب <code>&lt;meta&gt;</code> داخل ترويسة الصفحة <code>&lt;head&gt;</code>، لكننا لن نشرحها في هذه المرحلة لأنها ستربكك كثيرًا، وبدلًا من ذلك سنوضِّح عدة أمور قد تشاهدها كثيرًا وذلك لتأخذ فكرةً عنها.
</p>

<h3>
	تحديد مجموعة المحارف المستخدمة في صفحتك
</h3>

<p>
	ستجد في مثالنا السابق سطرًا يبدو كما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_92_34" style="">
<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></pre>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="110775" href="https://academy.hsoub.com/uploads/monthly_2022_10/03_unicode_eng_jap.png.e913983f282d497543aebe2b581de95c.png" rel=""><img alt="استخدام محرف meta لعرض الكتابات وفق اتجاه لغتها في HTML" class="ipsImage ipsImage_thumbnailed" data-fileid="110775" data-unique="7ni7fiq79" src="https://academy.hsoub.com/uploads/monthly_2022_10/03_unicode_eng_jap.png.e913983f282d497543aebe2b581de95c.png" style="width: 520px; height: auto;"></a>
</p>

<p>
	قد لا تُعرض الصفحة بالصورة الصحيحة إذا استخدمت مجموعة المحارف ISO-8859-1 مثل مجموعة المحارف الخاصة بالأبجدية اللاتينية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="110776" href="https://academy.hsoub.com/uploads/monthly_2022_10/04_iso_latin.png.d805e91cc11fd914347290ca7d147ef5.png" rel=""><img alt="عرض الصفحات عند استخدام المحارف ISO-8859-1 في لغة HTML" class="ipsImage ipsImage_thumbnailed" data-fileid="110776" data-unique="nugvptjny" src="https://academy.hsoub.com/uploads/monthly_2022_10/04_iso_latin.png.d805e91cc11fd914347290ca7d147ef5.png" style="width: 520px; height: auto;"></a>
</p>

<p>
	<strong>ملاحظة</strong>: تصحِّح بعض المتصفحات -مثل كروم- هذه الأخطاء تلقائيًا، لذلك قد لا ترى هذه المشكلة في بعض المتصفحات، ومع ذلك يُفضّل استخدام مجموعة المحارف <code>utf-8</code> لتلافي أيّ مشاكل محتمَلة في المتصفحات المختلفة.
</p>

<h3>
	تطبيق: اختبار مجموعات المحارف
</h3>

<p>
	عُد إلى قالب HTML الذي عملنا عليه قبل قليل في فقرة "إضافة عنوان للصفحة"، وحاول تغيير قيمة السمة <code>charset</code> للعنصر <code>&lt;meta&gt;</code> إلى ISO-8859-1 وستدخِل المحارف اليابانية إلى صفحتك:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_92_41" style="">
<span class="tag">&lt;p&gt;</span><span class="pln">Japanese example: ご飯が熱い。</span><span class="tag">&lt;/p&gt;</span></pre>

<h3>
	إضافة اسم المؤلف ووصف للصفحة
</h3>

<p>
	قد يحتوي العنصر <a href="https://wiki.hsoub.com/HTML/meta" rel="external"><code>&lt;meta&gt;</code></a> على سمات مثل <code>name</code> و <code>content</code>:
</p>

<ul>
<li>
		<code>name</code>: يحدِّد نوع البيانات التي يعرضها العنصر <code>&lt;meta&gt;</code>.
	</li>
	<li>
		<code>content</code>: يحدِّد المحتوى الفعلي للعنصر.
	</li>
</ul>
<p>
	تساعدك الصفتين السابقتين على إضافة مؤلف الصفحة وتزودك بوصف مناسب لمحتواها، وإليك مثالًا كما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_92_43" style="">
<span class="tag">&lt;meta</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"author"</span><span class="pln"> </span><span class="atn">content</span><span class="pun">=</span><span class="atv">"Chris Mills"</span><span class="tag">&gt;</span><span class="pln">
</span><span class="tag">&lt;meta</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"description"</span><span class="pln"> </span><span class="atn">content</span><span class="pun">=</span><span class="atv">"The MDN Web Docs Learning Area aims to provide complete beginners to the Web with all they need to know to get
started with developing web sites and applications."</span><span class="tag">&gt;</span></pre>

<p>
	يساعدك تحديد اسم المؤلف في نواح عدة منها الحصول على أجوبة عن نقاط في المحتوى أو التواصل معه، كما تتيح بعض أنظمة إدارة المحتوى إمكانية الاستخراج التلقائي لمعلومات مؤلف الصفحة لكي تستخِدمها لاحقًا للاستفسار عن المحتوى أو التواصل، ومن الجيد أيضًا أن تقدِّم وصفًا لصفحتك يضم كلمات مفتاحيةً تتعلق بطبيعة المحتوى الذي تقدمه، فقد يزيد ذلك من فرصة تصدُّر صفحتك لنتائج محركات البحث، إذ يُدعى هذا الأمر <a href="https://academy.hsoub.com/marketing/search-engine-optimisation/%D8%AA%D8%AD%D8%B3%D9%8A%D9%86-%D9%85%D8%AD%D8%B1%D9%83%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%AD%D8%AB-seo-%D9%88%D8%A3%D9%87%D9%85%D9%8A%D8%AA%D9%87%D8%A7-%D9%84%D9%85%D9%88%D9%82%D8%B9%D9%83-%D8%A7%D9%84%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A-r490/" rel="">تحسين محركات البحث</a> Search Engine Optimization أو SEO اختصارًا.
</p>

<h3>
	تطبيق: استخدام وصف الصفحة في محركات البحث
</h3>

<p>
	يُستخدَم وصف الصفحة أيضًا في نتائج محركات البحث، وسنوضِّح ذلك من خلال المثال التالي:
</p>

<ol>
<li>
		انتقل إلى الصفحة الرئيسية <a href="http://hsoub.com" rel="external">لموقع حسوب</a>.
	</li>
	<li>
		اعرض الشيفرة المصدرية للصفحة بالنقر عليها بالزر اليميني للفأرة ثم اختر "عرض الشيفرة المصدرية للصفحة View Page Source" من القائمة.
	</li>
	<li>
		ابحث عن البيانات الوصفية التي تحدِّد وصفًا للصفحة، وستبدو لك كما يلي:
	</li>
</ol>
<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_92_45" style="">
<span class="tag">&lt;meta</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"description"</span><span class="pln"> </span><span class="atn">content</span><span class="pun">=</span><span class="atv">"في مهمة لتطوير العالم العربي. نعمل لنمكّن الشباب ونفتح مزيدًا من الفرص أمامهم. نحن حسوب."</span><span class="tag">&gt;</span></pre>

<ol start="4">
<li>
		ابحث الآن عن "حسوب" باستخدام محرك البحث جوجل وستلاحظ كيف استخدم عنوان المستند <code>&lt;title&gt;</code> والبيانات الوصفية <code>&lt;meta&gt;</code> في إظهار نتيجة البحث.
	</li>
</ol>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="110777" href="https://academy.hsoub.com/uploads/monthly_2022_10/05_metadata.png.3ce249389b15fe9fdef5fd00a8b1de26.png" rel=""><img alt='نتائج البحث عن "حسوب" باستخدام محرك البحث جوجل' class="ipsImage ipsImage_thumbnailed" data-fileid="110777" data-unique="bknkea01e" src="https://academy.hsoub.com/uploads/monthly_2022_10/05_metadata.png.3ce249389b15fe9fdef5fd00a8b1de26.png" style="width: 600px; height: auto;"></a>
</p>

<p>
	<strong>ملاحظة</strong>: قد تلاحظ في جوجل صفحات فرعيةً مرتبطةً بنتيجة البحث مرتبةً في قائمة أسفل رابط الصفحة الرئيسية، إذ تُدعى هذه الصفحات باسم <a href="https://academy.hsoub.com/marketing/search-engine-optimisation/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D9%85%D8%B3%D8%A7%D8%B9%D8%AF%D8%A9-%D8%A7%D9%84%D8%B1%D9%88%D8%A7%D8%A8%D8%B7-%D8%A7%D9%84%D8%AF%D8%A7%D8%AE%D9%84%D9%8A%D8%A9-%D8%B9%D9%84%D9%89-%D8%AA%D8%AD%D8%B3%D9%8A%D9%86-%D9%85%D8%AD%D8%B1%D9%83%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%AD%D8%AB-seo-r576/" rel="">الروابط الداخلية siteLink</a> ويمكن إدارتها من خلال الأداة <a href="https://www.google.com/webmasters/tools/" rel="external nofollow">Google's webmaster tools</a> لتبدو نتائج البحث أفضل.
</p>

<p>
	<strong>ملاحظة</strong>: لم تعُد بعض البيانات الوصفية مستخدَمةً حاليًا مثل الكلمات المفتاحية "keywords":
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_92_49" style="">
<span class="tag">&lt;meta</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"keywords"</span><span class="pln"> </span><span class="atn">content</span><span class="pun">=</span><span class="atv">"fill, in, your, keywords, here"</span><span class="tag">&gt;</span></pre>

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

<h3>
	أنواع أخرى من البيانات الوصفية
</h3>

<p>
	قد تصادف في رحلتك ضمن عالم ويب أنواع أخرى من البيانات الوصفية، والكثير من الميزات التي ستراها في مواقع الويب هي ملكية إبداعية خاصة صُمِّمت لتزويد بعض المواقع بمعلومات محددة مثل مواقع التواصل الاجتماعي، فقد طوّرت الفيسبوك مثلًا بروتوكول بيانات وصفية يُدعى <a href="https://ogp.me/" rel="external nofollow">Open Graph Data</a> لكي يقدّم بيانات وصفيةً غنيةً عن موقع ما، فإذا اطلعت على الشيفرة المصدرية لموقع "MDN Web Docs"، فستجد التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_92_51" style="">
<span class="tag">&lt;meta</span><span class="pln"> </span><span class="atn">property</span><span class="pun">=</span><span class="atv">"og:image"</span><span class="pln"> </span><span class="atn">content</span><span class="pun">=</span><span class="atv">"https://developer.mozilla.org/static/img/opengraph-logo.png"</span><span class="tag">&gt;</span><span class="pln">
</span><span class="tag">&lt;meta</span><span class="pln"> </span><span class="atn">property</span><span class="pun">=</span><span class="atv">"og:description"</span><span class="pln"> </span><span class="atn">content</span><span class="pun">=</span><span class="atv">"The Mozilla Developer Network (MDN) provides
information about Open Web technologies including HTML, CSS, and APIs for both Web sites
and HTML5 Apps. It also documents Mozilla products, like Firefox OS."</span><span class="tag">&gt;</span><span class="pln">
</span><span class="tag">&lt;meta</span><span class="pln"> </span><span class="atn">property</span><span class="pun">=</span><span class="atv">"og:title"</span><span class="pln"> </span><span class="atn">content</span><span class="pun">=</span><span class="atv">"Mozilla Developer Network"</span><span class="tag">&gt;</span></pre>

<p>
	سيظهر الرابط مزوّدًا بصورة ووصف للموقع عندما تضع رابطًا إلى موقع "MDN Web Docs" على فيسبوك، مما يزيد غنى <a href="https://academy.hsoub.com/design/user-experience/%d9%85%d8%af%d8%ae%d9%84-%d8%a5%d9%84%d9%89-%d8%aa%d8%ac%d8%b1%d8%a8%d8%a9-%d8%a7%d9%84%d9%85%d8%b3%d8%aa%d8%ae%d8%af%d9%85-user-experience-r149/" rel="">تجربة المستخدِم</a>:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="110778" href="https://academy.hsoub.com/uploads/monthly_2022_10/06_og_metadata_MDN.png.787c7c7e2f3fc458a744cdca1c8d5e23.png" rel=""><img alt="عرض صورة ووصف موقع MDN Web Docs المضاف بشيفرة HTML" class="ipsImage ipsImage_thumbnailed" data-fileid="110778" data-unique="dmfjeda20" src="https://academy.hsoub.com/uploads/monthly_2022_10/06_og_metadata_MDN.png.787c7c7e2f3fc458a744cdca1c8d5e23.png" style="width: 550px; height: auto;"></a>
</p>

<p>
	يستخدِم تويتر بروتوكولًا وصفيًا مماثلًا يُدعى <a href="https://developer.twitter.com/en/docs/tweets/optimize-with-cards/overview/abouts-cards" rel="external nofollow">Twitter Cards</a> يقدِّم محتوًى غنيًا عن <a href="https://academy.hsoub.com/programming/general/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%B9%D9%86%D9%88%D8%A7%D9%86-url-%D9%88%D8%A3%D9%86%D9%88%D8%A7%D8%B9%D9%87-r1435/" rel="">عنوان URL</a> محدد عندما يُعرض على <code>twitter.com</code>، وإليك مثالًا كما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_92_58" style="">
<span class="tag">&lt;meta</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"twitter:title"</span><span class="pln"> </span><span class="atn">content</span><span class="pun">=</span><span class="atv">"Mozilla Developer Network"</span><span class="tag">&gt;</span></pre>

<h2>
	إضافة أيقونات مخصصة إلى صفحتك
</h2>

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

<ol>
<li>
		احفظ الأيقونة المطلوبة باللاحقة <code>ico.</code> في المجلد نفسه الذي يحتوي على الصفحة <code>index.html</code>، وقد تدعم بعض المتصفحات لواحق أخرى مثل <code>gif.</code> أو <code>png.</code>، لكن يضمن لك استخدام اللاحقة السابقة العمل على أيّ متصفح رجوعًا إلى إنترنت أكسبلورر 6.
	</li>
	<li>
		أضف السطر التالي إلى ترويسة ملف HTML:
	</li>
</ol>
<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_92_60" style="">
<span class="tag">&lt;link</span><span class="pln"> </span><span class="atn">rel</span><span class="pun">=</span><span class="atv">"icon"</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"favicon.ico"</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"image/x-icon"</span><span class="tag">&gt;</span></pre>

<p>
	إليك مثالًا عن أيقونة مفضلة إلى جانب علامة مرجعية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="110779" href="https://academy.hsoub.com/uploads/monthly_2022_10/07_favico.png.d4d231bb3b5cf0921c016ebee63d41bf.png" rel=""><img alt="مثال عن أيقونة مفضلة إلى جانب علامة مرجعية مضافة باستعمال HTML" class="ipsImage ipsImage_thumbnailed" data-fileid="110779" data-unique="7z1ekwzhv" src="https://academy.hsoub.com/uploads/monthly_2022_10/07_favico.png.d4d231bb3b5cf0921c016ebee63d41bf.png" style="width: 650px; height: auto;"></a>
</p>

<p>
	ستجد أيضًا الكثير من أنواع الأيقونات حاليًا، فإذا فتحت الشيفرة المصدرية لموقع "MDN Web Docs"، فستجد التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_92_64" style="">
<span class="com">&lt;!-- third-generation iPad with high-resolution Retina display: --&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">"apple-touch-icon-precomposed"</span><span class="pln"> </span><span class="atn">sizes</span><span class="pun">=</span><span class="atv">"144x144"</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"https://developer.mozilla.org/static/img/favicon144.png"</span><span class="tag">&gt;</span><span class="pln">
</span><span class="com">&lt;!-- iPhone with high-resolution Retina display: --&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">"apple-touch-icon-precomposed"</span><span class="pln"> </span><span class="atn">sizes</span><span class="pun">=</span><span class="atv">"114x114"</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"https://developer.mozilla.org/static/img/favicon114.png"</span><span class="tag">&gt;</span><span class="pln">
</span><span class="com">&lt;!-- first- and second-generation iPad: --&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">"apple-touch-icon-precomposed"</span><span class="pln"> </span><span class="atn">sizes</span><span class="pun">=</span><span class="atv">"72x72"</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"https://developer.mozilla.org/static/img/favicon72.png"</span><span class="tag">&gt;</span><span class="pln">
</span><span class="com">&lt;!-- non-Retina iPhone, iPod Touch, and Android 2.1+ devices: --&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">"apple-touch-icon-precomposed"</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"https://developer.mozilla.org/static/img/favicon57.png"</span><span class="tag">&gt;</span><span class="pln">
</span><span class="com">&lt;!-- basic favicon --&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">"icon"</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"https://developer.mozilla.org/static/img/favicon32.png"</span><span class="tag">&gt;</span></pre>

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

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

<p>
	<strong>ملاحظة</strong>: في حال استخدمت سياسة خصوصية المحتوى Content Security Policy أو CSP اختصارًا في موقعك، فستُطبق هذه السياسة على أيقونة المفضلة favico، فإذا لم يُحمّل المتصفح هذه الأيقونة، فتأكد من أنّ التوجيه <code>img-src</code> العائد للترويسة <code>Content-Security-Policy</code> لا يعيق الوصول إلى الأيقونة.
</p>

<h2>
	تطبيق تنسيقات CSS وشيفرة جافاسكربت على لغة HTML
</h2>

<p>
	تستخدِم معظم المواقع في أيامنا هذه <a href="https://academy.hsoub.com/programming/css/" rel="">لغة CSS</a> لتحسين مظهر الصفحة وجافاسكربت لإكساب الصفحة قدرات تفاعلية مع المستخدِم مثل مشغلات الفيديو والخرائط والألعاب وغيرها، إذ تُطبَّق هذه الأمور على الصفحات باستخدام العنصر <code>&lt;link&gt;</code> والعنصر <code>&lt;script&gt;</code>:
</p>

<ul>
<li>
		<code>&lt;link&gt;</code>: ينبغي وضع هذا العنصر ضمن ترويسة الملف <code><a href="https://wiki.hsoub.com/HTML/head" rel="external">&lt;head&gt;</a></code> ويمتلك صفتين هما <code>"rel="stylesheet</code> والتي تشير إلى أنّ الرابط سيستخدَم لتنسيق الصفحة، و<a href="https://wiki.hsoub.com/HTML/a#href" rel="external">السمة href</a> التي تحدد مسارًا إلى ملف التنسيق:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_92_73" style="">
<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">"my-css-file.css"</span><span class="tag">&gt;</span></pre>

<ul>
<li>
		<code>&lt;script&gt;</code>: ينبغي أن يكون أيضًا ضمن الترويسة، كما ينبغي أن يمتلك السمة <code><a href="https://wiki.hsoub.com/HTML/img#src" rel="external">src</a></code> التي تحتوي على مسار ملف جافاسكربت الذي تريد استخدامه، بالإضافة إلى السمة <code>defer</code> التي تدفع بالمتصفح إلى تحميل ملف الشيفرة بعد الانتهاء من تفسير شيفرة لغة HTML، وللأمر أهميته في ضمان تحميل كل عناصر لغة HTML قبل تشغيل <a href="https://academy.hsoub.com/programming/javascript/%D9%86%D9%85%D8%B7-%D9%83%D8%AA%D8%A7%D8%A8%D8%A9-%D8%B4%D9%8A%D9%81%D8%B1%D8%A9-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA-r785/" rel="">شيفرة جافاسكربت</a>، وبالتالي لن تقع أخطاء نتيجة محاولة جافاسكربت الوصول إلى عناصر لغة HTML غير موجودة بعد في الصفحة، وهناك طرق عدة للتحكم بتحميل شيفرة جافاسكربت ضمن الصفحات، لكنه الأسلوب الأكثر فعاليةً واستخدامًا في المتصفحات الحديثة:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_92_78" style="">
<span class="tag">&lt;script</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"my-js-file.js"</span><span class="pln"> </span><span class="atn">defer</span><span class="tag">&gt;&lt;/script&gt;</span></pre>

<p>
	<strong>ملاحظة</strong>: قد يبدو لك العنصر <a href="https://wiki.hsoub.com/HTML/script" rel="external"><code>&lt;script&gt;</code></a> فارغًا لكنه ليس كذلك، كما ينبغي استخدام وسم النهاية، إذ نستطيع أيضًا كتابة الشيفرة داخل هذا العنصر بدلًا من الإشارة إلى ملف خارجي.
</p>

<h3>
	تطبيق: استخدام لغة CSS ولغة جافاسكربت في صفحتنا
</h3>

<ol>
<li>
		لبدء العمل على هذا التطبيق، أحضر نسخًا عن الملفات <a href="https://github.com/mdn/learning-area/blob/master/html/introduction-to-html/the-html-head/meta-example.html" rel="external nofollow">meta-example.html</a> و <a href="https://github.com/mdn/learning-area/blob/master/html/introduction-to-html/the-html-head/script.js" rel="external nofollow">script.js</a> و <a href="https://github.com/mdn/learning-area/blob/master/html/introduction-to-html/the-html-head/style.css" rel="external nofollow">style.css</a> وخزِّنها على حاسوبك في المجلد نفسه، ثم تأكد من حفظها تمامًا بالأسماء واللواحق -أي الامتدادات- السابقة.
	</li>
	<li>
		افتح ملف HTML في المتصفح وفي محرِّر النصوص معًا.
	</li>
	<li>
		أضف العنصر <code>&lt;link&gt;</code> إلى شيفرة HTML لكي تشير إلى ملفَي <a href="https://academy.hsoub.com/programming/css/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%84%D8%BA%D8%A9-css-r1688/" rel="">CSS</a> و<a href="https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D8%B3%D8%B1%D9%8A%D8%B9-%D8%A5%D9%84%D9%89-%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D9%8A%D8%A8%D8%AA-javascript-r550/" rel="">جافاسكربت</a> كلًا على حدة كما فعلنا سابقًا.
	</li>
</ol>
<p>
	إذا نجحت في تنفيذ الأمر، فسترى أنّ الأمور قد تغيرت ليعرض المتصفح بعد تحديثه ما يلي:
</p>

<p style="text-align: center;">
	<img alt="نتائج استخدام لغة CSS ولغة جافاسكربت في صفحة بُنيت على HTML" class="ipsImage ipsImage_thumbnailed" data-fileid="110780" data-unique="0a9bi5yoa" src="https://academy.hsoub.com/uploads/monthly_2022_10/js-and-css.png.eeba31f1b97226a829cd1e6c046e4abc.png" style="width: 650px; height: auto;"></p>

<ul>
<li>
		أضافت شيفرة جافاسكربت قائمةً فارغةً إلى الصفحة، فإذا نقرت الآن في أيّ مكان من الصفحة، فستظهر لك رسالةً منبثقةً تسألك إضافة بعض الكلمات لتكوين عنصر قائمة جديد، وعند النقر على الزر "موافق OK"، سيُضاف عنصر جديد إلى القائمة يحمل النص الذي أدخلته؛ أما عندما تنقر على عنصر قائمة موجود، فستظهر لك رسالة منبثقة لتغيير محتوى هذا العنصر.
	</li>
	<li>
		غيّرت CSS الخلفية إلى اللون الأخضر وكبّرت حجم النص، كما غيّرت في تنسيق بعض العناصر التي أضافتها جافاسكربت، أي الشريط الأحمر والإطار الأسود للقائمة التي ولّدتها جافاسكربت.
	</li>
</ul>
<p>
	<strong>ملاحظة</strong>: لو وجدت نفسك تائهًا في هذا التمرين ولم تتمكن من إحضار ملفات CSS وجافاسكربت، فحاول التحقق من الملف <a href="https://github.com/mdn/learning-area/blob/master/html/introduction-to-html/the-html-head/css-and-js.html" rel="external nofollow">css-and-js.html</a>.
</p>

<h2>
	ضبط اللغة الرئيسية للصفحة
</h2>

<p>
	لابد أخيرًا من الإشارة إلى إمكانية وضرورة تحديد لغة الصفحة، فيمكن إنجاز الأمر من خلال السمة <code>lang</code> للعنصر الجذري <a href="https://wiki.hsoub.com/HTML/html" rel="external"><code>&lt;html&gt;</code></a>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_92_86" style="">
<span class="tag">&lt;html</span><span class="pln"> </span><span class="atn">lang</span><span class="pun">=</span><span class="atv">"en-US"</span><span class="tag">&gt;</span></pre>

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

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_92_84" style="">
<span class="tag">&lt;p&gt;</span><span class="pln">Japanese example: </span><span class="tag">&lt;span</span><span class="pln"> </span><span class="atn">lang</span><span class="pun">=</span><span class="atv">"ja"</span><span class="tag">&gt;</span><span class="pln">ご飯が熱い。</span><span class="tag">&lt;/span&gt;</span><span class="pln">.</span><span class="tag">&lt;/p&gt;</span></pre>

<p>
	<strong>ملاحظة</strong>: تُحدَّد رموز اللغات بواسطة المعيار <a href="https://en.wikipedia.org/wiki/ISO_639-1" rel="external nofollow">ISO 639-1</a>.
</p>

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

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

<p>
	ترجمة -وبتصرف- للمقال <a href="https://developer.mozilla.org/en-US/docs/Learn/HTML/Introduction_to_HTML/The_head_metadata_in_HTML" rel="external nofollow">What’s in the head? Metadata in HTML</a>.
</p>

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

<ul>
<li>
		<a href="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/" rel="">HTML و CSS للمبتدئين: كيف تصمم أول صفحة ويب لك</a>
	</li>
	<li>
		<a href="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/" rel="">HTML و CSS للمبتدئين: مقدمة إلى تنسيقات CSS</a>
	</li>
	<li>
		<a href="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/" rel="">خمسة أشياء عليك معرفتها عن HTML5</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/html/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D8%B5%D9%81%D9%8A%D8%A9-microdata-%D9%81%D9%8A-html5-r375/" rel="">مدخل إلى البيانات الوصفية (microdata) في HTML5</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1753</guid><pubDate>Sun, 30 Oct 2022 07:30:27 +0000</pubDate></item><item><title>&#x62A;&#x639;&#x631;&#x641; &#x639;&#x644;&#x649; &#x644;&#x63A;&#x629; HTML</title><link>https://academy.hsoub.com/programming/html/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%84%D8%BA%D8%A9-html-r1752/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_10/635e18e8126d5_----html.jpg.85cc8413d3dc47ab53cbeaefe2ce5d9c.jpg" /></p>
<p>
	يغطِّي هذا المقال المبادئ الأكثر بساطة لتنطلق، إذ يعرِّف مفهوم العناصر elements والسمات attributes وغيرها من المفاهيم المهمة ويعرض كيفية استخدامها، ثم ينتقل إلى عرض هيكلية صفحة مكتوبة <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> وكيف تُنظَّم العناصر داخلها، بالإضافة إلى شرح ميزات أساسية مهمة أخرى، كما ستجد خلال قراءتك لهذا المقال بعض الأمثلة التطبيقية التي تعطيك فرصة لتجريب ما تتعلمه، ولا بد أن تمتلك خلفيةً بسيطةً عن الحواسب قبل أن تبدأ قراءة المقال، كما يتطلب الأمر درايةً <span ipsnoautolink="true">بالبرمجيات التي ينبغي تثبيتها لبدء العمل</span>، ودرايةً ولو بسيطة <span ipsnoautolink="true">بالتعامل مع الملفات</span>.
</p>

<h2>
	ما هي لغة HTML؟
</h2>

<p>
	لا تمثِّل لغة توصيف النص التشعبي Hypertext Markup Language أو <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> اختصارًا لغة برمجة، وإنما لغةً وصفيةً تساعد المتصفحات على <a href="https://academy.hsoub.com/design/general/%d9%87%d9%8a%d9%83%d9%84%d8%a9-%d9%88%d8%aa%d9%88%d8%b2%d9%8a%d8%b9-%d9%85%d8%ad%d8%aa%d9%88%d9%89-%d8%b5%d9%81%d8%ad%d8%a7%d8%aa-%d8%a7%d9%84%d9%88%d9%8a%d8%a8-r43/" rel="">هيكلة صفحات الويب</a> التي تزورها، وقد تكون الصفحات بسيطةً جدًا أو معقدةً جدًا وفقًا لرؤية مطور ويب.
</p>

<p>
	تتألف لغة HTML من سلسلة من <a href="https://wiki.hsoub.com/%D8%AA%D8%B5%D9%86%D9%8A%D9%81:HTML_Elements" rel="external">العناصر</a> التي تستخدِمها في إحاطة أو تغليف أو توصيف الأجزاء المختلفة للمحتوى الذي تريد عرضه ليظهر أو يسلك سلوكًا محددًا، فقد تُستخدَم الوسوم tags المحيطة بالمحتوى لتوصيف رابط تشعبي إلى صفحة أخرى أو لإظهار نص بحروف مائلة أو غير ذلك، ولنتأمل على سبيل المثال المحتوى النصي التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2649_9" style=""><span class="pln">My cat is very grumpy</span></pre>

<p>
	إذا أردت أن يكون المحتوى فقرةً نصيةً مستقلةً بذاتها، فيمكن إحاطتها بوسمَي بداية ونهاية <a href="https://wiki.hsoub.com/HTML/p" rel="external">عنصر الفقرة النصية &lt;p&gt;</a>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2649_11" style=""><span class="tag">&lt;p&gt;</span><span class="pln">My cat is very grumpy</span><span class="tag">&lt;/p&gt;</span></pre>

<p>
	<strong>ملاحظة</strong>: لا تُعَدّ وسوم لغة HTML حساسةً لحالة الأحرف، أي من الممكن كتابتها بحروف كبيرة أو صغيرة، إذ يمكن كتابة <a href="https://wiki.hsoub.com/HTML/title" rel="external">العنصر &lt;title&gt;</a> مثلًا بالصورة <code>&lt;TITLE&gt;</code> أو <code>&lt;Title&gt;</code> أو <code>&lt;TiTlE&gt;</code> وسيعمل، لكن كتابة الوسوم بأحرف صغيرة هي ممارسة تطبيقية جيدة تسهِّل قراءة الشيفرة وتُظهر استمرارية في أسلوب الكتابة.
</p>

<h2>
	تشريح عنصر HTML
</h2>

<p>
	لنلق نظرةً أعمق على عنصر الفقرة <code>&lt;P&gt;</code>:
</p>

<p style="text-align: center;">
	<img alt="شرح عنصر الفقرة &lt;P&gt; من لغة HTML" class="ipsImage ipsImage_thumbnailed" data-fileid="110767" data-unique="87neuku07" style="width: 500px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2022_10/01_paragrhap_element.png.22a73f299f1073d64b7876267f601028.png">
</p>

<p>
	يتكوَّن العنصر من:
</p>

<ol>
	<li>
		<strong>وسم البداية Opening tag</strong>: يتكون من اسم العنصر -أي <code>p</code> في حالتنا- محاطًا بقوسَي زاوية، كما يشير هذا الوسم إلى النقطة التي يبدأ عندها العنصر أو التي يبدأ تأثيره عندها (بداية الفقرة النصية في حالتنا).
	</li>
	<li>
		<strong>وسم النهاية Closing tag</strong>: يشابه وسم البداية لكنه يبدأ بشرطة أمامية <code>/</code> قبل اسم العنصر، ويشير هذا الوسم إلى نهاية العنصر -أي نهاية الفقرة في حالتنا-، ويُعَدّ إغفال وسم النهاية من أكثر الأخطاء التي يرتكبها المبتدئون وقد تفضي إلى نتائج غريبة بالفعل.
	</li>
	<li>
		<strong>المحتوى Content</strong>: يشير إلى المحتوى الفعلي للعنصر وهو في حالتنا نص فقط.
	</li>
	<li>
		<strong>العنصر Element</strong>: يتكون من وسمَي البداية والنهاية وبينهما المحتوى.
	</li>
</ol>

<h3>
	تطبيق: إنشاء أول عنصر في لغة HTML
</h3>

<p>
	استخدم منطقة تحرير الشيفرة Editable code في المحرِّر المضمّن التالي لتغليف السطر المكتوب في تلك المنطقة وذلك بإضافة <a href="https://wiki.hsoub.com/HTML/em" rel="external">الوسم &lt;em&gt;</a> قبل السطر والوسم <code>&lt;em/&gt;</code> بعده، إذ سيؤدي ذلك إلى ظهور السطر مكتوبًا بأحرف مائلة، وسترى نتيجة عملك في منطقة الخرج المباشر Live Output"، فإذا ارتكبت خطأً، فيمكنك مسح ما كتبته بالنقر على زر إعادة ضبط Reset، في حين إذا وجدت نفسك تائهًا كليًا، فانقر على زر "أظهر الحل Show solution" لترى الحل الصحيح.
</p>

<div style="text-align: center; font-family: Arial, sans-serif; margin: 20px;">
	<textarea id="htmlEditor" style="width: 80%; max-width: 900px; height: 150px; padding: 10px; border: 2px solid #0072b3; border-radius: 5px; font-family: monospace; font-size: 14px;">مرحبًا بالعالم
  </textarea><br>
	<br>
	<button onclick="previewHTML()" style="padding: 10px 20px; font-size: 16px; background-color: #0072b3; color: white; border: none; border-radius: 5px; cursor: pointer;">معاينة</button><br>
	<br>
	<iframe id="preview" style="width:80%; max-width: 900px; height: 100px; border: 3px solid #0072b3; border-radius: 5px;"></iframe>
</div>
<script>
function previewHTML() {
  const html = document.getElementById('htmlEditor').value;
  const iframe = document.getElementById('preview');
  iframe.srcdoc = html;
}
</script>

<h3>
	عناصر متداخلة
</h3>

<p>
	يمكن وضع عناصر داخل عناصر أخرى أيضًا وهذا ما يُعرَف بالتداخل nesting، فإذا أردنا إظهار الكلمة "very" في الفقرة "My cat is very grumpy" بخط سميك، فيمكن تغليف هذه الكلمة داخل <a href="https://wiki.hsoub.com/HTML/strong" rel="external">العنصر &lt;strong&gt;</a> كما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2649_20" style=""><span class="tag">&lt;p&gt;</span><span class="pln">My cat is </span><span class="tag">&lt;strong&gt;</span><span class="pln">very</span><span class="tag">&lt;/strong&gt;</span><span class="pln"> grumpy.</span><span class="tag">&lt;/p&gt;</span></pre>

<p>
	لكن عليك أن تتأكد دومًا من تداخل العناصر بصورة صحيحة، فقد فتحنا في المثال السابق العنصر <code>&lt;p&gt;</code> أولًا ثم <code>&lt;strong&gt;</code>، وبالتالي توجَّب علينا إغلاق العنصر الثاني على الصورة <code>&lt;strong/&gt;</code> ثم إغلاق الأول <code>&lt;p/&gt;</code>، وبالتالي يكون التداخل التالي غير صحيح:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2649_22" style=""><span class="tag">&lt;p&gt;</span><span class="pln">My cat is </span><span class="tag">&lt;strong&gt;</span><span class="pln">very grumpy.</span><span class="tag">&lt;/p&gt;&lt;/strong&gt;</span></pre>

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

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

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

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

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

<h3>
	العناصر الكتلية والعناصر السطرية
</h3>

<p>
	تصنَّف عناصر <a href="ttps://academy.hsoub.com/programming/html" rel="">لغة HTML</a> ضمن مجموعتين مهمتين هما مجموعة العناصر الكتلية Block elements والسطرية inline elements:
</p>

<ul>
	<li>
		<strong>العناصر الكتلية</strong>: تشكل كتلةً مرئيةً ضمن الصفحة، كما تظهر في سطر جديد بعد العنصر الذي يسبقها، أي لا يمكن أن يقع على سطر آخر مع عنصر آخر، وسيظهر العنصر الذي يليه في سطر جديد أيضًا، كما تُعَدّ العناصر الكتلية في الصفحة عناصر هيكلة وتنظيم، فقد تمثِّل فقرةً نصيةً أو عناوين أو قوائم تعداد أو قوائم تنقل أو حواشي سفلية، وتجدر الإشارة إلى أنّ العناصر الكتلية لا توضَع ضمن عناصر سطرية لكنها قد تتداخل مع بعضها.
	</li>
	<li>
		<strong>العناصر السطرية</strong>: تقع داخل العناصر الكتلية وتحيط بأجزاء صغيرة من المحتوى، أي جزء من فقرة نصية أو مجموعة من بنود قائمة، ولا تسبب هذه العناصر ظهور سطر جديد في المستند، أي لا تشغل بنفسها السطر بالكامل، كما تُستخدَم هذه العناصر مع النصوص غالبًا، إذ ينشئ <a href="https://wiki.hsoub.com/HTML/a" rel="external">العنصر &lt;a&gt;</a> مثلًا رابطًا تشعبيًا، في حين يميِّز العنصران <code>&lt;em&gt;</code> و <code>&lt;strong&gt;</code> أجزاءً من النص.
	</li>
</ul>

<p>
	انظر إلى المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2649_25" style=""><span class="tag">&lt;em&gt;</span><span class="pln">first</span><span class="tag">&lt;/em&gt;&lt;em&gt;</span><span class="pln">second</span><span class="tag">&lt;/em&gt;&lt;em&gt;</span><span class="pln">third</span><span class="tag">&lt;/em&gt;</span><span class="pln">

</span><span class="tag">&lt;p&gt;</span><span class="pln">fourth</span><span class="tag">&lt;/p&gt;&lt;p&gt;</span><span class="pln">fifth</span><span class="tag">&lt;/p&gt;&lt;p&gt;</span><span class="pln">sixth</span><span class="tag">&lt;/p&gt;</span></pre>

<p>
	لاحظ أنّ <code>&lt;em&gt;</code> هو عنصر سطري، وكما ترى في النتيجة، ستقع العناصر الثلاث الأولى على السطر ذاته دون أية فراغات بينها، لكن من ناحية أخرى سيظهر العنصر الكتلي <code>&lt;p&gt;</code> في سطر جديد، بحيث يسبقه فراغ ويليه فراغ، وهذه الفراغات هي نتيجة لتطبيق تنسيق <a href="https://academy.hsoub.com/programming/css/%d8%aa%d8%b9%d8%b1%d9%91%d9%81-%d8%b9%d9%84%d9%89-%d8%a3%d8%b3%d8%a7%d8%b3%d9%8a%d8%a7%d8%aa-css-r70/" rel="">CSS</a> الافتراضي لعنصر الفقرة النصية <code>&lt;p&gt;</code>.
</p>

<p style="text-align: center;">
	<img alt="image.png" class="ipsImage ipsImage_thumbnailed" data-fileid="181851" data-ratio="28.82" data-unique="ftyahkveu" width="753" src="https://academy.hsoub.com/uploads/monthly_2026_03/image.png.39fcc68b0b77dd4543171f2eba811e1d.png">
</p>

<p>
	<strong>ملاحظات</strong>:
</p>

<ul>
	<li>
		أعادت لغة HTML بنسختها الخامسة -أي HTML5- تعريف فئات العناصر، وعلى الرغم من دقة التعاريف الجديدة وتفاديها للكثير من الغموض الذي يلف بعض العناصر، إلا أنها أكثر تعقيدًا موازنةً بمفهومَي العنصر الكتلي والسطري، لذلك سنبقى في مقالنا مع هذين المفهومين.
	</li>
	<li>
		لا يجب الخلط بين مفهومَي العنصر الكتلي والسطري مع أنواع <a href="https://academy.hsoub.com/programming/css/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D8%B5%D9%86%D8%A7%D8%AF%D9%8A%D9%82-boxes-%D9%81%D9%8A-css-r263/" rel="">صناديق CSS</a> التي تحمل الأسماء نفسها، وعلى الرغم من الترابط الافتراضي للأسماء في الحالتين، فإنّ تغيير قيمة الخاصية <code>display</code> عند تنسيق العنصر لن يغير من الفئة التي ينتمي إليها العنصر أصلًا، أي لن يؤثّر على محتواه من العناصر الأخرى، لهذا تخلّت HTML5 عن مفهومَي العنصر الكتلي والسطري منعًا لهذا الالتباس الشائع.
	</li>
</ul>

<h3>
	العناصر الفارغة
</h3>

<p>
	لا تتقيد جميع العناصر بالنمط المؤلف من وسم البداية والمحتوى ثم وسم النهاية، إذ لا تحتوي بعض العناصر سوى على وسم بداية وتستخدَم عادةً في إدراج شيء ما في الصفحة، كما يُدرَج <a href="https://wiki.hsoub.com/HTML/img" rel="external">العنصر &lt;img&gt;</a> على سبيل المثال على أساس صورة في الصفحة:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2649_30" style=""><span class="tag">&lt;img</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"https://raw.githubusercontent.com/mdn/beginner-html-site/gh-pages/images/firefox-icon.png"</span><span class="tag">&gt;</span></pre>

<p>
	ستكون نتيجة تنفيذ الشيفرة كما يلي:
</p>

<p style="text-align: center;">
	<img alt="image.png" class="ipsImage ipsImage_thumbnailed" data-fileid="181852" data-ratio="100.00" data-unique="6u4zofjfk" width="256" src="https://academy.hsoub.com/uploads/monthly_2026_03/image.png.8d8ecb454972eefdf2f7d522a0d73bb5.png">
</p>

<p>
	<strong>ملاحظة</strong>: تُدعى العناصر الفارغة أحيانًا بالعناصر الخالية void elements ولاحاجةً إلى وضع المحرف <code>/</code> قبل إغلاق الوسم، أي بالشكل <code>&lt;‎img ="cat.jpg" alt="cat" /‎&gt;</code> إلا في حالات خاصة مثل التوافق مع صيغة XML.
</p>

<h2>
	السمات في لغة HTML
</h2>

<p>
	يمكن أن تحمل عناصر لغة HTML سمات، وتبدو السمات كما يلي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="110768" href="https://academy.hsoub.com/uploads/monthly_2022_10/02_elements_attribute.png.9efda7286dedad27e223ed7d465fdaa4.png" rel=""><img alt="السمات في لغة HTML" class="ipsImage ipsImage_thumbnailed" data-fileid="110768" data-unique="45dd1w27g" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2022_10/02_elements_attribute.thumb.png.1bb3ece2944c0159b1547de9a50ced8d.png"></a>
</p>

<p>
	تحتوي السمات على معلومات إضافية عن العنصر، ولا تظهر مع المحتوى الذي يعرضه، إذ تُشير السمة <code>class</code> في الصورة السابقة مثلًا إلى اسم يُستخدَم لتطبيق تنسيقات محددة على العنصر.
</p>

<p>
	ينبغي أن تُكتب السمة بحيث تراعي ما يلي:
</p>

<ul>
	<li>
		توجد مسافة فارغة بينها وبين اسم العنصر، كما ينبغي أن تفصل مسافة فارغة بينها وبين السمة التي تليها إذا وجدت.
	</li>
	<li>
		تلي اسم السمة إشارة مساواة <code>=</code>.
	</li>
	<li>
		توضع قيمة السمة بين إشارتي تنصيص مزدوجتين <code>" "</code>.
	</li>
</ul>

<h3>
	تطبيق عملي: إضافة سمات إلى عنصر HTML
</h3>

<p>
	يُدعى العنصر <code>&lt;a&gt;</code> بعنصر المربط anchor الذي يحوّل النص الموجود ضمنه إلى رابط تشعبي، كما يمكن أن تحمل المرابط سمات عدة منها:
</p>

<ul>
	<li>
		<code><a href="https://wiki.hsoub.com/HTML/a#href" rel="external">href</a></code>: إن قيمة هذه السمة هي عنوان ويب للرابط التشعبي مثل <code>"href="<span ipsnoautolink="true">https://www.mozilla.org</span></code>.
	</li>
	<li>
		<code><a href="https://wiki.hsoub.com/HTML/title" rel="external">title</a></code>: تستخدَم لإدراج معلومات إضافية عن الرابط مثل وصف الصفحة التي سينقلنا إليها، أي مثل <code>title="The Mozilla homepage"</code>، كما تظهر هذه المعلومات على أساس تلميح فوق الرابط عندما تمرِّر مؤشر الفارة فوقه.
	</li>
	<li>
		<code><a href="https://wiki.hsoub.com/HTML/a#target" rel="external">target</a></code>: تستخدَم لتحديد طريقة عرض الصفحة التي ينقلنا إليها الرابط مثل <code>"target="_blank</code>، إذ سيعرض لك المتصفح الآن الصفحة في نافذة جديدة، في حين سيعرض المتصفح هذه الصفحة في النافذة نفسها ما لم تستخدم هذه السمة.
	</li>
</ul>

<p>
	سنحاول تحويل السطر الموجود في منطقة تحرير الشيفرة إلى مربط كما يلي:
</p>

<ol>
	<li>
		أضف الوسم <code>&lt;a&gt;</code>.
	</li>
	<li>
		أضف الصفتين <code>href</code> و <code>title</code>.
	</li>
	<li>
		حدد طريقة عرض صفحة الرابط من خلال السمة <code>target</code>.
	</li>
</ol>

<p>
	سترى نتيجة عملك في منطقة عرض النتيجة، ومن المفترض أن ترى رابطًا يعرض قيمة السمة <code>title</code>عندما تمرِّر المؤشر فوقه، وينقلك عند النقر عليه إلى الصفحة التي حددتها في السمة <code>href</code>، وتذكَّر أن تضع مسافة فارغة بين اسم العنصر والسمات.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9402_7" style=""><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">https://www.mozilla.org</span><span class="pun">/</span><span class="pln"> </span><span class="atn">title</span><span class="pun">=</span><span class="atv">The</span><span class="pln"> </span><span class="atn">Mozilla</span><span class="pln"> </span><span class="atn">homepage</span><span class="pln"> </span><span class="atv">"target="</span><span class="pln">_</span><span class="atn">blank</span><span class="tag">&gt;</span><span class="pln">favorite website</span><span class="tag">&lt;/a&gt;</span></pre>

<h3>
	السمات المنطقية
</h3>

<p>
	قد تلاحظ أحيانًا سمات دون قيم، وتُدعى هذه السمات بالسمات المنطقية Boolean، إذ تمتلك هذه السمات قيمةً واحدةً وعادةً ما تكون هذه القيمة مطابقةً لاسم السمة، ونضرب مثلًا على ذلك السمة <code>disabled</code> التي تضاف إلى عنصر الإدخال النصي، بحيث تمنع المستخدِم من الكتابة ضمن مربع النص الذي يبدو رماديًا:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2649_38" style=""><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"text"</span><span class="pln"> </span><span class="atn">disabled</span><span class="pun">=</span><span class="atv">"disabled"</span><span class="tag">&gt;</span></pre>

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

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2649_40" style=""><span class="com">&lt;!-- لمنع المستخدم من الكتابة ضمن المربع النصي disabled استخدام السمة --&gt;</span><span class="pln">
</span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"text"</span><span class="pln"> </span><span class="atn">disabled</span><span class="tag">&gt;</span><span class="pln">

</span><span class="com">&lt;!-- لا يضم عنصر الإدخال النصي هذه السمة ويمكن للمستخدم الكتابة ضمنه --&gt;</span><span class="pln">
</span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"text"</span><span class="tag">&gt;</span></pre>

<p>
	تعطيك الشيفرة في فقرة "السمات المنطقية" النتيجة التالية عند تنفيذها:
</p>

<p style="text-align: center;">
	<img alt="image.png" class="ipsImage ipsImage_thumbnailed" data-fileid="181853" data-ratio="7.70" data-unique="zonnnn5aj" width="740" src="https://academy.hsoub.com/uploads/monthly_2026_03/image.png.5f14a39873a6f73427601113e079a68d.png">
</p>

<h3>
	حذف إشارتي التنصيص المحيطتين بقيمة السمة
</h3>

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

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2649_42" style=""><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">https://www.mozilla.org</span><span class="tag">/&gt;</span><span class="pln">favorite website</span><span class="tag">&lt;/a&gt;</span></pre>

<p>
	لكن ستظهر المشاكل عندما نطبِّق الأمر نفسه على السمة <code>title</code>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2649_44" style=""><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">https://www.mozilla.org</span><span class="pun">/</span><span class="pln"> </span><span class="atn">title</span><span class="pun">=</span><span class="atv">The</span><span class="pln"> </span><span class="atn">Mozilla</span><span class="pln"> </span><span class="atn">homepage</span><span class="tag">&gt;</span><span class="pln">favorite website</span><span class="tag">&lt;/a&gt;</span></pre>

<p>
	سيخطئ المتصفح في تفسير المطلوب وسيفهم السمة <code>title</code> على أنها ثلاث سمات الأولى هي <code>title</code> وقيمتها "The" وسِمتان منطقيّتان هما <code>Mozilla</code> و <code>homepage</code>، إذ يسبب هذا الأمر أخطاءً غير متوقعة أو سلوكًا غير متوقع لهذا السبب، يجب أن تضع قيمة السمات ضمن إشارتَي تنصيص دومًا لتجنب مشاكل مثل هذه ولتسهِّل قراءة الشيفرة.
</p>

<h3>
	استخدام إشارتي تنصيص مزدوجتين أو مفردتين
</h3>

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

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2649_47" style=""><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"https://www.example.com"</span><span class="tag">&gt;</span><span class="pln">A link to my example.</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">'https://www.example.com'</span><span class="tag">&gt;</span><span class="pln">A link to my example.</span><span class="tag">&lt;/a&gt;</span></pre>

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

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2649_49" style=""><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"https://www.example.com'&gt;</span><span class="pln">A link to my example.</span><span class="tag">&lt;/a&gt;</span></pre>

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

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2649_51" style=""><span class="pln">&lt;--! "" ضع قيمة السمة بين مزدوجتين title لتضع الإشارة ' ضمن قيمة السمة --&gt;
</span><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"https://www.example.com"</span><span class="pln"> </span><span class="atn">title</span><span class="pun">=</span><span class="atv">"Isn't this fun?"</span><span class="tag">&gt;</span><span class="pln">A link to my example.</span><span class="tag">&lt;/a&gt;</span></pre>

<p>
	استخدم كيانات HTML لتضع إشارة تنصيص ضمن إشارتَي تنصيص من النوع نفسه -أي مفردة ضمن مفردتين مثلًا-، إذ تُعَدّ الكتابة التالية خاطئةً:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2649_53" style=""><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">'https://www.example.com'</span><span class="pln"> </span><span class="atn">title</span><span class="pun">=</span><span class="atv">'Isn'</span><span class="atn">t</span><span class="pln"> </span><span class="atn">this</span><span class="pln"> </span><span class="atn">fun</span><span class="pln">?</span><span class="atv">'&gt;</span><span class="pln">A link to my example.</span><span class="tag">&lt;/a&gt;</span></pre>

<p>
	عليك استخدام كيان HTML الذي يعطي المحرف <code>'</code> وهو مجموعة المحارف <code>;apos&amp;</code>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2649_56" style=""><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">'https://www.example.com'</span><span class="pln"> </span><span class="atn">title</span><span class="pun">=</span><span class="atv">'Isn&amp;apos;t this fun?'</span><span class="tag">&gt;</span><span class="pln">A link to my example.</span><span class="tag">&lt;/a&gt;</span></pre>

<h2>
	تشريح مستند HTML
</h2>

<p>
	لا فائدة كبيرة من عناصر لغة HTML بمفردها، وإنما عليك تعلّم كيفية تنظيمها لتبني صفحة ويب بأكملها:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2649_58" 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">My test page</span><span class="tag">&lt;/title&gt;</span><span class="pln">
  </span><span class="tag">&lt;/head&gt;</span><span class="pln">
  </span><span class="tag">&lt;body&gt;</span><span class="pln">
    </span><span class="tag">&lt;p&gt;</span><span class="pln">This is my page</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>

<ul>
	<li>
		<strong>أولًا</strong>: استخدم العنصر:
	</li>
</ul>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2649_60" style=""><span class="dec">&lt;!DOCTYPE html&gt;</span></pre>

<p>
	لقد كانت الغاية من هذا العنصر في الأيام الأولى (1991/1992) أن يعمل على أساس رابط إلى مجموعة من القواعد التي ينبغي أن تحققها صفحة مكتوبة بلغة HTML لكي تُعَدّ صفحةً جيدةً، إذ يبدو هذا العنصر كما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2649_62" style=""><span class="dec">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;</span></pre>

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

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2649_65" style=""><span class="dec">&lt;!DOCTYPE html&gt;</span></pre>

<p>
	أقل مجموعةً من المحارف كي يكون هذا العنصر صالحًا.
</p>

<ul>
	<li>
		<strong>ثانيًا</strong>: استخدم <a href="https://wiki.hsoub.com/HTML/html" rel="external">العنصر &lt;html&gt;&lt;/html&gt;</a> الذي يضم محتوى الصفحة بأكمله، ويعرف أحيانًا بالعنصر الجذري.
	</li>
	<li>
		<strong>ثالثًا</strong>: استخدم <a href="https://wiki.hsoub.com/HTML/head" rel="external">العنصر &lt;head&gt;&lt;/head&gt;</a> الذي يعمل على أساس حاوية لكل ما تريد وضعه في صفحة HTML دون أن يكون جزءًا من المحتوى المعروض للزائر، ويتضمن ذلك الكلمات المفتاحية ووصف الصفحة الذي يظهر في نتائج محركات البحث وملفات تنسيق <a href="https://wiki.hsoub.com/CSS" rel="external">CSS</a> ومجموعة المحارف الكتابية المستخدَمة وغيرها.
	</li>
	<li>
		<strong>رابعًا</strong>: استخدم العنصر <code><a href="https://wiki.hsoub.com/HTML/meta" rel="external">&lt;"meta charset="utf-8&gt;</a></code> الذي يضبط مجموعة المحارف التي تستخدِمها في الصفحة، وهنا اخترنا المجموعة <code>UTF-8</code> التي تضم محارف الأغلبية الساحقة من اللغات المكتوبة، إذ تستطيع هذا المحارف أن تعرض الآن أيّ محتوى نصي بأي لغة قد تضعه في صفحتك، ولا مبرر لعدم ضبط مجموعة المحارف المستخدَمة، كما ستساعدك على تحاشي الكثير من الأخطاء لاحقًا.
	</li>
	<li>
		<strong>خامسًا</strong>: استخدم العنصر <code>&lt;title&gt;&lt;/title&gt;</code> الذي يضبط عنوان صفحتك أعلى المتصفح عند تحميل الصفحة، كما يُستخدَم لوصف الصفحة عندما تضيفها إلى قائمة الصفحات المفضلة.
	</li>
	<li>
		<strong>سادسًا</strong>: استخدم <a href="https://wiki.hsoub.com/HTML/body" rel="external">العنصر &lt;body&gt;&lt;/body&gt;</a> الذي يضم المحتوى الذي تريد عرضه على زائرِي صفحتك بأكمله، سواءً كان نصًا أو صورًا أو فيديو أو ألعاب أو أيّ شيء آخر.
	</li>
</ul>

<h3>
	المسافات الفارغة في HTML
</h3>

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

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2649_75" style=""><span class="tag">&lt;p&gt;</span><span class="pln">Dogs are silly.</span><span class="tag">&lt;/p&gt;</span><span class="pln">

</span><span class="tag">&lt;p&gt;</span><span class="pln">Dogs        are
         silly.</span><span class="tag">&lt;/p&gt;</span></pre>

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

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

<h2>
	كيانات لغة HTML: إضافة محارف خاصة
</h2>

<p>
	تُعَدّ المحارف <code>&lt;</code> و <code>&gt;</code> و <code>"</code> و <code>'</code> و <code>&amp;</code> في HTML محارف خاصة لكونها جزءًا من الصياغة القواعدية للغة، فكيف سنتمكن إذًا من إضافة هذه المحارف إلى محتوى العناصر؟ وكيف سنضع مثلًا إشارة "أكبر من" دون أن تؤثر على تفسير الشيفرة؟ يمكن ذلك من خلال مراجع إلى تلك المحارف، والمراجع هي رموز خاصة تمثِّل محرفًا محددًا يمكن استخدامه في هذه الحالة، كما يبدأ كل مرجع بالمحرف <code>&amp;</code> وينتهي بالمحرف <code>;</code>.
</p>
<style type="text/css">
table {
    width: 100%;
}

thead {
    vertical-align: middle;
    text-align: center;
} 

td, th {
    border: 1px solid #dddddd;
    text-align: right;
    padding: 8px;
    text-align: inherit;

}
tr:nth-child(even) {
    background-color: #dddddd;
}</style>
<table>
	<thead>
		<tr>
			<th>
				المحرف الخاص
			</th>
			<th>
				سلسلة الحروف المرجعية
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>
				&lt;
			</td>
			<td>
				<code>;lt&amp;</code>
			</td>
		</tr>
		<tr>
			<td>
				&gt;
			</td>
			<td>
				<code>;gt&amp;</code>
			</td>
		</tr>
		<tr>
			<td>
				"
			</td>
			<td>
				<code>;quot&amp;</code>
			</td>
		</tr>
		<tr>
			<td>
				'
			</td>
			<td>
				<code>;apos&amp;</code>
			</td>
		</tr>
		<tr>
			<td>
				&amp;
			</td>
			<td>
				<code>;amp&amp;</code>
			</td>
		</tr>
	</tbody>
</table>

<p>
	يمكن تذكر المرجع إلى المحرف الخاص بسهولة لأن النص الذي يشير إلى إشارة أصغر مثلًا <code>;lt&amp;</code> يمكن أن يُفهم من المصطلح الذي أخذ منه أي Less Than، والأمر مشابه لبقية المراجع.
</p>

<p>
	ستجد في المثال التالي فقرتين نصيتين:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9402_14" style=""><span class="tag">&lt;p&gt;</span><span class="pln">In HTML, you define a paragraph using the </span><span class="tag">&lt;p&gt;</span><span class="pln"> element.</span><span class="tag">&lt;/p&gt;</span><span class="pln">

</span><span class="tag">&lt;p&gt;</span><span class="pln">In HTML, you define a paragraph using the &amp;lt;p&amp;gt; element.</span><span class="tag">&lt;/p&gt;</span></pre>

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

<p style="text-align: center;">
	<img alt="image.png" class="ipsImage ipsImage_thumbnailed" data-fileid="181855" data-ratio="30.07" data-unique="9rsvpqbkc" width="542" src="https://academy.hsoub.com/uploads/monthly_2026_03/image.png.7d125d38aab261558821c7068d6feced.png">
</p>

<p>
	<strong>ملاحظة</strong>: لا حاجة إلى استخدام مراجع إلى كيانات الرموز الأخرى، لأن المتصفحات الحديثة ستتعامل مع جميع الرموز جيدًا إذا كانت UTF-8 هي مجموعة محارف المستخدَمة في ترميز HTML.
</p>

<h2>
	التعليقات في لغة HTML
</h2>

<p>
	زوِّدت لغة HTML بآلية لإدراج تعليقات ضمن الشيفرة يتجاهلها المتصفح عند تصيير الصفحة ولا تُعرض للزائر، والغاية من التعليقات هي إضافة ملاحظات إلى الشيفرة بغية شرحها أو توضيح منطق العمل، كما تظهر فائدة التعليقات عندما تضطر إلى العمل على شيفرة أنجزتها قبل فترة من الزمن ولم تَعُد تتذكر تفاصيل العمل بأكمله، كما تظهر أهميتها عندما يعمل على تغيير الشيفرة وتحديثها مجموعة من الأشخاص، ولإدراج تعليق، ضعه ضمن الوسمين <code>&lt;--</code> و <code>--!&gt;</code> كما في المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2649_80" style=""><span class="tag">&lt;p&gt;</span><span class="pln">I'm not inside a comment</span><span class="tag">&lt;/p&gt;</span><span class="pln">

</span><span class="com">&lt;!-- &lt;p&gt;I am!&lt;/p&gt; --&gt;</span></pre>

<p>
	لاحظ أنّ ما سيعرضه المتصفح هو الفقرة الأولى فقط.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="181856" href="https://academy.hsoub.com/uploads/monthly_2026_03/image.png.cff9cb7abd4e8ab2db1dcf818434b6fc.png" rel=""><img alt="image.png" class="ipsImage ipsImage_thumbnailed" data-fileid="181856" data-ratio="18.29" data-unique="wbqn0lsop" style="width: 700px; height: auto;" width="900" src="https://academy.hsoub.com/uploads/monthly_2026_03/image.thumb.png.498434b5e99fb34de0ae43e005593b81.png"></a>
</p>

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

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

<p>
	وطالما أنك شرعت في تعلم لغة HTML، فننصحك بتعلم <a href="https://academy.hsoub.com/programming/css/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A7%D8%B3%D8%AA%D8%B9%D9%85%D8%A7%D9%84-%D9%84%D8%BA%D8%A9-css-r1049/" rel="">مبادئ تنسيق الصفحات باستخدام CSS</a>، فهي تعمل جيدًا مع لغة HTML كما سترى لاحقًا.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://developer.mozilla.org/en-US/docs/Learn/HTML/Introduction_to_HTML/Getting_started" rel="external nofollow">Getting started with HTML</a>.
</p>

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

<ul>
	<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/%D9%85%D9%83%D9%88%D9%86%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-html-%D8%A7%D9%84%D9%85%D8%AE%D8%B5%D8%B5%D8%A9-%D9%88%D9%82%D9%88%D8%A7%D9%84%D8%A8%D9%87%D8%A7-r1352/" rel="">مكونات الويب: عناصر HTML المخصصة وقوالبها</a>
	</li>
	<li>
		<a href="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/" rel="">HTML و CSS للمبتدئين: كيف تصمم أول صفحة ويب لك</a>
	</li>
</ul>

<p>
	 
</p>
]]></description><guid isPermaLink="false">1752</guid><pubDate>Tue, 01 Nov 2022 16:06:00 +0000</pubDate></item><item><title>&#x623;&#x633;&#x627;&#x633;&#x64A;&#x627;&#x62A; &#x644;&#x63A;&#x629; HTML</title><link>https://academy.hsoub.com/programming/html/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%84%D8%BA%D8%A9-html-r1687/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_08/63075e9fd9bab_-HTML.png.ce7df0a3d89c70b928d2fde54b80c5d1.png" /></p>
<p>
	تُعَدّ HTML أو لغة توصيف النصوص التشعبية بأنها الشيفرة التي تُستخدَم في هيكلة صفحات ويب ومحتوياتها، فقد تُنظَّم الصفحة مثلًا على هيئة مجموعة من المقاطع النصية أو قائمة من النقاط أو أن تعرض الصور أو جداول البيانات، وسنقدِّم لك في هذا المقال مجموعة معارف أساسية لفهم <a href="https://wiki.hsoub.com/HTML" rel="external">لغة HTML</a> ووظائفها.
</p>

<h2>
	ما هي HTML؟
</h2>

<p>
	تُعَدّ HTML بأنها لغة توصيفية تُعرِّف هيكلية المحتوى الذي تقدِّمه الصفحة، وتتألف اللغة من سلسلة من <a href="https://wiki.hsoub.com/%D8%AA%D8%B5%D9%86%D9%8A%D9%81:HTML_Elements" rel="external">العناصر</a> التي تستخدِمها لتضمين أو تغليف الأجزاء المختلفة من المحتوى لتظهر بطريقة محددة أو لتعمل بطريقة محددة، كما يمكن أن تربط الوسوم المغلقة enclosing tags كلمةً أو صورةً بمكان آخر، أو يمكنها عرض الكلمات عرضًا مائلًا أو تكبّر خط الكتابة أو تصغّره وهكذا، وإليك على سبيل المثال المحتوى التالي الذي لا يتعدى السطر:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_163_8" style=""><span class="pln">My cat is very grumpy</span></pre>

<p>
	إذا أردنا أن يظهر السطر كما هو، فيمكننا أن نجعله فقرةً نصيةً بتضمينه داخل وسمَي فقرة، أي <code><a href="https://wiki.hsoub.com/HTML/p" rel="external">&lt;p&gt; &lt;/p&gt;</a></code>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_163_11" style=""><span class="tag">&lt;p&gt;</span><span class="pln">My cat is very grumpy</span><span class="tag">&lt;/p&gt;</span></pre>

<h2>
	تشريح عنصر HTML
</h2>

<p>
	دعونا نستكشف عنصر الفقرة السابق بصورة أعمق:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="106323" href="https://academy.hsoub.com/uploads/monthly_2022_08/01_html_element.png.e973e2bdb8e5ea9f3671df1b25fae928.png" rel=""><img alt="01_html_element.png" class="ipsImage ipsImage_thumbnailed" data-fileid="106323" data-unique="yz7kkevza" style="width: 450px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2022_08/01_html_element.thumb.png.9d1f5369cb0cdac7152d3b6ca70a3cc4.png"></a>
</p>

<p>
	إن الأجزاء الرئيسية من العنصر هي:
</p>

<ol>
	<li>
		<strong>وسم البداية Opening tag</strong>: يشير هذا الوسم إلى النقطة التي يبدأ عندها العنصر أو التي يبدأ تأثيره عندها (بداية الفقرة النصية في حالتنا)، ويتكوّن من اسم العنصر (<code>p</code> في حالتنا) محاطًا بقوسَي زاوية.
	</li>
	<li>
		<strong>وسم النهاية Closing tag</strong>: يشير هذا الوسم إلى نهاية العنصر (نهاية الفقرة في حالتنا)، ويشبه وسم البداية لكنه يبدأ بشرطة أمامية <code>/</code> قبل اسم العنصر، كما يُعَدّ إغفال وسم النهاية من أكثر الأخطاء التي يرتكبها المبتدئون، وقد تفضي إلى نتائج غريبة بالفعل.
	</li>
	<li>
		<strong>المحتوى Content</strong>: يشير إلى المحتوى الفعلي للعنصر، وهو في حالتنا مجرد نص.
	</li>
	<li>
		<strong>العنصر Element</strong>: ويتكون من وسمَي البداية والنهاية والمحتوى معًا.
	</li>
</ol>

<p>
	يمكن أن تمتلك العناصر سمات attributes تبدو شبيهةً كما يلي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="106324" href="https://academy.hsoub.com/uploads/monthly_2022_08/02_element_att.png.df670a6255012f3a59eded1a22bd7262.png" rel=""><img alt="02_element_att.png" class="ipsImage ipsImage_thumbnailed" data-fileid="106324" data-unique="qga4isr2r" style="width: 500px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2022_08/02_element_att.thumb.png.bffeaff4fc68b272abbbfefbbe0f11fe.png"></a>
</p>

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

<p>
	لكتابة السمة لا بد من:
</p>

<ol>
	<li>
		مسافة فارغة بينها وبين اسم العنصر، أو بينها وبين السمة التي تسبقها في حال امتلك العنصر سمتَين أو أكثر.
	</li>
	<li>
		اسم السمة تليها إشارة المساواة <code>=</code>.
	</li>
	<li>
		قيمة السمة بين إشارتَي تنصيص.
	</li>
</ol>

<p>
	<strong>ملاحظة</strong>: يمكنك عدم وضع قيمة السمة بين إشارتي تنصيص إذا لم تتضمن رمز ASCII الخاص بالمسافة الفارغة أو أيّ من المحارف <code>"</code> أو <code>'</code> أو <code>`</code> أو <code>=</code> أو <code>&lt;</code> أو <code>&gt;</code>، لكن يفضَّل وضع قيمة السمة دائمًا داخل إشارتَي التنصيص لأنها تجعل الشيفرة واضحةً ومفهومةً.
</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>
	العناصر المتداخلة
</h2>

<p>
	يمكن وضع عناصر داخل عناصرأخرى أيضًا وهذا ما يُعرف بالتداخل nesting، فإذا أردنا أن تظهر الكلمة "very" في الفقرة "My cat is very grumpy" بخط سميك، فيمكن تغليف هذه الكلمة داخل <a href="https://wiki.hsoub.com/HTML/strong" rel="external">العنصر &lt;strong&gt;&lt;/strong&gt;</a> كما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_163_19" style=""><span class="tag">&lt;p&gt;</span><span class="pln">My cat is </span><span class="tag">&lt;strong&gt;</span><span class="pln">very</span><span class="tag">&lt;/strong&gt;</span><span class="pln"> grumpy.</span><span class="tag">&lt;/p&gt;</span></pre>

<p>
	لكن عليك التأكد دومًا من أنّ العناصر متداخلة بصورة صحيحة، فقد فتحنا في المثال السابق العنصر <code>&lt;p&gt;</code> أولًا ثم <code>&lt;strong&gt;</code>، وبالتالي توجَّب إغلاق العنصر الثاني آخر من فتح على الشكل <code>&lt;strong/&gt;</code> ثم إغلاق الأول <code>&lt;p/&gt;</code>، أي أنّ التداخل التالي غير صحيح:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_163_21" style=""><span class="tag">&lt;p&gt;</span><span class="pln">My cat is </span><span class="tag">&lt;strong&gt;</span><span class="pln">very grumpy.</span><span class="tag">&lt;/p&gt;&lt;/strong&gt;</span></pre>

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

<h2>
	العناصر الفارغة
</h2>

<p>
	تُدعى بعض العناصر التي لا تحمل أيّ محتوى بالعناصر الفارغة Empty elements مثل <a href="https://wiki.hsoub.com/HTML/img" rel="external">العنصر &lt;img&gt;</a> الذي استخدمناه سابقًا:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_163_24" style=""><span class="tag">&lt;img</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"images/firefox-icon.png"</span><span class="pln"> </span><span class="atn">alt</span><span class="pun">=</span><span class="atv">"My test image"</span><span class="tag">&gt;</span></pre>

<p>
	إذ يمتلك العنصر سمتَين ولا يمتلك وسم نهاية <code>&lt;img/&gt;</code> أو محتوى، والسبب أن عنصر الصورة لا يغلِّف محتوًى لكي يتأثر بوجود أو عدم وجود وسم النهاية، فوظيفته هي إدراج صورة في صفحة HTML في المكان الذي يظهر فيه.
</p>

<h2>
	تشريح مستند HTML
</h2>

<p>
	سنشرح الآن الطريقة التي نجمّع بها عناصر HTML المفردة لنشكِّل صفحةً كاملةً، فلنعُد قليلًا إلى الشيفرة التي وضعناها في الملف index.html والذي رأيناه أول مرة في <a href="https://academy.hsoub.com/programming/general/%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-%D9%81%D9%8A-%D8%B9%D9%85%D9%84%D9%8A%D8%A9-%D8%AA%D8%B7%D9%88%D9%8A%D8%B1-%D9%85%D9%88%D9%82%D8%B9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r1686/" rel="">المقال السابق</a>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_163_27" 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">My test page</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;img</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"images/firefox-icon.png"</span><span class="pln"> </span><span class="atn">alt</span><span class="pun">=</span><span class="atv">"My test image"</span><span class="tag">&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>

<ul>
	<li>
		<code>&lt;DOCTYPE html!&gt;</code>: وهو عنصر تمهيدي مطلوب، فقد كانت الغاية من هذا العنصر في الأيام الأولى (1991/1992) أن يعمل على أساس رابط إلى مجموعة من القواعد التي ينبغي أن تحققها صفحة HTML لكي تُعَدّ صفحةً جيدةً بما في ذلك الاكتشاف التلقائي للأخطاء وغيرها من النقاط المفيدة، وليس لهذا العنصر في أيامنا هذه وظيفةً سوى التأكد من سلوك المستند للسلوك المطلوب، وهذا كل ما عليك معرفته حاليًا.
	</li>
	<li>
		<code><a href="https://wiki.hsoub.com/HTML/html" rel="external">&lt;html&gt;&lt;/html&gt;</a></code>: يضم هذا العنصر كامل محتوى الصفحة، ويُدعى أحيانًا بالعنصر الجذري root element.
	</li>
	<li>
		<code><a href="https://wiki.hsoub.com/HTML/head" rel="external">&lt;head&gt;&lt;/head&gt;</a></code>: يعمل على أساس حاوية لتضع فيها كل الأشياء التي تريدها في صفحتك ولكنها لا تمثِّل محتوًى تريد إظهاره لمتابعيك مثل الكلمات المفتاحية ووصف الصفحة الذي تريد إظهاره عندما يعرضها محرك البحث على أساس نتيجة <a href="https://academy.hsoub.com/programming/css/%d8%aa%d8%b9%d8%b1%d9%91%d9%81-%d8%b9%d9%84%d9%89-%d8%a3%d8%b3%d8%a7%d8%b3%d9%8a%d8%a7%d8%aa-css-r70/" rel="">وقواعد CSS</a> لتنسيق محتوى الصفحة ونوع المحارف التي تستخدمها في الصفحة وغيرها الكثير.
	</li>
	<li>
		<code>&lt;"meta charset="utf-8&gt;</code>: يضبط هذا العنصر مجموعة المحارف التي تستخدِمها في الصفحة، وهنا اخترنا المجموعة UTF-8 التي تضم محارف الأغلبية الساحقة من اللغات المكتوبة، إذ تستطيع هذا المحارف أن تعرض الآن أيّ محتوى نصي بأيّ لغة قد تضعه في صفحتك، ولا مبرر لعدم ضبط مجموعة المحارف المستخدَمة، كما ستساعدك على تحاشي الكثير من الأخطاء لاحقًا.
	</li>
	<li>
		<code><a href="https://wiki.hsoub.com/HTML/title" rel="external">&lt;title&gt;&lt;/title&gt;</a></code>: يضبط هذا العنصر عنوان صفحتك الذي يظهر أعلى المتصفح عند تحميل الصفحة، كما يُستخدم لوصف الصفحة عندما تضيفها إلى قائمة الصفحات المفضلة.
	</li>
	<li>
		<code><a href="https://wiki.hsoub.com/HTML/body" rel="external">&lt;body&gt;&lt;/body&gt;</a></code>: يضم المحتوى الذي تريد عرضه على زائري صفحتك بأكمله، سواءً كان نصًا أو صورًا أو فيديو أو ألعاب أو أيّ شيء آخر.
	</li>
</ul>

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

<p>
	لنعُد إلى العنصر <code>&lt;img&gt;</code> مجددًا:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_163_34" style=""><span class="tag">&lt;img</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"images/firefox-icon.png"</span><span class="pln"> </span><span class="atn">alt</span><span class="pun">=</span><span class="atv">"My test image"</span><span class="tag">&gt;</span></pre>

<p>
	يُدرِج هذا العنصر صورةً ضمن الصفحة في المكان الذي تضعه فيه، إذ نحدِّد الصورة المعروضة بكتابة عنوانها على أساس قيمة للسمة <code>src</code> -أي مصدر source-، كما يمتلك عنصر الصورة أيضًا سمةً أخرى تُدعى <code>alt</code> -أي بديل alternative-، إذ تُستخدَم هذه السمة لعرض نص بديل عن الصورة للأشخاص الذين لا يستطيعون رؤيتها لأسباب عديدة منها:
</p>

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

<p style="text-align: center;">
	<img alt="03_imag_alt_text.png" class="ipsImage ipsImage_thumbnailed" data-fileid="106325" data-unique="p1uks1o1q" style="" src="https://academy.hsoub.com/uploads/monthly_2022_08/03_imag_alt_text.png.82f1dbe8ab14bd74e7d35eb303586c33.png">
</p>

<p>
	ما يهم فعلًا في النص البديل هو أن يكون وصفيًا تمامًا لمحتوى الصورة، إذ ينبغي أن يزوِّد النص القارئ بمعلومات كافية ليكوِّن فكرةً جيدةً عن محتوى الصورة، فالنص البديل "My test image" في مثالنا غير جيد على الإطلاق، وسيكون الأنسب لشعار فايرفوكس هو "Firefox logo: a flaming fox surrounding the Earth" وبالعربية "شعار فايرفوكس: ثعلب ملتهب يحيط بالكرة الأرضية"، أي حاول إذًا ابتكار نصوص بديلة جيدة تصف الصورة.
</p>

<h2>
	توصيف محتوى صفحات HTML
</h2>

<p>
	يغطي هذا القسم من المقال عناصر HTML الأساسية لتوصيف محتوى الصفحات.
</p>

<h3>
	العناوين
</h3>

<p>
	تساعدك العناوين Headings على عرض أجزاء من محتوى الصفحة على أساس عناوين رئيسية أو فرعية، وكما هو حال الكتب التي تحمل عنوانًا رئيسيًا وعناوين للفصول وعناوين فرعية في كل فصل، تحمل صفحة HTML الميزة ذاتها، إذ تضم اللغة عناوين تتدرج إلى مستويات ستة من <a href="https://wiki.hsoub.com/HTML/h1-h6" rel="external">&lt;h1&gt; إلى &lt;h6&gt;</a>، وغالبًا ما ستستخدِم ثلاث إلى أربع مستويات كحد أقصى.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_163_37" style=""><span class="com">&lt;!-- 4 heading levels: --&gt;</span><span class="pln">
</span><span class="tag">&lt;h1&gt;</span><span class="pln">My main title</span><span class="tag">&lt;/h1&gt;</span><span class="pln">
</span><span class="tag">&lt;h2&gt;</span><span class="pln">My top level heading</span><span class="tag">&lt;/h2&gt;</span><span class="pln">
</span><span class="tag">&lt;h3&gt;</span><span class="pln">My subheading</span><span class="tag">&lt;/h3&gt;</span><span class="pln">
</span><span class="tag">&lt;h4&gt;</span><span class="pln">My sub-subheading</span><span class="tag">&lt;/h4&gt;</span></pre>

<p>
	<strong>ملاحظة</strong>: كل ما يرد بين الوسمين <code>&lt;--</code> و <code>--!&gt;</code> في صفحة HTML هو تعليق سيتجاهل المتصفح محتواه عندما يصيّر الشيفرة ولن يُعرَض على الشاشة، إذ تساعدك التعليقات في وضع ملاحظات مفيدة عن مقطع محدَّد من الشيفرة أو عن منطق معيّن اعتمدته.
</p>

<p>
	حاول الآن وضع عنوان فرعي في صفحة HTML التي نبنيها فوق العنصر <code>&lt;img&gt;</code> مباشرةً.
</p>

<p>
	<strong>ملاحظة</strong>: تملك العناوين من المستوى الأول تنسيقًا ضمنيًا خاصًا، لذلك لا تستخدِمها لتكبير النص أو جعله سميكًا Bold لأنها تُستخدَم لغايات أخرى مثل <a href="https://academy.hsoub.com/programming/html/%D8%B4%D9%85%D9%88%D9%84%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D8%B3%D9%87%D9%88%D9%84%D8%A9-%D9%88%D8%B5%D9%88%D9%84-%D8%AC%D9%85%D9%8A%D8%B9-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85%D9%8A%D9%86-%D9%84%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D9%85%D9%88%D9%82%D8%B9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r1640/" rel="">سهولة الوصول</a> أو لأسباب أخرى مثل <a href="https://academy.hsoub.com/marketing/search-engine-optimisation/%D8%AA%D8%AD%D8%B3%D9%8A%D9%86-%D9%85%D8%AD%D8%B1%D9%83%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%AD%D8%AB-seo-%D9%88%D8%A3%D9%87%D9%85%D9%8A%D8%AA%D9%87%D8%A7-%D9%84%D9%85%D9%88%D9%82%D8%B9%D9%83-%D8%A7%D9%84%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A-r490/" rel="">تحسين محركات البحث</a>، لذا حاول أن تعطي تدرجًا منطقيًا للعناوين في صفحتك دون تجاوز أيّ مستوى إلى ما دونه مثل الانتقال من 4 إلى 2 مباشرةً دون المرور بالمستوى 3.
</p>

<h3>
	الفقرات النصية
</h3>

<p>
	يحتوي العنصر <code>&lt;p&gt;</code> كما شرحنا سابقًا مقطعًا نصيًا، وستستخدمه بكثرة عندما ترمز المحتوى النصي في الصفحة:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_163_40" style=""><span class="tag">&lt;p&gt;</span><span class="pln">This is a single paragraph</span><span class="tag">&lt;/p&gt;</span></pre>

<p>
	يمكنك على سبيل التجربة إضافة عينة من نص ما على هيئة فقرة نصية أو أكثر تحت العنصر <code>&lt;img&gt;</code> في الصفحة التجريبية التي نبنيها.
</p>

<h3>
	القوائم
</h3>

<p>
	تُصنَّف كمية لا بأس بها من محتوى ويب على صورة قوائم Lists وتمتلك HTML القدرة على ذلك، إذ تتضمن القائمة عنصرين على الأقل، وأكثر القوائم شيوعًا هي القوائم المرتبة Ordered وغير المرتبة Unordered:
</p>

<ol>
	<li>
		القوائم المرتبة: توضع بنود هذه القائمة ضمن <a href="https://wiki.hsoub.com/HTML/ol" rel="external">العنصر &lt;ol&gt;</a>، وتُستخدَم لعرض القوائم التي يهمنا فيها ترتيب العناصر مثل وصفات تحضير الطعام أو ترتيب فِرق دوري لكرة القدم وغيرها.
	</li>
	<li>
		القوائم غير المرتبة: توضع بنود هذه القائمة ضمن <a href="https://wiki.hsoub.com/HTML/ul" rel="external">العنصر &lt;ul&gt;</a>، وتُستخدَم لعرض القوائم التي لا نهتم فيها لترتيب العناصر مثل قائمة التسوق.
	</li>
</ol>

<p>
	يوضع كل بند من بنود القائمة ضمن <a href="https://wiki.hsoub.com/HTML/li" rel="external">العنصر &lt;li&gt;</a> -أي بند من قائمة list item-، فإذا أردنا مثلًا تحويل جزء من الفقرة النصية التالية إلى قائمة:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_163_45" style=""><span class="tag">&lt;p&gt;</span><span class="pln">At Mozilla, we’re a global community of technologists, thinkers, and builders working together ... </span><span class="tag">&lt;/p&gt;</span></pre>

<p>
	فيمكننا تعديل توصيف محتوى الفقرة ليصبح كما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_163_47" style=""><span class="tag">&lt;p&gt;</span><span class="pln">At Mozilla, we’re a global community of</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;</span><span class="pln">technologists</span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">thinkers</span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">builders</span><span class="tag">&lt;/li&gt;</span><span class="pln">
</span><span class="tag">&lt;/ul&gt;</span><span class="pln">

</span><span class="tag">&lt;p&gt;</span><span class="pln">working together ... </span><span class="tag">&lt;/p&gt;</span></pre>

<h3>
	الروابط
</h3>

<p>
	تُعَدّ الروابط العنصر الأكثر أهميةً، فهي ما تجعل من الويب شبكةً حقيقيةً، إذ نستخدِم العنصر البسيط <code>&lt;a&gt;</code> لإنشاء رابط، وهو اختصار للكلمة "anchor"، ولتجعل جزءًا من الفقرة النصية السابقة رابطًا اتبع الخطوات التالية:
</p>

<ol>
	<li>
		اختر جزءًا من النص وليكن "Mozilla Manifesto".
	</li>
	<li>
		ضَع هذا الجزء ضمن <a href="https://wiki.hsoub.com/HTML/a" rel="external">الوسمَين &lt;a&gt;&lt;/a&gt;</a> كما يلي:
	</li>
</ol>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_163_50" style=""><span class="tag">&lt;a&gt;</span><span class="pln">Mozilla Manifesto</span><span class="tag">&lt;/a&gt;</span></pre>

<ol start="3">
	<li>
		زوّد الرابط بعنوان للانتقال إليه من خلال <a href="https://wiki.hsoub.com/HTML/a#href" rel="external">السمة href</a> كما يلي:
	</li>
</ol>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_163_52" style=""><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">Mozilla Manifesto</span><span class="tag">&lt;/a&gt;</span></pre>

<ol start="4">
	<li>
		اكتب العنوان المطلوب بين علامَتي تنصيص السمة <code>href</code> كما يلي:
	</li>
</ol>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_163_55" style=""><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"https://www.mozilla.org/en-US/about/manifesto/"</span><span class="tag">&gt;</span><span class="pln">Mozilla Manifesto</span><span class="tag">&lt;/a&gt;</span></pre>

<p>
	قد تصل إلى نتيجة غير متوقعة إذا حذفت بداية العنوان الذي يُدعى بروتوكول، أي <code>//:https</code> أو <code>://http</code>، لذلك تحقق من وصولك إلى المكان المطلوب عند النقر على الرابط.
</p>

<p>
	<strong>ملاحظة</strong>: قد يبدو اختيار اسم السمة <code>href</code> غامضًا في البداية، فإذا صعُب عليك الأمر، تذكر أنه مشتق من كلمتَي "مرجع إلى نص تشعبي <strong>h</strong>ypertext <strong>ref</strong>erence"
</p>

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

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="106326" href="https://academy.hsoub.com/uploads/monthly_2022_08/04_your_page_so_far.png.114ba7954b41805b55f5be16fc583cbd.png" rel=""><img alt="04_your_page_so_far.png" class="ipsImage ipsImage_thumbnailed" data-fileid="106326" data-unique="eic95zmxr" src="https://academy.hsoub.com/uploads/monthly_2022_08/04_your_page_so_far.thumb.png.f046b97468e42bc8fc086b0387d03808.png"></a>
</p>

<p>
	إذا لم تجد عملك صحيحًا، فيمكنك دائمًا موازنة ما فعلته مع <a href="https://github.com/mdn/beginner-html-site/blob/gh-pages/index.html" rel="external nofollow">النسخة الجاهزة</a> على جيت-هاب.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://developer.mozilla.org/en-US/docs/Learn/Getting_started_with_the_web/HTML_basics" rel="external nofollow">HTML Basics</a>.
</p>

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

<ul>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/general/%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-%D9%81%D9%8A-%D8%B9%D9%85%D9%84%D9%8A%D8%A9-%D8%AA%D8%B7%D9%88%D9%8A%D8%B1-%D9%85%D9%88%D9%82%D8%B9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r1686/" rel="">التعامل مع الملفات في عملية تطوير موقع الويب</a>
	</li>
	<li>
		<a href="https://wiki.hsoub.com/HTML" rel="external">توثيق لغة HTML العربي</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/html/%D9%85%D9%83%D9%88%D9%86%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-html-%D8%A7%D9%84%D9%85%D8%AE%D8%B5%D8%B5%D8%A9-%D9%88%D9%82%D9%88%D8%A7%D9%84%D8%A8%D9%87%D8%A7-r1352/" rel="">مكونات الويب: عناصر HTML المخصصة وقوالبها</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">1687</guid><pubDate>Tue, 13 Sep 2022 16:07:00 +0000</pubDate></item><item><title>&#x62A;&#x639;&#x644;&#x645; &#x644;&#x63A;&#x629; HTML</title><link>https://academy.hsoub.com/programming/html/%D8%AA%D8%B9%D9%84%D9%85-%D9%84%D8%BA%D8%A9-html-r1702/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_09/6316f4d348cda_----HTML.png.b0ec735790863d7847b677a1be10acd3.png" /></p>
<blockquote class="ipsQuote" data-gramm="false" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p data-gramm="false">
		تعلم لغة HTML هو الخطوة الأولى من خطوات تعلم البرمجة للدخول إلى عالم تطوير الويب.
	</p>
</blockquote>

<p>
	هل فكرت يومًا خلال تصفحك لموقع ما أن تخزّن إحدى الصفحات على حاسوبك لجودة المحتوى أو لأهمية المعلومات التي قرأتها؟ فهل لاحظت -إن فعلت ذلك- أن امتداد هذا الملف (آخر ثلاث أو أربعة أحرف من اسم الملف) من الشكل <code>html</code> أو <code>htm</code>؟ هل وصلك بريد إلكتروني من شركة أو من مجلة إلكترونية أو حتى من صديق ووجدته مميزًا يضم صورًا وعناوين وكل ما اعتدت أن تفعله هو كتابة بضعة أسطر توجز فيها ما تريد ثم ترسل بريدك؟ هل دخلت يومًا إلى منتدى إلكتروني وأردت أن تكتب تعليقًا وقرأت عبارة "يُسمح باستخدام أكواد HTML" وتساءلت ما هي <strong>أكواد HTML</strong>؟ هل فكّرت أخيرًا وأنت تتصفح الإنترنت، أنّ جميع المواقع دون استثناء تتشابه في هيكليتها؟ فجميعها يضم شكلًا من قوائم التنقل وأقسامٍ أعلى وأدنى الصفحات تبقى كما هي عند التنقل بين صفحات الموقع نفسه، ونماذج لتعبئتها وعناوين رئيسية وفرعية وروابط لتنظيم المحتوى وتسهيل الوصول إلى المعلومات المطلوبة. إن الوصفة السحرية خلف كل ذلك هي <a href="https://wiki.hsoub.com/HTML" rel="external"><strong>لغة ترميز النص التشعبي</strong></a> Hyper Text Markup Language واختصارًا لغة HTML.
</p>

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

<h2>
	جدول المحتويات
</h2>

<p>
	سنذكر هنا جدول المحتويات باختصار حرصًا على تنظيم المقالة ولتسهيل الوصول إلى القسم الذي تريده بسهولة:
</p>

<ul>
	<li>
		<a href="#%D9%85%D8%A7-%D9%87%D9%8A-%D9%84%D8%BA%D8%A9-HTML" rel="">ما هي لغة HTML؟</a>
	</li>
	<li>
		<a href="#%D8%A7%D9%84%D9%81%D8%B1%D9%82-%D8%A8%D9%8A%D9%86-%D8%A7%D9%84%D9%84%D8%BA%D8%A7%D8%AA-%D8%A7%D9%84%D8%AA%D9%88%D8%B5%D9%8A%D9%81%D9%8A%D8%A9-%D9%88%D9%84%D8%BA%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9" rel="">الفرق بين اللغات التوصيفية ولغات البرمجة</a>
	</li>
	<li>
		<a href="#%D8%AA%D8%A7%D8%B1%D9%8A%D8%AE-%D9%88%D8%AA%D8%B7%D9%88%D8%B1-%D9%84%D8%BA%D8%A9-HTML" rel="">تاريخ وتطور لغة HTML</a>
	</li>
	<li>
		<a href="#%D8%A3%D9%87%D9%85%D9%8A%D8%A9-%D8%AA%D8%B9%D9%84%D9%85-%D9%84%D8%BA%D8%A9-HTML" rel="">أهمية تعلم لغة HTML</a>
	</li>
	<li>
		<a href="#%D9%85%D8%A7-%D8%A7%D9%84%D8%B0%D9%8A-%D8%A3%D8%AD%D8%AA%D8%A7%D8%AC-%D8%A5%D9%84%D9%8A%D9%87-%D9%84%D8%A3%D8%A8%D8%AF%D8%A3-%D8%A7%D9%84%D8%B9%D9%85%D9%84-%D9%85%D8%B9-%D9%84%D8%BA%D8%A9-HTML" rel="">ما الذي أحتاج إليه لأبدأ العمل مع لغة HTML</a>
	</li>
	<li>
		<a href="#%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85%D8%A7%D8%AA-%D9%84%D8%BA%D8%A9-HTML" rel="">استخدامات لغة HTML</a>
	</li>
	<li>
		<a href="#%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%84%D8%BA%D8%A9-HTML" rel="">أساسيات لغة HTML</a>
		<ul>
			<li>
				<a href="#%D8%A7%D9%84%D8%B3%D9%85%D8%A7%D8%AA-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-HTML" rel="">السمات في لغة HTML</a>
			</li>
			<li>
				<a href="#%D8%A7%D9%84%D9%88%D8%B3%D9%88%D9%85-%D8%A7%D9%84%D8%A8%D9%86%D8%A7%D8%A6%D9%8A%D8%A9-%D9%88%D8%A7%D9%84%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-%D8%A7%D9%84%D8%B3%D8%B7%D8%B1%D9%8A%D8%A9" rel="">الوسوم البنائية والعناصر السطرية</a>
			</li>
			<li>
				<a href="#%D8%A7%D9%84%D9%88%D8%B3%D9%88%D9%85-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-HTML" rel="">الوسوم الأساسية في لغة HTML</a>
			</li>
		</ul>
	</li>
	<li>
		<a href="#%D8%A5%D9%8A%D8%AC%D8%A7%D8%A8%D9%8A%D8%A7%D8%AA-%D9%88%D8%B3%D9%84%D8%A8%D9%8A%D8%A7%D8%AA-%D9%84%D8%BA%D8%A9-HTML" rel="">إيجابيات وسلبيات لغة HTML</a>
	</li>
	<li>
		<a href="#%D9%85%D8%B5%D8%A7%D8%AF%D8%B1-%D8%AA%D8%B9%D9%84%D9%85-%D9%84%D8%BA%D8%A9-HTML" rel="">مصادر تعلم لغة HTML</a>
	</li>
</ul>

<h2 id="ما-هي-لغة-HTML">
	ما هي لغة HTML؟
</h2>

<p>
	<strong>لغة HTML</strong> أو لغة ترميز النص التشعبي هي لغة توصيف للمحتوى markup language بمعنى أنها توصِّف محتوًى معينًا كي تتمايز أجزاءه عن بعضها فيسهل تنظيمه وهيكلته، إذ تشير لغة HTML إلى جزء من المحتوى على أنه فقرة وتميز عدة كلمات على أنها عنوان رئيسي وأخرى على أنها عنوان فرعي وقد تسلسل جزءًا آخر من المحتوى على شكل قائمة من النقاط وكل ذلك باستعمال ما يُدعى وسوم HTML التي تُعطي صفحة ويب هيكليتها وتعطي كل جزء منها <strong>دلالة semantic</strong> معينة.
</p>

<p>
	تُستخدم إذًا لغة HTML في إعطاء هيكل عام لصفحة الويب وبالتالي يُعد تعلم لغة HTML أساسيًا لدخول عالم <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>. بالإضافة إلى قدرة لغة HTML على تضمين الكثير من ملفات الوسائط المتعددة الصوتيات والمرئيات دون الحاجة إلى أية أدوات أو برمجة إضافية، وتساعدك على تصميم نماذج لإرسال البيانات واستقبالها من خلال الإنترنت وغيرها الكثير.
</p>

<h2 id="الفرق-بين-اللغات-التوصيفية-ولغات-البرمجة">
	الفرق بين اللغات التوصيفية ولغات البرمجة
</h2>

<p>
	لغة HTML كما أشرنا هي من اللغات التوصيفية markup languages ولا تعد لغة برمجة programming language ويكثر الخلط بينهما ويظن حديث العهد بمجال علوم الحاسوب أن تعلمه لغة HTML يعني دخوله للمجال واحترافه للبرمجة وهذا خلط وخطأ، ويجب التفريق بين لغة التوصيف ولغة البرمجة.
</p>

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

<p>
	تضم اللغات التوصيفية مجموعة من الوسوم أو القواعد التي يشير كل منها إلى دلالة معينة وتستخدم لتنظيم البيانات النصية وعرضها بطريقة يسهل تمييزها بالنسبة للإنسان أو الحاسوب كأن تشير إلى عبارة على أنها عنوان وتبرز عبارة أخرى بكتابتها بخط ثخين وهكذا. لا تُعرض تلك القواعد أو الوسوم ولا تُضاف إلى المحتوى الفعلي بل وظيفتها وصف البيانات فقط وترتيبها، وتتطلب هذه اللغات فقط برنامجًا ليحلل الوسوم ويعرض المحتوى وفقًا لمدلول كل وسم وغالبًا ما تحلل المتصفحات أكواد HTML وأكواد XML ثم تعرض النتائج بينما تحلل برمجيات أخرى مخصصة لغات توصيفية أخرى مثل <a href="https://academy.hsoub.com/apps/web/wordpress/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%B1%D9%85%D9%88%D8%B2-%D8%A7%D9%84%D8%AA%D9%86%D8%B3%D9%8A%D9%82-markdown-%D9%85%D9%86-%D8%A3%D8%AC%D9%84-%D8%AA%D8%AC%D8%B1%D8%A8%D8%A9-%D8%AA%D8%AF%D9%88%D9%8A%D9%86-%D8%A3%D9%81%D8%B6%D9%84-%D9%81%D9%8A-%D9%85%D9%88%D9%82%D8%B9-%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3-r51/" rel="">مارك داون Markdown</a> ودوك بوك DocBook اللتان تستخدمان في المحررات النصية ولاتخ LaTex لكتابة الأوراق البحثية الأكاديمية وغيرها الكثير.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="107476" href="https://academy.hsoub.com/uploads/monthly_2022_09/00_html_code.png.1dddf49c51548e9d760db5ad51f59f9f.png" rel=""><img alt="00_html_code.png" class="ipsImage ipsImage_thumbnailed" data-fileid="107476" data-unique="7kph1r9y2" src="https://academy.hsoub.com/uploads/monthly_2022_09/00_html_code.thumb.png.89bc115b4abe5e36df893af48b6d3996.png"></a>
</p>

<p>
	أما اللغات البرمجية فوظيفتها توجيه أوامر للحاسوب لإنجاز مهمة أو وظيفة محددة مثل توجيهه لجمع عددين مع بعضهما كأبسط مثال أو طلب بيانات من مستخدم ومعالجتها وعرضها له أو استعمالها في غرض ما فأنت حين تسجل في موقع مثل أكاديمية حسوب أو تدفع لشراء شيء ما تتدخل لغة برمجية في الخلفية لإنجاز هذه المهام وغيرها من الأمثلة المتقدمة، وهنالك الكثير من <a href="https://academy.hsoub.com/programming/general/%D9%84%D8%BA%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9/" rel="">لغات البرمجة</a> التي تتفاوت وظيفتها ومجال استخدامها فمنها عام الاستخدام الذي يُستخدم في بناء البرامج والتطبيقات الحاسوبية مثل <a href="https://wiki.hsoub.com/Python" rel="external">لغة البرمجة بايثون</a>، ومنها ما هو خاص الاستخدام مثل <a href="https://academy.hsoub.com/programming/php/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%84%D8%BA%D8%A9-php-r2040/" rel="">لغة PHP</a> التي تستخدم في أغلب الحالات في تطوير الويب بدمج لغة HTML معها.
</p>

<p>
	تأتي بساطة HTML وسهولتها من كونها لغة توصيفية خفيفة وسهلة الفهم، ولا يتطلب العمل معها الكثير من الأدوات أو البرمجيات وبالتالي استقلالية ومحمولية portability أفضل.
</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 id="تاريخ-وتطور-لغة-HTML">
	تاريخ وتطور لغة HTML
</h2>

<p>
	قد لا تتوقع إطلاقًا أين ولدت لغة HTML! وهذا دليل إضافي على صحة مقولة "الحاجة أم الاختراع". لقد أراد مهندس الحاسوب <a href="https://ar.wikipedia.org/wiki/%D8%AA%D9%8A%D9%85_%D8%A8%D9%8A%D8%B1%D9%86%D8%B1%D8%B2_%D9%84%D9%8A" rel="external nofollow">تيم بيرنرز لي Tim Berners-Lee</a> الذي يعمل في قسم خدمات الحاسب في مؤسسة CERN لفيزياء الجزيئات أن يُمكّن الزملاء في مختلف المواقع داخل وخارج المؤسسة من تبادل الدراسات والأوراق البحثية وربطها مع بعضها بدلًا من تحميل نسخ عن جميع هذه الأوراق والأبحاث على كل حاسوب. أي بكلمات أخرى، سيتمكن أي باحث أثناء قراءته لمقال ما أن ينتقل إلى مقال آخر أو يستعرض معلومات أخرى جرى ذكرها في المقال الذي يقرأه دون أن يُضطر إلى إغلاق مقاله ثم البحث من جديد في أرشيف المقالات عن الموضوع الذي صادفه ثم العودة إلى المقال الأصلي.
</p>

<p>
	لا أعتقد أن بيرنرز-لي قد توقع من فكرته الثورية ميلاد تقنية شبكة الويب بأكملها فقد أثبتت هذه الفكرة قدرتها على التوسع لبناء شبكة عنكبوتية من الصفحات المترابطة التي تتيح لك التنقل فيما بينها جيئةً وذهابًا. لقد اعتمد بيرنرز-لي على لغة توصيف موجودة بالفعل ومحط اتفاق بين جميع العاملين في مجال الحواسب وهي لغة الترميز المعياري العام <a href="https://ar.wikipedia.org/wiki/%D9%84%D8%BA%D8%A9_%D8%A7%D9%84%D8%AA%D8%B1%D9%85%D9%8A%D8%B2_%D8%A7%D9%84%D9%82%D9%8A%D8%A7%D8%B3%D9%8A_%D8%A7%D9%84%D8%B9%D8%A7%D9%85" rel="external nofollow">SGML</a> فبدون أساس متين تستند عليه لم يكن ليُكتب البقاء لهذه اللغة.
</p>

<p>
	إذًا اعتمد بيرنرز-لي على فكرة الوسوم التي تُستخدم في SGML وهي مفاتيح تحيط بنص معين في بدايته ونهايته ليكون لهذا النص دلالة معينة وفقًا لنوع الوسم مثل <code>&lt;p/&gt;...نص ما هنا...&lt;p&gt;</code>، لكنه أضاف وسمًا جديدًا للمساهمة في الربط بين الصفحات وهو وسم المربط أو المرساة <code><a href="https://wiki.hsoub.com/HTML/a" rel="external">&lt;a&gt;</a></code>.
</p>

<p>
	ولكي تُفسّر هذه الوسوم لا بد من وجود أداة تحللها وتعرض المطلوب على الشاشة لهذا صمم بيرنيرز لي أول أداة لتحليل أكواد لغة HTML دُعيت حينها WorldWideWeb وتختصر إلى www وهو اختصار معروف لك تجده اليوم في أغلب الروابط، وكانت هذه الأداة أصل ما يُدعى اليوم بالمتصفحات Browsers.
</p>

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

	<p data-gramm="false">
		السير تيم بيرنرز-لي Sir Tim Berners-Lee‏ ولد في عام 1955 هو مهندس وعالم حاسوب إنجليزي، اشتهر بسبب اختراعه للشبكة العنكبوتية العالمية والتي تعرف بالويب ويلقب أحيانًا بلقب "أبو الويب" وهو الآن أستاذ في علوم الحاسوب في جامعة أوكسفورد في بريطانيا.
	</p>
</blockquote>

<p>
	شجّع بيرنرز-لي المهتمين بلغة HTML على كتابة برمجيات لتحليل هذه اللغة وعرضها على الشاشة كما اخترع بنفسه بروتوكولًا لنقل وتوزيع النصوص التشعبية سماه بروتوكول HTTP أي بروتوكول نقل النصوص التشعبية HyperText Transfer Protocol.
</p>

<p>
	لا زلنا حتى اللحظة في عام 1991 لكن مع ظهور فكرة أسماء النطاقات DNS (دُعيت حينها خدمة الأسماء الموزّعة) وعناوين إنترنت IP أمكن الربط بين الحواسب بطريقة أسهل وأكثر أمانًا وأصبح كل شيء مهيئًا لولادة الويب.
</p>

<p>
	تصاعد اهتمام الباحثين والعاملين في مجال الحواسب بلغة HTML لاحقًا من خلال عدة اجتماعات ومراسلات لتظهر للعلن أولى نسخ لغة HTML الرسمية عام 1993 وهي HTML 1.0.
</p>

<p>
	مع زيادة اهتمام الفعاليات بهذه اللغة أضيفت وسوم وميزات جديدة لها وبدأت الكثير من الشركات بالعمل على إنتاج المتصفحات فظهرت النسخة HTML 2.0 وتلاها ظهور متصفحات معروفة مثل نتسكيب Netscape وإنترنت إكسبلورر Internet Explorer.
</p>

<p>
	قدم ديفيد راغيت David Raggett نسخة HTML+‎ عام 1993 وأضافت هذه النسخة الكثير من الميزات إلى اللغة مثل الجداول ونماذج إرسال البيانات، والتي اعتمدت أغلبها لاحقًا في نسخة HTML 3.0 عام 1995 لكنها سببت في بطء المتصفحات مما دفع لاعتماد نسخة جديدة محسّنة هي HTML 4.0 عام 1999 ثم تلتها النسخة HTML 4.01 في وآخر العام ذاته وكانت بالفعل أكثر نجاحًا.
</p>

<p>
	تبنت منظمة W3C وهي <a href="https://ar.wikipedia.org/wiki/%D8%B1%D8%A7%D8%A8%D8%B7%D8%A9_%D8%A7%D9%84%D8%B4%D8%A8%D9%83%D8%A9_%D8%A7%D9%84%D8%B9%D8%A7%D9%84%D9%85%D9%8A%D8%A9" rel="external nofollow">رابطة الشبكة العالمية</a> World Wide Web Consortium التي أسسها بيرنرز-لي اعتماد معايير لغة HTML وتطويرها منذ عام 1996 ثم تكونت لاحقًا مجموعة <a href="https://whatwg.org/" rel="external nofollow">WHATWG</a> عام 2004، وضمت الكثير من الشركات المهتمة بصناعة تقنيات الويب آنذاك وقد أخذت على عاتقها تطوير نسخة HTML 5 لتصدر رسميًا عام 2015، وتُعد HTML 5 امتدادًا لسابقتها والأكثر اعتمادًا حاليًا وتقدم الكثير من الميزات المتقدمة مثل الموقع الجغرافي ودعم الفيديو والصوتيات ضمنيًا واستخدام لوحات الرسوم الديناميكية من خلال من خلال العنصر <a href="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/" rel="">Canvas</a> وكذلك العمل مع <a href="https://academy.hsoub.com/programming/html/%D9%85%D8%B3%D8%AA%D9%82%D8%A8%D9%84-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-html-%D8%B9%D8%A8%D8%B1-%D9%85%D9%82%D8%A7%D8%A8%D8%B3-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-websocket-r1556/" rel="">مقابس ويب web sockets</a> وغيرها، وصدرت بعد ذلك نسختي HTML 5.1 و HTML 5.2 في عامي 2016 و 2017 تباعًا.
</p>

<p>
	لن تكون هناك نسخة HTML 6 في المدى المنظور بل سيستمر العمل على تطوير HTM 5 بما يتناسب مع التطور التكنولوجي وفقًل لتقارير تصدرها مجموعة WHATWG ومن يدري في النهاية، فالويب متطور بسرعة رهيبة وقد تنقلب الموازين وتتغير الأحكام.
</p>

<h2 id="أهمية-تعلم-لغة-HTML">
	أهمية تعلم لغة HTML
</h2>

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

<ul>
	<li>
		لغة HTML هي مدخلك الرئيسي إلى <a href="https://academy.hsoub.com/programming/general/%D8%B9%D9%84%D9%88%D9%85-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8/" rel="">علوم الحاسب</a> عمومًا وإلى <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> خصوصًا: فإن شبهنا موقع ويب بالمنزل فستكون لغة HTML بمثابة هيكل المنزل من أعمدة وأسقف وجدران.
	</li>
	<li>
		لغة HTML بسيطة التعلم: كل ما عليك فعله بداية هو تذكر وسوم لغة HTML ودلالاتها ثم استخدام هذه الوسوم وفق تسلسل منطقي لتكوين الصفحة فالوسم <a href="https://wiki.hsoub.com/HTML/title" rel="external"><code>&lt;title&gt;</code></a> مثلًا لإضافة عنوان للصفحة والوسم <a href="https://wiki.hsoub.com/HTML/p" rel="external"><code>&lt;p&gt;</code></a> لإضافة فقرة نصية والوسم <a href="https://wiki.hsoub.com/HTML/img" rel="external"><code>&lt;img&gt;</code></a> لإدراج صورة وهكذا.
	</li>
	<li>
		لا يحتاج تعلم لغة HTML واستخدامها إلى أدوات معقدة: يمكنك استخدام أي محرر نصي بسيط لكتابة أكواد HTML ثم حفظ الملف بالامتداد <code>html</code> ليتحول إلى صفحة HTML ساكنة يستطيع أي متصفح تحليلها. مع ذلك قد تستفيد من محررات متقدمة لتسريع وتيرة عملك والتأكد من عدم وجود أخطاء.
	</li>
	<li>
		لغة HTML لغة مرنة: ارتكب ما تشاء من الأخطاء وسيحاول المتصفح جاهدًا فهم ما تريده. يشجعك ذلك غالبًا على الانطلاق في العمل، فرؤية نتاج ما فعلته أمر محفز، بينما ستحبطك بالتأكيد قائمة بعشرات الأخطاء لا تعرف معها أين اخطأت وكيف تتجاوز تلك الأخطاء.
	</li>
</ul>

<p>
	فإن شجعتك النقاط السابقة على البدء في تعلّم لغة HTML، تابع القراءة معنا لتتعرف على أساسيات لغة HTML وأين وكيف تُستخدم.
</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://sndian.com/?utm_source=academy.hsoub.com&amp;utm_medium=referral&amp;utm_campaign=cademy.hsoub.com-CTA-Block" rel="external">أطلق موقعك الآن</a>
		</div>
	</div>
</div>

<h2 id="ما-الذي-أحتاج-إليه-لأبدأ-العمل-مع-لغة-HTML">
	ما الذي أحتاج إليه لأبدأ العمل مع لغة HTML
</h2>

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

<ul>
	<li>
		محرر نصي: مثل المفكرة Notepad إن كنت من مستخدمي ويندوز أو محرر النصوص الافتراضي تكست Text أو كايت Kate إن كنت تستخدم إحدى توزيعات لينكس. إذ ستكتب أكواد HTML كما تكتب أي نص ثم تحفظ عملك تحت اسم معبّر ينتهي بالامتداد <code>html</code>، وهذا كبداية.
	</li>
	<li>
		متصفح ويب: لن يخلو حاسوبك من هذه البرامج طالما أنك تستخدم الإنترنت. يُفضّل مع ذلك استخدام إحدى المتصفحات الحديثة مثل غوغل كروم أو موزيللا فايرفوكس أو مايكروسوفت إيدج أو غيرها، وبإمكانك تنزيلها مجانًا. يحلل المتصفح أكواد HTML ويعرض محتوى الصفحة وفقًا لأكواد HTML التي استخدمتها.
	</li>
</ul>

<p>
	قد تحتاج لاحقًا إلى محررات نصية أكثر تقدمًا لتسريع إنتاجيتك مثل VS code لتسهيل كتابة أكواد لغة HTML خصوصًا إن كنت مقبلًا على <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>. إذ تقدم هذه المحررات النصية الخاصة ميزات إضافية كالإكمال التلقائي للشيفرة بمجرد كتابة الأحرف الأولى وتنبيهك إن ارتكبت بعض الأخطاء واقتراح الحلول وغير ذلك.
</p>

<h2 id="استخدامات-لغة-HTML">
	استخدامات لغة HTML
</h2>

<p>
	رأينا أن لغة HTML هي لغة توصيفية أي توصِّف النصوص لذا تُستخدم مع النصوص عمومًا لتنسيقها وهيكلتها ولكن شاع استخدامها مع نصوص صفحات الويب خصوصًا (التي هي نصوص في النهاية) وبالتالي تعتبر وسيلة يستخدمها مصممو ويب في:
</p>

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

<p>
	إن تحدثنا على عملية تطوير الويب وتحديدًا تطوير الواجهات الأمامية في صفحات الويب، فيُستخدم ثلاثي ذهبي أساسي فيها أولها لغة HTML لهيكلة النصوص وتوصيفها كما رأينا وثانيها <a href="https://wiki.hsoub.com/CSS" rel="external">لغة CSS</a> صفحات الأنماط الانسيابية لإضافة تنسيقات وتأثيرات مرئية تضفي جمالية وبهجة على النصوص، وثالثها <a href="https://wiki.hsoub.com/JavaScript" rel="external">لغة جافاسكربت</a> البرمجية التي تمنحها قدرات تفاعلية كبيرة مثل التفاعل عند النقر أو تنفيذ وظائف معينة في الخلفية، إذ تشكل هذه اللغات الثلاثة أساسًا للصفحات الديناميكية وتطبيقات الويب.
</p>

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

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

	<div class="ipsQuote_contents ipsClearfix" data-gramm="false">
		<p>
			هذه المقالة التي تقرؤها الآن هي عبارة عن صفحة HTML ويمكنك تصفحها مباشرة والاطلاع عليها عمليًا وعلى الوسوم والعناصر المكونة منها عبر الضغط على الاختصار Ctrl + U أو الضغط بزر الفأرة الأيمن واختيار view page source طبعًا إن كنت تقرأ المقال هذا على حاسوبك وليس على الجوال.
		</p>
	</div>
</blockquote>

<p>
	إضافة إلى ذلك تُستخدم HTML حديثًا كأساس لكتابة واجهات تطبيقات سطح مكتب تعمل على أنظمة تشغيل مختلفة في وقت واحد عبر استعمال الثلاثي الذهبي السابق مع إطار العمل إلكترون Electron، وذلك اعتمادًا على المعايير الموحدة في تطوير الويب بدلًا من تعلم لغة مخصصة لكل نظام تشغل لبرمجة تطبيقاته فلا تستغرب أن بعض واجهات التطبيقات التي تستعملها الآن مكتوبة بلغة HTML، وتشرح <a href="https://academy.hsoub.com/learn/javascript-application-development/" rel="">دورة تطوير التطبيقات باستخدام JavaScript</a> من أكاديمية حسوب كيفية تطوير تطبيق سطح مكتب باستخدام Electron.js مرة واحدة ولكن يعمل على كل أنظمة التشغيل كما أشرنا.
</p>

<p>
	<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" frameborder="0" height="480" id="ips_uid_8091_6" src="https://academy.hsoub.com/applications/core/interface/index.html" title="دورة تطوير التطبيقات باستخدام JavaScript - أكاديمية حسوب" width="853" data-embed-src="https://www.youtube.com/embed/T6CnMmvF4e0"></iframe>
</p>

<h2>
	أساسيات لغة HTML
</h2>

<p>
	تعتمد لغة HTML على مفهوم الوسم tag وهو مفتاح دلالي يحيط بنص ليعطيه مظهرًا أساسيًا ودلالة محددة. لنلق نظرة على المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_558_6" style=""><span class="tag">&lt;h1&gt;</span><span class="pln"> HTML مرحبا بك إلى </span><span class="tag">&lt;/h1&gt;</span><span class="pln">
</span><span class="tag">&lt;p&gt;</span><span class="pln"> هي لغة توصيفية تُستخدم لهيكلة صفحات ويب HTML لغة </span><span class="tag">&lt;/p&gt;</span></pre>

<p>
	لو كتبت هذه الشيفرة في محرر نصي (يمكنك نسخها ولصقها أيضًا) ثم حفظت التغييرات بالاسم test.html ونقرت على هذا الملف الجديد سيستدعي <a href="https://academy.hsoub.com/apps/operating-systems/%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84/" rel="">نظام التشغيل</a> المتصفح الافتراضي ليعرض النتيجة التالية:
</p>

<p style="text-align: center;">
	<img alt="01_basic_html.png" class="ipsImage ipsImage_thumbnailed" data-fileid="107532" data-unique="tpbbsb9cc" src="https://academy.hsoub.com/uploads/monthly_2022_09/01_basic_html.png.e1d0dca007156c8856722b9a1fce10b6.png">
</p>

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

<p>
	يتألف عنصر HTML من الأجزاء التالية:
</p>

<ol>
	<li>
		<strong>وسم البداية Opening tag</strong>: وتتكون من اسم العنصر (<code>p</code> أو <code>h1</code> في مثالنا) محاطًا بقوسي زاوية <code>&lt;&gt;</code>. ويشير هذا الوسم إلى النقطة التي يبدأ عندها العنصر.
	</li>
	<li>
		<strong>وسم النهاية Closing tag</strong>: يشابه وسم البداية لكنه يبدأ بشرطة أمامية <code>/</code> تسبق اسم العنصر. ويشير هذا الوسم إلى نهاية العنصر (<code>&lt;p/&gt;</code> و <code>&lt;h1/&gt;</code>).
	</li>
	<li>
		<strong>المحتوى Content</strong>: ويشير إلى المحتوى النصي الموجود بين وسمي البداية والنهاية. وقد لا يغلف وسمي البداية والنهاية أي محتوى، فيُدعى العنصر في هذه الحالة عنصرًا فارغًا empty element.
	</li>
</ol>

<p style="text-align: center;">
	<img alt="03_paragrhap_element.png" class="ipsImage ipsImage_thumbnailed" data-fileid="107479" data-unique="48d6hpmjt" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2022_09/03_paragrhap_element.png.2e6a069212c8422a7af820fc76b53cfe.png">
</p>

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

<p>
	لا تُعد لغة HTML لغة ًحساسة لحالة الأحرف عند كتابة الوسوم، فالوسمين <code>&lt;p&gt;</code> أو <code>&lt;P&gt;</code> مثلًا متطابقين ويعطيان النتيجة ذاتها.
</p>

<h3 id="السمات-في-لغة-HTML">
	السمات في لغة HTML
</h3>

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

<p>
	وتتكون السمة من اسم السمة يليها إشارة مساواة ثم قيمة السمة ضمن إشارتي تنصيص مزدوجتين (" ") أو مفردتين (' ').
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="107478" href="https://academy.hsoub.com/uploads/monthly_2022_09/02_elements_attribute.png.a71670a281d554f948b492f6188a76ce.png" rel=""><img alt="02_elements_attribute.png" class="ipsImage ipsImage_thumbnailed" data-fileid="107478" data-unique="sx3129isa" style="width: 800px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2022_09/02_elements_attribute.thumb.png.c16215c6b287e2a70ac9f80a0b5ab841.png"></a>
</p>

<p>
	ولا بد من وجود فراغ بين السمة واسم العنصر وبين السمة والسمة التي تليها إن وجدت. إليك مثالًا عن عرض صورة باستعمال الوسم <code><a href="https://wiki.hsoub.com/HTML/img" rel="external">&lt;img&gt;</a></code>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2805_18" style=""><span class="tag">&lt;h1&gt;</span><span class="pln">جمال الطبيعة</span><span class="tag">&lt;/h1&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">"nature.jpg"</span><span class="pln"> </span><span class="atn">width</span><span class="pun">=</span><span class="atv">"300px"</span><span class="pln"> </span><span class="atn">alt</span><span class="pun">=</span><span class="atv">"صورة من الطبيعة"</span><span class="tag">&gt;</span></pre>

<p>
	وضعت صورة بجانب صفحة text.html باسم nature.jpg وأشرت إليها في الخاصية <code>src</code> التي يأخذها عنصر الصورة ولاحظ أنني حددت عرضها عبر الخاصية <code>width</code> واسم بديل للصورة إن لم تُعرض لأي سبب عبر الخاصية <code>alt</code>، والنتيجة:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="107533" href="https://academy.hsoub.com/uploads/monthly_2022_09/04_html_attr.png.8d75297c65e5bc4651bfc17411d11134.png" rel=""><img alt="04_html_attr.png" class="ipsImage ipsImage_thumbnailed" data-fileid="107533" data-unique="k00m4n5d0" src="https://academy.hsoub.com/uploads/monthly_2022_09/04_html_attr.thumb.png.84e1c772f33143c39e852be70c071cf3.png"></a>
</p>

<p>
	ضع في بالك أن السمات التي يأخذها عنصر قد لا يأخذها عنصر آخر وأن لبعض العناصر سمات خاصة فريدة بها، فانظر مثلًا إلى <a href="https://wiki.hsoub.com/HTML/img#.D8.A7.D9.84.D8.AE.D8.A7.D8.B5.D9.8A.D8.A7.D8.AA" rel="external">سمات العنصر &lt;img&gt;</a> في توثيقه في موسوعة حسوب وبالطريقة نفسها يمكنك الرجوع إلى توثيق كل عنصر على حدة ومعرفة سماته التي يأخذها.
</p>

<p>
	<strong>ملاحظة</strong>: إن وجدت سمة HTML بلا قيمة أو كانت قيمتها نفس اسمها مثل <code>"disabled="disabled</code> تُدعى حينها بالسمة المنطقية وتُنفّذ ما يوحي به اسمها.
</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://khamsat.com/programming/scripting" rel="external">اطلب خدمتك الآن</a>
		</div>
	</div>
</div>

<h3 id="الوسوم-البنائية-والعناصر-السطرية">
	الوسوم البنائية والعناصر السطرية
</h3>

<p>
	تصنف وسوم HTML ضمن مجموعتين مهمتين هما مجموعة الوسوم الكتلية أو البنائية Block elements والسطرية inline elements وسنشرح الفرق بينهما.
</p>

<p>
	أما <strong>الوسوم الكتلية</strong>، فهي وسوم تظهر في سطر جديد بعد العنصر الذي يسبقها أي لا يمكن أن تقع على نفس السطر مع عنصر آخر لأنها تحتل سطرًا كاملًا من أوله لآخره وسيظهر العنصر الذي يليها في سطر جديد أيضًا. تُعد الوسوم الكتلية في الصفحة عناصر هيكلة وتنظيم ومن أمثلتها وسم الفقرة النصية <a href="https://wiki.hsoub.com/HTML/p" rel="external"><code>&lt;p&gt;</code></a> والعناوين <code>&lt;h&gt;</code> وقوائم تعداد <a href="https://wiki.hsoub.com/HTML/ol" rel="external"><code>&lt;ol&gt;</code></a> و <a href="https://wiki.hsoub.com/HTML/ul" rel="external"><code>&lt;ul&gt;</code></a> وغيرها، وتجدر الإشارة إلى أن الوسوم الكتلية لا توضع ضمن وسوم سطرية لكنها العكس صحيح.
</p>

<p>
	وأما <strong>الوسوم السطرية</strong>، فتقع داخل الوسوم البنائية وتحيط بأجزاء صغيرة من المحتوى (أي جزء من فقرة نصية أو مجموعة من بنود قائمة). لا تسبب هذه اوسوم ظهور سطر جديد في المستند أي لا تشغل بنفسها السطر بالكامل من هذه الوسوم نذكر الوسم <a href="https://wiki.hsoub.com/HTML/span" rel="external"><code>&lt;span&gt;</code></a> الذي يطبق تنسيقًا على جزء من فقرة والوسم <a href="https://wiki.hsoub.com/HTML/em" rel="external"><code>&lt;em&gt;</code></a> الذي يعرض جزءًا من النص بخط مائل.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5090_10" style=""><span class="tag">&lt;h1&gt;</span><span class="pln"> أنا وسم كتلي</span><span class="tag">&lt;/h1&gt;</span><span class="pln">
</span><span class="tag">&lt;p&gt;</span><span class="pln">عندما لا أقع على سطر خاص بي </span><span class="tag">&lt;em&gt;</span><span class="pln">وسمًا سطريًا </span><span class="tag">&lt;/em&gt;</span><span class="pln"> وأكون </span><span class="tag">&lt;/p&gt;</span></pre>

<h3 id="الوسوم-الأساسية-في-لغة-HTML">
	الوسوم الأساسية في لغة HTML
</h3>

<p>
	إليك قائمة بأهم وسوم لغة HTML ودلالاتها:
</p>

<h4>
	عنصر الفقرة p
</h4>

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

<h4>
	عناصر عناوين الفقرات h
</h4>

<p>
	يُضاف إلى الوسم أرقام من 1 إلى 6 لتحديد مستوى العنوان Header لتصبح على الشكل <code>&lt;h1&gt;</code> و <code>&lt;h2&gt;</code> وهكذا حتى <code>&lt;h6&gt;</code>. إليك مثالًا:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2805_23" style=""><span class="tag">&lt;hgroup&gt;</span><span class="pln">
  </span><span class="tag">&lt;h1&gt;</span><span class="pln">عنوان من المستوى الأول</span><span class="tag">&lt;/h1&gt;</span><span class="pln">
  </span><span class="tag">&lt;h2&gt;</span><span class="pln">عنوان من المستوى الثاني</span><span class="tag">&lt;/h2&gt;</span><span class="pln">
  </span><span class="tag">&lt;h3&gt;</span><span class="pln">عنوان من المستوى الثالث</span><span class="tag">&lt;/h3&gt;</span><span class="pln">
  </span><span class="tag">&lt;h4&gt;</span><span class="pln">عنوان من المستوى الرابع</span><span class="tag">&lt;/h4&gt;</span><span class="pln">
</span><span class="tag">&lt;/hgroup&gt;</span></pre>

<p>
	ستكون النتيجة كالتالي:
</p>

<p style="text-align: center;">
	<img alt="05_headers.png" class="ipsImage ipsImage_thumbnailed" data-fileid="107534" data-unique="hy80ffw22" src="https://academy.hsoub.com/uploads/monthly_2022_09/05_headers.png.c61f21bc80d2b7053fdd9d9db7e690cb.png">
</p>

<h4>
	عنصر القائمة ol/ul
</h4>

<p>
	وتضم مجموعة من وسوم HTML تُدعى وسوم القائمة <a href="https://wiki.hsoub.com/HTML/li" rel="external"><code>&lt;li&gt;</code></a> ينبغي ترتيبها وفق تسلسل معين باستخدام قائمة مرتبة <code>&lt;ol&gt;</code> كأن تصف طريقة تحضير وصفة طعام أو خطوات الوصول إلى وجهة معينة أو دون تسلسل باستخدام قائمة غير مرتبة <code>&lt;ul&gt;</code>. إليك مثالًا عن قائمة مرتبة:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2805_25" style=""><span class="tag">&lt;ol&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">أفرغ محتويات ظرف الكريمة ضمن وعاء نظيف</span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">أسكب كوبًا من الماء البارد وحرك المزيج بلطف حتى التجانس</span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">استخدم خفاقة كهربائية لخفق المزيج بشدة من 4 إلى 5 دقائق</span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">ضع الكريمة في البراد حتى يحين وقت استخدامها</span><span class="tag">&lt;/li&gt;</span><span class="pln">
</span><span class="tag">&lt;/ol&gt;</span></pre>

<p>
	ستكون النتيجة كما يلي:
</p>

<p style="text-align: center;">
	<img alt="06_ordered_list.png" class="ipsImage ipsImage_thumbnailed" data-fileid="107535" data-unique="7w17c4zje" src="https://academy.hsoub.com/uploads/monthly_2022_09/06_ordered_list.png.8272674b9fc96a91adc8a3fc1df8cea4.png">
</p>

<p>
	وهذا مثال عن قائمة غير مرتبة:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2805_30" style=""><span class="tag">&lt;ul&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">C++</span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">Python</span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">Java</span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">PHP</span><span class="tag">&lt;/li&gt;</span><span class="pln">
</span><span class="tag">&lt;/ul&gt;</span></pre>

<p>
	ستكون النتيجة كما يلي:
</p>

<p style="text-align: center;">
	<img alt="07_unordered_list.png" class="ipsImage ipsImage_thumbnailed" data-fileid="107536" data-unique="cewkofbjt" src="https://academy.hsoub.com/uploads/monthly_2022_09/07_unordered_list.png.cc8d7f23b251398be211319721f0e651.png">
</p>

<p>
	للاطلاع على المزيد من الوسوم لتعلم لغة HTML وطريقة استخدامها أنصحك بالتوجه إلى <a href="https://wiki.hsoub.com/HTML" rel="external">التوثيق العربي للغة HTML</a> ضمن <a href="https://wiki.hsoub.com" rel="external">موسوعة حسوب</a> لعلوم الحواسب وتكنولوجيا المعلومات.
</p>

<h4>
	عنصر الرابط a
</h4>

<p>
	يولد عنصر <a href="https://wiki.hsoub.com/HTML/a" rel="external"><code>&lt;a&gt;</code></a> رابطًا إلى صفحة HTML أخرى أو إلى قسم آخر ضمن صفحة HTML نفسها ويأخذ سمة <code>href</code> التي تحوي رابط الوجهة المطلوبة:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2805_32" style=""><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"https://academy.hsoub.com/"</span><span class="tag">&gt;</span><span class="pln">
  أكاديمية حسوب
</span><span class="tag">&lt;/a&gt;</span></pre>

<p>
	يسمى النص بعد تحويله إلى رابط بالمربط anchor ومن هنا جاءت تسمية العنصر <code>&lt;a&gt;</code> اختصارًا لأول حرف.
</p>

<p>
	أخيرًا وليس آخرًا، لا يسعنا في هذا القسم شرح كل عناصر HTML ولا حتى في مقال واحد، وسنحيلك في قسم المصادر إلى مراجع تتعرف فيها على كل وسوم لغة HTML.
</p>

<h2 id="إيجابيات-وسلبيات-لغة-HTML">
	إيجابيات وسلبيات لغة HTML
</h2>

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

<h3>
	إيجابيات لغة HTML
</h3>

<ul>
	<li>
		تستخدم لغة HTML على نطاق واسع في بناء هيكلية صفحات <a href="https://khamsat.com/create-website" rel="external">ومواقع ويب</a>.
	</li>
	<li>
		تدعم جميع المتصفحات الحديثة لغة HTML وعلى مختلف المنصات.
	</li>
	<li>
		تعلم لغة HTML أمر سهل.
	</li>
	<li>
		حجم أكواد لغة HTML صغير وسريعة التحميل.
	</li>
	<li>
		لا حاجة لشراء برمجيات إضافية للتعامل مع لغة HTML بل يمكن أن تكتفي بمحرر نصي ومتصفح.
	</li>
	<li>
		لغة HTML شديدة المرونة وتحاول تجاهل الأخطاء التي ترتكبها أو تفسير ما هو مكتوب لإظهار نتيجة.
	</li>
	<li>
		يمكن أن تتكامل لغة HTML بسهولة مع لغات أخرى مثل JavaScript.
	</li>
	<li>
		من السهل كتابة أكواد HTML حتى بالنسبة للمبتدئين.
	</li>
	<li>
		تضم لغة HTML عددًا كبيرًا من العناصر التي تمتلك دلالات مختلفة مما يساعد في تنظيم وهيكلة صفحة الويب بطريقة أكثر احترافيةً ووضوحًا.
	</li>
</ul>

<h3>
	سلبيات لغة HTML
</h3>

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

<h2 id="مصادر-تعلم-لغة-HTML">
	مصادر تعلم لغة HTML
</h2>

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

<p>
	بدايةً، وفرت أكاديمية حسوب دورة تطبيقية كاملة عن تطوير الواجهات باستخدام لغة HTML وهي <span ipsnoautolink="true">دورة تطوير واجهات المستخدم</span> تزيد عن 50 ساعة فيديو أُعدت على يد نخبة من المبرمجين العرب وبلغة عربية تشرح الدورة الثلاثي الذهبي لغة HTML مع لغة CSS ولغة جافاسكربت وستصبح بإنهائك للدورة مطور واجهات مستخدم أمامية مع شهادة معتمدة تشهد بذلك وستتقن فيها تلك اللغات السابقة وستستعملها في بناء واجهات تطبيقات حقيقية.
</p>

<p>
	<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" frameborder="0" height="480" id="ips_uid_491_7" src="https://academy.hsoub.com/applications/core/interface/index.html" title="دورة تطوير واجهات المستخدم - أكاديمية حسوب" width="853" data-embed-src="https://www.youtube.com/embed/habGCxz4LXs"></iframe>
</p>

<p>
	دعمت <a href="https://wiki.hsoub.com/" rel="external">موسوعة حسوب</a> الدورة هذه بتوفير <a href="https://wiki.hsoub.com/HTML" rel="external">توثيق HTML العربي</a> وهو توثيق كامل عن لغة HTML بكل عناصرها وتفصيلاتها والسمات التي تأخذها وقيمها وكل شيء بلغة عربية لن تحتاج معه إلى مصادر أجنبية.
</p>

<p>
	نضيف إلى ما سبق المنشورات التي تنشرها أكاديمية حسوب ومنها:
</p>

<ol>
	<li>
		كتاب <a href="https://academy.hsoub.com/files/13-%25D9%2586%25D8%25AD%25D9%2588-%25D9%2581%25D9%2587%25D9%2585-%25D8%25A7%25D9%2594%25D8%25B9%25D9%2585%25D9%2582-%25D9%2584%25D8%25AA%25D9%2582%25D9%2586%25D9%258A%25D8%25A7%25D8%25AA-html5/" rel="">نحو فهم أعمق لتقنيات HTML5</a> وهو كتاب يخص إصدار HTML 5 وما فيه من ميزات وتقنيات أضيفت للغة HTML.
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/html/" rel="">قسم لغة HTML</a>: وتُنشر فيه دروس ومقالات عن لغة HTML عمومًا بمختلف المواضيع وفيه ما يزيد عن 80 مقال ودرس عملي تطبيقي ننصح بالإطلاع عليه دوريًا ومتابعته.
	</li>
</ol>

<p>
	ستتعلم بتلك المصادر لغة HTML باتقان واحتراف وستستخدمها في مكانها أحسن استخدام لبناء واجهات وصفحات الويب احترافية وستدخل عالم الويب من أوسع أبوابه متجهًا نحو إتقان البرمجة والتطوير، وإن واجهت في رحلتك تلك أي عقبة، فضع سؤالك ضمن قسم <a href="https://academy.hsoub.com/questions/c3-programming/" rel="">الأسئلة والأجوبة</a> لتحصل على إجابة من مبرمجين آخرين معك ولا تنسى مشاركة تجاربك في <a href="https://io.hsoub.com/webdev" rel="external">مجتمع حسوب IO البرمجي</a>.
</p>

<h2>
	خاتمة
</h2>

<p>
	تُعد لغة HTML لغة توصيفية سهلة الاستخدام تعتمد على مجموعة من الوسوم لتنظيم النصوص وهيكلتها لتسهيل قراءتها وتوضيح مدلولاتها من فقرات وعناوين وقوائم وكذلك لتسهيل الوصول إلى أجزائها آليًا.
</p>

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

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

<ul>
	<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>
	<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/general/%D9%81%D9%88%D8%A7%D8%A6%D8%AF-%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9/" rel="">ما هي فوائد تعلم البرمجة؟</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/python/%D8%A7%D9%84%D9%85%D8%B1%D8%AC%D8%B9-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-%D8%A5%D9%84%D9%89-%D8%AA%D8%B9%D9%84%D9%85-%D9%84%D8%BA%D8%A9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-r735/" rel="">المرجع الشامل إلى تعلم لغة بايثون</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/freelance/jobs/%D8%AF%D9%84%D9%8A%D9%84%D9%83-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-%D9%84%D9%84%D8%AA%D8%AD%D8%B6%D9%8A%D8%B1-%D9%84%D9%84%D8%B9%D9%85%D9%84-%D9%83%D9%85%D8%B3%D8%AA%D9%82%D9%84-%D8%B9%D9%86%D8%AF%D9%85%D8%A7-%D8%AA%D9%83%D9%88%D9%86-%D9%85%D8%A8%D8%B1%D9%85%D8%AC%D8%A7-%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A8%D9%86%D9%81%D8%B3%D9%87-r140/" rel="">دليلك الشامل للتحضير للعمل كمستقل عندما تكون مبرمجا تعلم البرمجة بنفسه</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1702</guid><pubDate>Thu, 01 Sep 2022 19:00:00 +0000</pubDate></item><item><title>&#x634;&#x645;&#x648;&#x644;&#x64A;&#x629; &#x627;&#x644;&#x62A;&#x635;&#x645;&#x64A;&#x645;: &#x633;&#x647;&#x648;&#x644;&#x629; &#x648;&#x635;&#x648;&#x644; &#x62C;&#x645;&#x64A;&#x639; &#x627;&#x644;&#x645;&#x633;&#x62A;&#x62E;&#x62F;&#x645;&#x64A;&#x646; &#x644;&#x635;&#x641;&#x62D;&#x627;&#x62A; &#x645;&#x648;&#x642;&#x639; &#x627;&#x644;&#x648;&#x64A;&#x628;</title><link>https://academy.hsoub.com/programming/html/%D8%B4%D9%85%D9%88%D9%84%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D8%B3%D9%87%D9%88%D9%84%D8%A9-%D9%88%D8%B5%D9%88%D9%84-%D8%AC%D9%85%D9%8A%D8%B9-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85%D9%8A%D9%86-%D9%84%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D9%85%D9%88%D9%82%D8%B9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r1640/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_08/62e821cd38e7a_-----.png.40763784e5f10348375f1ab96429c5e1.png" /></p>

<p>
	يشرح هذا المقال مفاهيم تصميمية أساسية تتمثل <a href="https://academy.hsoub.com/programming/html/%D8%B3%D9%87%D9%88%D9%84%D8%A9-%D9%88%D8%B5%D9%88%D9%84-%D8%AC%D9%85%D9%8A%D8%B9-%D8%A7%D9%84%D8%B2%D9%88%D8%A7%D8%B1-%D9%84%D9%85%D9%88%D8%A7%D9%82%D8%B9-%D9%88%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r1323/" rel="">بسهولة أو إمكانية الوصول accessibility إلى محتوى مواقع ويب</a> وكيفية تصميم مواقع ويب يستطيع معظم زائريها الحصول على محتواها بسهولة ومتعة.
</p>

<h2>
	تسهيل وصول جميع المستخدمين إلى مواقع ويب
</h2>

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

<h3>
	المبادئ العامة لسهولة الوصول
</h3>

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

<h3>
	سهولة الوصول في عالم ويب
</h3>

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

<p>
	لنتأمل مقطع فيديو:
</p>

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

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

<p>
	أدارت منظمة <a href="https://ar.wikipedia.org/wiki/%D8%B1%D8%A7%D8%A8%D8%B7%D8%A9_%D8%A7%D9%84%D8%B4%D8%A8%D9%83%D8%A9_%D8%A7%D9%84%D8%B9%D8%A7%D9%84%D9%85%D9%8A%D8%A9" rel="external nofollow">W3C</a> منذ عام 1999 مجموعة عمل تُدعى "مبادرة سهولة الوصول على الويب <a href="https://developer.mozilla.org/en-US/docs/Glossary/WAI" rel="external nofollow">Web Accessibility Initiative</a>" لتطوير معايير إمكانية الوصول من خلال الإرشادات والمواد الداعمة والموارد على المستوى العالمي، ويمكنك الاطلاع على المزيد من خلال موقع المبادرة <a href="https://www.w3.org/WAI/" rel="external nofollow">WAI</a>، كما قد تجد بعض الأفكار في <a href="https://academy.hsoub.com/programming/html/%D8%B3%D9%87%D9%88%D9%84%D8%A9-%D9%88%D8%B5%D9%88%D9%84-%D8%AC%D9%85%D9%8A%D8%B9-%D8%A7%D9%84%D8%B2%D9%88%D8%A7%D8%B1-%D9%84%D9%85%D9%88%D8%A7%D9%82%D8%B9-%D9%88%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r1323/" rel="">مقالات</a> أكاديمية حسوب.
</p>

<h2>
	تصميمات موجهة لجميع المستخدمين
</h2>

<p>
	عندما تشرع في تصميم موقع ويب ينبغي علينا التفكير أولًا <a href="https://academy.hsoub.com/design/user-experience/%D8%A7%D9%84%D9%81%D8%B1%D9%82-%D8%A8%D9%8A%D9%86-%D8%A5%D9%85%D9%83%D8%A7%D9%86%D9%8A%D8%A9-%D8%A7%D9%84%D9%88%D8%B5%D9%88%D9%84-%D9%88%D8%A7%D9%84%D8%B4%D9%85%D9%88%D9%84%D9%8A%D8%A9-%D9%81%D9%8A-%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D8%AA%D8%AC%D8%B1%D8%A8%D8%A9-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-r642/" rel="">بتصميم شمولي</a> Universal Design للموقع يلائم جميع مستخدِميه بغض النظر عن أية إعاقات قد يعانونها أو أية قيود تقنية أو ثقافية أو مكانية.
</p>

<p>
	يناقش هذا المقال بعض الأفكار السريعة والناجحة في تصميم أكثر شمولية لمواقع ويب، ولكن لا بدّ أن تكون أولًا على دراية بمفهوم <a href="https://academy.hsoub.com/design/user-experience/%D8%A7%D9%84%D9%81%D8%B1%D9%82-%D8%A8%D9%8A%D9%86-%D8%A5%D9%85%D9%83%D8%A7%D9%86%D9%8A%D8%A9-%D8%A7%D9%84%D9%88%D8%B5%D9%88%D9%84-%D9%88%D8%A7%D9%84%D8%B4%D9%85%D9%88%D9%84%D9%8A%D8%A9-%D9%81%D9%8A-%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D8%AA%D8%AC%D8%B1%D8%A8%D8%A9-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-r642/" rel="">التصميم الشمولي</a> Universal design.
</p>

<h3>
	التلاؤم اللوني
</h3>

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

<p>
	تُحدِّد منظمة <a href="https://ar.wikipedia.org/wiki/%D8%B1%D8%A7%D8%A8%D8%B7%D8%A9_%D8%A7%D9%84%D8%B4%D8%A8%D9%83%D8%A9_%D8%A7%D9%84%D8%B9%D8%A7%D9%84%D9%85%D9%8A%D8%A9" rel="external nofollow">W3C</a> التلاؤم اللوني من خلال خوارزمية تحسب نسبة السطوع luminosity ratio بين الخلفية والواجهة، وقد تكون هذه الحسابات معقدةً، لكن بعض الأدوات الجاهزة قد تساعدنا في إنجاز الأمر.
</p>

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

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			<strong>ملاحظة</strong>: ستجد الكثير من الأدوات التي تحدِّد التلاؤم اللوني مثل <a href="http://www.paciellogroup.com/resources/contrastanalyser/" rel="external nofollow">Color Contrast Analyser</a> التي تتيحها مجموعة Paciello، أو <a href="https://webaim.org/resources/contrastchecker/" rel="external nofollow">Color Contrast Checker</a> التي تتيحها WebAIM، ونقترح عليك استخدام أدوات تضم منتقي ألوان مدمج معها يساعدك على انتقاء اللون من الشاشة مباشرةً.
		</p>
	</div>
</blockquote>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="104220" href="https://academy.hsoub.com/uploads/monthly_2022_08/01_color_contrast.png.f53ded40649297c1033db416490383e1.png" rel=""><img alt="01_color_contrast.png" class="ipsImage ipsImage_thumbnailed" data-fileid="104220" data-unique="z35ikebcw" src="https://academy.hsoub.com/uploads/monthly_2022_08/01_color_contrast.thumb.png.20473955616c140987f4949cac1fa62d.png" style="width: 650px; height: auto;"></a>
</p>

<p>
	اختُبر التلاؤم اللوني لصفحة المقال الأصلي في الصورة السابقة وأعطى نتيجة 8.30:1 وهذا الرقم أعلى بكثير من الحد الأدنى المقبول الذي يقدَّر بالنسبة 4.5:1 وبالتالي لا بد أن يساعد التلاؤم اللوني للصفحة الكثيرين من ذوي الإعاقة البصرية في قراءتها.
</p>

<h3>
	حجم خط الكتابة
</h3>

<p>
	يمكنك تحديد حجم خط الكتابة في موقع ويب بوحدات قياس نسبية relative أو مطلقة absolute.
</p>

<h4>
	وحدات القياس المطلقة
</h4>

<p>
	لا تُحسَب هذه الوحدات حسابًا تناسبيًا، وإنما تعتمد على حجم محدد بصورة أساسية في الحساب، إذ تُقدَّر وحدة القياس المطلقة غالبًا بالبيكسل <code>px</code>، فإذا وضعت الشيفرة التالية مثلًا في ملف تنسيق <a href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D8%B3%D8%B1%D9%8A%D8%B9-%D8%A5%D9%84%D9%89-%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%AA%D9%86%D8%B3%D9%8A%D9%82-css-r551/" rel="">CSS</a>:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_3206_10" style="">
<span class="pln">body </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="lit">16px</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span></pre>

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

<h4>
	وحدات القياس النسبية
</h4>

<p>
	تُحسَب هذه الأحجام نسبةً إلى العنصر الأب، وهي أكثر وضوحًا فيما يخص سهولة الوصول لأنها تحترم الإعدادات الخاصة بنظام المستخدِم، كما يُعبَّر عن الوحدات النسبية بالرموز <code>em</code> و<code>%</code> و<code>rem</code>:
</p>

<ul>
<li>
		الحجم المبني على النسبة المئوية <code>%</code>: تخبر هذه الوحدة المتصفح أنّ حجم الخط في العنصر هو نسبة مئوية من حجم الخط في العنصر الأب الذي حُدِّد فيه حجم الخط، فإذا لم يكن للعنصر أب، فستجري الحسابات بالنسبة إلى حجم الخط الافتراضي للمتصفح (16 بكسل عادةً).
	</li>
	<li>
		الحجم المبني على الوحدة <code>Em</code>: تُحسَب اعتمادًا على أسلوب النسبة المئوية ذاته لكن على أساس أجزاء من 1 وليس 100، كما يُقال أن "em" هو عرض الحرف الأبجدي "M" على أساس حرف كبير (إذ يمكن وضعه ضمن مربع بصورة تقريبية).
	</li>
	<li>
		الحجم المبني على الوحدة <code>rem</code>: تُحسَب على أساس نسبة من حجم الخط للعنصر الجذري، ويعبَّر عنها على أساس أجزاء من 1 كما هو حال <code>Em</code>.
	</li>
</ul>
<p>
	لنفترض أننا نريد حجمًا أساسيًا للخط مقداره 16 بكسل وحجمًا مقداره 32 بكسل لعنصر العنوان الرئيسي <code>h1</code>، فإذا وجدنا ضمن العنصر <code>h1</code> الوسم <code>span</code> الذي يطبق تنسيق الصنف <code>subheading</code>، فيجب تصيير ما داخل <code>span</code> أيضًا بالنسبة إلى حجم الخط الافتراضي (16 بكسل عادة)، وإليك شيفرة <a href="https://wiki.hsoub.com/HTML" rel="external">HTML</a> لتوضيح الفكرة:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3206_13" style="">
<span class="dec">&lt;!DOCTYPE html&gt;</span><span class="pln">
</span><span class="tag">&lt;html</span><span class="pln"> </span><span class="atn">lang</span><span class="pun">=</span><span class="atv">"en"</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;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">Font size experiment</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">This is our main heading
        </span><span class="tag">&lt;span</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"subheading"</span><span class="tag">&gt;</span><span class="pln">This is our subheading</span><span class="tag">&lt;/span&gt;</span><span class="pln">
    </span><span class="tag">&lt;/h1&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>
	أما شيفرة <a href="https://wiki.hsoub.com/CSS" rel="external">CSS</a> المبنية على النسبة المئوية:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_3206_15" style="">
<span class="pun">‫</span><span class="com">/* 100% من حجم الخط الأساسي للمتصفح والذي يكون عادة 16 بكسل */</span><span class="pln">
body </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="lit">100</span><span class="pun">%;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="com">/* أي حوالي 32 بكسل body ضعفي حجم المحدد */</span><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="lit">200</span><span class="pun">%;</span><span class="pln"> </span><span class="pun">}</span><span class="pln"> 
</span><span class="com">/* أي العودة إلى القياس 16 بكسل h1 نصف  */</span><span class="pln">
span</span><span class="pun">.</span><span class="pln">subheading </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="lit">50</span><span class="pun">%;</span><span class="pln"> </span><span class="pun">}</span><span class="pln"> </span></pre>

<p>
	سنواجه المشكلة نفسها عند استخدام وحدة القياس <code>Em</code>:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_3206_17" style="">
<span class="pun">‫</span><span class="pln"> </span><span class="com">/* 1em = 100% من قياس الخط الأساسي الذي يكون عادة 16 بكسل*/</span><span class="pln">
body </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="lit">1em</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln"> 
</span><span class="com">/*أي حوالي 32 بكسل body ضعفي حجم المحدد */</span><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="lit">2em</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln"> 
</span><span class="com">/* أي العودة إلى القياس 16 بكسل h1 نصف */</span><span class="pln">
span</span><span class="pun">.</span><span class="pln">subheading </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="lit">0.5em</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln"> </span></pre>

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

<p>
	تقاس الوحدة <code>rem</code> بالنسبة إلى حجم العنصر الجذري وليس لأيّ عنصر أب، لذلك يمكن كتابة تنسيق CSS كما يلي:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_3206_19" style="">
<span class="pun">‫</span><span class="com">/* 1em = 100% من قياس الخط الأساسي الذي يكون عادة 16 بكسل*/</span><span class="pln">
body </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="lit">1em</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln"> 
</span><span class="com">/*أي حوالي 32 بكسل body ضعفي حجم المحدد */</span><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="lit">2rem</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><span class="pun">.</span><span class="pln">subheading </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="lit">1rem</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln"> </span></pre>

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

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

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			<strong>ملاحظة</strong>: قد تلاحظ أنّ متصفح أوبرا ميني لا يدعم استخدام وحدة القياس <code>rem</code> وسينتهي الأمر بتطبيق إعداداته الخاصة فلا تزعج نفسك بالأمر.
		</p>
	</div>
</blockquote>

<h4>
	لماذا قد أستخدم وحدات القياس النسبية
</h4>

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

<ul>
<li>
		استخدم وحدة القياس <code>rem</code> وستكون النتائج مرضيةً في جميع المتصفحات.
	</li>
	<li>
		دع مهمة عرض الخطوط في المتصفحات القديمة لمحركاتها الداخلية، إذ تتجاهل هذه المحركات أيّ خاصية أو قيمة لتنسيقات CSS لا تتوافق معها، وهكذا ستبقى قادرًا على عرض صفحتك على تلك المتصفحات، وعلى أية حال، ستختفي المتصفحات القديمة مع الوقت حتى لو لم يتفق ذلك مع رؤية المصمم.
	</li>
</ul>
<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			<strong>ملاحظة</strong>: قد تختلف وحدات القياس التي تستخدِمها، لكن إذا أردت دعم المتصفحات القديمة، فعليك استخدم وحدة <code>em</code>، ولا بد عندها من بعض الحسابات الإضافية.
		</p>
	</div>
</blockquote>

<h3>
	حجم السطر
</h3>

<p>
	هنالك جدل طويل قائم حول طول الأسطر في ويب، وإليك القصة كاملةً.
</p>

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

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3206_21" style="">
<span class="dec">&lt;!DOCTYPE html&gt;</span><span class="pln">
</span><span class="tag">&lt;html</span><span class="pln"> </span><span class="atn">lang</span><span class="pun">=</span><span class="atv">"en"</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;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">Font size experiment</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;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"container"</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="tag">&lt;h1&gt;</span><span class="pln">This is our main heading
        </span><span class="tag">&lt;span</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"subheading"</span><span class="tag">&gt;</span><span class="pln">This is our subheading</span><span class="tag">&lt;/span&gt;</span><span class="pln">
    </span><span class="tag">&lt;/h1&gt;</span><span class="pln">

    </span><span class="tag">&lt;p&gt;</span><span class="pln">[lengthy text that spans many lines]</span><span class="tag">&lt;/p&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>
	لدينا عنصر <code>div</code> له صنف التنسيق <code>container</code>، إذ يمكننا تنسيق <code>div</code> بضبط عرضه باستخدام الخاصية <code>width</code> أو من خلال ضبط عرضه الأعظمي لكي لا يزداد كثيرًا باستخدام الخاصية <code>max-width</code>، فإذا أردت موقعًا مرنًا أو متجاوبًا ولم تكن تعرف العرض الافتراضي الذي يأخذه المتصفح، فيمكنك استخدام الخاصية <code>max-width</code> لكي تضبط عدد المحارف في السطر بحدود 70 محرفًا لا أكثر:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_3206_23" style="">
<span class="pln">div</span><span class="pun">.</span><span class="pln">container </span><span class="pun">{</span><span class="pln"> max</span><span class="pun">-</span><span class="pln">width</span><span class="pun">:</span><span class="lit">70em</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span></pre>

<h3>
	النصوص البديلة عن الصور والمقاطع الصوتية ومقاطع الفيديو
</h3>

<p>
	تضم مواقع الويب أشياء أخرى غير النصوص، ولا بد من الانتباه إليها:
</p>

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

<p>
	قد تكون الصور لمجرد العرض وتدعى بالصور الاستعراضية أو قد تحتوي على معلومات، لكن لا ضمانة بأن يراها المستخدِم لأسباب منها:
</p>

<ul>
<li>
		استخدام ذوي الإعاقة البصرية قارئات الشاشة التي تتعامل مع النصوص فقط.
	</li>
	<li>
		استخدام شبكات إنترانت محلية تفرض قيودًا على عرض الصور من مصادر خارجية أو <a href="https://academy.hsoub.com/devops/cloud-computing/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%B4%D8%A8%D9%83%D8%A7%D8%AA-%D8%AA%D8%B3%D9%84%D9%8A%D9%85-%D8%A7%D9%84%D9%85%D8%AD%D8%AA%D9%88%D9%89-cdn-%D9%84%D8%AA%D8%B3%D8%B1%D9%8A%D8%B9-%D8%AA%D8%B3%D9%84%D9%8A%D9%85-%D8%A7%D9%84%D9%85%D8%AD%D8%AA%D9%88%D9%89-%D8%A7%D9%84%D8%AB%D8%A7%D8%A8%D8%AA-r393/" rel="">شبكات توريد محتوى CDN</a>.
	</li>
	<li>
		تعطيل المستخدِم عرض الصور لتوفير حزمة البيانات المتاحة وخاصةً عند استخدام الهواتف الجوالة.
	</li>
</ul>
<p>
	أما <strong>الصور الاستعراضية Decorative</strong>، فتُستخدَم لتزيين الصفحات ولا توصل أية معلومات حقيقة، كما يمكن استبدالها في معظم الحالات بصورة خلفية، وتأكد من وضع نص فارغ على أساس قيمة للسمة <code>alt</code> في عنصر الصورة كي لا يتجاهل المتصفح عرض النص البديل.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3206_25" style="">
<span class="tag">&lt;img</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"deco.gif"</span><span class="pln"> </span><span class="atn">alt</span><span class="pun">=</span><span class="atv">""</span><span class="tag">&gt;</span></pre>

<p>
	وأما <strong>الصور التي تحتوي على معلومات Informative</strong>، فتُستخدَم لإيصال معلومات محددة، مثل عرض رسم بياني أو وجه أحد ما أو أية معلومات أخرى، إذ عليك أن تقدِّم على الأقل نصًا بديلًا في هذه الحالة (السمة <code>alt</code>)، فإذا أمكن وصف الصورة جيدًا، فيكفي استخدام النص البديل، وإلا عليك تقديم محتوى الصورة تقديمًا آخرًا في الصفحة نفسها مثل أن تعرض بالإضافة إلى الرسم البياني جدولًا يضم المعلومات نفسها، أو الجأ إلى السمة <code>longdesc</code> التي تحمل عنوان URL يشير إلى مصدر يشرح صراحةً محتوى الصورة.
</p>

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

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			<strong>ملاحظة</strong>: إنّ استخدام <code>longdesc</code> أو وجود هذه السمة أصلًا هو محط خلاف منذ زمن، وننصحك بالعودة إلى <a href="https://www.w3.org/TR/html-longdesc/" rel="external nofollow">توثيقات W3C عن هذه السمة</a> لتطَّلع على شرح أوسع مع أمثلة عن الاستخدام.
		</p>
	</div>
</blockquote>

<h4>
	الصوت والصورة
</h4>

<p>
	لابد أن تقدِّم بديًلا عن الوسائط السمعية والبصرية أيضًا.
</p>

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

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

<ul>
<li>
		<strong>برمجيات تُثبَّت على جهازك</strong>: ستجد ImageOptim على ماك، وستجد PNGcrush على دوس ولينوكس ويونكس، بينما يعمل OptiPNG على كل المنصَّات.
	</li>
	<li>
		<strong>أدوات على الإنترنت</strong>: مثل smushit!‎ من ياهو Yahoo و Online Image Optimizer من Dynamic Drive، إذ يحوِّل هذا الأخير الصور تلقائيًا من تنسيق إلى آخر إذا كان أكثر فعاليةً فيما يخص تخفيض استهلاك حزمة تراسل البيانات.
	</li>
</ul>
<h2>
	نظرة إلى ميزات HTML التي تدعم سهول الوصول
</h2>

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

<h3>
	التنقل عبر المفتاح TAB
</h3>

<p>
	يمكن للزائرين الذين لا يمتلكون أجهزة تأشير مثل الفأرة، أو لا يستطيعون استخدامها التنقل عبر الروابط من خلال استخدام المفتاح TAB، إذ ينبغي أن تكون الروابط مرتبةً بطريقة منطقية لاستخدام هذه الميزة، لذلك تقدِّم HTML السمة <code>tabindex</code> التي تحدِّد الترتيب، فإذا كانت شيفرة HTML المكتوبة خطيةً ومتتابعةً كما ينبغي، فستظهر الروابط وفق الترتيب المنطقي تلقائيًا.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3206_28" style="">
<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">"here.html"</span><span class="pln"> </span><span class="atn">tabindex</span><span class="pun">=</span><span class="atv">"1"</span><span class="tag">&gt;</span><span class="pln">Here</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">"there.html"</span><span class="pln"> </span><span class="atn">tabindex</span><span class="pun">=</span><span class="atv">"3"</span><span class="tag">&gt;</span><span class="pln">There</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">"anywhere.html"</span><span class="pln"> </span><span class="atn">tabindex</span><span class="pun">=</span><span class="atv">"2"</span><span class="tag">&gt;</span><span class="pln">Anywhere</span><span class="tag">&lt;/a&gt;&lt;/li&gt;</span><span class="pln">
</span><span class="tag">&lt;/ul&gt;</span></pre>

<p>
	تعرض الشيفرة السابقة التي قدمناها لمجرد توضيح الفكرة ترتيب استخدام TAB من "Here" إلى "Anywhere" إلى "There".
</p>

<h3>
	عناوين الروابط
</h3>

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

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3206_30" style="">
<span class="tag">&lt;p&gt;</span><span class="pln">I'm really bad at writing link text. </span><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"inept.html"</span><span class="pln"> </span><span class="atn">title</span><span class="pun">=</span><span class="atv">"Why I'm rubbish at writing link text: An explanation and an apology."</span><span class="tag">&gt;</span><span class="pln">Click here</span><span class="tag">&lt;/a&gt;</span><span class="pln"> to find out more.</span><span class="tag">&lt;/p&gt;</span></pre>

<h3>
	مفاتيح الوصول
</h3>

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

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3206_32" style="">
<span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"somepage.html"</span><span class="pln"> </span><span class="atn">accesskey</span><span class="pun">=</span><span class="atv">"s"</span><span class="tag">&gt;</span><span class="pln">Some page</span><span class="tag">&lt;/a&gt;</span></pre>

<h3>
	روابط التجاوز
</h3>

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

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3206_34" style="">
<span class="tag">&lt;header&gt;</span><span class="pln">
  </span><span class="tag">&lt;h1&gt;</span><span class="pln">The Heading</span><span class="tag">&lt;/h1&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">"#content"</span><span class="tag">&gt;</span><span class="pln">Skip to content</span><span class="tag">&lt;/a&gt;</span><span class="pln">
</span><span class="tag">&lt;/header&gt;</span><span class="pln">

</span><span class="tag">&lt;nav&gt;</span><span class="pln">
  </span><span class="com">&lt;!-- navigation stuff --&gt;</span><span class="pln">
</span><span class="tag">&lt;/nav&gt;</span><span class="pln">

</span><span class="tag">&lt;section</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="com">&lt;!--your content --&gt;</span><span class="pln">
</span><span class="tag">&lt;/section&gt;</span></pre>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://developer.mozilla.org/en-US/docs/Learn/Common_questions/What_is_accessibility" rel="external nofollow">?What is accessibility</a>، والمقال <a href="https://developer.mozilla.org/en-US/docs/Learn/Common_questions/Design_for_all_types_of_users" rel="external nofollow">?How can we design for all types of users</a>، والمقال <a href="https://developer.mozilla.org/en-US/docs/Learn/Common_questions/HTML_features_for_accessibility" rel="external nofollow">?What HTML features promote accessibility</a>.
</p>

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

<ul>
<li>
		<a href="https://academy.hsoub.com/design/user-experience/%D8%A7%D9%84%D9%81%D8%B1%D9%82-%D8%A8%D9%8A%D9%86-%D8%A5%D9%85%D9%83%D8%A7%D9%86%D9%8A%D8%A9-%D8%A7%D9%84%D9%88%D8%B5%D9%88%D9%84-%D9%88%D8%A7%D9%84%D8%B4%D9%85%D9%88%D9%84%D9%8A%D8%A9-%D9%81%D9%8A-%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D8%AA%D8%AC%D8%B1%D8%A8%D8%A9-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-r642/" rel="">الفرق بين إمكانية الوصول والشمولية في تصميم تجربة المستخدم</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/html/%D8%B3%D9%87%D9%88%D9%84%D8%A9-%D9%88%D8%B5%D9%88%D9%84-%D8%AC%D9%85%D9%8A%D8%B9-%D8%A7%D9%84%D8%B2%D9%88%D8%A7%D8%B1-%D9%84%D9%85%D9%88%D8%A7%D9%82%D8%B9-%D9%88%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r1323/" rel="">سهولة وصول جميع الزوار لمواقع وتطبيقات الويب</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/html/%D8%A7%D9%84%D8%AA%D8%AD%D9%82%D9%82-%D9%85%D9%86-%D8%B3%D9%87%D9%88%D9%84%D8%A9-%D8%A7%D9%84%D9%88%D8%B5%D9%88%D9%84-%D9%84%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r1328/" rel="">التحقق من سهولة الوصول لصفحات الويب</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/design/user-experience/%D8%A7%D9%84%D9%85%D8%A8%D8%A7%D8%AF%D8%A6-%D8%A7%D9%84%D8%AE%D9%85%D8%B3%D8%A9-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-%D9%81%D9%8A-%D9%82%D8%A7%D8%A8%D9%84%D9%8A%D8%A9-%D8%A7%D9%84%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-usability-r116/" rel="">المبادئ الخمسة الأساسية في قابلية الاستخدام</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/html/%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%B5%D9%88%D8%B1-%D9%85%D8%AA%D8%AC%D8%A7%D9%88%D8%A8%D8%A9-r687/" rel="">إعداد صور متجاوبة في صفحات الويب</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1640</guid><pubDate>Mon, 15 Aug 2022 16:09:00 +0000</pubDate></item><item><title>&#x628;&#x646;&#x64A;&#x629; &#x62A;&#x637;&#x628;&#x64A;&#x642; &#x625;&#x637;&#x627;&#x631; &#x627;&#x644;&#x639;&#x645;&#x644; Ember &#x648;&#x62A;&#x642;&#x633;&#x64A;&#x645;&#x647;&#x627; &#x625;&#x644;&#x649; &#x645;&#x643;&#x648;&#x646;&#x627;&#x62A;</title><link>https://academy.hsoub.com/programming/html/%D8%A8%D9%86%D9%8A%D8%A9-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82-%D8%A5%D8%B7%D8%A7%D8%B1-%D8%A7%D9%84%D8%B9%D9%85%D9%84-ember-%D9%88%D8%AA%D9%82%D8%B3%D9%8A%D9%85%D9%87%D8%A7-%D8%A5%D9%84%D9%89-%D9%85%D9%83%D9%88%D9%86%D8%A7%D8%AA-r1649/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_08/62ee1962416d0_----Ember---.png.61532c4a4b0170c6bfb243b72ee54873.png" /></p>

<p>
	سنخطط في هذا المقال بنية تطبيق TodoMVC في إطار العمل Ember، وسنضيف توصيف HTML له، ثم سنقسّم بنية HTML إلى مكونات.
</p>

<ul>
<li>
		<strong>المتطلبات الأساسية</strong>: الإلمام بأساسيات لغات <a href="https://wiki.hsoub.com/HTML" rel="external">HTML</a> و<a href="https://wiki.hsoub.com/CSS" rel="external">CSS</a> و<a href="https://wiki.hsoub.com/JavaScript" rel="external">جافاسكربت JavaScript</a>، ومعرفة استخدام <a href="https://academy.hsoub.com/programming/workflow/%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%B3%D8%B7%D8%B1-%D8%A7%D9%84%D8%A3%D9%88%D8%A7%D9%85%D8%B1-%D9%81%D9%8A-%D8%B9%D9%85%D9%84%D9%8A%D8%A9-%D8%AA%D8%B7%D9%88%D9%8A%D8%B1-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D9%85%D9%86-%D8%B7%D8%B1%D9%81-%D8%A7%D9%84%D8%B9%D9%85%D9%8A%D9%84-r1471/" rel="">سطر الأوامر أو الطرفية</a>. يُعَد فهم ميزات جافاسكربت الحديثة مثل الأصناف Classes والوحدات Modules وما إلى ذلك مفيدًا للغاية، لأن إطار العمل Ember يستخدِمها بكثرة.
	</li>
	<li>
		<strong>الهدف</strong>: تعلّم كيفية إنشاء بنية تطبيق Ember، ثم تقسيم هذه البنية إلى مكونات.
	</li>
</ul>
<h2>
	التخطيط لتصميم تطبيق TodoMVC
</h2>

<p>
	أنشأنا في المقال السابق مشروع Ember جديد ثم أضفنا وضبطنا أنماط <a href="https://academy.hsoub.com/programming/css/%d8%aa%d8%b9%d8%b1%d9%91%d9%81-%d8%b9%d9%84%d9%89-%d8%a3%d8%b3%d8%a7%d8%b3%d9%8a%d8%a7%d8%aa-css-r70/" rel="">CSS</a>، وسنضيف الآن توصيف HTML وسنخطط بنية ودلالات تطبيق TodoMVC.
</p>

<p>
	يُعَدّ توصيف HTML لصفحة هبوط تطبيقنا مُعرَّفًا في المسار <code>app/templates/application.hbs</code>، وهو موجود مسبقًا وتبدو محتوياته حاليًا كما يلي:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_452_8" style="">
<span class="pun">‏{{!--</span><span class="pln"> </span><span class="pun">يعرض</span><span class="pln"> </span><span class="pun">المكون</span><span class="pln"> </span><span class="pun">التالي</span><span class="pln"> </span><span class="pun">رسالة</span><span class="pln"> </span><span class="pun">ترحيب‫</span><span class="pln"> </span><span class="typ">Ember</span><span class="pln"> </span><span class="pun">الافتراضية.</span><span class="pln"> </span><span class="pun">--}}</span><span class="pln">
</span><span class="pun">&lt;</span><span class="typ">WelcomePage</span><span class="pln"> </span><span class="pun">/&gt;</span><span class="pln">
</span><span class="pun">{{!--</span><span class="pln"> </span><span class="pun">لا</span><span class="pln"> </span><span class="pun">تتردد</span><span class="pln"> </span><span class="pun">في</span><span class="pln"> </span><span class="pun">إزالتها</span><span class="pln"> </span><span class="pun">--}}</span><span class="pln">

</span><span class="pun">{{</span><span class="pln">outlet</span><span class="pun">}}</span></pre>

<p>
	المكوّن <code>&lt;WelcomePage /‎&gt;</code> هو مكون توفّره إضافة Ember التي تصيِّر Render صفحة الترحيب الافتراضية التي رأيناها في المقال السابق عندما انتقلنا لأول مرة إلى الخادم على المضيف المحلي <code>localhost:4200</code>، لكننا لا نريد ذلك، وإنما نريد أن يحتوي هذا المكون على بنية تطبيق TodoMVC، لذلك احذف محتويات الملف application.hbs واستبدلها بما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_452_10" style="">
<span class="tag">&lt;section</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"todoapp"</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;h1&gt;</span><span class="pln">todos</span><span class="tag">&lt;/h1&gt;</span><span class="pln">
  </span><span class="tag">&lt;input</span><span class="pln">
    </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"new-todo"</span><span class="pln">
    </span><span class="atn">aria-label</span><span class="pun">=</span><span class="atv">"What needs to be done?"</span><span class="pln">
    </span><span class="atn">placeholder</span><span class="pun">=</span><span class="atv">"What needs to be done?"</span><span class="pln">
    </span><span class="atn">autofocus</span><span class="pln">
  </span><span class="tag">&gt;</span><span class="pln">
</span><span class="tag">&lt;/section&gt;</span></pre>

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

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			<strong>ملاحظة</strong>: توفِّر السمة <code>aria-label</code> عنوانًا أو تسميةً توضيحيةً label للتقنيات المساعِدة مثل قارئات الشاشة للاستفادة منها، وهذا مفيد في مثل الحالات التي يُستخدَم فيها العنصر <code>&lt;input&gt;</code> مع عدم وجود نص HTML مقابل له يمكن تحويله إلى عنوان label.
		</p>
	</div>
</blockquote>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="104464" href="https://academy.hsoub.com/uploads/monthly_2022_08/01_todos-initial-render.png.951c476d514f02c98ecea7af73374783.png" rel=""><img alt="01_todos-initial-render.png" class="ipsImage ipsImage_thumbnailed" data-fileid="104464" data-unique="d1ot4jsxt" src="https://academy.hsoub.com/uploads/monthly_2022_08/01_todos-initial-render.thumb.png.c96f7f4bff10404bfe4e448148e7d057.png" style="width: 550px; height: auto;"></a>
</p>

<p>
	لا يتطلب الأمر كثيرًا من الجهد لجعل توصيف HTML يبدو مثل تطبيق قائمة مهام كامل الميزات.
</p>

<p>
	عدِّل الملف application.hbs مرةً أخرى ليكون محتواه على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_452_14" style="">
<span class="tag">&lt;section</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"todoapp"</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;h1&gt;</span><span class="pln">todos</span><span class="tag">&lt;/h1&gt;</span><span class="pln">
  </span><span class="tag">&lt;input</span><span class="pln">
    </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"new-todo"</span><span class="pln">
    </span><span class="atn">aria-label</span><span class="pun">=</span><span class="atv">"What needs to be done?"</span><span class="pln">
    </span><span class="atn">placeholder</span><span class="pun">=</span><span class="atv">"What needs to be done?"</span><span class="pln">
    </span><span class="atn">autofocus</span><span class="pln">
  </span><span class="tag">&gt;</span><span class="pln">

  </span><span class="tag">&lt;section</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"main"</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"mark-all-complete"</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"toggle-all"</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"checkbox"</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="tag">&lt;label</span><span class="pln"> </span><span class="atn">for</span><span class="pun">=</span><span class="atv">"mark-all-complete"</span><span class="tag">&gt;</span><span class="pln">Mark all as complete</span><span class="tag">&lt;/label&gt;</span><span class="pln">

    </span><span class="tag">&lt;ul</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"todo-list"</span><span class="tag">&gt;</span><span class="pln">
      </span><span class="tag">&lt;li&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">"view"</span><span class="tag">&gt;</span><span class="pln">
          </span><span class="tag">&lt;input</span><span class="pln">
            </span><span class="atn">aria-label</span><span class="pun">=</span><span class="atv">"Toggle the completion of this todo"</span><span class="pln">
            </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"toggle"</span><span class="pln">
            </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"checkbox"</span><span class="pln">
          </span><span class="tag">&gt;</span><span class="pln">
          </span><span class="tag">&lt;label&gt;</span><span class="pln">Buy Movie Tickets</span><span class="tag">&lt;/label&gt;</span><span class="pln">
          </span><span class="tag">&lt;button</span><span class="pln">
            </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"button"</span><span class="pln">
            </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"destroy"</span><span class="pln">
            </span><span class="atn">title</span><span class="pun">=</span><span class="atv">"Remove this todo"</span><span class="pln">
          </span><span class="tag">&gt;&lt;/button&gt;</span><span class="pln">
        </span><span class="tag">&lt;/div&gt;</span><span class="pln">

        </span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">autofocus</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"edit"</span><span class="pln"> </span><span class="atn">value</span><span class="pun">=</span><span class="atv">"Todo Text"</span><span class="tag">&gt;</span><span class="pln">
      </span><span class="tag">&lt;/li&gt;</span><span class="pln">

      </span><span class="tag">&lt;li&gt;</span><span class="pln">
        </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"view"</span><span class="tag">&gt;</span><span class="pln">
          </span><span class="tag">&lt;input</span><span class="pln">
            </span><span class="atn">aria-label</span><span class="pun">=</span><span class="atv">"Toggle the completion of this todo"</span><span class="pln">
            </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"toggle"</span><span class="pln">
            </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"checkbox"</span><span class="pln">
          </span><span class="tag">&gt;</span><span class="pln">
          </span><span class="tag">&lt;label&gt;</span><span class="pln">Go to Movie</span><span class="tag">&lt;/label&gt;</span><span class="pln">
          </span><span class="tag">&lt;button</span><span class="pln">
            </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"button"</span><span class="pln">
            </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"destroy"</span><span class="pln">
            </span><span class="atn">title</span><span class="pun">=</span><span class="atv">"Remove this todo"</span><span class="pln">
           </span><span class="tag">&gt;&lt;/button&gt;</span><span class="pln">
        </span><span class="tag">&lt;/div&gt;</span><span class="pln">

        </span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">autofocus</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"edit"</span><span class="pln"> </span><span class="atn">value</span><span class="pun">=</span><span class="atv">"Todo Text"</span><span class="tag">&gt;</span><span class="pln">
      </span><span class="tag">&lt;/li&gt;</span><span class="pln">
    </span><span class="tag">&lt;/ul&gt;</span><span class="pln">
  </span><span class="tag">&lt;/section&gt;</span><span class="pln">

  </span><span class="tag">&lt;footer</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"footer"</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="tag">&lt;span</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"todo-count"</span><span class="tag">&gt;</span><span class="pln">
      </span><span class="tag">&lt;strong&gt;</span><span class="pln">0</span><span class="tag">&lt;/strong&gt;</span><span class="pln"> todos left
    </span><span class="tag">&lt;/span&gt;</span><span class="pln">

    </span><span class="tag">&lt;ul</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"filters"</span><span class="tag">&gt;</span><span class="pln">
      </span><span class="tag">&lt;li&gt;</span><span class="pln">
        </span><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"#"</span><span class="tag">&gt;</span><span class="pln">All</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">"#"</span><span class="tag">&gt;</span><span class="pln">Active</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">"#"</span><span class="tag">&gt;</span><span class="pln">Completed</span><span class="tag">&lt;/a&gt;</span><span class="pln">
      </span><span class="tag">&lt;/li&gt;</span><span class="pln">
    </span><span class="tag">&lt;/ul&gt;</span><span class="pln">

    </span><span class="tag">&lt;button</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"button"</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"clear-completed"</span><span class="tag">&gt;</span><span class="pln">
      Clear Completed
    </span><span class="tag">&lt;/button&gt;</span><span class="pln">
  </span><span class="tag">&lt;/footer&gt;</span><span class="pln">
</span><span class="tag">&lt;/section&gt;</span></pre>

<p>
	يجب أن يكون الخرج المُصيَّر الآن على النحو التالي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="104465" href="https://academy.hsoub.com/uploads/monthly_2022_08/02_todos-with-todo-items.png.5cb879db76df46f69cf6d07d390d36e1.png" rel=""><img alt="02_todos-with-todo-items.png" class="ipsImage ipsImage_thumbnailed" data-fileid="104465" data-unique="xjyomx6s2" src="https://academy.hsoub.com/uploads/monthly_2022_08/02_todos-with-todo-items.thumb.png.e412f84982be021ea9b069e8647e7d31.png" style="width: 500px; height: auto;"></a>
</p>

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

<p>
	إذا نظرنا إلى الشيفرة الموجودة بجوار تطبيق المهام المُصيَّر في الشكل التالي، فهناك طرق متعددة يمكن من خلالها تحديد كيفية تقسيم <a href="https://academy.hsoub.com/design/user-interface/%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A5%D9%84%D9%89-%D8%AA%D9%87%D9%8A%D8%A6%D8%A9-%D9%88%D8%A7%D8%AC%D9%87%D8%A9-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-ui-r652/" rel="">واجهة المستخدِم UI</a>، ولكن لنخطّط الآن لتقسيم توصيف HTML إلى المكونات التالية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="104466" href="https://academy.hsoub.com/uploads/monthly_2022_08/03_todos-ui-component-breakdown.png.63de0a37f5c3c152ba75ba5bf6cc2ae4.png" rel=""><img alt="03_todos-ui-component-breakdown.png" class="ipsImage ipsImage_thumbnailed" data-fileid="104466" data-unique="af47igu6b" src="https://academy.hsoub.com/uploads/monthly_2022_08/03_todos-ui-component-breakdown.thumb.png.803bca9db4e30063769b0072a7356e3a.png"></a>
</p>

<p>
	مجموعات المكونات هي كما يلي:
</p>

<ul>
<li>
		حقل الإدخال الرئيسي <code>new-todo</code>: باللون الأحمر في الشكل السابق.
	</li>
	<li>
		الجسم Body الذي يحتوي على قائمة المهام والزر الذي يضع علامة على جميع المهام المكتملة <code>mark-all-complete</code>: باللون الأرجواني في الشكل السابق.
		<ul>
<li>
				الزر <code>mark-all-complete</code> المميز بوضوح للأسباب التي سنوضّحها لاحقًا: باللون الأصفر في الشكل السابق.
			</li>
			<li>
				كل مهمة هي مكوّن لوحده: باللون الأخضر في الشكل السابق.
			</li>
		</ul>
</li>
	<li>
		التذييل Footer: باللون الأزرق في الشكل السابق.
	</li>
</ul>
<p>
	لاحظ أنّ مربع الاختيار <code>mark-all-complete</code> المميَّز باللون الأصفر يُصيَّر بجوار حقل الإدخال <code>new-todo</code> أثناء وجوده في القسم <code>main</code> لأن تنسيقات CSS الافتراضية تضع مربع الاختيار والعنصر <code>label</code> بقيم سالبة للإحداثيات العلوية واليسارية لتحريكهما بجوار حقل الإدخال، عوضًا عن وضعهما في القسم <code>main</code>.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="104467" href="https://academy.hsoub.com/uploads/monthly_2022_08/04_todos-devtools-view.png.87440ddb9d2b818ff2c3b298a8a94457.png" rel=""><img alt="04_todos-devtools-view.png" class="ipsImage ipsImage_thumbnailed" data-fileid="104467" data-unique="yol6czxys" src="https://academy.hsoub.com/uploads/monthly_2022_08/04_todos-devtools-view.thumb.png.2562e0a28ec82bc1a734d14b72b012db.png" style="width: 500px; height: auto;"></a>
</p>

<h2>
	استخدام واجهة سطر الأوامر CLI لإنشاء المكونات
</h2>

<p>
	نريد إنشاء أربعة مكونات لتمثيل تطبيقنا وهذه المكونات هي:
</p>

<ul>
<li>
		الترويسة Header.
	</li>
	<li>
		القائمة List.
	</li>
	<li>
		عنصر المهمة Todo.
	</li>
	<li>
		التذييل Footer.
	</li>
</ul>
<p>
	استخدِم الأمر <code>ember generate component</code> متبوعًا باسم المكوّن لإنشائه، ولننشئ مكوّن الترويسة أولًا باتباع الخطوات التالية:
</p>

<ol>
<li>
		أوقف تشغيل الخادم بالانتقال إلى الطرفية والضغط على الاختصار <code>Ctrl + C</code>.
	</li>
	<li>
		أدخِل الأمر التالي في الطرفية:
	</li>
</ol>
<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_452_23" style="">
<span class="pln">ember generate component header</span></pre>

<p>
	سينشئ هذا الأمر بعض الملفات الجديدة، كما هو موضّح في ناتج الطرفية النهائي التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_452_25" style="">
<span class="pln">installing component
  create app</span><span class="pun">/</span><span class="pln">components</span><span class="pun">/</span><span class="pln">header</span><span class="pun">.</span><span class="pln">hbs
  skip app</span><span class="pun">/</span><span class="pln">components</span><span class="pun">/</span><span class="pln">header</span><span class="pun">.</span><span class="pln">js
  tip to add a </span><span class="kwd">class</span><span class="pun">,</span><span class="pln"> run </span><span class="pun">`</span><span class="pln">ember generate component</span><span class="pun">-</span><span class="kwd">class</span><span class="pln"> header</span><span class="pun">`</span><span class="pln">
installing component</span><span class="pun">-</span><span class="pln">test
  create tests</span><span class="pun">/</span><span class="pln">integration</span><span class="pun">/</span><span class="pln">components</span><span class="pun">/</span><span class="pln">header</span><span class="pun">-</span><span class="pln">test</span><span class="pun">.</span><span class="pln">js</span></pre>

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

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

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			<strong>ملاحظة</strong>: الملف header.js -الموضح على أنه يجب تخطيه- مخصَّص للاتصال بالصنف الداعم للمكوّن Glimmer الذي لا نحتاجه في الوقت الحالي، لأنه مُخصَّص لإضافة التفاعل ومعالجة الحالة، كما يولّد الأمر <code>generate component</code> افتراضيًا مكونات القالب فقط التي تشكّل غالبية المكونات في التطبيقات الكبيرة.
		</p>
	</div>
</blockquote>

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

<p>
	لننشئ شيفرة مساعِدة Scaffolding للمكوّنات الأخرى قبل إضافة أيّ شيفرة مكوّن، وبالتالي أدخِل الأوامر التالية في طرفيتك واحدًا تلو الآخر:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_452_27" style="">
<span class="pln">ember generate component todo</span><span class="pun">-</span><span class="pln">list
ember generate component todo
ember generate component footer</span></pre>

<p>
	سترى الآن ما يلي في المجلد todomvc/app/components:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="104468" href="https://academy.hsoub.com/uploads/monthly_2022_08/05_todos-components-directory.png.8066f3474cbcc58ecd3a46c6ca1fe75a.png" rel=""><img alt="05_todos-components-directory.png" class="ipsImage ipsImage_thumbnailed" data-fileid="104468" data-unique="ad71pa5pt" src="https://academy.hsoub.com/uploads/monthly_2022_08/05_todos-components-directory.png.8066f3474cbcc58ecd3a46c6ca1fe75a.png"></a>
</p>

<p>
	بما أنه أصبح لدينا الآن جميع ملفات بنية المكونات، فيمكننا قص ولصق توصيف HTML لكل مكوّن من الملف application.hbs إلى كل مكوّن من هذه المكوّنات، ثم تعديل الملف application.hbs ليمثّل تجريداتنا الجديدة.
</p>

<p>
	أولًا، يجب تعديل الملف header.hbs ليحوي ما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_452_30" style="">
<span class="tag">&lt;input</span><span class="pln">
  </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"new-todo"</span><span class="pln">
  </span><span class="atn">aria-label</span><span class="pun">=</span><span class="atv">"What needs to be done?"</span><span class="pln">
  </span><span class="atn">placeholder</span><span class="pun">=</span><span class="atv">"What needs to be done?"</span><span class="pln">
  </span><span class="atn">autofocus</span><span class="pln">
</span><span class="tag">&gt;</span></pre>

<p>
	ثانيًا، كما يجب تعديل الملف todo-list.hbs ليحوي ما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_452_32" style="">
<span class="tag">&lt;section</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"main"</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"mark-all-complete"</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"toggle-all"</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"checkbox"</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;label</span><span class="pln"> </span><span class="atn">for</span><span class="pun">=</span><span class="atv">"mark-all-complete"</span><span class="tag">&gt;</span><span class="pln">Mark all as complete</span><span class="tag">&lt;/label&gt;</span><span class="pln">

  </span><span class="tag">&lt;ul</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"todo-list"</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="tag">&lt;Todo</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
    </span><span class="tag">&lt;Todo</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
  </span><span class="tag">&lt;/ul&gt;</span><span class="pln">
</span><span class="tag">&lt;/section&gt;</span></pre>

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

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			<strong>ملاحظة</strong>: العنصر الوحيد الذي ليس عنصر HTML في الملف todo-list.hbs الجديد هو استدعاء المكوّن <code>&lt;Todo /‎&gt;</code>، إذ أنّ استدعاء المكوّن في Ember مشابه للتصريح عن عنصر HTML ولكن يبدأ بحرف كبير، والأسماء مكتوبة بحالة الجَمل للأحرف الكبيرة Upper Camel Case، كما سترى مع العنصر <code>&lt;TodoList /‎&gt;</code> لاحقًا، وستحل محتويات الملف todo.hbs الآتية محل المكوّن <code>&lt;Todo /‎&gt;</code> في الصفحة المُصيَّرة أثناء تحميل تطبيقنا.
		</p>
	</div>
</blockquote>

<p>
	ثالثًا، أضف ما يلي إلى الملف todo.hbs:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_452_34" style="">
<span class="tag">&lt;li&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">"view"</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="tag">&lt;input</span><span class="pln">
      </span><span class="atn">aria-label</span><span class="pun">=</span><span class="atv">"Toggle the completion of this todo"</span><span class="pln">
      </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"toggle"</span><span class="pln">
      </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"checkbox"</span><span class="pln">
    </span><span class="tag">&gt;</span><span class="pln">
    </span><span class="tag">&lt;label&gt;</span><span class="pln">Buy Movie Tickets</span><span class="tag">&lt;/label&gt;</span><span class="pln">
    </span><span class="tag">&lt;button</span><span class="pln">
      </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"button"</span><span class="pln">
      </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"destroy"</span><span class="pln">
      </span><span class="atn">title</span><span class="pun">=</span><span class="atv">"Remove this todo"</span><span class="pln">
    </span><span class="tag">&gt;&lt;/button&gt;</span><span class="pln">
  </span><span class="tag">&lt;/div&gt;</span><span class="pln">

  </span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">autofocus</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"edit"</span><span class="pln"> </span><span class="atn">value</span><span class="pun">=</span><span class="atv">"Todo Text"</span><span class="tag">&gt;</span><span class="pln">
</span><span class="tag">&lt;/li&gt;</span></pre>

<p>
	رابعًا، يجب تعديل الملف footer.hbs بحيث يحوي ما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_452_36" style="">
<span class="tag">&lt;footer</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"footer"</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;span</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"todo-count"</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="tag">&lt;strong&gt;</span><span class="pln">0</span><span class="tag">&lt;/strong&gt;</span><span class="pln"> todos left
  </span><span class="tag">&lt;/span&gt;</span><span class="pln">

  </span><span class="tag">&lt;ul</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"filters"</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="tag">&lt;li&gt;</span><span class="pln">
      </span><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"#"</span><span class="tag">&gt;</span><span class="pln">All</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">"#"</span><span class="tag">&gt;</span><span class="pln">Active</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">"#"</span><span class="tag">&gt;</span><span class="pln">Completed</span><span class="tag">&lt;/a&gt;</span><span class="pln">
    </span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;/ul&gt;</span><span class="pln">

  </span><span class="tag">&lt;button</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"button"</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"clear-completed"</span><span class="tag">&gt;</span><span class="pln">
    Clear Completed
  </span><span class="tag">&lt;/button&gt;</span><span class="pln">
</span><span class="tag">&lt;/footer&gt;</span></pre>

<p>
	خامسًا، أخيرًا، يجب تعديل محتويات الملف application.hbs بحيث تُستدَعى المكونات المناسبة كما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_452_38" style="">
<span class="tag">&lt;section</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"todoapp"</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;h1&gt;</span><span class="pln">todos</span><span class="tag">&lt;/h1&gt;</span><span class="pln">

  </span><span class="tag">&lt;Header</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
  </span><span class="tag">&lt;TodoList</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
  </span><span class="tag">&lt;Footer</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">

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

<p>
	سادسًا، شغِّل الأمر <code>npm start</code> في الطرفية مرةً أخرى بعد إجراء هذه التعديلات، ثم توجَّه إلى المضيف المحلي <code><a href="http://localhost:4200" ipsnoembed="false" rel="external nofollow">http://localhost:4200</a></code> للتأكد من أنّ تطبيق المهام لا يزال يبدو كما كان قبل إعادة البناء.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="104469" href="https://academy.hsoub.com/uploads/monthly_2022_08/06_todos-components-render.png.81bc9eb14ee8963e835caeb87767a318.png" rel=""><img alt="06_todos-components-render.png" class="ipsImage ipsImage_thumbnailed" data-fileid="104469" data-unique="w8mrsszuc" src="https://academy.hsoub.com/uploads/monthly_2022_08/06_todos-components-render.thumb.png.344adb3e1e5e5efa12a79f11af1dc0fe.png" style="width: 500px; height: auto;"></a>
</p>

<p>
	لاحظ كيف يعرض كلا عنصري المهام العبارة "Buy Movie Tickets" بسبب استدعاء المكوّن نفسه مرتين، ونَص المهمة ثابت فيه.
</p>

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

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

<p>
	ترجمة -وبتصرّف- للمقال <a href="https://developer.mozilla.org/en-US/docs/Learn/Tools_and_testing/Client-side_JavaScript_frameworks/Ember_structure_componentization" rel="external nofollow">Ember app structure and componentization</a>.
</p>

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

<ul>
<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/javascript/%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D8%A5%D9%84%D9%89-%D8%A5%D8%B7%D8%A7%D8%B1-%D8%A7%D9%84%D8%B9%D9%85%D9%84-ember-r1648/" rel="">مقدمة إلى إطار العمل Ember</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1649</guid><pubDate>Mon, 08 Aug 2022 16:08:02 +0000</pubDate></item><item><title>&#x631;&#x645;&#x648;&#x632; HTML &#x627;&#x644;&#x623;&#x633;&#x627;&#x633;&#x64A;&#x629; &#x627;&#x644;&#x62A;&#x64A; &#x64A;&#x62D;&#x62A;&#x627;&#x62C; &#x645;&#x639;&#x631;&#x641;&#x62A;&#x647;&#x627; &#x643;&#x644; &#x645;&#x633;&#x62A;&#x62E;&#x62F;&#x645; &#x648;&#x648;&#x631;&#x62F;&#x628;&#x631;&#x64A;&#x633;</title><link>https://academy.hsoub.com/programming/html/%D8%B1%D9%85%D9%88%D8%B2-html-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D9%8A-%D9%8A%D8%AD%D8%AA%D8%A7%D8%AC-%D9%85%D8%B9%D8%B1%D9%81%D8%AA%D9%87%D8%A7-%D9%83%D9%84-%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3-r1636/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_07/62e3be9f4997a_-HTML-------(1).jpg.fc41dd0e621f6f6b0d70f3fe3ca033b8.jpg" /></p>
<p>
	تُعد <a href="https://academy.hsoub.com/programming/html/" rel="">لغة HTML</a> الترميزية أساس كل شيءٍ تقريبًا على الإنترنت. فهي حجر الزاوية الذي بُني عليه المحتوى في الإنترنت منذ عقودٍ مضت، وحتى الآن. ولكن دون فهمٍ عميق للغة <a href="https://wiki.hsoub.com/HTML" rel="external">HTML</a>، سيكون كل ما تفعله في ووردبريس من تصميم أو تطوير ناقصًا. لحسن حظك، يوجد عدد كبير من رموز HTML الأساسية التي يستخدمها المبتدئون والمخضرمون في ووردبريس على حدٍّ سواء على أساسٍ شبه يومي، والتي سنشرحها لك خلال هذا المقال لتستوعبها بسهولة.
</p>

<h2>
	ما هي لغة HTML؟
</h2>

<p>
	يَرمز HTML إلى اختصار <strong>لغة ترميز النص الفائق</strong>، وهذا يعني أنها لا تنتمي إلى لغات البرمجة. لا تنفِّذ HTML أوامر برمجية في الحاسوب باستخدام برنامجٍ نصي، بل تضع علامات على النص الموجود في صفحة <a href="https://academy.hsoub.com/devops/networking/%D8%A2%D9%84%D9%8A%D8%A9-%D8%B9%D9%85%D9%84-%D8%B4%D8%A8%D9%83%D8%A9-%D8%A7%D9%84%D8%A5%D9%86%D8%AA%D8%B1%D9%86%D8%AA-r571/" rel="">الإنترنت</a>، مثل: مائل، غامق، المحاذاة، الحجم، وغير ذلك. تمنحك HTML أيضًا القدرة على تضمين الصور والروابط. ومع آخر إصدار <a href="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/" rel="">HTML5</a>، بات عرض النص والوسائط يتمّ بطرائق جديدة ومثيرة.
</p>

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

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4902_9" style=""><span class="tag">&lt;html</span><span class="pln"> </span><span class="atn">dir</span><span class="pun">=</span><span class="atv">"rtl"</span><span class="pln"> </span><span class="atn">lang</span><span class="pun">=</span><span class="atv">"ar"</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;title&gt;</span><span class="pln">يكتب عنوان الصفحة هنا.</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">هذا عنوان الصفحة الذي يراه المستخدمون</span><span class="tag">&lt;/h1&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&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;h2&gt;</span><span class="pln">عنوان فرعي</span><span class="tag">&lt;/h2&gt;</span><span class="pln">
      </span><span class="tag">&lt;p&gt;&lt;img</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"https://bit.ly/3OhDvUC"</span><span class="tag">&gt;&lt;/p&gt;</span><span class="pln">
      </span><span class="tag">&lt;p&gt;&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"https://academy.hsoub.com/"</span><span class="tag">&gt;</span><span class="pln">رابط أكاديمية حسوب</span><span class="tag">&lt;/a&gt;&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>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="104023" href="https://academy.hsoub.com/uploads/monthly_2022_07/62e3b63d16b20_01-HTML.png.0fd1e53f8c548091da69521edee99fa4.png" rel=""><img alt="01 - ما هي لغة HTML؟.png" class="ipsImage ipsImage_thumbnailed" data-fileid="104023" data-unique="4bfxgdcoa" style="width: 650px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2022_07/62e3b63f2552c_01-HTML.thumb.png.14b0c9cdee853043764d09555a7982f3.png"></a>
</p>

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

<h2>
	العريض
</h2>

<p>
	عندما تضع <a href="https://wiki.hsoub.com/HTML/strong" rel="external">وسم &lt;strong&gt;</a> حول النص، فأنت تطلب من المتصفح أن يجعل النص عريضًا. يمكنك أيضًا استخدام وسم <code><a href="https://wiki.hsoub.com/HTML/b" rel="external">&lt;b&gt;</a></code> ببساطة، لكنّ استخدام وسم <code>&lt;strong&gt;</code> أكثر أمانًا؛ بسبب تفضيل جوجل ومحركات البحث الأخرى للعناصر الدلالية المشابهة له.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4902_17" style=""><span class="pln">يمكنك جعل هذا </span><span class="tag">&lt;strong&gt;</span><span class="pln"> النص عريضًا </span><span class="tag">&lt;/strong&gt;</span><span class="pln"> باستخدام هذا الوسم.</span></pre>

<h2>
	المائل
</h2>

<p>
	يُستخدم <a href="https://wiki.hsoub.com/HTML/em" rel="external">وسم &lt;Em&gt;</a> للتوكيد، ويمثل أيضًا الطريقة الدلالية في HTML لاستخدام الخط المائل. كما يمكنك استخدام <code><a href="https://wiki.hsoub.com/HTML/i" rel="external">&lt;i&gt;</a></code> بدلًا من ذلك.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4902_19" style=""><span class="pln">يمكنك وضع النص </span><span class="tag">&lt;em&gt;</span><span class="pln"> بخط مائل </span><span class="tag">&lt;em&gt;</span><span class="pln"> باستخدام هذا الوسم.</span></pre>

<h2>
	التسطير
</h2>

<p>
	يُستخدم <a href="https://wiki.hsoub.com/HTML/u" rel="external">وسم &lt;u&gt;</a> لتسطير النص. عامةً، لا يُستخدم التسطير بكثرة، وذلك لأن الروابط تكون مسطّرة افتراضيًا؛ مما جعل استخدام النص المسطّر العادي مرتبطًا بتجربة المستخدم السيئة، بسبب عدم قدرة المستخدمين على النقر على النص المسطّر العادي.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4902_23" style=""><span class="pln">يمكنك </span><span class="tag">&lt;u&gt;</span><span class="pln"> تسطير النص </span><span class="tag">&lt;/u&gt;</span><span class="pln"> باستخدام هذا الوسم.</span></pre>

<h2>
	العناوين
</h2>

<p>
	ربما تكون وسوم العناوين هي الوسوم الأكثر استخدامًا من بين جميع رموز HTML الأساسية. تُستخدم <a href="https://wiki.hsoub.com/HTML/h1-h6" rel="external">وسوم &lt;h1&gt; و&lt;h2&gt; و&lt;h3&gt; و&lt;h4&gt; و&lt;h5&gt; و&lt;h6&gt;</a> لتقسيم المحتوى إلى أقسام.
</p>

<p>
	احرص فقط على استخدام العناوين بترتيبٍ هرمي. تُوجِّهكَ جوجل إلى إدراج العناوين أسفل بعضها، لذا، تأكد من استخدام <code>&lt;h2&gt;</code> فقط أسفل <code>&lt;h1&gt;</code>، وليس أسفل <code>&lt;h3&gt;</code>.
</p>

<p>
	على الرغم من أن معظم الصفحات ستحتوي على <code>&lt;h1&gt;</code> واحد فقط، إلا أن جوجل لن تعاقبك على وجود المزيد. فقط ضع في حسبانك أن استخدام <code>&lt;h1&gt;</code> مرةً أخرى سيعيد تعيين التداخل في الصفحة (أو على الأقل في قسمٍ معيّن من الصفحة).
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4902_26" style=""><span class="tag">&lt;h2&gt;</span><span class="pln"> إن عنوان H2 هو العنوان الأكثر استخدامًا </span><span class="tag">&lt;/h2&gt;</span></pre>

<p>
	لاحظ أن أغلب العناوين الواردة في هذا المقال هي <code>H2</code>.
</p>

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

<p>
	يُعَد إدراج الصور أحد أكثر الأشياء المفيدة التي يمكنك فعلها باستخدام<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> الترميزية، فقد أَخرجت هذه الميزة الإنترنت من أساليب عرض المحتوى النمطية إلى أخرى أكثر حيوية، كالتي نراها اليوم؛ وكل ما عليك فعله هو الحصول على <a href="https://academy.hsoub.com/programming/general/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%B9%D9%86%D9%88%D8%A7%D9%86-url-%D9%88%D8%A3%D9%86%D9%88%D8%A7%D8%B9%D9%87-r1435/" rel="">عنوان URL</a> للصورة التي تريدها، واستخدام وسم <code>&lt;img src&gt;</code> (الذي يشير اختصارًا إلى عبارة مصدر الصورة Image Source) مرةً واحدةً فقط، كما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4902_29" style=""><span class="tag">&lt;img</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"https://bit.ly/3OhDvUC"</span><span class="pln"> </span><span class="atn">alt</span><span class="pun">=</span><span class="atv">"صورة شعار أكاديمية حسوب"</span><span class="tag">&gt;</span></pre>

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

<p>
	تمثل قيمة خاصيّة <code><a href="https://wiki.hsoub.com/HTML/img#alt" rel="external">&lt;alt&gt;</a></code> النص البديل للصورة الذي سيظهر لأغراض إمكانية الوصول، ولفهرسة الصورة أيضًا بواسطة محركات البحث. يُعد النص البديل ضروريًا جدًا من أجل استخدام الأشخاص الذين لديهم برامج قراءة الشاشة والأجهزة الأخرى الإنترنت. يُعد النص البديل للصور من الممارسات المفضل استخدامها على الدوام.
</p>

<h2>
	الروابط
</h2>

<p>
	وصلنا إلى الروابط التي تحمل الكثير من الخاصيّات. أبسط صور استخدام الروابط هي من خلال الوسم <code><a href="https://wiki.hsoub.com/HTML/a#href" rel="external">&lt;a href&gt;</a></code>. يشير <code>&lt;a&gt;</code> إلى أن هذا النص رابط، ويعني <code>&lt;href&gt;</code> حرفيًا إشارة النص التشعبي (العنوان الإلكتروني URL) إلى الموقع الذي يربط معه.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4902_31" style=""><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"https://academy.hsoub.com/"</span><span class="tag">&gt;</span><span class="pln">رابط أكاديمية حسوب، وهذا هو النص الذي سيكون قابلًا للنقر عليه</span><span class="tag">&lt;/a&gt;</span></pre>

<p>
	يُغلق وسم الرابط ببساطة باستخدام وسم <code>&lt;/a&gt;</code>، ويمكنك استخدام أي نص تريده بينهما. سيكون هذا هو نفسه الرابط القابل للنقر، ويسمى <strong>نص الرابط Anchor Text</strong>.
</p>

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

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4902_35" style=""><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"https://academy.hsoub.com/"</span><span class="tag">&gt;&lt;img</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"https://bit.ly/3OhDvUC"</span><span class="pln"> </span><span class="atn">alt</span><span class="pun">=</span><span class="atv">"صورة شعار أكاديمية حسوب"</span><span class="tag">&gt;</span></pre>

<h3>
	المزيد من خصائص الروابط
</h3>

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

<ul>
	<li>
		توضح <a href="https://wiki.hsoub.com/HTML/link#rel" rel="external">خاصية rel</a> نوع العلاقة بين الرابط والصفحة الحالية، مثل استخدام <strong>noreferrer</strong> لمنع تتبّع حركة الإحالة إليك.
	</li>
	<li>
		تخبر خاصية <strong>target</strong> المتصفح بكيفية فتح الرابط، مثل استخدام <strong>_blank</strong> لفتح الرابط في علامة تبويب جديدة.
	</li>
	<li>
		تتوافق خاصية nofollow مع rel، وتخبر محركات البحث أنك لا تريدها أن تتبع موقعك رجوعًا عند الذهاب إلى الرابط المستهدف. هذا أمر جيد عند الربط بمحتوى مثير للجدل أو ما شابه ذلك، كما أنه يمنع الأشخاص من وضع روابط غير مرغوب فيها في التعليقات في موقعك. ومن خلالها، سيكون محتوى موقعك غير متحيّز؛ نظرًا لأنك لا تسمح بأيّ تتبع (روابط خلفية) تفيد المواقع بخلاف استضافتها في موقعك والنقر لفتحها.
	</li>
</ul>

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

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4902_38" style=""><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"https://academy.hsoub.com/"</span><span class="pln"> </span><span class="atn">rel</span><span class="pun">=</span><span class="atv">"nofollow"</span><span class="pln"> </span><span class="atn">target</span><span class="pun">=</span><span class="atv">"_blank"</span><span class="tag">&gt;</span><span class="pln">رابط موقع أكاديمية حسوب مع تفعيل وضع عدم التتبع والفتح في تبويب جديد</span><span class="tag">&lt;/a&gt;</span></pre>

<h2>
	نص يتوسطه خط
</h2>

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

<p>
	يمكنك استخدام وسم <code><a href="https://wiki.hsoub.com/HTML/del" rel="external">&lt;del&gt;</a></code> من أجل كتابة نص يتوسط خط. وبالنسبة لبعض الأشخاص، يُعد هذا الوسم معروفًا وكثير الاستخدام، بينما قد لا يستخدمه البعض الآخر أبدًا. بغض النظر عن ذلك، من الجيد معرفته بما أنه سهل التذكر.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4902_41" style=""><span class="pln">تستطيع استخدام هذا الوسم من أجل إنشاء </span><span class="tag">&lt;del&gt;</span><span class="pln"> نص يتوسطه خط </span><span class="tag">&lt;/del&gt;</span><span class="pln"> في لغة HTML.</span></pre>

<h2>
	القوائم
</h2>

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

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

<p>
	لإنشاء القوائم، ضع حولها <a href="https://wiki.hsoub.com/HTML/ul" rel="external">وسم &lt;ul&gt;</a>، أو <a href="https://wiki.hsoub.com/HTML/ol" rel="external">وسم &lt;ol&gt;</a> للقوائم غير المرتبة أو المرتبة على التوالي، وحول كل عنصر في القائمة <a href="https://wiki.hsoub.com/HTML/li" rel="external">وسم &lt;li&gt;</a>.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4902_47" style=""><span class="tag">&lt;ul&gt;</span><span class="pln">
</span><span class="tag">&lt;li&gt;</span><span class="pln"> عنصر من قائمة غير مرتبة  </span><span class="tag">&lt;/li&gt;</span><span class="pln">
</span><span class="tag">&lt;li&gt;</span><span class="pln"> عنصر آخر  </span><span class="tag">&lt;/li&gt;</span><span class="pln">
</span><span class="tag">&lt;/ul&gt;</span><span class="pln">

</span><span class="tag">&lt;ol&gt;</span><span class="pln">
</span><span class="tag">&lt;li&gt;</span><span class="pln"> عنصر من قائمة مرتبة مرقمة   </span><span class="tag">&lt;/li&gt;</span><span class="pln">
</span><span class="tag">&lt;li&gt;&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"https://academy.hsoub.com/"</span><span class="tag">&gt;</span><span class="pln">رابط داخل عنصر بقائمة</span><span class="tag">&lt;/a&gt;&lt;/li&gt;</span><span class="pln">
</span><span class="tag">&lt;li&gt;&lt;strong&gt;</span><span class="pln"> هذا النص غامق </span><span class="tag">&lt;/strong&gt;</span><span class="pln"> وهذا لا </span><span class="tag">&lt;/li&gt;</span><span class="pln">
</span><span class="tag">&lt;/ol&gt;</span></pre>

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

<h2>
	الاقتباس
</h2>

<p>
	ستحتاج في مرحلة ما من حياتك المهنية في الووردبريس إلى اقتباس شيءٍ ما ضمن محتواك، ولهذا الأمر يمكنك استخدام <a href="https://wiki.hsoub.com/HTML/blockquote" rel="external">وسم &lt;blockquote&gt;</a>. الصق النص الذي نسخته بين وسمي فتح وإغلاق من وسم الاقتباس، وستحصل على نصٍ مقتبس بين علامتي تنصيص.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4902_50" style=""><span class="tag">&lt;blockquote&gt;</span><span class="pln">سيظهر هذا النص بتصميمٍ مختلف لتمييزه على أنه نص مقتبس</span><span class="tag">&lt;/blockquote&gt;</span></pre>

<h2>
	الفقرات
</h2>

<p>
	يملك الووردبريس ميزةً تتعلق بالفقرات في لغة HTML الترميزية، وهي إنشاء فقرة جديدة تلقائيًا مع كل نزولٍ إلى سطرٍ جديد، مع العلم أن أنظمة إدارة المحتوى ومنشئي الصفحات لا تفعل جميعها ذلك. لذا إن كنت بحاجة إلى جعل فقرات المحتوى منفصلة عن بعضها من دون أن تظهر كمُعلّقةٍ متراصّة، فضع حول بداية ونهاية كل فقرة <a href="https://wiki.hsoub.com/HTML/p" rel="external">وسم &lt;p&gt;</a>. سيعرض المتصفح كل كتلة من النص كفقرة منفصلة، بدلًا من كتلة واحدة متتابعة. وافتراضيًا، تتجاهل المتصفحات فواصل الأسطر ما لم تخبرها بخلاف ذلك.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4902_54" style=""><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>

<h2>
	الخطوط الفاصلة والسطر الجديد
</h2>

<p>
	قد تحتاج إلى فواصل أخرى بين الفقرات والأقسام، ومن أجل ذلك، يمكنك استخدام <a href="https://wiki.hsoub.com/HTML/hr" rel="external">وسم &lt;hr&gt;</a> لفصل الفقرات عن بعضها بسطر، ووسم <code>&lt;br/&gt;</code> لنزول سطر جديد.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4902_57" style=""><span class="tag">&lt;hr&gt;</span><span class="pln"> يُستخدم هذا الوسم لرسم خط على طول السطر الفاصل بين الفقرة والتي تليها.</span></pre>

<p>
	أما وسم <code>&lt;br/&gt;</code>، فهو مخصصٌ لنزول سطرٍ جديد، حيث يمكنك استخدامه في منتصف فقرة <code>&lt;p&gt;</code> لنزول سطر دون الخوض في فقرة جديدة، والحفاظ على التصميم والتنظيم. إن وسم <code>&lt;br/&gt;</code> ذاتي الإغلاق، أي لا يمكن أن يحوي أيّ نصٍ داخله، ويُعرف ذلك بالشرطة المائلة في نهاية الوسم.
</p>

<p>
	بالرغم من أن هدف وسمي <code>&lt;hr&gt;</code> و<code>&lt;br/&gt;</code> هو فصل النص عن بعضه، إلا أنه لا يُنصح باستخدامهما، فعندما تصبح أكثر <a href="https://academy.hsoub.com/store/1-%D8%AF%D9%88%D8%B1%D8%A9-%D8%AA%D8%B7%D9%88%D9%8A%D8%B1-%D9%88%D8%A7%D8%AC%D9%87%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85/" rel="">خبرة في استخدام HTML وCSS وJavaScript</a>، ستلاحظ أن استخدام وسم <code>&lt;p&gt;</code> أسهل في استخدام عناصر التصميم معه.
</p>

<h2>
	الخاتمة
</h2>

<p>
	إن لغة HTML الترميزية مهمة جدًا في شبكة الإنترنت، ويستخدمها الجميع بنفس الطريقة، سواء كانوا مبتدئين في <a href="https://sndian.com/" rel="external">تصميم وإنشاء مواقع الويب</a>، أم مخضرمين، فما زالت رموز HTML الأساسية مستخدمة في جميع المواقع. مهما كان موقعك رائعًا وذا ميزات متطورة، ستحتاج إلى معرفة كل من <code>&lt;href&gt;</code> و<code>&lt;strong&gt;</code> لحل أيّة مشكلة في الروابط، أو جعل النص غامقًا عند موضعٍ معين بسهولة.
</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://khamsat.com/start-wordpress-website" rel="external">أنشئ موقع ووردبريس الآن</a>
		</div>
	</div>
</div>

<p>
	ترجمة -وبتصرّف- للمقال <a href="https://www.elegantthemes.com/blog/wordpress/wordpress-user-registration-page" rel="external nofollow">How to Create a Custom WordPress User Registration Page</a> لصاحبه B.J. Keeton.
</p>

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

<ul>
	<li>
		<a href="https://academy.hsoub.com/apps/web/wordpress/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%85%D9%83%D9%88%D9%86-html-%D9%85%D8%AE%D8%B5%D8%B5-%D9%81%D9%8A-%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3-r581/" rel="">كيفية استخدام مكون HTML مخصص في ووردبريس</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/php/wordpress/%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D8%A5%D9%84%D9%89-%D8%AA%D8%B7%D9%88%D9%8A%D8%B1-%D9%82%D9%88%D8%A7%D9%84%D8%A8-%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3-%D8%AA%D8%AD%D9%88%D9%8A%D9%84-%D8%B5%D9%81%D8%AD%D8%A9-html-%D8%A5%D9%84%D9%89-%D9%82%D8%A7%D9%84%D8%A8-%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3-r32/" rel="">مقدمة إلى تطوير قوالب ووردبريس: تحويل صفحة HTML إلى قالب ووردبريس</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/php/wordpress/%D9%83%D9%8A%D9%81-%D8%AA%D8%AD%D9%88%D9%91%D9%90%D9%84-%D9%82%D8%A7%D9%84%D8%A8-html-%D8%B3%D8%A7%D9%83%D9%90%D9%86-%D8%A5%D9%84%D9%89-%D9%82%D8%A7%D9%84%D8%A8-%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3-%D9%85%D8%AA%D8%AC%D8%A7%D9%88%D8%A8-%D8%A7%D9%84%D8%AA%D8%AD%D8%B6%D9%8A%D8%B1-%D9%84%D9%84%D8%AA%D8%AD%D9%88%D9%8A%D9%84%D8%8C-%D9%86%D8%B3%D8%AE-%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-%D9%88%D8%AA%D9%81%D8%B9%D9%8A%D9%84-%D8%A7%D9%84%D9%82%D8%A7%D9%84%D8%A8-r581/" rel="">كيف تحوِّل قالب HTML ساكِن إلى قالب ووردبريس متجاوب: تخصيص الموقع</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1636</guid><pubDate>Mon, 01 Aug 2022 19:02:00 +0000</pubDate></item><item><title>&#x62A;&#x62E;&#x635;&#x64A;&#x635; &#x623;&#x64A;&#x642;&#x648;&#x646;&#x627;&#x62A; &#x648;&#x623;&#x644;&#x648;&#x627;&#x646; &#x627;&#x644;&#x645;&#x62A;&#x635;&#x641;&#x62D; &#x628;&#x645;&#x627; &#x64A;&#x62A;&#x646;&#x627;&#x633;&#x628; &#x645;&#x639; &#x645;&#x648;&#x642;&#x639;&#x643;</title><link>https://academy.hsoub.com/programming/html/%D8%AA%D8%AE%D8%B5%D9%8A%D8%B5-%D8%A3%D9%8A%D9%82%D9%88%D9%86%D8%A7%D8%AA-%D9%88%D8%A3%D9%84%D9%88%D8%A7%D9%86-%D8%A7%D9%84%D9%85%D8%AA%D8%B5%D9%81%D8%AD-%D8%A8%D9%85%D8%A7-%D9%8A%D8%AA%D9%86%D8%A7%D8%B3%D8%A8-%D9%85%D8%B9-%D9%85%D9%88%D9%82%D8%B9%D9%83-r1558/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_05/627f99b0e34e7_.png.bd20f076b6b54232d1e3dae09df9c1a7.png" /></p>

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

<h2>
	توفير أيقونات رائعة
</h2>

<p>
	عندما يزور المستخدم موقعك، يعمل المتصفح على جلب الأيقونات من ملف <a href="https://wiki.hsoub.com/HTML" rel="external">HTML</a>، إذ تظهر الأيقونة في أماكن متعددةً مثلًا تظهر في علامة التبويب وفي قسم المواقع التي زرتها مؤخرًا والكثير من الأماكن الأخرى.
</p>

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

<p>
	للتأكد من توافق موقعك مع كل المتصفحات، سيتوجب عليك إضافة بعض الوسوم في داخل العنصر <code>&lt;head&gt;</code> الموجود في كل صفحة من صفحات الموقع.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3150_7" style="">
<span class="pln"> </span><span class="com">&lt;!-- icon in the highest resolution we need it for --&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">"icon"</span><span class="pln"> </span><span class="atn">sizes</span><span class="pun">=</span><span class="atv">"192x192"</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"icon.png"</span><span class="tag">&gt;</span><span class="pln">

</span><span class="com">&lt;!-- reuse same icon for Safari --&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">"apple-touch-icon"</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"ios-icon.png"</span><span class="tag">&gt;</span><span class="pln">

</span><span class="com">&lt;!-- multiple icons for IE --&gt;</span><span class="pln">
</span><span class="tag">&lt;meta</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"msapplication-square310x310logo"</span><span class="pln"> </span><span class="atn">content</span><span class="pun">=</span><span class="atv">"icon_largetile.png"</span><span class="tag">&gt;</span></pre>

<h3>
	متصفحي كروم وأوبرا
</h3>

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

<p>
	ملاحظة: يجب أن تكون أحجام الأيقونات من مضاعفات الحجم 48px على سبيل المثال 48px، أو 96px، أو 144px، أو 192px.
</p>

<h3>
	متصفح سفاري
</h3>

<p>
	يستخدم متصفح سفاري الوسم <code>&lt;link&gt;</code> مع الخاصية <code>rel</code> والتي قيمتها <code>apple-touch-icon</code> للإشارة إلى أيقونة الشاشة الرئيسية.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3150_9" style="">
<span class="tag">&lt;link</span><span class="pln"> </span><span class="atn">rel</span><span class="pun">=</span><span class="atv">"apple-touch-icon"</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"touch-icon-iphone.png"</span><span class="tag">&gt;</span></pre>

<p>
	تعد الأيقونات مربعة الشكل شفافة اللون ذات الحجم 180px أو 192px والامتداد png مثاليةً للاستخدام مع <code>apple-touch-icon</code>.
</p>

<p>
	لا ينصح بتضمين الموقع أحجامًا متعددةً من الصور لدعم مواقع متعددة، كان متصفح سفاري الخاص بنظام iOS يأخذ في السابق بعين الاعتبار الكلمة المفتاحية <code>precomposed-</code> والتي تستعمل لمنع إضافة التأثيرات البصرية لكن لم يعد لها حاجة بعد الإصدار السابع من iOS.
</p>

<h3>
	متصفح انترنت اكسبلورر ونظام التشغيل ويندوز فون
</h3>

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

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3150_11" style="">
<span class="tag">&lt;meta</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"msapplication-square70x70logo"</span><span class="pln"> </span><span class="atn">content</span><span class="pun">=</span><span class="atv">"icon_smalltile.png"</span><span class="tag">&gt;</span><span class="pln">
</span><span class="tag">&lt;meta</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"msapplication-square150x150logo"</span><span class="pln"> </span><span class="atn">content</span><span class="pun">=</span><span class="atv">"icon_mediumtile.png"</span><span class="tag">&gt;</span><span class="pln">
</span><span class="tag">&lt;meta</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"msapplication-wide310x150logo"</span><span class="pln"> </span><span class="atn">content</span><span class="pun">=</span><span class="atv">"icon_widetile.png"</span><span class="tag">&gt;</span></pre>

<h2>
	عناصر ألوان المتصفح
</h2>

<p>
	يمكنك باستخدام أنواع مختلفة من عنصر <a href="https://wiki.hsoub.com/HTML/meta" rel="external">meta</a> تخصيص المتصفح وحتى عناصر أخرى من النظام الأساسي، ضع في اعتبارك أن بعض هذه التخصيصات ستعمل على متصفحات وأنظمة تشغيل دون غيرها، لكن هذه التحسينات ستعمل على تحسين تجربة المستخدم بشكل كبير.
</p>

<p>
	تتيح المتصفحات (Coast و Chrome و Firefox OS و Safari و Internet Explorer و Opera) للمستخدم تخصيص ألوان عناصر المتصفح وحتى عناصر من النظام الأساسي باستخدام الوسم meta.
</p>

<h3>
	تخصيص ألوان القالب في متصفحي أوبرا وكروم
</h3>

<p>
	لضبط ألوان القالب الخاص بمتصفح كروم في <a href="https://academy.hsoub.com/files/24-%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%84%D9%85%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D9%86/" rel="">نظام التشغيل</a> أندرويد استخدم عنصر <code>meta</code> الخاص بألوان القالب.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3150_14" style="">
<span class="com">&lt;!-- Chrome, Firefox OS and Opera --&gt;</span><span class="pln">
</span><span class="tag">&lt;meta</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"theme-color"</span><span class="pln"> </span><span class="atn">content</span><span class="pun">=</span><span class="atv">"#4285f4"</span><span class="tag">&gt;</span></pre>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2022_05/theme-color.png.9ccdb28109a53bd3bd977251b142b6d7.png" data-fileid="98714" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="98714" data-unique="xpuhrin1f" src="https://academy.hsoub.com/uploads/monthly_2022_05/theme-color.thumb.png.7b4e8b411a8f3d81f09809cb743ee6a2.png" style="width: 500px; height: auto;" alt="theme-color.png"></a>
</p>

<h3>
	تخصيص تنسيق متصفح سفاري
</h3>

<p>
	يسمح متصفح سفاري بتنسيق شريط الحالة وتخصيص صورة بدء التشغيل.
</p>

<h4>
	تحديد صورة بدء التشغيل
</h4>

<p>
	يعرض متصفح سفاري افتراضيًا شاشةً فارغةً أثناء وقت التحميل وبعد عدة تحميلات للموقع يعرض لقطة شاشة لآخر حالة في التطبيق، من الممكن منع هذا من خلال إجبار متصفح سفاري على عرض صورة بدء تشغيل بشكل صريح، من خلال إضافة وسم <code>link</code> مع الخاصية <code>rel=apple-touch-startup-image</code> انظر للمثال التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3150_18" style="">
<span class="tag">&lt;link</span><span class="pln"> </span><span class="atn">rel</span><span class="pun">=</span><span class="atv">"apple-touch-startup-image"</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"icon.png"</span><span class="tag">&gt;</span></pre>

<p>
	يجب أن تكون الصورة بحجم محدد يلائم شاشة الجهاز المستهدف وإلا فلن يستخدمها، للحصول على مزيد من التفاصيل راجع العنوان التالي <a href="https://developer.apple.com/library/ios/documentation/AppleApplications/Reference/SafariWebContent/ConfiguringWebApplications/ConfiguringWebApplications.html" rel="external nofollow">Safari Web Content Guidelines</a>.
</p>

<p>
	على الرغم من ندرة التوثيقات المقدمة من شركة آبل لهذا الموضوع، إلا أن مجتمع المطورين توصل إلى طريقة يستطيع من خلالها دعم الأجهزة المختلفة وذلك باستخدام media queries لتحديد الجهاز من ثم تحديد الصورة المناسبة له، يمكنك الاطلاع على هذا المثال لتتضح الصورة أكثر <a href="https://gist.github.com/tfausak/2222823" rel="external nofollow">tfausak's gist</a>.
</p>

<h4>
	تغيير مظهر شريط الحالة
</h4>

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

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3150_20" style="">
<span class="tag">&lt;meta</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"apple-mobile-web-app-status-bar-style"</span><span class="pln"> </span><span class="atn">content</span><span class="pun">=</span><span class="atv">"black"</span><span class="tag">&gt;</span></pre>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98713" href="https://academy.hsoub.com/uploads/monthly_2022_05/status-bar-translucent.png.7fce57511f9826f099e5acebe7db09dd.png" rel=""><img alt="status-bar-translucent.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98713" data-unique="hiawfm8ge" src="https://academy.hsoub.com/uploads/monthly_2022_05/status-bar-translucent.png.7fce57511f9826f099e5acebe7db09dd.png" style="width: 280px; height: auto;"></a>
</p>

<p>
	لقطة شاشة للون الأسود نصف شفاف
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98712" href="https://academy.hsoub.com/uploads/monthly_2022_05/status-bar-black.png.fa81f9d896a50f2697e27cd995ab9cbf.png" rel=""><img alt="status-bar-black.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98712" data-unique="1pn299ty6" src="https://academy.hsoub.com/uploads/monthly_2022_05/status-bar-black.png.fa81f9d896a50f2697e27cd995ab9cbf.png" style="width: 280px; height: auto;"></a>
</p>

<p>
	لقطة شاشة للون الأسود
</p>

<p>
	ترجمة وبتصرف للمقال <a href="https://developers.google.com/web/fundamentals/design-and-ux/browser-customization#chrome_opera/" rel="external nofollow">Icons &amp; Browser Colors developers.google</a> من موقع <a href="https://developers.google.com/" rel="external nofollow">developers.google</a>.
</p>

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

<ul>
<li>
		<a href="https://academy.hsoub.com/design/general/%D8%A3%D9%81%D8%B6%D9%84-12-%D8%A3%D8%AF%D8%A7%D8%A9-%D8%A7%D9%86%D8%AA%D9%82%D8%A7%D8%A1-%D9%84%D9%84%D8%A3%D9%84%D9%88%D8%A7%D9%86-%D9%84%D9%85%D8%B5%D9%85%D9%85%D9%8A-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r515/" rel="">أفضل 12 أداة انتقاء للألوان لمصممي الويب</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1558</guid><pubDate>Sat, 14 May 2022 12:34:38 +0000</pubDate></item><item><title>&#x645;&#x633;&#x62A;&#x642;&#x628;&#x644; &#x62A;&#x637;&#x628;&#x64A;&#x642;&#x627;&#x62A; &#x627;&#x644;&#x648;&#x64A;&#x628;: HTML &#x639;&#x628;&#x631; &#x645;&#x642;&#x627;&#x628;&#x633; &#x627;&#x644;&#x648;&#x64A;&#x628; WebSocket</title><link>https://academy.hsoub.com/programming/html/%D9%85%D8%B3%D8%AA%D9%82%D8%A8%D9%84-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-html-%D8%B9%D8%A8%D8%B1-%D9%85%D9%82%D8%A7%D8%A8%D8%B3-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-websocket-r1556/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_05/627eb6923e9a1_---HTML----WebSockets.png.6b1d5d7cea023fd204eaf1c00c658cb2.png" /></p>

<p>
	تطورت هيكلية تطبيقات الويب كثيرًا مع الوقت، حيث بدأت من صفحات ثابتة أو مصيّرة rendered من طرف الخادم، إلى ما بات يعرف بالتصيير من طرف العميل، أما المستقبل الآن فيبدو أنه يتوجه إلى التصيير من طرف الخادم مرةً أخرى، لكن هذه المرة عبر بث <a href="https://wiki.hsoub.com/HTML" rel="external">HTML</a> من خلال مقابس الويب WebSockets.
</p>

<p>
	أدى اعتماد هيكلية تطبيقات الصفحة الواحدة Single Page App، واختصارًا SPA، مع خدمة <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D9%88%D8%A7%D8%AC%D9%87%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-api-r1314/" rel="">الواجهة البرمجية <abbr title="Application Programming Interface | واجهة برمجية">API</abbr></a> لتصيير التطبيقات إلى صعوبات، من بينها التعامل مع ردود <a href="https://academy.hsoub.com/programming/javascript/%D8%AA%D8%B9%D9%84%D9%85-json-r604/" rel="">JSON</a> للواجهة البرمجية، وإدارة حالة التطبيق بين طبقتين، ما يؤدي لزيادة كلفة وقت التطوير، ويبطئ إصدار النسخ الجديدة، ويعيق عجلة التطوير.
</p>

<p>
	انتشرت بين المطورين طريقة جديدة، وهي الهيكلية الموجهة بمقابس الويب WebSocket driven، والتي تؤكد مجددًا أهمية التصيير من طرف الخادم، وتتيح تطوير النماذج الأولية prototype بسرعة، وتحول مسؤولية إدارة حالة التطبيق إلى الخادم مجددًا، وتسرع عملية إضافة المزايا الجديدة للتطبيقات، وتبسط إجراءات <a href="https://academy.hsoub.com/marketing/search-engine-optimisation/%D9%86%D8%B5%D8%A7%D8%A6%D8%AD-%D8%AA%D8%AD%D8%B3%D9%8A%D9%86-%D9%85%D8%AD%D8%B1%D9%83%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%AD%D8%AB-%D9%84%D9%84%D9%85%D9%88%D8%A7%D9%82%D8%B9-%D8%A7%D9%84%D8%AC%D8%AF%D9%8A%D8%AF%D8%A9-r521/" rel="">التحسين لمحركات البحث SEO</a>، وتوفر التشاركية لعدة مستخدمين، وتبسط إمكانية تطوير تصاميم متجاوبة دون الحاجة لبناء تطبيقين منفصلين، حيث يكون التطبيق النهائي مستودعًا واحدًا، ويشعر مستخدمه بنفس التجاوب الذي يشعر به على تطبيقات <a href="https://wiki.hsoub.com/JavaScript" rel="external">جافاسكربت</a> من طرف العميل، مع توفير قوالب بسيطة دون الحاجة للكثير من رموز التحميل، أو أخطاء في إدارة الحالة لأنها موجودة على الخادم في مكان واحد فقط، وتمهد كل الميزات السابقة لطريق تطوير أبسط وأسرع.
</p>

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

<p>
	قد يكون <a href="https://academy.hsoub.com/programming/ruby/rails/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A5%D8%B7%D8%A7%D8%B1-%D8%A7%D9%84%D8%B9%D9%85%D9%84-ruby-on-rails-r526/" rel="">إطار عمل روبي أون ريلز</a> Ruby on Rails أفضل إطار يركز على توفير وقت التطوير، كما يمكنك تطوير العروض ضمن بنية MVC باستخدام مكونات العروض ViewComponents، وكذلك الاستعانة بمكتبتي CableReady و StimulusReflex لإضافة التفاعلية لتطبيقاتك، وسنتحدث عن إطار ريلز لاحقًا.
</p>

<h2>
	البداية من أطر العمل
</h2>

<p>
	بدأت أطر العمل بالانتشار عام 2005 تقريبًا، وكان الشائع قبلها تجميع واستخدام عدة مكتبات مع بعضها، وعلى المطور أن يجد طريقته في تحديد هيكلية التطبيق، ثم نشره على <a href="https://academy.hsoub.com/devops/servers/web/apache/" rel="">خوادم أباتشي Apache</a> التي يديرها المطورون يدويًا، لكن أطر العمل وعدت بتوفير طريقة جديدة لهيكلة التطبيقات دون الحاجة للمعاناة أو حتى لمس ما يتعلق بهيكلة التطبيق، مما أدى لتركيز المطورين على المفاهيم البرمجية العامة، وكتابة الشيفرات المقروءة، وتطوير المزايا التي يحتاجها السوق بسرعة أكبر، وما على المطور إلا أن يتعلم المفاهيم التي يقدمها إطار العمل، وكيفية استخدامها ليستطيع بناء تطبيقات ويب معقدة، بينما يبقى باقي المطورين مشغولون بإعداد طرق هيكلة تطبيقاتهم الخاصة.
</p>

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

<h2>
	استخدمت جافاسكريبت في كل شيء
</h2>

<p>
	بدأت المفاهيم السابقة تتغير مع بداية عام 2010، إذ تنحّت أطر العمل التي تعتمد مبدأ التصيير من طرف الخادم جانبًا، واستخدمت بدلًا منها تطبيقات الصفحة الواحدة SPA، وهي تطبيقات مبنية كليًا باستخدام جافاسكريبت، وتعمل بالكامل على جهاز العميل، وأصبح غرض الخادم في العديد من الشركات استضافة الواجهة البرمجية للتطبيق <abbr title="Application Programming Interface | واجهة برمجية">API</abbr> لتخديم البيانات فقط، أما باقي منطق العمل وتصيير HTML فموجود من طرف الخادم فقط، وعند أول زيارة للموقع سيحتاج الزائر لتحميل حزمة كبيرة من جافاسكريبت تحتوي على كل ذلك، وهنا أصبح الأمر مزعجًا قليلًا.
</p>

<p>
	بدأنا نلاحظ مع دخول عام 2020 أن الويب عمومًا وصل إلى حد معين من السرعة ولم يعد يتطور أكثر، على عكس الأمل الذي وعدت به تطبيقات الصفحة الواحدة، فمثلًا أدى تحميل حزم بأحجام من فئة الميجابايت إلى هاتف محمول إلى تجربة مستخدم سيئة، عدا عن حاجة تطوير تطبيق ويب احترافي لموارد كثيرة، مع وجوب تطوير خدمة <abbr title="Application Programming Interface | واجهة برمجية">API</abbr> وقناة تواصل بينهما، وفعليًا ليس لكل المستخدمين أجهزة قوية قادرة على معالجة 100 كيلو بايت من JSON وتصييرها إلى جدول معقد بترميز HTML أسرع من تصييرها على خادم بمواصفات متوسطة، كما أن تطوير تلك التطبيقات مكلف جدًا أيضًا، ففي الكثير من الأحيان ينتهي بنا الأمر ببذل جهد مضاعف، بل ودفع ضعف التكلفة للمطورين للحصول على نفس النتيجة التي حصلنا عليها سابقًا من تطوير تطبيقات طرف الخادم.
</p>

<p>
	ذهلت تطبيقات أطر العمل الجميع في عام 2005 عندما أتاحت إمكانية بناء تطبيق مدونة كامل بربع ساعة فقط، ثم -وبعد 15 عام- صار تطوير نفس المدونة باستخدام طريقة تطبيقات الصفحة الواحدة سيحتاج لمستودعين وطبقة تحويل JSON إلى سلاسل، والكثير من مؤشرات التحميل ضمن التطبيق، كل هذا بهدف للحصول على أول صورة للمحتوى ضمن التطبيق خلال 50 ميلي ثانية، وفي هذه الأثناء ينتظر المستخدم -محدقًا في شاشة رمادية- تصيير المعلومات بصيغة JSON التي طلبها متصفحه إلى HTML.
</p>

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

<h2>
	الكلفة المضاعفة للتحسن الضئيل
</h2>

<p>
	بدت تطبيقات الوب -مع التطور الذي جرى عليها- جميلةً أكثر من وجهة نظر المستخدم، وإذا اهتممنا بتطويرها بالطريقة الصحيحة فسيشعر المستخدم أن التطبيق أكثر تفاعليةً وسرعةً، ويتيح إمكانية توفير مكونات تفاعلية غير أصلية، وكانت الخطوة التالية الصحيحة هي التركيز على تلك المكونات، فقد كنا سابقًا نهتم بالتفكير بكيفية تعديل مستند HTML بالكامل ليعطي المستخدم إحساس التفاعل مع مكون واحد داخل الصفحة، أما الآن فيمكن تضمين ذلك مباشرةً، ويمكننا تقسيم <a href="https://academy.hsoub.com/design/user-experience/%d9%85%d8%af%d8%ae%d9%84-%d8%a5%d9%84%d9%89-%d8%aa%d8%ac%d8%b1%d8%a8%d8%a9-%d8%a7%d9%84%d9%85%d8%b3%d8%aa%d8%ae%d8%af%d9%85-user-experience-r149/" rel="">تجربة المستخدم</a> إلى مكونات، لكن هذا سينعكس مباشرةً على الزيادة في الكلفة، فمثلًا يمكنك تطوير مكون تقييم يظهر بصورة نجوم، وإضافة حركات جميلة إليه، وجعل عملية وضع المؤشر عليه وضغطه تعطي شعورًا جميلًا، مما يحفز الأندورفين للمستخدم عندما يعطي تقييمه، لكن تلك العملية تحتاج لحفظ بيانات عن هذا التقييم ضمن قاعدة البيانات، ويجب على التطبيق أن يعكس حالة التخزين تلك ليشاهدها المستخدم.
</p>

<p>
	كنا نظهر نفس المكون السابق عن طريق توفير عدة نجوم في صور GIF للمستخدم، ولكل منها رابط يشير لنفس المسار، مع اختلاف قيمة معامل التقييم لكل منها، وعلى طرف الخادم كنا نأخذ القيمة المرسَلة ونحفظها ضمن قاعدة البيانات، ونعيد إرسال صفحة HTML كاملة للمتصفح ليعيد تصييرها، حتى أنه كان بالإمكان استخدام أجاكس AJAX لإتمام هذه العملية في الخلفية دون الحاجة لإعادة تحديث الصفحة بالكامل، وإذا فرضنا أن الطريقة السابقة تكلف المطور قيمة x زمنيًا وماديًا، ولن نذكر كلفة الفرص الضائعة نتيجة التأخير في إطلاق المزايا الجديدة، فستكلف الطريقة التي تعتمد Ajax في التحديث x+n، حيث n كلفة برمجة وإدارة هذه الطريقة باستخدام جافاسكريبت، وستزيد كلما اعتمد تطبيقنا على جافاسكريبت أكثر، وكلما زاد تعقيده.
</p>

<p>
	نكتب جافاسكريبت في طرف الخادم حاليًا في تطبيقات الصفحة الواحدة، ونستخدم قوالب JSX وHandlebar لتصيير المكونات، ونستخدم شيفرةً لحفظ حالة التطبيق في مستودع الواجهة الأمامية، ثم نرسل طلب PUT إلى واجهة برمجة التطبيق <abbr title="Application Programming Interface | واجهة برمجية">API</abbr>، حيث سنكتب شيفرةً مسؤولةً عن معالجة الطلب، وطبقةً لتحويل JSON إلى سلاسل (ربما مع الشيرة الوهمية للنموذج) لتحزيم الرد، وشيفرةً في الواجهة الأمامية لتحديث -إعادة تصيير- المكون بعد تلقي الرد، وبعض منطق التفريع للتراجع وإعادة تصيير تغير الحالة من طرف العميل عند فشل الواجهة الخلفية، وسيزيد كل هذا من كلفة وقت وأجرة المطور أكثر من x+n، وإذا تكوّن فريق العمل من فريق للواجهات الأمامية وآخر للواجهات الخلفية، فستضاعف هذه الكلفة فورًا في الحالات التي ستحتاج فيها لعدة أشخاص لإنهاء التضمين، وستكون كل هذه المشاكل التي تأتي مع تطبيقات الصفحة الواحدة على حساب هدف العمل في السباق للتواجد في السوق، وتوفير منتجات تهمّ الأشخاص المحتاجين إليها.
</p>

<p>
	إحدى وجهات النظر التي تدافع عن تطبيقات الصفحة الواحدة تقول إن من مزاياها توفير كلفة البنية التحتية، عن طريق تحميل العميل كلفة الاستضافة، مما يوفر كلفة الحلول السحابية المعتمدة، لكن وجهة النظر هذه قد تكون خاطئةً، لأننا مع ذلك مضطرون للدفع مقابل استضافة خدمة <abbr title="Application Programming Interface | واجهة برمجية">API</abbr> وقاعدة البيانات، وقد نزيد عليها أيضًا كلفة موازنات الأحمال Load Balancers، <a href="https://academy.hsoub.com/devops/servers/dns/%D9%85%D9%82%D8%A7%D8%B1%D9%86%D8%A9-%D8%A8%D9%8A%D9%86-%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D8%A7%D9%84%D8%AE%D9%88%D8%A7%D8%AF%D9%8A%D9%85-%D9%81%D9%8A-%D9%86%D8%B8%D8%A7%D9%85-dns-%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A7%D8%AE%D8%AA%D9%8A%D8%A7%D8%B1-%D8%A7%D9%84%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A7%D9%84%D9%85%D9%86%D8%A7%D8%B3%D8%A8-%D9%84%D9%84%D8%AE%D8%A7%D8%AF%D9%88%D9%85-r15/" rel="">وخادم نطاق الأسماء DNS</a> وغيرها، وكل هذه الكلف ليست إلا جزءًا بسيطًا من مجموع رواتب المطورين التي تدفعها الشركات لهم، بل يتوقع المطورون مع الوقت زيادة رواتبهم، بينما تبقى كلفة خدمات الاستضافة على حالها، وتنخفض مع الوقت.
</p>

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

<p>
	قد يبدو ذلك مستحيلًا لكنه ممكن، ويوفر تطبيقات رائعةً في وقت قصير، فيمكننا مثلًا البث لكل المستخدمين المسجلين دخولهم حاليًا، وتحديث <a href="https://academy.hsoub.com/programming/javascript/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-dom-r644/" rel="">شجرة DOM</a> من طرف الخادم فورًا، وتوفير حركات متجاوبة ثلاثية الأبعاد بواسطة جافاسكريبت، ونوافذ محادثة بالوقت الحقيقي، كل ذلك في مستودع واحد يعمل على نفس الخادم الذي يُستخدم للتطبيقات المصيرة من طرف الخادم، كما يمكن استخدام خادم بمواصفات أقل بما أننا نصيّر قطع HTML غالبًا، لا مستندات وصفحات كاملة، ولن نحتاج لتطبيق منفصل للواجهة الأمامية، وإنما مكونات جافاسكريبت وشيفرة من طرف الخادم تعمل مع بعضها بطريقة مثالية فقط.
</p>

<h2>
	مقابس الويب WebSockets
</h2>

<p>
	بدأت المتصفحات الحديثة بدعم مقابس الويب عام 2011، وهي الآن مدعومة في كل المتصفحات، ويمكنك الحصول على <a href="https://ar.wikipedia.org/wiki/%D8%A7%D8%B2%D8%AF%D9%88%D8%A7%D8%AC_(%D8%A7%D8%AA%D8%B5%D8%A7%D9%84%D8%A7%D8%AA)" rel="external nofollow">اتصال مزدوج</a> عبر المقبس بين المتصفح والخادم بالاستعانة بالقليل من جافاسكريبت بجهة العميل، حيث يمكن للبيانات المرور بكلا الاتجاهين، ويمكن دفعها من كلا الطرفين في أي وقت، دون الحاجة لتدخل المستخدم، كما تطورت صناعة الألعاب، وذهبت باتجاه الألعاب السحابية، ولن يكون مستقبل تطبيقات الويب في الذهاب أكثر باتجاه نموذج خادم/عميل، بل على العكس سيذهب باتجاه جعل العميل يعمل مثل طرفية بطبقة رقيقة، تُصيِّر حالة التطبيق بترميز مفهوم للبشر، وتوفر مقابس الويب طبقة اتصال سهلةً وسريعةً، تتجه فيها البيانات من الخادم إلى البشر مباشرةً.
</p>

<p>
	لم يتقبل المطورون تلك الفكرة بسهولة، كما لم تكن فوائدها واضحةً، بسبب تعودهم على حلقة طلبات <a href="https://academy.hsoub.com/programming/general/%d9%85%d8%af%d8%ae%d9%84-%d8%a5%d9%84%d9%89-http-r73/" rel="">HTTP</a> من عشرات السنين، حيث يجب على الخادم أن يدعم تلك الطريقة في كافة المزايا المتضمنة فيه، لذا احتاج تبنّي مقابس الويب للتفكير من جديد لاستيعاب بنيته، وكما هو الحال في كل التقنيات والبروتوكولات الجديدة فهو بحاجة إلى طبقة تجريد عليا، تمكننا من توفير المزايا الجديدة بفعالية وسرعة إلى المستخدم.
</p>

<h2>
	HTML عبر مقابس الويب
</h2>

<p>
	إذا أردت الحصول على قائمة بيانات متجاوبة ومتزامنة مع قاعدة البيانات، فأرسل استعلام المستخدم عبر مقبس الويب إلى الخادم عند كل ضغطة مفتاح من لوحة المفاتيح، ليعيد لك عناصر <a href="wiki.hsoub.com/HTML/option" rel="">option</a> المناسبة لذلك الاستعلام.
</p>

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

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

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

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

<h2>
	هل هذه الطريقة معقدة أو مكلفة أو تحتاج لبنية تحتية ما؟
</h2>

<p>
	الجواب هو لا، إذ تدعمها مخدمات الويب مفتوحة المصدر دعمًا أصيلًا، دون الحاجة لإعدادها تقريبًا، وتوفر العديد من أطر عمل التصيير من طرف الخادم ضمنيًا شيفرة جافاسكريبت لطرف العميل لتتيح إمكانية التواصل عبر المقبس، فمثلًا في إطار عمل ريلز نعدّ التطبيق لاستخدام مقابس الويب بإعداد ActionCable المعتاد على نفس العتاد الذي نستخدمه عادةً، ويمكن لإجرائية مخدم ريلز تخديم 4000 اتصال معًا تقريبًا مع الحفاظ على أدائها، ويمكنك استخدام <a href="https://wiki.hsoub.com/Rails/action_cable" rel="external">ActionCable</a> لرفع العدد إلى 10000 اتصال لكل عقدة، وذلك بعدم الاعتماد على خادم ريلز لمقابس الويب، على نفس العتاد الذي تستخدمه عادةً، دون الحاجة لإضافة أي عتاد أو توسيع البنية السحابية لمشروعك.
</p>

<p>
	انتشرت هذه الطريقة وأنشئت لها إضافات ومكتبات وإعدادات لمختلف اللغات وأطر العمل، فمثلًا يوجد Socketpuppet لإطار ديجانغو Django، وLiveView لإطار فونكس Phoenix، ويمكنك البحث عن مكتبات توفر دعمًا للاتصال عبر مقابس الويب لإطار العمل المفضل لديك، مما سيغير طريقة تفكيرك حول هيكلية التطبيقات، ثم حاول بناء تطبيق صغير بواسطة ذلك، وستشعر بمتعة وسرعة إرسال أجزاء HTML عبر المقبس، وستحتاج لعقلية جديدة وميزات منفَّذة جيدًا لنجاح شركتك الناشئة.
</p>

<h2>
	إطار عمل روبي أون ريلز Ruby on Rails
</h2>

<p>
	عند إضافة آخر إصدار كل من <a href="https://github.com/turbolinks/turbolinks" rel="external nofollow">Turbolinks</a> و<a href="https://stimulus.hotwire.dev/" rel="external nofollow">Stimulus</a> و<a href="https://docs.stimulusreflex.com/" rel="external nofollow">StimulusReflex</a> و<a href="https://cableready.stimulusreflex.com/" rel="external nofollow">CableReady</a> و<a href="https://github.com/github/view_component" rel="external nofollow">ViewComponent</a> إلى إطار العمل روبي أون ريلز ستتمكن من العمل على تطبيق تفاعلي يشعرك أنك تبني تطبيق ريلز كلاسيكيًا وأكثر عصريةً، بالإضافة إلى مكونات تطبيقات الصفحة الواحدة ضمن مستودع واحد لكل التطبيقات، ومزايا التصيير من طرف الخادم، والتخزين المؤقت لقطع HTML، وتحسين محركات البحث، وكافة مزايا الأمان، وما يماثلها من مزايا، وستجد العديد من الأدوات التي ستخدمك لبناء مزايا كنت سابقًا تبتعد عنها لصعوبة بنائها.
</p>

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

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

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

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

<p>
	يشاركنا أوبي فرناندز Obie Fernandez صاحب كتاب "على طريقة روبي The Ruby Way" ذلك الرأي، ويؤمن راس هانيمان Russ Hanneman أن تلك الطريقة مع استخدام StimulusReflex هي المستقبل، وقدّم الأشخاص في بيزكامب Basecamp (مؤسسو ريلز الأوائل) وجهة نظرهم عن تلك الطريقة <a href="https://hotwire.dev/" rel="external nofollow">Hotwire</a>.
</p>

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

<p>
	يجب عليه الاطلاع على ريلز التفاعلي مع StimulusReflex وباقي المكتبات التي ستتيح مساحةً من التطبيقات الجديدة كليًا، لكل من يعاني مع مسارات JSON على الخادم أو مع JSX.
</p>

<p>
	ترجمة -وبتصرف- للمقال "<a href="https://alistapart.com/article/the-future-of-web-software-is-html-over-websockets/" rel="external nofollow">The Future of Web Software Is HTML-over-WebSockets</a>" لصاحبه Matt E. Patterson.
</p>

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

<ul>
<li>
		<a href="https://academy.hsoub.com/programming/python/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D9%83%D8%AA%D8%A7%D8%A8%D8%A9-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r1524/" rel="">كيفية كتابة تطبيقات الويب</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/html/%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%AA%D9%8A-%D8%AA%D8%B9%D9%85%D9%84-%D8%AF%D9%88%D9%86-%D8%A7%D8%AA%D8%B5%D8%A7%D9%84-%E2%80%93-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%A3%D9%88%D9%84-r441/" rel="">تطبيقات الويب التي تعمل دون اتصال – الجزء الأول</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/php/%D8%A7%D9%84%D8%AA%D8%AE%D8%B2%D9%8A%D9%86-%D8%A7%D9%84%D9%85%D8%A4%D9%82%D8%AA-cache-%D9%88%D9%85%D9%82%D8%A7%D8%A8%D8%B3-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-webscockets-%D9%81%D9%8A-php-r1180/" rel="">التخزين المؤقت (Cache) ومقابس الويب (Webscockets) في PHP</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">1556</guid><pubDate>Sat, 14 May 2022 15:05:00 +0000</pubDate></item><item><title>&#x646;&#x645;&#x648;&#x630;&#x62C; &#x647;&#x64A;&#x643;&#x644; &#x627;&#x644;&#x62A;&#x637;&#x628;&#x64A;&#x642; App Shell &#x644;&#x628;&#x646;&#x627;&#x621; &#x62A;&#x637;&#x628;&#x64A;&#x642;&#x627;&#x62A; &#x627;&#x644;&#x648;&#x64A;&#x628; &#x627;&#x644;&#x62A;&#x642;&#x62F;&#x645;&#x64A;&#x629; PWA</title><link>https://academy.hsoub.com/programming/html/%D9%86%D9%85%D9%88%D8%B0%D8%AC-%D9%87%D9%8A%D9%83%D9%84-%D8%A7%D9%84%D8%AA%D8%B7%D8%A8%D9%8A%D9%82-app-shell-%D9%84%D8%A8%D9%86%D8%A7%D8%A1-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%AA%D9%82%D8%AF%D9%85%D9%8A%D8%A9-pwa-r1530/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_04/625e65b105c07_(1).png.14ada768d00b160de8eb9d36bc07bf17.png" /></p>

<p>
	تعد بنية هيكل التطبيق App Shell هي إحدى الطرق المستعملة لبناء <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%AA%D9%82%D8%AF%D9%85%D9%8A%D8%A9-pwa-r832/" rel="">تطبيقات الويب التقدمية Progressive Web App</a> -تختصر إلى PWA- والتي تعمل بكفاءة وسرعة على شاشات المستخدمين، تمامًا مثل تلك التطبيقات التي بنيت بلغات نظام التشغيل الأصيلة native application.
</p>

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

<p>
	يعد هيكل التطبيق هو تطوير على تطبيقات الويب أحادية الصفحة single-page applications التي يتم تشغيلها باستخدام أكواد كبيرة من جافاسكربت، ويعتمد هيكل التطبيق على تخزين هيكل التطبيق الأساسي في الذاكرة المؤقتة باستخدام <a href="https://academy.hsoub.com/programming/general/%D9%85%D9%81%D9%87%D9%88%D9%85-service-worker-%D9%88%D8%AA%D8%A3%D8%AB%D9%8A%D8%B1%D9%87-%D9%81%D9%8A-%D8%A3%D8%AF%D8%A7%D8%A1-%D9%88%D8%A8%D9%86%D9%8A%D8%A9-%D9%85%D9%88%D8%A7%D9%82%D8%B9-%D9%88%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r833/" rel="">عامل الخدمة</a> service worker ليشغل التطبيق، ثم بعد ذلك نحصل على المحتوى الخاص بكل صفحة في التطبيق باستخدام جافاسكربت، ويتلخص الهدف الأساسي من استخدام التطبيقات الهيكلية في الحصول على بنية "HTM" الأساسية الخاصة بالتطبيق.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="96616" href="https://academy.hsoub.com/uploads/monthly_2022_04/appshell.png.0233f1b709387207322750105bb6e81f.png" rel=""><img alt="appshell.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96616" data-unique="6q7vlzc8d" src="https://academy.hsoub.com/uploads/monthly_2022_04/appshell.png.0233f1b709387207322750105bb6e81f.png" style="width: 500px; height: auto;"></a>
</p>

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

<h2>
	متى يستخدم نموذج هيكل التطبيق
</h2>

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

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

<p>
	لتتعرف على كيفية بناء جوجل لهيكل التطبيق ألق نظرةً على <a href="https://developers.google.com/web/showcase/2016/iowa2016" rel="external nofollow">تطبيق الويب التقدمي I/O 2016 الذي بنته جوجل</a> حيث كانت بداية هذا التطبيق الواقعي من خلال عملية بناء تطبيق ويب أحادي الصفحة SPA يهدف إلى إنشاء تطبيق ويب تقدمي والذي يستعمل عامل خدمة والذي يعمل بدوره على إضافة المحتوى ديناميكًا وتمكين تغيير المحتوى المعروض على الشاشة بسلاسة ودعم إمكانية إعادة استخدام المحتوى بعد تحميله لأول مرة.
</p>

<h2>
	مزايا استعمال نموذج هيكل التطبيق
</h2>

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

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

<ul>
<li>
		تحميل سريع.
	</li>
	<li>
		استخدام أقل قدر ممكن من البيانات.
	</li>
	<li>
		استخدام المكونات الثابتة المخزنة في الذاكرة المحلية.
	</li>
	<li>
		أن يعمل على فصل المحتوى عن التنقل.
	</li>
	<li>
		يحصل على محتوى صفحة مخصص ويعرضه، قد يكون هذا المحتوى ملف HTML أو JSON.
	</li>
	<li>
		تخزين المحتوى الديناميكي ولكن يبقى هذا قرارًا اختياريًا.
	</li>
</ul>
<p>
	يعمل هيكل التطبيق على الاحتفاظ بواجهة التطبيق مخزنةً محليًا والحصول على المحتوى الديناميكي من <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D9%88%D8%A7%D8%AC%D9%87%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-api-r1314/" rel="">الواجهة البرمجية <abbr title="Application Programming Interface | واجهة برمجية">API</abbr></a>، ولكن مع الاحتفاظ بميزة سهولة الاستكشاف وترابط المحتوى في صفحات الويب، فسيجد المستخدم في كل مرة يدخل فيها للتطبيق أحدث إصدار منه دون الحاجة لتنزيل الإصدار الجديد ليسمح ذلك للمستخدم ببدء استخدام التطبيق.
</p>

<p>
	<strong>ملاحظة</strong>: يمكن استخدام أداة التدقيق <a href="https://github.com/googlechrome/lighthouse" rel="external nofollow">Lighthouse</a> للتحقق من أن تطبيق الويب التقدمي يستخدم هيكل تطبيق يحقق أفضل أداء ممكن، ويمكنك الرجوع إلى مقال <a href="https://academy.hsoub.com/programming/workflow/%D8%AF%D9%84%D9%8A%D9%84%D9%83-%D8%A5%D9%84%D9%89-%D8%A7%D8%B3%D8%AA%D8%B9%D9%85%D8%A7%D9%84-%D8%A7%D9%84%D8%A3%D8%AF%D8%A7%D8%A9-lighthouse-r691/" rel="">دليلك إلى استعمال الأداة Lighthouse</a> لمزيد من التفصيل حولها.
</p>

<h2>
	كيفية بناء هيكل تطبيق
</h2>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="96617" href="https://academy.hsoub.com/uploads/monthly_2022_04/wikipedia.png.171790b3ea52181f8c30146470e3b977.png" rel=""><img alt="wikipedia.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96617" data-unique="7ig3rh7u1" src="https://academy.hsoub.com/uploads/monthly_2022_04/wikipedia.thumb.png.67c1f35d752cbb7eed941135f6183b00.png" style="width: 750px; height: auto;"></a>
</p>

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

<h3>
	مثال لهيكل تطبيق
</h3>

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

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

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

<ul>
<li>
		شيفرات HTML و CSS والتي تشكل الواجهة والبنية الأساسية للتطبيق، وكامل آليات التنقل بين مكونات التطبيق، والمكان المخصص للمحتويات التي ستعرض داخل التطبيق.
	</li>
	<li>
		ملف جافا سكريبت الخارجي app.js والذي من مهامه إدارة آليات التنقل في واجهة التطبيق، ويعمل على معالجة البيانات القادمة من الخادم من خلال إدارة عمليات العرض والتخزين من خلال تخزين البيانات محليًا باستخدام إحدى آليات التخزين مثل IndexedDB.
	</li>
	<li>
		ملف "web app manifest" ومحمل عامل الخدمة service worker لتمكين خدمات التطبيق في وضع عدم الاتصال، فيوفر ملف web app manifest بيانات عن تطبيق الويب التقدمي بصيغة JSON، والتي يحتاجها المتصفح لمعرفة كيفية التصرف مع التطبيق عند تثبيته على الحواسيب أو الهواتف المحمولة الخاصة بالمستخدمين.
	</li>
</ul>
<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7984_9" 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">App Shell</span><span class="tag">&lt;/title&gt;</span><span class="pln">
  </span><span class="tag">&lt;link</span><span class="pln"> </span><span class="atn">rel</span><span class="pun">=</span><span class="atv">"manifest"</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"/manifest.json"</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;meta</span><span class="pln"> </span><span class="atn">http-equiv</span><span class="pun">=</span><span class="atv">"X-UA-Compatible"</span><span class="pln"> </span><span class="atn">content</span><span class="pun">=</span><span class="atv">"IE=edge"</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;meta</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"viewport"</span><span class="pln"> </span><span class="atn">content</span><span class="pun">=</span><span class="atv">"width=device-width, initial-scale=1.0"</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">type</span><span class="pun">=</span><span class="atv">"text/css"</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"styles/inline.css"</span><span class="tag">&gt;</span><span class="pln">
</span><span class="tag">&lt;/head&gt;</span><span class="pln">

</span><span class="tag">&lt;body&gt;</span><span class="pln">
  </span><span class="tag">&lt;header</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"header"</span><span class="tag">&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">"header__title"</span><span class="tag">&gt;</span><span class="pln">App Shell</span><span class="tag">&lt;/h1&gt;</span><span class="pln">
  </span><span class="tag">&lt;/header&gt;</span><span class="pln">

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

  </span><span class="tag">&lt;main</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"main"</span><span class="tag">&gt;</span><span class="pln">
  ...
  </span><span class="tag">&lt;/main&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">"dialog-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;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"loader"</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="com">&lt;!-- Show a spinner or placeholders for content --&gt;</span><span class="pln">
  </span><span class="tag">&lt;/div&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">"app.js"</span><span class="pln"> </span><span class="atn">async</span><span class="tag">&gt;&lt;/script&gt;</span><span class="pln">
  </span><span class="tag">&lt;script&gt;</span><span class="pln">
  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="str">'serviceWorker'</span><span class="pln"> in navigator</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">serviceWorker</span><span class="pun">.</span><span class="kwd">register</span><span class="pun">(</span><span class="str">'/sw.js'</span><span class="pun">).</span><span class="pln">then</span><span class="pun">(</span><span class="kwd">function</span><span class="pun">(</span><span class="pln">registration</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      </span><span class="com">// Registration was successful</span><span class="pln">
      console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'ServiceWorker registration successful with scope: '</span><span class="pun">,</span><span class="pln"> registration</span><span class="pun">.</span><span class="pln">scope</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}).</span><span class="kwd">catch</span><span class="pun">(</span><span class="kwd">function</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="com">// registration failed :(</span><span class="pln">
      console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'ServiceWorker registration failed: '</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="pun">}</span><span class="pln">
  </span><span class="tag">&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>

<h3>
	تخزين هيكل التطبيق
</h3>

<p>
	يمكن تخزين هيكل التطبيق باستخدام عامل خدمة service worker مكتوب يدويًا أو باستخدام إحدى الأدوات الثابتة التي توفر إنشاء عامل خدمة مثل أداة <a href="https://github.com/GoogleChromeLabs/sw-precache" rel="external nofollow">sw-precache</a> (أصبحت أداة قديمة ومؤرشفة).
</p>

<p>
	<strong>ملاحظة</strong>: جهزت الأمثلة من أجل توفير معلومات عامة وتوضيح الأهداف فقط، قد تختلف الموارد الفعلية المستخدمة في الواقع عن التي سيستخدمها تطبيقك.
</p>

<h4>
	تخزين هيكل التطبيق يدويا
</h4>

<p>
	يوضح المثال بالأسفل شيفرة عامل خدمة يعمل على تخزين المكونات الثابتة لهيكل التطبيق في باستعمال الواجهة Cache <abbr title="Application Programming Interface | واجهة برمجية">API</abbr> الخاصة بعملية التخزين وذلك باستخدام الحدث <code>install</code>.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7984_11" style="">
<span class="kwd">var</span><span class="pln"> cacheName </span><span class="pun">=</span><span class="pln"> </span><span class="str">'shell-content'</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">var</span><span class="pln"> filesToCache </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
  </span><span class="str">'/css/styles.css'</span><span class="pun">,</span><span class="pln">
  </span><span class="str">'/js/scripts.js'</span><span class="pun">,</span><span class="pln">
  </span><span class="str">'/images/logo.svg'</span><span class="pun">,</span><span class="pln">
  </span><span class="str">'/offline.html'</span><span class="pun">,</span><span class="pln">
  </span><span class="str">'/'</span><span class="pun">,</span><span class="pln">
</span><span class="pun">];</span><span class="pln">

self</span><span class="pun">.</span><span class="pln">addEventListener</span><span class="pun">(</span><span class="str">'install'</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">function</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">
  console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'[ServiceWorker] Install'</span><span class="pun">);</span><span class="pln">
  e</span><span class="pun">.</span><span class="pln">waitUntil</span><span class="pun">(</span><span class="pln">
    caches</span><span class="pun">.</span><span class="pln">open</span><span class="pun">(</span><span class="pln">cacheName</span><span class="pun">).</span><span class="pln">then</span><span class="pun">(</span><span class="kwd">function</span><span class="pun">(</span><span class="pln">cache</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'[ServiceWorker] Caching app shell'</span><span class="pun">);</span><span class="pln">
      </span><span class="kwd">return</span><span class="pln"> cache</span><span class="pun">.</span><span class="pln">addAll</span><span class="pun">(</span><span class="pln">filesToCache</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">})</span><span class="pln">
  </span><span class="pun">);</span><span class="pln">
</span><span class="pun">});</span></pre>

<h4>
	تخزين هيكل التطبيق باستخدام sw-precache
</h4>

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

<p>
	يوضح المثال التالي استخدام "sw-precache" بصفته جزءًا من شيفرة "<a href="https://academy.hsoub.com/programming/workflow/%D8%AF%D9%84%D9%8A%D9%84%D9%83-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-%D8%A5%D9%84%D9%89-%D8%A3%D8%AF%D8%A7%D8%A9-%D8%A7%D9%84%D8%A8%D9%86%D8%A7%D8%A1-gulp-r663/" rel="">gulp</a>" المسؤولة عن عملية البناء.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7984_13" style="">
<span class="pln">gulp</span><span class="pun">.</span><span class="pln">task</span><span class="pun">(</span><span class="str">'generate-service-worker'</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">(</span><span class="pln">callback</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"> path </span><span class="pun">=</span><span class="pln"> require</span><span class="pun">(</span><span class="str">'path'</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">var</span><span class="pln"> swPrecache </span><span class="pun">=</span><span class="pln"> require</span><span class="pun">(</span><span class="str">'sw-precache'</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">var</span><span class="pln"> rootDir </span><span class="pun">=</span><span class="pln"> </span><span class="str">'app'</span><span class="pun">;</span><span class="pln">

  swPrecache</span><span class="pun">.</span><span class="pln">write</span><span class="pun">(</span><span class="pln">path</span><span class="pun">.</span><span class="pln">join</span><span class="pun">(</span><span class="pln">rootDir</span><span class="pun">,</span><span class="pln"> </span><span class="str">'service-worker.js'</span><span class="pun">),</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    staticFileGlobs</span><span class="pun">:</span><span class="pln"> </span><span class="pun">[</span><span class="pln">rootDir </span><span class="pun">+</span><span class="pln"> </span><span class="str">'/**/*.{js,html,css,png,jpg,gif}'</span><span class="pun">],</span><span class="pln">
    stripPrefix</span><span class="pun">:</span><span class="pln"> rootDir
  </span><span class="pun">},</span><span class="pln"> callback</span><span class="pun">);</span><span class="pln">
</span><span class="pun">});</span></pre>

<p>
	<strong>ملاحظة:</strong> تكمن فائدة عامل خدمة التخزين المسبق sw-precache في التخزين المؤقت لموارد تطبيقك الثابتة في وضع عدم الاتصال، أما خلال تشغيل البرنامج والتعامل مع الموارد الديناميكية في التطبيق فمن المفضل استعمال المكتبة المتكاملة <a href="https://github.com/googlechrome/sw-toolbox" rel="external nofollow">sw-toolbox</a>.
</p>

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

<p>
	يعد هيكل التطبيق الذي يستخدم عامل الخدمة service worker مزيجًا رائعًا يعمل على إنتاج أفضل التطبيقات التي تستخدم التخزين المؤقت لتعمل في وضع عدم الاتصال، ولكن هذا ليس هو المكسب الوحيد من هيكل التطبيق وعامل الخدمة فهي توفر أفضل أداء يمكن الحصول عليه من خلال التحميل الفوري للمحتوى خلال زيارات المستخدم المتكررة <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%A7-%D9%87%D9%8A-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%AA%D9%82%D8%AF%D9%85%D9%8A%D8%A9-pwa%D8%9F-r1480/" rel="">لتطبيق الويب المتقدم PWA</a>، ويمكنك من خلال هيكل التطبيق أن تخزن بيانات هيكل التطبيق محليًا ثم جلب المحتوى الذي يتغير دائمًا باستخدام <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%B9%D8%A8%D8%B1-%D9%84%D8%BA%D8%A9-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D9%8A%D8%A8%D8%AA-r651/" rel="">الجافاسكربت</a>.
</p>

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

<p>
	ترجمة وبتصرف للمقال <a href="https://developers.google.com/web/fundamentals/architecture/app-shell/" rel="external nofollow">The App Shell Model developers.google</a> من موقع <a href="https://developers.google.com/" rel="external nofollow">developers.google</a>.
</p>

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

<ul>
<li>
		<a href="https://academy.hsoub.com/programming/general/%D9%85%D9%8A%D8%B2%D8%A7%D8%AA-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%AA%D9%82%D8%AF%D9%85%D9%8A-pwa-r1489/" rel="">ميزات تطبيق الويب التقدمي PWA</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D9%86%D9%85%D8%A7%D8%B0%D8%AC-%D8%A7%D9%82%D8%AA%D8%B1%D8%A7%D8%AD%D8%A7%D8%AA-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%AA%D9%82%D8%AF%D9%85%D9%8A%D8%A9-pwa-r1446/" rel="">نماذج اقتراحات تثبيت تطبيقات الويب التقدمية PWA</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/javascript/%D8%AA%D9%88%D9%81%D9%8A%D8%B1-%D8%AA%D8%AC%D8%B1%D8%A8%D8%A9-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D9%85%D8%AE%D8%B5%D8%B5%D8%A9-%D8%AF%D8%A7%D8%AE%D9%84-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%AA%D9%82%D8%AF%D9%85%D9%8A-pwa-r1445/" rel="">توفير تجربة تثبيت مخصصة داخل تطبيق الويب التقدمي PWA</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D8%AC%D8%B9%D9%84-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%AA%D9%82%D8%AF%D9%85%D9%8A-pwa-%D9%8A%D8%A8%D8%AF%D9%88-%D9%83%D8%AA%D8%B7%D8%A8%D9%8A%D9%82-%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A-%D9%81%D9%8A-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-r1528/" rel="">جعل تطبيق الويب التقدمي PWA يبدو كتطبيق أساسي في نظام التشغيل</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1530</guid><pubDate>Tue, 19 Apr 2022 07:46:30 +0000</pubDate></item><item><title>&#x645;&#x643;&#x648;&#x646;&#x627;&#x62A; &#x627;&#x644;&#x648;&#x64A;&#x628;: &#x627;&#x644;&#x62A;&#x639;&#x627;&#x645;&#x644; &#x645;&#x639; &#x634;&#x62C;&#x631;&#x629; DOM &#x627;&#x644;&#x62E;&#x641;&#x64A;&#x629;</title><link>https://academy.hsoub.com/programming/html/%D9%85%D9%83%D9%88%D9%86%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D8%B4%D8%AC%D8%B1%D8%A9-dom-%D8%A7%D9%84%D8%AE%D9%81%D9%8A%D8%A9-r1353/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2021_11/618275185a75f_--2.png.4a9954d99af246f60efe733dba6d3b61.png" /></p>

<p>
	تعرفنا في المقال السابق <a data-ss1635250123="1" href="https://academy.hsoub.com/programming/html/%D9%85%D9%83%D9%88%D9%86%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-html-%D8%A7%D9%84%D9%85%D8%AE%D8%B5%D8%B5%D8%A9-%D9%88%D9%82%D9%88%D8%A7%D9%84%D8%A8%D9%87%D8%A7-r1352/" rel="">مكونات الويب: عناصر HTML المخصصة وقوالبها</a> على عناصر HTML المخصصة وكيفية إنشائها وسنكمل التعرف على موضوع مهم في هذا الصدد وهو <a href="https://academy.hsoub.com/programming/javascript/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-dom-r644/" rel="">شجرة DOM</a> الخفية Shadow DOM -والتي تترجم أيضًا إلى ظل شجرة DOM- تستخدَم للتغليف encapsulation، والتي تسمح لكل مكوِّن ويب مخصص أن يمتلك شجرةً خفيةً لا يمكن للمستند الرئيسي الوصول إليها صدفةً، وقد تمتلك قواعد تنسيق خاصة وغير ذلك من الخواص.
</p>

<h2>
	شجرة DOM الخفية
</h2>

<p>
	هل لديك فكرة عن مدى تعقيد إنشاء وتنسيق أدوات تحكم المتصفح؟
</p>

<p>
	لنفترض وجود العنصر <code>&lt;"input type="range&gt;</code> مثلًا:
</p>

<p style="text-align: center;">
	<input type="range"></p>
<style type="text/css">
input[type="range" i] {
   appearance: auto;
   cursor: default;
   color: rgb(157, 150, 142);
   padding: initial;
   border: initial;
   margin: 2px;
}</style>
<p>
	يستخدم المتصفح ضمنيًا DOM/CSS لرسم أدوات التحكم، ولا تظهر <a href="https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D8%A8%D9%86%D9%8A%D8%A9-%D8%A7%D9%84%D8%B4%D8%AC%D8%B1%D9%8A%D8%A9-%D9%84%D9%80-dom-r646/" rel="">بنية شجرة DOM</a> لنا عادةً، لكن يمكننا رؤيتها باستخدام أدوات التطوير بتفعيل الخيار Show user agent shadow DOM من إعدادات أدوات المطور Dev Tools تحديدًا قسم Elements في المتصفح Chrome مثلًا.
</p>

<p>
	ستبدو الشجرة DOM للعنصر السابق كالتالي:
</p>

<p style="text-align: center;">
	<img alt="input_dom_01.png" class="ipsImage ipsImage_thumbnailed" data-fileid="80759" data-unique="g8xic8ajv" src="https://academy.hsoub.com/uploads/monthly_2021_10/input_dom_01.png.d1f416be3590ba4b5268e966fe718349.png"></p>

<p>
	ما نراه تحت العنوان <code>shadow-root#</code> يسمَّى شجرة DOM المخفية، ولا يمكن الحصول على عناصر شجرة DOM المخفية المضمنة باستخدام استدعاءات JavaScript النظامية أو <a data-ss1635250123="1" href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D9%85%D8%AD%D8%AF%D8%AF%D8%A7%D8%AA-selectors-%D9%81%D9%8A-css-r249/" rel="">المحددات selectors</a>، فهذه العناصر ليست أبناءً نظاميةً، بل هي تقنية تغليف متقدمة.
</p>

<p>
	سنرى في المثال السابق السمة المفيدة <code>pseudo</code>، وهي سمة غير قياسية وموجودة لأسباب تاريخية، حيث يمكننا استخدامها لتنسيق العناصر الفرعية باستخدام <a href="https://academy.hsoub.com/programming/css/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D8%AD%D9%88%D9%8A%D9%84-%D8%B4%D9%8A%D9%81%D8%B1%D8%A9-css-%D8%A5%D9%84%D9%89-%D8%AA%D9%86%D8%B3%D9%8A%D9%82%D8%A7%D8%AA-%D9%85%D8%B1%D8%A6%D9%8A%D8%A9-r1269/" rel="">CSS</a> كالتالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4087_7" style="">
<span class="tag">&lt;style&gt;</span><span class="pln">
</span><span class="com">/* make the slider track red */</span><span class="pln">
input</span><span class="pun">::-</span><span class="pln">webkit</span><span class="pun">-</span><span class="pln">slider</span><span class="pun">-</span><span class="pln">runnable</span><span class="pun">-</span><span class="pln">track </span><span class="pun">{</span><span class="pln">
  background</span><span class="pun">:</span><span class="pln"> red</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="tag">&lt;/style&gt;</span><span class="pln">

</span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"range"</span><span class="tag">&gt;</span></pre>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" data-ss1635250123="1" frameborder="no" height="192" loading="lazy" scrolling="no" src="https://codepen.io/Hsoub/embed/yLobLLb?default-tab=html%2Cresult" style="width: 100%;" title="JS-p3-06-Shadow-DOM -ex1">See the Pen JS-p3-06-Shadow-DOM -ex1 by Hsoub (@Hsoub) on CodePen.</iframe>
</p>

<p>
	بدأت المتصفحات باختبار الشيفرة بالاستفادة من بنى DOM الداخلية لتجهيز أدوات التحكم، وبعد فترة من الزمن طوّرت شجرة DOM الخفية وأصبحت معياريةً لتسمح لنا وللمطورين بالقيام بأشياء مماثلة. سنستخدم لاحقًا المعيار الحديث لشجرة DOM الخفية الذي تغطيه <a data-ss1635250123="1" href="https://dom.spec.whatwg.org/#shadow-trees" rel="external nofollow">مواصفات DOM</a> وغيرها من المواصفات ذات الصلة.
</p>

<h3>
	الشجرة الخفية Shadow tree
</h3>

<p>
	يمكن لكائن DOM أن يمتلك نوعين من الأشجار الفرعية:
</p>

<ol>
<li>
		شجرة ظاهرة Light tree: وتمثل شجرةً فرعيةً نظاميةً مكوّنةً من <a data-ss1635250123="1" href="https://wiki.hsoub.com/HTML" rel="external">عناصر HTML</a> أبناء، وجميع الأشجار التي رأيناها في المقال السابق من هذا النوع.
	</li>
	<li>
		شجرة خفية Shadow tree: شجرة DOM فرعية لا تظهر على صفحة HTML، بل تكون مخفيةً من الظهور والرؤية.
	</li>
</ol>
<p>
	إذا امتلك العنصر الشجرتين السابقتين فسيصيّر المتصفح الشجرة الخفية، لكن يمكن إعداد توليفة بين الشجرتين، وسنرى تفاصيل أكثر في مقالات لاحقة.
</p>

<p>
	يمكن استخدام الشجرة الخفية في العناصر المخصصة لإخفاء المكوّنات الداخلية وتطبيق تنسيق خاص بالمكوِّن.
</p>

<p>
	يخفي العنصر <code>&lt;show-hello&gt;</code> على سبيل المثال شجرة DOM الداخلية ضمن شجرة خفية:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4087_9" style="">
<span class="tag">&lt;script&gt;</span><span class="pln">
customElements</span><span class="pun">.</span><span class="pln">define</span><span class="pun">(</span><span class="str">'show-hello'</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> extends </span><span class="typ">HTMLElement</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  connectedCallback</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">const</span><span class="pln"> shadow </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">attachShadow</span><span class="pun">({</span><span class="pln">mode</span><span class="pun">:</span><span class="pln"> </span><span class="str">'open'</span><span class="pun">});</span><span class="pln">
    shadow</span><span class="pun">.</span><span class="pln">innerHTML </span><span class="pun">=</span><span class="pln"> </span><span class="pun">`&lt;</span><span class="pln">p</span><span class="pun">&gt;</span><span class="pln">
      </span><span class="typ">Hello</span><span class="pun">,</span><span class="pln"> $</span><span class="pun">{</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">getAttribute</span><span class="pun">(</span><span class="str">'name'</span><span class="pun">)}</span><span class="pln">
    </span><span class="pun">&lt;/</span><span class="pln">p</span><span class="pun">&gt;`;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">});</span><span class="pln">
</span><span class="tag">&lt;/script&gt;</span><span class="pln">

</span><span class="tag">&lt;show-hello</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"John"</span><span class="tag">&gt;&lt;/show-hello&gt;</span></pre>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" data-ss1635250123="1" frameborder="no" height="190" loading="lazy" scrolling="no" src="https://codepen.io/Hsoub/embed/JjyNjoa?default-tab=html%2Cresult" style="width: 100%;" title="JS-p3-06-Shadow-DOM -ex2">See the Pen JS-p3-06-Shadow-DOM -ex2 by Hsoub (@Hsoub) on CodePen.</iframe>
</p>

<p>
	ستظهر النتيجة في أدوات تطوير متصفح بالشكل التالي، حيث تكون جميع المحتويات تحت "shadow-root#":
</p>

<p style="text-align: center;">
	<img alt="shadow_tree_02.png" class="ipsImage ipsImage_thumbnailed" data-fileid="80761" data-unique="tdyz0i7xy" src="https://academy.hsoub.com/uploads/monthly_2021_10/shadow_tree_02.png.4a13b24f825ea309eadb1ac85ef1aea1.png"></p>

<p>
	يُنشئ الاستدعاء <code>({...:elem.attachShadow({mode</code> شجرةً مخفيةً أولًا، لكن توجد عقبتان:
</p>

<ol>
<li>
		يمكن إنشاء جذر مخفي واحد لكل عنصر.
	</li>
	<li>
		يجب أن يكون العنصر عنصرًا مخصصًا، أو أحد العناصر التالية:
		<ul>
<li>
				"article".
			</li>
			<li>
				"blockquote".
			</li>
			<li>
				"body".
			</li>
			<li>
				"div".
			</li>
			<li>
				"footer".
			</li>
			<li>
				"h1…h6".
			</li>
			<li>
				"header".
			</li>
			<li>
				"main".
			</li>
			<li>
				"nav".
			</li>
			<li>
				"p".
			</li>
			<li>
				"section".
			</li>
			<li>
				"span".
			</li>
		</ul>
</li>
</ol>
<p>
	ولا يمكن لغير هذه العناصر استضافة شجرة خفية.
</p>

<p>
	يضبط الخيار <code>mode</code> مستوى التغليف، ويمكن أن يحمل إحدى القيمتين:
</p>

<ul>
<li>
		<code>"open"</code>: يمكن أن نحصل على الجذر الخفي من خلال <code>elem.shadowRoot</code>، ويمكن لأي شيفرة الوصول إلى الشجرة الخفية لــ <code>elem</code>.
	</li>
	<li>
		<code>"closed"</code>: ويعيد الأمر <code>elem.shadowRoot</code> القيمة <code>null</code> دائمًا.
	</li>
</ul>
<p>
	يمكن <a href="https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D8%AA%D9%86%D9%82%D9%84-%D9%81%D9%8A-%D8%B4%D8%AC%D8%B1%D8%A9-dom-%D8%B9%D8%A8%D8%B1-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA-r1105/" rel="">الوصول إلى شجرة DOM</a> الخفية عن طريق المرجع الذي يعيده <code>attachShadow</code> فقط، ومن الممكن أن يكون مخفيًا ضمن صنف، وتكون الأشجار الخفية الأصلية المتعلقة بالمتصفح -مثل <code>&lt;input type="range"</code>‎<code>&gt;</code>- من النوع المغلق، ولا يمكن الوصول إليها، ويشابه الجذر الخفي <a data-ss1635250123="1" href="https://dom.spec.whatwg.org/#shadowroot" rel="external nofollow">shadow root</a> الذي يعيده <code>attachShadow</code> العناصر، ويمكن إظهاره باستخدام <code>innerHTML</code> أو توابع DOM مثل <code>append</code>.
</p>

<p>
	يُدعى العنصر الذي يمتلك جذرًا خفيًا بمضيف الشجرة الخفية shadow tree host، ويتاح للاستخدام ضمن الخاصية <code>host</code> للجذر الخفي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4087_11" style="">
<span class="com">//  لن يعيد شيئًا elem.shadowRoot وإلا {mode: "open"} بافتراض أن </span><span class="pln">
alert</span><span class="pun">(</span><span class="pln">elem</span><span class="pun">.</span><span class="pln">shadowRoot</span><span class="pun">.</span><span class="pln">host </span><span class="pun">===</span><span class="pln"> elem</span><span class="pun">);</span><span class="pln"> </span><span class="com">// محقق</span></pre>

<h3>
	التغليف Encapsulation
</h3>

<p>
	تفصَل شجرة DOM الخفية عن المستند الرئيسي:
</p>

<ol>
<li>
		لا تكون عناصر شجرة DOM الخفية مرئيةً للتابع <a href="https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D8%A8%D8%AD%D8%AB-%D9%81%D9%8A-dom-%D8%B9%D8%A8%D8%B1-getelement-%D9%88-queryselector-%D9%81%D9%8A-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA-r1106/" rel="">querySelector</a> من شجرة DOM الظاهرة، وقد تمتلك عناصر شجرة DOM الخفية معرفات id تتعارض مع تلك الموجودة في شجرة DOM الظاهرة، فهي فريدة ضمن الشجرة الخفية فقط.
	</li>
	<li>
		لشجرة DOM الخفية أوراق تنسيق خاصة بها، إذ لا تُطبق قواعد التنسيق الخارجية عليها.
	</li>
</ol>
<p>
	إليك مثالًا:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4087_13" style="">
<span class="tag">&lt;style&gt;</span><span class="pln">
  </span><span class="com">/*(1)  #elem  لن يطبق التنسيق على الشجرة الخفية للعنصر*/</span><span class="pln">
  p </span><span class="pun">{</span><span class="pln"> color</span><span class="pun">:</span><span class="pln"> red</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="tag">&lt;/style&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">"elem"</span><span class="tag">&gt;&lt;/div&gt;</span><span class="pln">

</span><span class="tag">&lt;script&gt;</span><span class="pln">
  elem</span><span class="pun">.</span><span class="pln">attachShadow</span><span class="pun">({</span><span class="pln">mode</span><span class="pun">:</span><span class="pln"> </span><span class="str">'open'</span><span class="pun">});</span><span class="pln">
    </span><span class="com">// (للشجرة الخفية تنسيقها الخاص (2</span><span class="pln">
    elem</span><span class="pun">.</span><span class="pln">shadowRoot</span><span class="pun">.</span><span class="pln">innerHTML </span><span class="pun">=</span><span class="pln"> </span><span class="pun">`</span><span class="pln">
    </span><span class="pun">&lt;</span><span class="pln">style</span><span class="pun">&gt;</span><span class="pln"> p </span><span class="pun">{</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 class="pun">}</span><span class="pln"> </span><span class="pun">&lt;/</span><span class="pln">style</span><span class="pun">&gt;</span><span class="pln">
    </span><span class="pun">&lt;</span><span class="pln">p</span><span class="pun">&gt;</span><span class="typ">Hello</span><span class="pun">,</span><span class="pln"> </span><span class="typ">John</span><span class="pun">!&lt;/</span><span class="pln">p</span><span class="pun">&gt;</span><span class="pln">
  </span><span class="pun">`;</span><span class="pln">

  </span><span class="com">// مرئية فقط للاستعلامات التي تجري داخل الشجرة &lt;p&gt;  (3)</span><span class="pln">
  alert</span><span class="pun">(</span><span class="pln">document</span><span class="pun">.</span><span class="pln">querySelectorAll</span><span class="pun">(</span><span class="str">'p'</span><span class="pun">).</span><span class="pln">length</span><span class="pun">);</span><span class="pln"> </span><span class="com">// 0</span><span class="pln">
  alert</span><span class="pun">(</span><span class="pln">elem</span><span class="pun">.</span><span class="pln">shadowRoot</span><span class="pun">.</span><span class="pln">querySelectorAll</span><span class="pun">(</span><span class="str">'p'</span><span class="pun">).</span><span class="pln">length</span><span class="pun">);</span><span class="pln"> </span><span class="com">// 1</span><span class="pln">
</span><span class="tag">&lt;/script&gt;</span></pre>

<p>
	تشير (1) و(2) و(3) أعلاه إلى الآتي:
</p>

<ul>
<li>
		(1) لا يؤثر تنسيق الصفحة على تنسيق الشجرة الخفية.
	</li>
	<li>
		(2) يؤدي التنسيق داخل الشجرة عمله بطريقة صحيحة.
	</li>
	<li>
		(3) للحصول على العناصر من الشجرة الخفية، لا بدّ من الاستعلام عنها من داخل الشجرة.
	</li>
</ul>
<h2>
	تقليم شجرة DOM الخفية وعملية التركيب
</h2>

<p>
	تحتاج العديد من المكوّنات إلى محتوىً لتصييره، مثل النوافذ ومعارض الصور والقوائم وغيرها، ويتوقع العنصر المخصص <code>&lt;custom-tabs&gt;</code> محتوى نافذة ليمرَّر إليه، على غرار العناصر الأصلية المضمنة في المتصفح مثل <code>&lt;select&gt;</code> -عدا عناصر <code>&lt;option&gt;</code>-، ويحتاج العنصر <code>&lt;custom-menu&gt;</code> كذلك إلى محتوى على شكل عناصر قائمة.
</p>

<p>
	قد تبدو الشيفرة التي تستعمل العنصر <code>&lt;custom-menu&gt;</code> كالتالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4087_15" style="">
<span class="tag">&lt;custom-menu&gt;</span><span class="pln">
  </span><span class="tag">&lt;title&gt;</span><span class="pln">Candy menu</span><span class="tag">&lt;/title&gt;</span><span class="pln">
  </span><span class="tag">&lt;item&gt;</span><span class="pln">Lollipop</span><span class="tag">&lt;/item&gt;</span><span class="pln">
  </span><span class="tag">&lt;item&gt;</span><span class="pln">Fruit Toast</span><span class="tag">&lt;/item&gt;</span><span class="pln">
  </span><span class="tag">&lt;item&gt;</span><span class="pln">Cup Cake</span><span class="tag">&lt;/item&gt;</span><span class="pln">
</span><span class="tag">&lt;/custom-menu&gt;</span></pre>

<p>
	سيتمكن بعدها مكوّننا من تصيير المحتوى بصورة صحيحة، على شكل قائمة جميلة لها عنوان وعناصر ومعالجات لأحداث القائمة وغيرها، ولكن كيف سننجز ذلك؟ يمكننا أن نحاول تحليل محتوى العناصر وأن ننسخ أو نعيد ترتيب <a href="https://academy.hsoub.com/programming/javascript/%D8%A7%D8%B3%D8%AA%D9%83%D8%B4%D8%A7%D9%81-%D8%AE%D8%A7%D8%B5%D9%8A%D8%A7%D8%AA-%D8%B9%D9%82%D8%AF-dom-%D8%A8%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA-%D8%A7%D9%84%D8%B5%D9%86%D9%81-%D9%88%D8%A7%D9%84%D9%88%D8%B3%D9%85-%D9%88%D8%A7%D9%84%D9%85%D8%AD%D8%AA%D9%88%D9%8A%D8%A7%D8%AA-r1107/" rel="">عقد DOM</a> ديناميكيًا، لكن إذا كنا سننقل عناصر إلى شجرة DOM الخفية shadow DOM، فلن يُطبَّق تنسيق <a href="https://academy.hsoub.com/files/14-%D8%A7%D9%84%D8%AA%D8%AD%D8%B1%D9%8A%D9%83-%D8%B9%D8%A8%D8%B1-css/" rel="">CSS </a>الموجود ضمن المستند عليها، وبالتالي سنفقد التنسيق المرئي، وسيحتاج ذلك إلى كتابة بعض الشيفرة، ولحسن الحظ ليس علينا فعل ذلك، إذ تدعم شجرة DOM الخفية عناصر <code>&lt;slot&gt;</code> التي تُملأ تلقائيًا بالمحتوى الموجود في شجرة DOM الظاهرة وشبهنا هذه العملية بعملية "التقليم" التي تجرى على الأشجار من قص وإنشاء فتحة في الشجرة ووضع فرع في الفتحة من شجرة أو نوع آخر لذلك أطلقنا عليها هذا الاسم وسنستعمل اسم "فتحة" المقابل للكلمة الأجنبية slot (اسم العنصر) للسهولة.
</p>

<h3>
	الفتحات المسماة Named slots
</h3>

<p>
	لنلق نظرةً على طريقة عمل التقليمات في هذا المثال البسيط، حيث توفر شجرة DOM الخفية للعنصر المخصص <code>&lt;user-card&gt;</code> فتحتين تُملآن من شجرة DOM الظاهرة:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4087_17" style="">
<span class="tag">&lt;script&gt;</span><span class="pln">
customElements</span><span class="pun">.</span><span class="pln">define</span><span class="pun">(</span><span class="str">'user-card'</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> extends </span><span class="typ">HTMLElement</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  connectedCallback</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">attachShadow</span><span class="pun">({</span><span class="pln">mode</span><span class="pun">:</span><span class="pln"> </span><span class="str">'open'</span><span class="pun">});</span><span class="pln">
    </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">shadowRoot</span><span class="pun">.</span><span class="pln">innerHTML </span><span class="pun">=</span><span class="pln"> </span><span class="pun">`</span><span class="pln">
      </span><span class="pun">&lt;</span><span class="pln">div</span><span class="pun">&gt;</span><span class="typ">Name</span><span class="pun">:</span><span class="pln">
        </span><span class="pun">&lt;</span><span class="pln">slot name</span><span class="pun">=</span><span class="str">"username"</span><span class="pun">&gt;&lt;/</span><span class="pln">slot</span><span class="pun">&gt;</span><span class="pln">
      </span><span class="pun">&lt;/</span><span class="pln">div</span><span class="pun">&gt;</span><span class="pln">
      </span><span class="pun">&lt;</span><span class="pln">div</span><span class="pun">&gt;</span><span class="typ">Birthday</span><span class="pun">:</span><span class="pln">
        </span><span class="pun">&lt;</span><span class="pln">slot name</span><span class="pun">=</span><span class="str">"birthday"</span><span class="pun">&gt;&lt;/</span><span class="pln">slot</span><span class="pun">&gt;</span><span class="pln">
      </span><span class="pun">&lt;/</span><span class="pln">div</span><span class="pun">&gt;</span><span class="pln">
    </span><span class="pun">`;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">});</span><span class="pln">
</span><span class="tag">&lt;/script&gt;</span><span class="pln">

</span><span class="tag">&lt;user-card&gt;</span><span class="pln">
  </span><span class="tag">&lt;span</span><span class="pln"> </span><span class="atn">slot</span><span class="pun">=</span><span class="atv">"username"</span><span class="tag">&gt;</span><span class="pln">John Smith</span><span class="tag">&lt;/span&gt;</span><span class="pln">
  </span><span class="tag">&lt;span</span><span class="pln"> </span><span class="atn">slot</span><span class="pun">=</span><span class="atv">"birthday"</span><span class="tag">&gt;</span><span class="pln">01.01.2001</span><span class="tag">&lt;/span&gt;</span><span class="pln">
</span><span class="tag">&lt;/user-card&gt;</span></pre>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" data-ss1635250123="1" frameborder="no" height="169" loading="lazy" scrolling="no" src="https://codepen.io/Hsoub/embed/jOLmOaL?default-tab=html%2Cresult" style="width: 100%;" title="JS-p3-06-Shadow-DOM -ex3">See the Pen JS-p3-06-Shadow-DOM -ex3 by Hsoub (@Hsoub) on CodePen.</iframe>
</p>

<p>
	يعرّف العنصر <code>&lt;"slot name="X&gt;</code> في شجرة DOM الخفية نقطة إدراج، وهو المكان الذي تُصيَّر فيه العناصر التي تعرف فيها الخاصية <code>"slot="X</code>، ثم ينفِّذ المتصفح عملية تركيب composition، إذ يأخذ عناصر من شجرة DOM الظاهرة، ويصيّرها ضمن الفتحات الملائمة ضمن شجرة DOM الخفية، وهكذا سنحصل في نهاية الأمر على مكوِّن يمكن ملؤه بالبيانات، وهذا ما نريده.
</p>

<p>
	إليك بنية الشجرة DOM بعد تنفيذ السكربت مهملين عملية التركيب:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4087_19" style="">
<span class="tag">&lt;user-card&gt;</span><span class="pln">
  #shadow-root
    </span><span class="tag">&lt;div&gt;</span><span class="pln">Name:
      </span><span class="tag">&lt;slot</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"username"</span><span class="tag">&gt;&lt;/slot&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">Birthday:
      </span><span class="tag">&lt;slot</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"birthday"</span><span class="tag">&gt;&lt;/slot&gt;</span><span class="pln">
    </span><span class="tag">&lt;/div&gt;</span><span class="pln">
  </span><span class="tag">&lt;span</span><span class="pln"> </span><span class="atn">slot</span><span class="pun">=</span><span class="atv">"username"</span><span class="tag">&gt;</span><span class="pln">John Smith</span><span class="tag">&lt;/span&gt;</span><span class="pln">
  </span><span class="tag">&lt;span</span><span class="pln"> </span><span class="atn">slot</span><span class="pun">=</span><span class="atv">"birthday"</span><span class="tag">&gt;</span><span class="pln">01.01.2001</span><span class="tag">&lt;/span&gt;</span><span class="pln">
</span><span class="tag">&lt;/user-card&gt;</span></pre>

<p>
	لقد أنشأنا شجرة DOM خفيةً، وسنجدها تحت <code>‎#shadow-root</code>. سيمتلك العنصر الآن شجرتي DOM الظاهرة والخفية.
</p>

<p>
	سيبحث المتصفح -لأغراض التصيير- عن السمة <code>"..."=slot</code> لكل <code>&lt;"..."=slot name&gt;</code> التي لها نفس الاسم في شجرة DOM الظاهرة، وستُصيَّر هذه العناصر ضمن الفتحات.
</p>

<p>
	 
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="80760" data-ss1635250123="1" href="https://academy.hsoub.com/uploads/monthly_2021_10/shadow-dom-user-card.png.952fa4f84f4a60c85c6bb893eb8072b4.png" rel=""><img alt="shadow-dom-user-card.png" class="ipsImage ipsImage_thumbnailed" data-fileid="80760" data-unique="oxk6laqx2" src="https://academy.hsoub.com/uploads/monthly_2021_10/shadow-dom-user-card.png.952fa4f84f4a60c85c6bb893eb8072b4.png"></a>
</p>

<p>
	 
</p>

<p>
	وعندها ستسمى النتيجة شجرة DOM المسطّحة flattened DOM.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4087_21" style="">
<span class="tag">&lt;user-card&gt;</span><span class="pln">
  #shadow-root
    </span><span class="tag">&lt;div&gt;</span><span class="pln">Name:
      </span><span class="tag">&lt;slot</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"username"</span><span class="tag">&gt;</span><span class="pln">
        </span><span class="com">&lt;!-- slotted element is inserted into the slot --&gt;</span><span class="pln">
        </span><span class="tag">&lt;span</span><span class="pln"> </span><span class="atn">slot</span><span class="pun">=</span><span class="atv">"username"</span><span class="tag">&gt;</span><span class="pln">John Smith</span><span class="tag">&lt;/span&gt;</span><span class="pln">
      </span><span class="tag">&lt;/slot&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">Birthday:
      </span><span class="tag">&lt;slot</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"birthday"</span><span class="tag">&gt;</span><span class="pln">
        </span><span class="tag">&lt;span</span><span class="pln"> </span><span class="atn">slot</span><span class="pun">=</span><span class="atv">"birthday"</span><span class="tag">&gt;</span><span class="pln">01.01.2001</span><span class="tag">&lt;/span&gt;</span><span class="pln">
      </span><span class="tag">&lt;/slot&gt;</span><span class="pln">
    </span><span class="tag">&lt;/div&gt;</span><span class="pln">
</span><span class="tag">&lt;/user-card&gt;</span></pre>

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

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4087_23" style="">
<span class="pln">alert</span><span class="pun">(</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">querySelectorAll</span><span class="pun">(</span><span class="str">'user-card span'</span><span class="pun">).</span><span class="pln">length </span><span class="pun">);</span><span class="pln"> </span><span class="com">// 2</span></pre>

<p>
	تُشتقّ شجرة DOM المسطحة من شجرة DOM الخفية بإدراج الفتحات، حيث يصيّرها المتصفح ويستخدمها في وراثة التنسيق وانتقال الأحداث -وهو ما سنوضّحه لاحقًا-، لكن نظرتها لن تغير JavaScript إلى المستند قبل الوصول إلى الشجرة المسطحة.
</p>

<p>
	ملاحظة: يمكن للأبناء من المستوى الأعلى فقط امتلاك السمة "…"=slot، إذ يمتلك الأبناء المباشرون للمضيف الخفي -وهو العنصر <code>&lt;user-card&gt;</code> في مثالنا- السمة <code>"..."=slot</code> فقط، بينما ستُهمل هذه السمة للعناصر الداخلية. وسيتجاهل المتصفح في المثال التالي العنصر <code>&lt;span&gt;</code> الثاني، فهو ليس ابنًا مباشرًا للعنصر <code>&lt;user-card&gt;</code>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4087_25" style="">
<span class="tag">&lt;user-card&gt;</span><span class="pln">
  </span><span class="tag">&lt;span</span><span class="pln"> </span><span class="atn">slot</span><span class="pun">=</span><span class="atv">"username"</span><span class="tag">&gt;</span><span class="pln">John Smith</span><span class="tag">&lt;/span&gt;</span><span class="pln">
  </span><span class="tag">&lt;div&gt;</span><span class="pln">
    </span><span class="com">&lt;!-- invalid slot, must be direct child of user-card --&gt;</span><span class="pln">
    </span><span class="tag">&lt;span</span><span class="pln"> </span><span class="atn">slot</span><span class="pun">=</span><span class="atv">"birthday"</span><span class="tag">&gt;</span><span class="pln">01.01.2001</span><span class="tag">&lt;/span&gt;</span><span class="pln">
  </span><span class="tag">&lt;/div&gt;</span><span class="pln">
</span><span class="tag">&lt;/user-card&gt;</span></pre>

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

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4087_27" style="">
<span class="tag">&lt;user-card&gt;</span><span class="pln">
  </span><span class="tag">&lt;span</span><span class="pln"> </span><span class="atn">slot</span><span class="pun">=</span><span class="atv">"username"</span><span class="tag">&gt;</span><span class="pln">John</span><span class="tag">&lt;/span&gt;</span><span class="pln">
  </span><span class="tag">&lt;span</span><span class="pln"> </span><span class="atn">slot</span><span class="pun">=</span><span class="atv">"username"</span><span class="tag">&gt;</span><span class="pln">Smith</span><span class="tag">&lt;/span&gt;</span><span class="pln">
</span><span class="tag">&lt;/user-card&gt;</span></pre>

<p>
	إليك مثالًا عن شجرة DOM مسطحة تمتلك عنصرين ضمن الفتحة <code>&lt;"slot name="username&gt;</code>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4087_29" style="">
<span class="tag">&lt;user-card&gt;</span><span class="pln">
  #shadow-root
    </span><span class="tag">&lt;div&gt;</span><span class="pln">Name:
      </span><span class="tag">&lt;slot</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"username"</span><span class="tag">&gt;</span><span class="pln">
        </span><span class="tag">&lt;span</span><span class="pln"> </span><span class="atn">slot</span><span class="pun">=</span><span class="atv">"username"</span><span class="tag">&gt;</span><span class="pln">John</span><span class="tag">&lt;/span&gt;</span><span class="pln">
        </span><span class="tag">&lt;span</span><span class="pln"> </span><span class="atn">slot</span><span class="pun">=</span><span class="atv">"username"</span><span class="tag">&gt;</span><span class="pln">Smith</span><span class="tag">&lt;/span&gt;</span><span class="pln">
      </span><span class="tag">&lt;/slot&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">Birthday:
      </span><span class="tag">&lt;slot</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"birthday"</span><span class="tag">&gt;&lt;/slot&gt;</span><span class="pln">
    </span><span class="tag">&lt;/div&gt;</span><span class="pln">
</span><span class="tag">&lt;/user-card&gt;</span></pre>

<h3>
	المحتوى الابتدائي للعنصر slot
</h3>

<p>
	إذا وُضع محتوًى ما ضمن الفتحة <code>&lt;slot&gt;</code>، فسيصبح هو المحتوى الافتراضي حيث سيعرضه المتصفح إذا لم يوجد محتوىً مناسب ضمن شجرة DOM الظاهرة لملء الفتحة. عندها ستكون نتيجة تصيير هذا الجزء مثلًا من شجرة DOM الخفية هي <code>Anonymous</code> إذا لم توجد فتحة باسم <code>"slot="username</code> في شجرة DOM الظاهرة.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4087_31" style="">
<span class="tag">&lt;div&gt;</span><span class="pln">Name:
  </span><span class="tag">&lt;slot</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"username"</span><span class="tag">&gt;</span><span class="pln">Anonymous</span><span class="tag">&lt;/slot&gt;</span><span class="pln">
</span><span class="tag">&lt;/div&gt;</span></pre>

<h3>
	الفتحة الافتراضية هي أول فتحة بلا اسم
</h3>

<p>
	ستكون أول فتحة <code>&lt;slot&gt;</code> في شجرة DOM الخفية غير مالكة لاسم هي الفتحة الافتراضية، وستحصل على كل العقد في شجرة DOM الظاهرة التي لم تُدرج في أي فتحة أخرى. لنضف في المثال التالي فتحةً افتراضيةً للعنصر المخصص <code>&lt;user-card&gt;</code> الذي سيخفي كل معلومات المستخدم غير المدرجة في فتحات:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4087_33" style="">
<span class="tag">&lt;script&gt;</span><span class="pln">
customElements</span><span class="pun">.</span><span class="pln">define</span><span class="pun">(</span><span class="str">'user-card'</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> extends </span><span class="typ">HTMLElement</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  connectedCallback</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">attachShadow</span><span class="pun">({</span><span class="pln">mode</span><span class="pun">:</span><span class="pln"> </span><span class="str">'open'</span><span class="pun">});</span><span class="pln">
    </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">shadowRoot</span><span class="pun">.</span><span class="pln">innerHTML </span><span class="pun">=</span><span class="pln"> </span><span class="pun">`</span><span class="pln">
    </span><span class="pun">&lt;</span><span class="pln">div</span><span class="pun">&gt;</span><span class="typ">Name</span><span class="pun">:</span><span class="pln">
      </span><span class="pun">&lt;</span><span class="pln">slot name</span><span class="pun">=</span><span class="str">"username"</span><span class="pun">&gt;&lt;/</span><span class="pln">slot</span><span class="pun">&gt;</span><span class="pln">
    </span><span class="pun">&lt;/</span><span class="pln">div</span><span class="pun">&gt;</span><span class="pln">
    </span><span class="pun">&lt;</span><span class="pln">div</span><span class="pun">&gt;</span><span class="typ">Birthday</span><span class="pun">:</span><span class="pln">
      </span><span class="pun">&lt;</span><span class="pln">slot name</span><span class="pun">=</span><span class="str">"birthday"</span><span class="pun">&gt;&lt;/</span><span class="pln">slot</span><span class="pun">&gt;</span><span class="pln">
    </span><span class="pun">&lt;/</span><span class="pln">div</span><span class="pun">&gt;</span><span class="pln">
    </span><span class="pun">&lt;</span><span class="pln">fieldset</span><span class="pun">&gt;</span><span class="pln">
      </span><span class="pun">&lt;</span><span class="pln">legend</span><span class="pun">&gt;</span><span class="typ">Other</span><span class="pln"> information</span><span class="pun">&lt;/</span><span class="pln">legend</span><span class="pun">&gt;</span><span class="pln">
      </span><span class="pun">&lt;</span><span class="pln">slot</span><span class="pun">&gt;&lt;/</span><span class="pln">slot</span><span class="pun">&gt;</span><span class="pln">
    </span><span class="pun">&lt;/</span><span class="pln">fieldset</span><span class="pun">&gt;</span><span class="pln">
    </span><span class="pun">`;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">});</span><span class="pln">
</span><span class="tag">&lt;/script&gt;</span><span class="pln">

</span><span class="tag">&lt;user-card&gt;</span><span class="pln">
  </span><span class="tag">&lt;div&gt;</span><span class="pln">I like to swim.</span><span class="tag">&lt;/div&gt;</span><span class="pln">
  </span><span class="tag">&lt;span</span><span class="pln"> </span><span class="atn">slot</span><span class="pun">=</span><span class="atv">"username"</span><span class="tag">&gt;</span><span class="pln">John Smith</span><span class="tag">&lt;/span&gt;</span><span class="pln">
  </span><span class="tag">&lt;span</span><span class="pln"> </span><span class="atn">slot</span><span class="pun">=</span><span class="atv">"birthday"</span><span class="tag">&gt;</span><span class="pln">01.01.2001</span><span class="tag">&lt;/span&gt;</span><span class="pln">
  </span><span class="tag">&lt;div&gt;</span><span class="pln">...And play volleyball too!</span><span class="tag">&lt;/div&gt;</span><span class="pln">
</span><span class="tag">&lt;/user-card&gt;</span></pre>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" data-ss1635250123="1" frameborder="no" height="227" loading="lazy" scrolling="no" src="https://codepen.io/Hsoub/embed/mdMmdQP?default-tab=html%2Cresult" style="width: 100%;" title="JS-p3-06-Shadow-DOM -ex4">See the Pen JS-p3-06-Shadow-DOM -ex4 by Hsoub (@Hsoub) on CodePen.</iframe>
</p>

<p>
	سيوضع محتوى شجرة DOM الظاهرة غير المُدرج في المثال السابق ضمن العنصر <code>&lt;fieldset&gt;</code> الذي يحمل تسمية Other information، حيث ستُدرج العناصر ضمن الفتحة واحدًا تلو الآخر، ولذا ستُدرج قطعتا المعلومات معًا ضمن الفتحة الافتراضية.
</p>

<p>
	وستبدو شجرة DOM المسطحة كالتالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4087_35" style="">
<span class="tag">&lt;user-card&gt;</span><span class="pln">
  #shadow-root
    </span><span class="tag">&lt;div&gt;</span><span class="pln">Name:
      </span><span class="tag">&lt;slot</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"username"</span><span class="tag">&gt;</span><span class="pln">
        </span><span class="tag">&lt;span</span><span class="pln"> </span><span class="atn">slot</span><span class="pun">=</span><span class="atv">"username"</span><span class="tag">&gt;</span><span class="pln">John Smith</span><span class="tag">&lt;/span&gt;</span><span class="pln">
      </span><span class="tag">&lt;/slot&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">Birthday:
      </span><span class="tag">&lt;slot</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"birthday"</span><span class="tag">&gt;</span><span class="pln">
        </span><span class="tag">&lt;span</span><span class="pln"> </span><span class="atn">slot</span><span class="pun">=</span><span class="atv">"birthday"</span><span class="tag">&gt;</span><span class="pln">01.01.2001</span><span class="tag">&lt;/span&gt;</span><span class="pln">
      </span><span class="tag">&lt;/slot&gt;</span><span class="pln">
    </span><span class="tag">&lt;/div&gt;</span><span class="pln">
    </span><span class="tag">&lt;fieldset&gt;</span><span class="pln">
      </span><span class="tag">&lt;legend&gt;</span><span class="pln">Other information</span><span class="tag">&lt;/legend&gt;</span><span class="pln">
      </span><span class="tag">&lt;slot&gt;</span><span class="pln">
        </span><span class="tag">&lt;div&gt;</span><span class="pln">I like to swim.</span><span class="tag">&lt;/div&gt;</span><span class="pln">
        </span><span class="tag">&lt;div&gt;</span><span class="pln">...And play volleyball too!</span><span class="tag">&lt;/div&gt;</span><span class="pln">
      </span><span class="tag">&lt;/slot&gt;</span><span class="pln">
    </span><span class="tag">&lt;/fieldset&gt;</span><span class="pln">
</span><span class="tag">&lt;/user-card&gt;</span></pre>

<h3>
	مثال القائمة
</h3>

<p>
	لنعد الآن إلى العنصر المخصص الذي أشرنا إليه سابقًا في هذا المقال، حيث يمكن استخدام الفتحات لتوزيع العناصر، إليك ترميز <a href="https://academy.hsoub.com/programming/html/" rel="">HTML</a> للعنصر المخصص <code>&lt;custom-menu&gt;</code>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4087_37" style="">
<span class="tag">&lt;custom-menu&gt;</span><span class="pln">
  </span><span class="tag">&lt;span</span><span class="pln"> </span><span class="atn">slot</span><span class="pun">=</span><span class="atv">"title"</span><span class="tag">&gt;</span><span class="pln">Candy menu</span><span class="tag">&lt;/span&gt;</span><span class="pln">
  </span><span class="tag">&lt;li</span><span class="pln"> </span><span class="atn">slot</span><span class="pun">=</span><span class="atv">"item"</span><span class="tag">&gt;</span><span class="pln">Lollipop</span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li</span><span class="pln"> </span><span class="atn">slot</span><span class="pun">=</span><span class="atv">"item"</span><span class="tag">&gt;</span><span class="pln">Fruit Toast</span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li</span><span class="pln"> </span><span class="atn">slot</span><span class="pun">=</span><span class="atv">"item"</span><span class="tag">&gt;</span><span class="pln">Cup Cake</span><span class="tag">&lt;/li&gt;</span><span class="pln">
</span><span class="tag">&lt;/custom-menu&gt;</span></pre>

<p>
	تمثل الشيفرة التالية قالب شجرة DOM الخفية مزوّدةً بالفتحات الملائمة:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4087_39" style="">
<span class="tag">&lt;template</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"tmpl"</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;style&gt;</span><span class="pln"> </span><span class="com">/* menu styles */</span><span class="pln"> </span><span class="tag">&lt;/style&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">"menu"</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="tag">&lt;slot</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"title"</span><span class="tag">&gt;&lt;/slot&gt;</span><span class="pln">
    </span><span class="tag">&lt;ul&gt;&lt;slot</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"item"</span><span class="tag">&gt;&lt;/slot&gt;&lt;/ul&gt;</span><span class="pln">
  </span><span class="tag">&lt;/div&gt;</span><span class="pln">
</span><span class="tag">&lt;/template&gt;</span></pre>

<ol>
<li>
		يُدرج <code>&lt;"span slot="title&gt;</code> ضمن <code>&lt;"slot name="title&gt;</code>.
	</li>
	<li>
		هناك العديد من عناصر القائمة <code>&lt;li slot="item"&gt;</code> في القالب، لكن توجد فتحة مناسبة <code>&lt;slot name="item"&gt;</code> واحدة ضمنه، لذلك ستُدرج كل عناصر القائمة -مثل <code>&lt;li slot="item"&gt;</code>- ضمن الفتحة الواحد تلو الآخر، وهذا ما يُشكِّل القائمة.
	</li>
</ol>
<p>
	ستصبح شجرة DOM المسطّحة كالتالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4087_41" style="">
<span class="tag">&lt;custom-menu&gt;</span><span class="pln">
  #shadow-root
    </span><span class="tag">&lt;style&gt;</span><span class="pln"> </span><span class="com">/* menu styles */</span><span class="pln"> </span><span class="tag">&lt;/style&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">"menu"</span><span class="tag">&gt;</span><span class="pln">
      </span><span class="tag">&lt;slot</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"title"</span><span class="tag">&gt;</span><span class="pln">
        </span><span class="tag">&lt;span</span><span class="pln"> </span><span class="atn">slot</span><span class="pun">=</span><span class="atv">"title"</span><span class="tag">&gt;</span><span class="pln">Candy menu</span><span class="tag">&lt;/span&gt;</span><span class="pln">
      </span><span class="tag">&lt;/slot&gt;</span><span class="pln">
      </span><span class="tag">&lt;ul&gt;</span><span class="pln">
        </span><span class="tag">&lt;slot</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"item"</span><span class="tag">&gt;</span><span class="pln">
          </span><span class="tag">&lt;li</span><span class="pln"> </span><span class="atn">slot</span><span class="pun">=</span><span class="atv">"item"</span><span class="tag">&gt;</span><span class="pln">Lollipop</span><span class="tag">&lt;/li&gt;</span><span class="pln">
          </span><span class="tag">&lt;li</span><span class="pln"> </span><span class="atn">slot</span><span class="pun">=</span><span class="atv">"item"</span><span class="tag">&gt;</span><span class="pln">Fruit Toast</span><span class="tag">&lt;/li&gt;</span><span class="pln">
          </span><span class="tag">&lt;li</span><span class="pln"> </span><span class="atn">slot</span><span class="pun">=</span><span class="atv">"item"</span><span class="tag">&gt;</span><span class="pln">Cup Cake</span><span class="tag">&lt;/li&gt;</span><span class="pln">
        </span><span class="tag">&lt;/slot&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;/custom-menu&gt;</span></pre>

<p>
	قد نُلاحظ تواجد العنصر <code>&lt;li&gt;</code> ضمن القائمة <code>&lt;ul&gt;</code> في شجرة DOM صالحة، لكن الشجرة في الشيفرة السابقة مسطحة تصف آلية تصيير المكوِّن، وهذا الأمر طبيعي، ويبقى علينا إضافة معالج للحدث <code>click</code> لفتح وإغلاق القائمة <code>&lt;custom-menu&gt;</code> لتصبح جاهزةً:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4087_43" style="">
<span class="pln">customElements</span><span class="pun">.</span><span class="pln">define</span><span class="pun">(</span><span class="str">'custom-menu'</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> extends </span><span class="typ">HTMLElement</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  connectedCallback</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">attachShadow</span><span class="pun">({</span><span class="pln">mode</span><span class="pun">:</span><span class="pln"> </span><span class="str">'open'</span><span class="pun">});</span><span class="pln">

    </span><span class="com">//هو قالب الشجرة الخفية في الأعلى </span><span class="pln">
    </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">shadowRoot</span><span class="pun">.</span><span class="pln">append</span><span class="pun">(</span><span class="pln"> tmpl</span><span class="pun">.</span><span class="pln">content</span><span class="pun">.</span><span class="pln">cloneNode</span><span class="pun">(</span><span class="kwd">true</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">this</span><span class="pun">.</span><span class="pln">shadowRoot</span><span class="pun">.</span><span class="pln">querySelector</span><span class="pun">(</span><span class="str">'slot[name="title"]'</span><span class="pun">).</span><span class="pln">onclick </span><span class="pun">=</span><span class="pln"> </span><span class="pun">()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      </span><span class="com">// فتح وإغلاق القائمة</span><span class="pln">
      </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">shadowRoot</span><span class="pun">.</span><span class="pln">querySelector</span><span class="pun">(</span><span class="str">'.menu'</span><span class="pun">).</span><span class="pln">classList</span><span class="pun">.</span><span class="pln">toggle</span><span class="pun">(</span><span class="str">'closed'</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">};</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">});</span></pre>

<p>
	وستكون النتيجة:
</p>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" data-ss1635250123="1" frameborder="no" height="300" loading="lazy" scrolling="no" src="https://codepen.io/Hsoub/embed/GRvmRPq?default-tab=html%2Cresult" style="width: 100%;" title="JS-p3-06-Shadow-DOM -ex5">See the Pen JS-p3-06-Shadow-DOM -ex5 by Hsoub (@Hsoub) on CodePen.</iframe>
</p>

<p>
	يمكن بالطبع تعزيز وظائف القائمة من خلال الأحداث والتوابع وغيرها.
</p>

<h3>
	تحديث الفتحات
</h3>

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

<p>
	يُدرَج في المثال التالي عنصر قائمة ديناميكيًا بعد ثانية، ويتغير العنوان بعد ثانيتين:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4087_45" style="">
<span class="tag">&lt;custom-menu</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"menu"</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;span</span><span class="pln"> </span><span class="atn">slot</span><span class="pun">=</span><span class="atv">"title"</span><span class="tag">&gt;</span><span class="pln">Candy menu</span><span class="tag">&lt;/span&gt;</span><span class="pln">
</span><span class="tag">&lt;/custom-menu&gt;</span><span class="pln">

</span><span class="tag">&lt;script&gt;</span><span class="pln">
customElements</span><span class="pun">.</span><span class="pln">define</span><span class="pun">(</span><span class="str">'custom-menu'</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> extends </span><span class="typ">HTMLElement</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  connectedCallback</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">attachShadow</span><span class="pun">({</span><span class="pln">mode</span><span class="pun">:</span><span class="pln"> </span><span class="str">'open'</span><span class="pun">});</span><span class="pln">
    </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">shadowRoot</span><span class="pun">.</span><span class="pln">innerHTML </span><span class="pun">=</span><span class="pln"> </span><span class="pun">`&lt;</span><span class="pln">div </span><span class="kwd">class</span><span class="pun">=</span><span class="str">"menu"</span><span class="pun">&gt;</span><span class="pln">
      </span><span class="pun">&lt;</span><span class="pln">slot name</span><span class="pun">=</span><span class="str">"title"</span><span class="pun">&gt;&lt;/</span><span class="pln">slot</span><span class="pun">&gt;</span><span class="pln">
      </span><span class="pun">&lt;</span><span class="pln">ul</span><span class="pun">&gt;&lt;</span><span class="pln">slot name</span><span class="pun">=</span><span class="str">"item"</span><span class="pun">&gt;&lt;</span><span class="str">/slot&gt;&lt;/</span><span class="pln">ul</span><span class="pun">&gt;</span><span class="pln">
    </span><span class="pun">&lt;/</span><span class="pln">div</span><span class="pun">&gt;`;</span><span class="pln">
    </span><span class="com">//لا يمتلك الجذر الخفي معالجات أحداث لذا سنستخدم الابن الأول</span><span class="pln">

    </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">shadowRoot</span><span class="pun">.</span><span class="pln">firstElementChild</span><span class="pun">.</span><span class="pln">addEventListener</span><span class="pun">(</span><span class="str">'slotchange'</span><span class="pun">,</span><span class="pln">
      e </span><span class="pun">=&gt;</span><span class="pln"> alert</span><span class="pun">(</span><span class="str">"slotchange: "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> e</span><span class="pun">.</span><span class="pln">target</span><span class="pun">.</span><span class="pln">name</span><span class="pun">)</span><span class="pln">
    </span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">});</span><span class="pln">

setTimeout</span><span class="pun">(()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  menu</span><span class="pun">.</span><span class="pln">insertAdjacentHTML</span><span class="pun">(</span><span class="str">'beforeEnd'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'&lt;li slot="item"&gt;Lollipop&lt;/li&gt;'</span><span class="pun">)</span><span class="pln">
</span><span class="pun">},</span><span class="pln"> </span><span class="lit">1000</span><span class="pun">);</span><span class="pln">

setTimeout</span><span class="pun">(()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  menu</span><span class="pun">.</span><span class="pln">querySelector</span><span class="pun">(</span><span class="str">'[slot="title"]'</span><span class="pun">).</span><span class="pln">innerHTML </span><span class="pun">=</span><span class="pln"> </span><span class="str">"New menu"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">},</span><span class="pln"> </span><span class="lit">2000</span><span class="pun">);</span><span class="pln">
</span><span class="tag">&lt;/script&gt;</span></pre>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" data-ss1635250123="1" frameborder="no" height="194" loading="lazy" scrolling="no" src="https://codepen.io/Hsoub/embed/preview/qBXmBLe?default-tab=html%2Cresult" style="width: 100%;" title="JS-p3-06-Shadow-DOM -ex6">See the Pen JS-p3-06-Shadow-DOM -ex6 by Hsoub (@Hsoub) on CodePen.</iframe>
</p>

<p>
	يُحدَّث تصيير القائمة كل مرة دون تدخلنا، وسنلاحظ في الشيفرة السابقة وجود حدثي <code>slotchange</code>:
</p>

<ol>
<li>
		عند التهيئة: حيث يقع الحدث <code>slotchange: title</code> مباشرةً عندما يُدرج <code>"slot="title</code> من شجرة DOM الظاهرة ضمن الفتحة الموافقة له.
	</li>
	<li>
		بعد ثانية: يقع الحدث <code>slotchange: item</code> عندما يُضاف عنصر قائمة جديد <code>&lt;"li slot="item&gt;</code>.
	</li>
</ol>
<p>
	لاحظ أنه لا وجود للحدث <code>slotchange</code> بعد ثانيتين عندما يُعدَّل محتوى <code>"slot="title</code>، والسبب هو عدم وجود أي تغييرات في الفتحة، حيث عدّلنا محتوى عنصر مُدرج في الفتحة، وهذا أمر مختلف.
</p>

<p>
	يمكن تتبع التغيرات الداخلية ضمن شجرة DOM الظاهرة باستخدام <a href="https://academy.hsoub.com/programming/javascript/%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D8%A5%D9%84%D9%89-%D9%84%D8%BA%D8%A9-javascript-r664/" rel="">شيفرة JavaScript</a> من خلال الآلية المعمّمة المعروفة بـ <a data-ss1635250123="1" href="https://academy.hsoub.com/programming/javascript/%D9%85%D8%B1%D8%A7%D9%82%D8%A8-%D8%A7%D9%84%D8%AA%D8%AD%D9%88%D9%84-mutationobserver-%D8%B9%D8%A8%D8%B1-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA-%D9%84%D9%85%D8%B1%D8%A7%D9%82%D8%A8%D8%A9-%D8%B4%D8%AC%D8%B1%D8%A9-dom-r1239/" rel="">MutationObserver</a>.
</p>

<h3>
	الواجهة البرمجية للفتحات
</h3>

<p>
	لنلق نظرةً على توابع JavaScript المتعلقة بالفتحات، إذ تنظر JavaScript كما رأينا سابقًا إلى شجرة DOM الحقيقية دون تسطيح flattening، لكن إذا كانت قيمة الخيار <code>mode</code> في الشجرة الخفية هي "open"، فسنتمكن من معرفة أي العناصر أدرِجت في فتحات، كما يمكننا معرفة الفتحة من العنصر الذي أدرج ضمنه:
</p>

<ul>
<li>
		<code>node.assignedSlot</code>: تعيد الفتحة <code>&lt;slot&gt;</code> التي أسندت إليها عقدة من الشجرة <code>node</code>.
	</li>
	<li>
		<code>({slot.assignedNodes({flatten: true/false</code>: يعيد عقد DOM التي أسندت إلى فتحة، وستكون قيمة الخيار <code>flatten</code> هي "false" افتراضيًا، لكن إذا ضبطت على القيمة "true" صراحةً، فسيُنظر إلى DOM المسطحة بعمق، كما سيعيد التابع الفتحات المتداخلة nested في حال وجود مكوّنات متداخلة، ويعيد "محتوى التراجع" إذا لم يجد أي عقد أسندت إلى فتحات.
	</li>
	<li>
		<code>({slot.assignedElements({flatten: true/false</code>: يعيد عناصر DOM التي أسندت إلى فتحة، وهو يشابه التابع السابق إلا أنه يعيد عقد العنصر.
	</li>
</ul>
<p>
	تُستخدَم هذه التوابع عندما نريد إظهار محتوى الفتحات وتتبعها باستخدام JavaScript. وإذا أراد المكوّن <code>&lt;custom-menu&gt;</code> مثلًا معرفة ما الذي يعرضه، فيمكنه تعقّب الحدث <code>slotchange</code> والحصول على العناصر من خلال <code>slot.assignedElements</code>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4087_47" style="">
<span class="tag">&lt;custom-menu</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"menu"</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;span</span><span class="pln"> </span><span class="atn">slot</span><span class="pun">=</span><span class="atv">"title"</span><span class="tag">&gt;</span><span class="pln">Candy menu</span><span class="tag">&lt;/span&gt;</span><span class="pln">
  </span><span class="tag">&lt;li</span><span class="pln"> </span><span class="atn">slot</span><span class="pun">=</span><span class="atv">"item"</span><span class="tag">&gt;</span><span class="pln">Lollipop</span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li</span><span class="pln"> </span><span class="atn">slot</span><span class="pun">=</span><span class="atv">"item"</span><span class="tag">&gt;</span><span class="pln">Fruit Toast</span><span class="tag">&lt;/li&gt;</span><span class="pln">
</span><span class="tag">&lt;/custom-menu&gt;</span><span class="pln">

</span><span class="tag">&lt;script&gt;</span><span class="pln">
customElements</span><span class="pun">.</span><span class="pln">define</span><span class="pun">(</span><span class="str">'custom-menu'</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> extends </span><span class="typ">HTMLElement</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  items </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[]</span><span class="pln">

  connectedCallback</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">attachShadow</span><span class="pun">({</span><span class="pln">mode</span><span class="pun">:</span><span class="pln"> </span><span class="str">'open'</span><span class="pun">});</span><span class="pln">
    </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">shadowRoot</span><span class="pun">.</span><span class="pln">innerHTML </span><span class="pun">=</span><span class="pln"> </span><span class="pun">`&lt;</span><span class="pln">div </span><span class="kwd">class</span><span class="pun">=</span><span class="str">"menu"</span><span class="pun">&gt;</span><span class="pln">
      </span><span class="pun">&lt;</span><span class="pln">slot name</span><span class="pun">=</span><span class="str">"title"</span><span class="pun">&gt;&lt;/</span><span class="pln">slot</span><span class="pun">&gt;</span><span class="pln">
      </span><span class="pun">&lt;</span><span class="pln">ul</span><span class="pun">&gt;&lt;</span><span class="pln">slot name</span><span class="pun">=</span><span class="str">"item"</span><span class="pun">&gt;&lt;</span><span class="str">/slot&gt;&lt;/</span><span class="pln">ul</span><span class="pun">&gt;</span><span class="pln">
    </span><span class="pun">&lt;/</span><span class="pln">div</span><span class="pun">&gt;`;</span><span class="pln">

    </span><span class="com">// يقع عندما يتغير محتوى الفتحة</span><span class="pln">
    </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">shadowRoot</span><span class="pun">.</span><span class="pln">firstElementChild</span><span class="pun">.</span><span class="pln">addEventListener</span><span class="pun">(</span><span class="str">'slotchange'</span><span class="pun">,</span><span class="pln"> e </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      let slot </span><span class="pun">=</span><span class="pln"> e</span><span class="pun">.</span><span class="pln">target</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">slot</span><span class="pun">.</span><span class="pln">name </span><span class="pun">==</span><span class="pln"> </span><span class="str">'item'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">items </span><span class="pun">=</span><span class="pln"> slot</span><span class="pun">.</span><span class="pln">assignedElements</span><span class="pun">().</span><span class="pln">map</span><span class="pun">(</span><span class="pln">elem </span><span class="pun">=&gt;</span><span class="pln"> elem</span><span class="pun">.</span><span class="pln">textContent</span><span class="pun">);</span><span class="pln">
        alert</span><span class="pun">(</span><span class="str">"Items: "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">items</span><span class="pun">);</span><span class="pln">
      </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">});</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">});</span><span class="pln">

</span><span class="com">// items update after 1 second</span><span class="pln">
setTimeout</span><span class="pun">(()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  menu</span><span class="pun">.</span><span class="pln">insertAdjacentHTML</span><span class="pun">(</span><span class="str">'beforeEnd'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'&lt;li slot="item"&gt;Cup Cake&lt;/li&gt;'</span><span class="pun">)},</span><span class="pln"> </span><span class="lit">1000</span><span class="pun">);</span><span class="pln">
</span><span class="tag">&lt;/script&gt;</span></pre>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" data-ss1635250123="1" frameborder="no" height="200" loading="lazy" scrolling="no" src="https://codepen.io/Hsoub/embed/preview/RwZVwmR?default-tab=result" style="width: 100%;" title="Untitled">See the Pen Untitled by Hsoub (@Hsoub) on CodePen.</iframe>
</p>

<h2>
	تنسيق شجرة DOM الخفية
</h2>

<p>
	يمكن أن تحتوي شجرة DOM الخفية على الوسمين <code>&lt;style&gt;</code> و<code>&lt;link rel="stylesheet" href="…"‎&gt;</code>، وتُخزّن أوراق التنسيق في الوسم الأخير في ذاكرة <a href="https://academy.hsoub.com/programming/javascript/http-%D9%88%D8%A7%D9%84%D8%A7%D8%B3%D8%AA%D9%85%D8%A7%D8%B1%D8%A7%D8%AA-%D9%81%D9%8A-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA-r1367/" rel="">HTTP</a> المؤقتة، لذلك لن يُعاد تحميلها للمكونات المختلفة التي تستخدم نفس القالب، ويمكن أن نعد ما لي قاعدةً عامةً: يعمل التنسيق المحلي داخل الشجرة الخفية، بينما تعمل تنسيقات المستند ككل خارجها، مع وجود بعض الاستثناءات.
</p>

<h3>
	المحدد host:
</h3>

<p>
	يسمح هذا المحدد باختيار المضيف الخفي، أي العنصر الذي يحتوي الشجرة الخفية، لنفترض مثلًا أننا سننشئ عنصرًا مخصصًا <code>&lt;custom-dialog&gt;</code> يجب أن يتوسط الصفحة، لذلك لا بدّ من تنسيق المكوّن <code>&lt;custom-dialog&gt;</code> ذاته، وهذا ما يفعله <code>host:</code> تمامًا:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4087_49" style="">
<span class="tag">&lt;template</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"tmpl"</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;style&gt;</span><span class="pln">
    </span><span class="com">/* the style will be applied from inside to the custom-dialog element */</span><span class="pln">
    </span><span class="pun">:</span><span class="pln">host </span><span class="pun">{</span><span class="pln">
      position</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">fixed</span><span class="pun">;</span><span class="pln">
      left</span><span class="pun">:</span><span class="pln"> </span><span class="lit">50</span><span class="pun">%;</span><span class="pln">
      top</span><span class="pun">:</span><span class="pln"> </span><span class="lit">50</span><span class="pun">%;</span><span class="pln">
      transform</span><span class="pun">:</span><span class="pln"> translate</span><span class="pun">(-</span><span class="lit">50</span><span class="pun">%,</span><span class="pln"> </span><span class="pun">-</span><span class="lit">50</span><span class="pun">%);</span><span class="pln">
      display</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">inline</span><span class="pun">-</span><span class="pln">block</span><span class="pun">;</span><span class="pln">
      border</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1px</span><span class="pln"> solid red</span><span class="pun">;</span><span class="pln">
      padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">10px</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
  </span><span class="tag">&lt;/style&gt;</span><span class="pln">
  </span><span class="tag">&lt;slot&gt;&lt;/slot&gt;</span><span class="pln">
</span><span class="tag">&lt;/template&gt;</span><span class="pln">

</span><span class="tag">&lt;script&gt;</span><span class="pln">
customElements</span><span class="pun">.</span><span class="pln">define</span><span class="pun">(</span><span class="str">'custom-dialog'</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> extends </span><span class="typ">HTMLElement</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  connectedCallback</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">attachShadow</span><span class="pun">({</span><span class="pln">mode</span><span class="pun">:</span><span class="pln"> </span><span class="str">'open'</span><span class="pun">}).</span><span class="pln">append</span><span class="pun">(</span><span class="pln">tmpl</span><span class="pun">.</span><span class="pln">content</span><span class="pun">.</span><span class="pln">cloneNode</span><span class="pun">(</span><span class="kwd">true</span><span class="pun">));</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">});</span><span class="pln">
</span><span class="tag">&lt;/script&gt;</span><span class="pln">

</span><span class="tag">&lt;custom-dialog&gt;</span><span class="pln">
  Hello!
</span><span class="tag">&lt;/custom-dialog&gt;</span></pre>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" data-ss1635250123="1" frameborder="no" height="178" loading="lazy" scrolling="no" src="https://codepen.io/Hsoub/embed/OJjmJKm?default-tab=result" style="width: 100%;" title="JS-p3-06-Shadow-DOM-styling -ex1">See the Pen JS-p3-06-Shadow-DOM-styling -ex1 by Hsoub (@Hsoub) on CodePen.</iframe>
</p>

<h3>
	توريث التنسيقات Cascading
</h3>

<p>
	يبقى المضيف الخفي -<code>&lt;custom-dialog&gt;</code> ذاته- ضمن شجرة DOM الظاهرة، لذلك سيتأثر بقواعد CSS التي يخضع لها المستند كاملاً، فإذا وجدت خاصية جرى تنسيقها محليًا ضمن <code>host:</code> وفي المستند بنفس الوقت، فسيُطبق حينها تنسيق المستند.
</p>

<p>
	فإن كان المستند مثلًا:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4087_51" style="">
<span class="tag">&lt;style&gt;</span><span class="pln">
custom</span><span class="pun">-</span><span class="pln">dialog </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">
</span><span class="pun">}</span><span class="pln">
</span><span class="tag">&lt;/style&gt;</span></pre>

<p>
	فسيُعرض العنصر <code>&lt;custom-dialog&gt;</code> دون حاشية padding.
</p>

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

<h3>
	المحدد (host(selector:
</h3>

<p>
	هو نفسه <code>host:</code> لكنه يُطبّق فقط إذا تطابق اسم المضيف الخفي مع الوسيط <code>selector</code>، فعلى سبيل المثال: نريد توسيط المكوّن <code>&lt;custom-dialog&gt;</code> في الصفحة فقط إذا امتلك السمة <code>centered</code>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4087_53" style="">
<span class="tag">&lt;template</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"tmpl"</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;style&gt;</span><span class="pln">
    </span><span class="pun">:</span><span class="pln">host</span><span class="pun">([</span><span class="pln">centered</span><span class="pun">])</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      position</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">fixed</span><span class="pun">;</span><span class="pln">
      left</span><span class="pun">:</span><span class="pln"> </span><span class="lit">50</span><span class="pun">%;</span><span class="pln">
      top</span><span class="pun">:</span><span class="pln"> </span><span class="lit">50</span><span class="pun">%;</span><span class="pln">
      transform</span><span class="pun">:</span><span class="pln"> translate</span><span class="pun">(-</span><span class="lit">50</span><span class="pun">%,</span><span class="pln"> </span><span class="pun">-</span><span class="lit">50</span><span class="pun">%);</span><span class="pln">
      border</span><span class="pun">-</span><span class="pln">color</span><span class="pun">:</span><span class="pln"> blue</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="pun">:</span><span class="pln">host </span><span class="pun">{</span><span class="pln">
      display</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">inline</span><span class="pun">-</span><span class="pln">block</span><span class="pun">;</span><span class="pln">
      border</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1px</span><span class="pln"> solid red</span><span class="pun">;</span><span class="pln">
      padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">10px</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
  </span><span class="tag">&lt;/style&gt;</span><span class="pln">
  </span><span class="tag">&lt;slot&gt;&lt;/slot&gt;</span><span class="pln">
</span><span class="tag">&lt;/template&gt;</span><span class="pln">

</span><span class="tag">&lt;script&gt;</span><span class="pln">
customElements</span><span class="pun">.</span><span class="pln">define</span><span class="pun">(</span><span class="str">'custom-dialog'</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> extends </span><span class="typ">HTMLElement</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  connectedCallback</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">attachShadow</span><span class="pun">({</span><span class="pln">mode</span><span class="pun">:</span><span class="pln"> </span><span class="str">'open'</span><span class="pun">}).</span><span class="pln">append</span><span class="pun">(</span><span class="pln">tmpl</span><span class="pun">.</span><span class="pln">content</span><span class="pun">.</span><span class="pln">cloneNode</span><span class="pun">(</span><span class="kwd">true</span><span class="pun">));</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">});</span><span class="pln">
</span><span class="tag">&lt;/script&gt;</span><span class="pln">


</span><span class="tag">&lt;custom-dialog</span><span class="pln"> </span><span class="atn">centered</span><span class="tag">&gt;</span><span class="pln">
  Centered!
</span><span class="tag">&lt;/custom-dialog&gt;</span><span class="pln">

</span><span class="tag">&lt;custom-dialog&gt;</span><span class="pln">
  Not centered.
</span><span class="tag">&lt;/custom-dialog&gt;</span></pre>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" data-ss1635250123="1" frameborder="no" height="213" loading="lazy" scrolling="no" src="https://codepen.io/Hsoub/embed/QWMvwLm?default-tab=result" style="width: 100%;" title="JS-p3-06-Shadow-DOM-styling -ex2">See the Pen JS-p3-06-Shadow-DOM-styling -ex2 by Hsoub (@Hsoub) on CodePen.</iframe>
</p>

<p>
	والآن سيُطبّق التوسيط فقط على المكوّن الأول <code>&lt;custom-dialog centered&gt;</code>.
</p>

<p>
	باختصار، يمكن استخدام عائلة المحددات <code>host:</code> لتنسيق العنصر الرئيسي للمكوِّن بناءً على السياق، ويمكن تغيير هذه التنسيقات -ما لم تستخدم السمة <code>important!</code>- من قبل تنسيق المستند.
</p>

<h3>
	تنسيق محتوى الفتحات
</h3>

<p>
	لننظر إلى حالة وجود فتحات slots.
</p>

<p>
	تأتي المكوّنات المقلمة slotted components من شجرة DOM الظاهرة، لذا ستستخدم تنسيقات المستند، ولن يؤثر التنسيق المحلي على المحتوى المركب. سنرى في المثال التالي أنّ العنصر المركب <code>&lt;span&gt;</code> سيظهر بخط سميك وفق تنسيق المستند، لكنه لن يتأثر بقيمة الخاصية <code>background</code> العائدة للتنسيق المحلي للعنصر:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4087_55" style="">
<span class="tag">&lt;style&gt;</span><span class="pln">
  span </span><span class="pun">{</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 class="tag">&lt;/style&gt;</span><span class="pln">

</span><span class="tag">&lt;user-card&gt;</span><span class="pln">
  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">slot</span><span class="pun">=</span><span class="atv">"username"</span><span class="tag">&gt;&lt;span&gt;</span><span class="pln">John Smith</span><span class="tag">&lt;/span&gt;&lt;/div&gt;</span><span class="pln">
</span><span class="tag">&lt;/user-card&gt;</span><span class="pln">

</span><span class="tag">&lt;script&gt;</span><span class="pln">
customElements</span><span class="pun">.</span><span class="pln">define</span><span class="pun">(</span><span class="str">'user-card'</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> extends </span><span class="typ">HTMLElement</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  connectedCallback</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">attachShadow</span><span class="pun">({</span><span class="pln">mode</span><span class="pun">:</span><span class="pln"> </span><span class="str">'open'</span><span class="pun">});</span><span class="pln">
    </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">shadowRoot</span><span class="pun">.</span><span class="pln">innerHTML </span><span class="pun">=</span><span class="pln"> </span><span class="pun">`</span><span class="pln">
      </span><span class="pun">&lt;</span><span class="pln">style</span><span class="pun">&gt;</span><span class="pln">
      span </span><span class="pun">{</span><span class="pln"> background</span><span class="pun">:</span><span class="pln"> red</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
      </span><span class="pun">&lt;/</span><span class="pln">style</span><span class="pun">&gt;</span><span class="pln">
      </span><span class="typ">Name</span><span class="pun">:</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln">slot name</span><span class="pun">=</span><span class="str">"username"</span><span class="pun">&gt;&lt;/</span><span class="pln">slot</span><span class="pun">&gt;</span><span class="pln">
    </span><span class="pun">`;</span><span class="pln">
  </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>
	<iframe allowfullscreen="true" allowtransparency="true" data-ss1635250123="1" frameborder="no" height="159" loading="lazy" scrolling="no" src="https://codepen.io/Hsoub/embed/LYjyEYE?default-tab=result" style="width: 100%;" title="JS-p3-06-Shadow-DOM-styling -ex3">See the Pen JS-p3-06-Shadow-DOM-styling -ex3 by Hsoub (@Hsoub) on CodePen.</iframe>
</p>

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

<p>
	الأول هو تنسيق الفتحة <code>&lt;slot&gt;</code> نفسه اعتمادًا على وراثة تنسيق CSS:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4087_57" style="">
<span class="tag">&lt;user-card&gt;</span><span class="pln">
  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">slot</span><span class="pun">=</span><span class="atv">"username"</span><span class="tag">&gt;&lt;span&gt;</span><span class="pln">John Smith</span><span class="tag">&lt;/span&gt;&lt;/div&gt;</span><span class="pln">
</span><span class="tag">&lt;/user-card&gt;</span><span class="pln">

</span><span class="tag">&lt;script&gt;</span><span class="pln">
customElements</span><span class="pun">.</span><span class="pln">define</span><span class="pun">(</span><span class="str">'user-card'</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> extends </span><span class="typ">HTMLElement</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  connectedCallback</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">attachShadow</span><span class="pun">({</span><span class="pln">mode</span><span class="pun">:</span><span class="pln"> </span><span class="str">'open'</span><span class="pun">});</span><span class="pln">
    </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">shadowRoot</span><span class="pun">.</span><span class="pln">innerHTML </span><span class="pun">=</span><span class="pln"> </span><span class="pun">`</span><span class="pln">
      </span><span class="pun">&lt;</span><span class="pln">style</span><span class="pun">&gt;</span><span class="pln">
      slot</span><span class="pun">[</span><span class="pln">name</span><span class="pun">=</span><span class="str">"username"</span><span class="pun">]</span><span class="pln"> </span><span class="pun">{</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 class="pun">}</span><span class="pln">
      </span><span class="pun">&lt;/</span><span class="pln">style</span><span class="pun">&gt;</span><span class="pln">
      </span><span class="typ">Name</span><span class="pun">:</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln">slot name</span><span class="pun">=</span><span class="str">"username"</span><span class="pun">&gt;&lt;/</span><span class="pln">slot</span><span class="pun">&gt;</span><span class="pln">
    </span><span class="pun">`;</span><span class="pln">
  </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>
	<iframe allowfullscreen="true" allowtransparency="true" data-ss1635250123="1" frameborder="no" height="152" loading="lazy" scrolling="no" src="https://codepen.io/Hsoub/embed/RwZVNPo?default-tab=result" style="width: 100%;" title="JS-p3-06-Shadow-DOM-styling -ex4">See the Pen JS-p3-06-Shadow-DOM-styling -ex4 by Hsoub (@Hsoub) on CodePen.</iframe>
</p>

<p>
	سيكون الخط سميكًا في <code>&lt;p&gt;John Smith&lt;/p&gt;</code>، وذلك لأن وراثة CSS ستنقل التنسيق من الفتحة <code>&lt;slot&gt;</code> إلى المحتويات، لكن ليست كل <a href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D8%B3%D8%B1%D9%8A%D8%B9-%D8%A5%D9%84%D9%89-%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%AA%D9%86%D8%B3%D9%8A%D9%82-css-r551/" rel="">خصائص CSS</a> قابلة للوراثة.
</p>

<p>
	الخيار الثاني هو استخدام محدد الصنف الوهمي <code>(slotted(selector::</code>، والتي تطابق العناصر بناءً على شرطين:
</p>

<ol>
<li>
		أن يكون العنصر مركبًا وآتيًا من الشجرة الظاهرة، ولا يهم اسم الفتحة هنا، ويطبق على العنصر المركب ذاته وليس على أبنائه.
	</li>
	<li>
		أن يطابق العنصر قيم الوسيط <code>selector</code>.
	</li>
</ol>
<p>
	يختار المحدد <code>(slotted(div::</code> في مثالنا التالي العنصر <code>&lt;"div slot="username&gt;</code> تمامًا وليس أبناءه:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4087_59" style="">
<span class="tag">&lt;user-card&gt;</span><span class="pln">
  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">slot</span><span class="pun">=</span><span class="atv">"username"</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="tag">&lt;div&gt;</span><span class="pln">John Smith</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;/user-card&gt;</span><span class="pln">

</span><span class="tag">&lt;script&gt;</span><span class="pln">
customElements</span><span class="pun">.</span><span class="pln">define</span><span class="pun">(</span><span class="str">'user-card'</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> extends </span><span class="typ">HTMLElement</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  connectedCallback</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">attachShadow</span><span class="pun">({</span><span class="pln">mode</span><span class="pun">:</span><span class="pln"> </span><span class="str">'open'</span><span class="pun">});</span><span class="pln">
    </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">shadowRoot</span><span class="pun">.</span><span class="pln">innerHTML </span><span class="pun">=</span><span class="pln"> </span><span class="pun">`</span><span class="pln">
      </span><span class="pun">&lt;</span><span class="pln">style</span><span class="pun">&gt;</span><span class="pln">
      </span><span class="pun">::</span><span class="pln">slotted</span><span class="pun">(</span><span class="pln">div</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> border</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1px</span><span class="pln"> solid red</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
      </span><span class="pun">&lt;/</span><span class="pln">style</span><span class="pun">&gt;</span><span class="pln">
      </span><span class="typ">Name</span><span class="pun">:</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln">slot name</span><span class="pun">=</span><span class="str">"username"</span><span class="pun">&gt;&lt;/</span><span class="pln">slot</span><span class="pun">&gt;</span><span class="pln">
    </span><span class="pun">`;</span><span class="pln">
  </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>
	<iframe allowfullscreen="true" allowtransparency="true" data-ss1635250123="1" frameborder="no" height="183" loading="lazy" scrolling="no" src="https://codepen.io/Hsoub/embed/MWvmYwz?default-tab=result" style="width: 100%;" title="JS-p3-06-Shadow-DOM-styling -ex5">See the Pen JS-p3-06-Shadow-DOM-styling -ex5 by Hsoub (@Hsoub) on CodePen.</iframe>
</p>

<p>
	لاحظ أنه يمكن للمحدد <code>slotted::</code> التقدم داخل عناصر الفتحة، لذا تكون المحددات التالية غير صحيحة:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_4087_63" style="">
<span class="pun">::</span><span class="pln">slotted</span><span class="pun">(</span><span class="pln">div span</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">/*مع هذا المحدد div لايتطابق العنصر  */</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">::</span><span class="pln">slotted</span><span class="pun">(</span><span class="pln">div</span><span class="pun">)</span><span class="pln"> p </span><span class="pun">{</span><span class="pln">
  </span><span class="com">/* DOM لا يمكنه التقدم داخل */</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	يمكن استخدام <code>slotted::</code> أيضًا في <code>querySelector</code>.
</p>

<h3>
	خطافات CSS مع خاصيات مخصصة
</h3>

<p>
	كيف ننسق العناصر الداخلية للمكوِّن من المستند الرئيسي؟
</p>

<p>
	تطبق المحددات -مثل <code>host:</code>- القواعد على عناصر مخصصة، مثل <code>&lt;custom-dialog&gt;</code> أو <code>&lt;user-card&gt;</code>، لكن كيف ننسق عناصر شجرة DOM الخفية ضمنها؟ لا يوجد محدد قادر على التأثير المباشر على تنسيق شجرة DOM الخفية من المستند الرئيسي، لكن -وكما عرضنا توابع للتفاعل مع مكوننا- يمكن عرض متغيرات CSS -خصائص CSS مخصصة- إلى التنسيق.
</p>

<p>
	تتواجد الخصائص المخصصة على كل المستويات وفي كلتا الشجرتين الخفية والظاهرة، حيث يمكن مثلًا استخدام المتغير <code>‎--user-card-field-color</code> في شجرة DOM الخفية لتنسيق الحقول، ويمكن أن يضبط المستند الخارجي قيمتها:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4087_65" style="">
<span class="tag">&lt;style&gt;</span><span class="pln">
  </span><span class="pun">.</span><span class="pln">field </span><span class="pun">{</span><span class="pln">
    color</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">var</span><span class="pun">(--</span><span class="pln">user</span><span class="pun">-</span><span class="pln">card</span><span class="pun">-</span><span class="pln">field</span><span class="pun">-</span><span class="pln">color</span><span class="pun">,</span><span class="pln"> black</span><span class="pun">);</span><span class="pln">
    </span><span class="com">/* معرفًا استخدم اللون الأسود --user-card-field-color  */</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="tag">&lt;/style&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">"field"</span><span class="tag">&gt;</span><span class="pln">Name: </span><span class="tag">&lt;slot</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"username"</span><span class="tag">&gt;&lt;/slot&gt;&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">"field"</span><span class="tag">&gt;</span><span class="pln">Birthday: </span><span class="tag">&lt;slot</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"birthday"</span><span class="tag">&gt;&lt;/slot&gt;&lt;/div&gt;</span></pre>

<p>
	عندها يمكن التصريح عن هذه الخاصية في المستند الخارجي للمكوّن <code>&lt;user-card&gt;</code>:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_4087_67" style="">
<span class="pln">user</span><span class="pun">-</span><span class="pln">card </span><span class="pun">{</span><span class="pln">
  </span><span class="pun">--</span><span class="pln">user</span><span class="pun">-</span><span class="pln">card</span><span class="pun">-</span><span class="pln">field</span><span class="pun">-</span><span class="pln">color</span><span class="pun">:</span><span class="pln"> green</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	تخترق خاصيات CSS المخصصة شجرة DOM الخفية، وهي مرئية في كل مكان، لذلك يمكن للقاعدة الداخلية <code>field.</code> استخدامها، وإليك مثالًا كاملًا:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4087_69" style="">
<span class="tag">&lt;style&gt;</span><span class="pln">
  user</span><span class="pun">-</span><span class="pln">card </span><span class="pun">{</span><span class="pln">
    </span><span class="pun">--</span><span class="pln">user</span><span class="pun">-</span><span class="pln">card</span><span class="pun">-</span><span class="pln">field</span><span class="pun">-</span><span class="pln">color</span><span class="pun">:</span><span class="pln"> green</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="tag">&lt;/style&gt;</span><span class="pln">

</span><span class="tag">&lt;template</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"tmpl"</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;style&gt;</span><span class="pln">
    </span><span class="pun">.</span><span class="pln">field </span><span class="pun">{</span><span class="pln">
      color</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">var</span><span class="pun">(--</span><span class="pln">user</span><span class="pun">-</span><span class="pln">card</span><span class="pun">-</span><span class="pln">field</span><span class="pun">-</span><span class="pln">color</span><span class="pun">,</span><span class="pln"> black</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
  </span><span class="tag">&lt;/style&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">"field"</span><span class="tag">&gt;</span><span class="pln">Name: </span><span class="tag">&lt;slot</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"username"</span><span class="tag">&gt;&lt;/slot&gt;&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">"field"</span><span class="tag">&gt;</span><span class="pln">Birthday: </span><span class="tag">&lt;slot</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"birthday"</span><span class="tag">&gt;&lt;/slot&gt;&lt;/div&gt;</span><span class="pln">
</span><span class="tag">&lt;/template&gt;</span><span class="pln">

</span><span class="tag">&lt;script&gt;</span><span class="pln">
customElements</span><span class="pun">.</span><span class="pln">define</span><span class="pun">(</span><span class="str">'user-card'</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> extends </span><span class="typ">HTMLElement</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  connectedCallback</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">attachShadow</span><span class="pun">({</span><span class="pln">mode</span><span class="pun">:</span><span class="pln"> </span><span class="str">'open'</span><span class="pun">});</span><span class="pln">
    </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">shadowRoot</span><span class="pun">.</span><span class="pln">append</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">'tmpl'</span><span class="pun">).</span><span class="pln">content</span><span class="pun">.</span><span class="pln">cloneNode</span><span class="pun">(</span><span class="kwd">true</span><span class="pun">));</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">});</span><span class="pln">
</span><span class="tag">&lt;/script&gt;</span><span class="pln">

</span><span class="tag">&lt;user-card&gt;</span><span class="pln">
  </span><span class="tag">&lt;span</span><span class="pln"> </span><span class="atn">slot</span><span class="pun">=</span><span class="atv">"username"</span><span class="tag">&gt;</span><span class="pln">John Smith</span><span class="tag">&lt;/span&gt;</span><span class="pln">
  </span><span class="tag">&lt;span</span><span class="pln"> </span><span class="atn">slot</span><span class="pun">=</span><span class="atv">"birthday"</span><span class="tag">&gt;</span><span class="pln">01.01.2001</span><span class="tag">&lt;/span&gt;</span><span class="pln">
</span><span class="tag">&lt;/user-card&gt;</span></pre>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" data-ss1635250123="1" frameborder="no" height="160" loading="lazy" scrolling="no" src="https://codepen.io/Hsoub/embed/NWvjPGy?default-tab=result" style="width: 100%;" title="JS-p3-06-Shadow-DOM-styling -ex6">See the Pen JS-p3-06-Shadow-DOM-styling -ex6 by Hsoub (@Hsoub) on CodePen.</iframe>
</p>

<h2>
	شجرة DOM الخفية والأحداث
</h2>

<p>
	إنّ الفكرة الأساسية من الشجرة الخفية هي تغليف تفاصيل التنفيذ الداخلي للمكوّن. لنفترض وقوع حدث نقرٍ داخل شجرة DOM الخفية للمكوّن <code>&lt;user-card&gt;</code>، لكن لا تملك السكربتات في المستند الرئيسي أي فكرة عن ما يجري داخل الشجرة، وخاصةً إذا أتى المكون من طرف ثالث، لذا يعيد المتصفح استهداف الحدث للمحافظة على تغليف التفاصيل.
</p>

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

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4087_71" style="">
<span class="tag">&lt;user-card&gt;&lt;/user-card&gt;</span><span class="pln">

</span><span class="tag">&lt;script&gt;</span><span class="pln">
customElements</span><span class="pun">.</span><span class="pln">define</span><span class="pun">(</span><span class="str">'user-card'</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> extends </span><span class="typ">HTMLElement</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  connectedCallback</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">attachShadow</span><span class="pun">({</span><span class="pln">mode</span><span class="pun">:</span><span class="pln"> </span><span class="str">'open'</span><span class="pun">});</span><span class="pln">
    </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">shadowRoot</span><span class="pun">.</span><span class="pln">innerHTML </span><span class="pun">=</span><span class="pln"> </span><span class="pun">`&lt;</span><span class="pln">p</span><span class="pun">&gt;</span><span class="pln">
      </span><span class="pun">&lt;</span><span class="pln">button</span><span class="pun">&gt;</span><span class="typ">Click</span><span class="pln"> me</span><span class="pun">&lt;/</span><span class="pln">button</span><span class="pun">&gt;</span><span class="pln">
    </span><span class="pun">&lt;/</span><span class="pln">p</span><span class="pun">&gt;`;</span><span class="pln">
    </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">shadowRoot</span><span class="pun">.</span><span class="pln">firstElementChild</span><span class="pun">.</span><span class="pln">onclick </span><span class="pun">=</span><span class="pln">
      e </span><span class="pun">=&gt;</span><span class="pln"> alert</span><span class="pun">(</span><span class="str">"Inner target: "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> e</span><span class="pun">.</span><span class="pln">target</span><span class="pun">.</span><span class="pln">tagName</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">});</span><span class="pln">

document</span><span class="pun">.</span><span class="pln">onclick </span><span class="pun">=</span><span class="pln">
  e </span><span class="pun">=&gt;</span><span class="pln"> alert</span><span class="pun">(</span><span class="str">"Outer target: "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> e</span><span class="pun">.</span><span class="pln">target</span><span class="pun">.</span><span class="pln">tagName</span><span class="pun">);</span><span class="pln">
</span><span class="tag">&lt;/script&gt;</span></pre>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" data-ss1635250123="1" frameborder="no" height="229" loading="lazy" scrolling="no" src="https://codepen.io/Hsoub/embed/WNEjbrz?default-tab=result" style="width: 100%;" title="JS-p3-06-Shadow-DOM-and-events -ex1">See the Pen JS-p3-06-Shadow-DOM-and-events -ex1 by Hsoub (@Hsoub) on CodePen.</iframe>
</p>

<p>
	إذا نقرت على الزر فستظهر الرسائل التالية:
</p>

<ol>
<li>
		الهدف الداخلي <code>BUTTON</code>: معالج حدث داخلي يحصل على الهدف الصحيح، وهو عنصر داخل الشجرة الخفية.
	</li>
	<li>
		الهدف الخارجي <code>USER-CARD</code>: معالج حدث المستند، والذي يحصل على المضيف الخفي مثل هدف.
	</li>
</ol>
<p>
	إنّ إعادة استهداف retargeting الأحداث أمر مفيد جدًا، إذ يُفترض أن لا يعرف المستند الخارجي ما يوجد داخل المكوّن، فالحدث قد وقع من وجهة نظره على المكوّن <code>&lt;user-card&gt;</code>.
</p>

<p>
	لا تحدث إعادة الاستهداف إذا وقع الحدث في عنصر مُركّب، وذلك لأنه موجود فيزيائيًا في شجرة DOM الظاهرة، فلو نقر مستخدم مثلًا على <code>&lt;span slot="username"‎&gt;</code> في المثال التالي، فسيستهدف الحدث العنصر <code>span</code> هذا بالتحديد، وفي كلا معالجي الحدث الخاصين بالشجرتين الظاهرة والخفية:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4087_73" style="">
<span class="tag">&lt;user-card</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"userCard"</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;span</span><span class="pln"> </span><span class="atn">slot</span><span class="pun">=</span><span class="atv">"username"</span><span class="tag">&gt;</span><span class="pln">John Smith</span><span class="tag">&lt;/span&gt;</span><span class="pln">
</span><span class="tag">&lt;/user-card&gt;</span><span class="pln">

</span><span class="tag">&lt;script&gt;</span><span class="pln">
customElements</span><span class="pun">.</span><span class="pln">define</span><span class="pun">(</span><span class="str">'user-card'</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> extends </span><span class="typ">HTMLElement</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  connectedCallback</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">attachShadow</span><span class="pun">({</span><span class="pln">mode</span><span class="pun">:</span><span class="pln"> </span><span class="str">'open'</span><span class="pun">});</span><span class="pln">
    </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">shadowRoot</span><span class="pun">.</span><span class="pln">innerHTML </span><span class="pun">=</span><span class="pln"> </span><span class="pun">`&lt;</span><span class="pln">div</span><span class="pun">&gt;</span><span class="pln">
      </span><span class="pun">&lt;</span><span class="pln">b</span><span class="pun">&gt;</span><span class="typ">Name</span><span class="pun">:&lt;</span><span class="str">/b&gt; &lt;slot name="username"&gt;&lt;/</span><span class="pln">slot</span><span class="pun">&gt;</span><span class="pln">
    </span><span class="pun">&lt;/</span><span class="pln">div</span><span class="pun">&gt;`;</span><span class="pln">

    </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">shadowRoot</span><span class="pun">.</span><span class="pln">firstElementChild</span><span class="pun">.</span><span class="pln">onclick </span><span class="pun">=</span><span class="pln">
      e </span><span class="pun">=&gt;</span><span class="pln"> alert</span><span class="pun">(</span><span class="str">"Inner target: "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> e</span><span class="pun">.</span><span class="pln">target</span><span class="pun">.</span><span class="pln">tagName</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">});</span><span class="pln">

userCard</span><span class="pun">.</span><span class="pln">onclick </span><span class="pun">=</span><span class="pln"> e </span><span class="pun">=&gt;</span><span class="pln"> alert</span><span class="pun">(`</span><span class="typ">Outer</span><span class="pln"> target</span><span class="pun">:</span><span class="pln"> $</span><span class="pun">{</span><span class="pln">e</span><span class="pun">.</span><span class="pln">target</span><span class="pun">.</span><span class="pln">tagName</span><span class="pun">}`);</span><span class="pln">
</span><span class="tag">&lt;/script&gt;</span></pre>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" data-ss1635250123="1" frameborder="no" height="159" loading="lazy" scrolling="no" src="https://codepen.io/Hsoub/embed/mdMmyPW?default-tab=result" style="width: 100%;" title="JS-p3-06-Shadow-DOM-and-events -ex2">See the Pen JS-p3-06-Shadow-DOM-and-events -ex2 by Hsoub (@Hsoub) on CodePen.</iframe>
</p>

<p>
	فإذا نُقر الاسم <code>"John Smith"</code>، فسيكون الهدف بالنسبة لمعالجي الحدث الداخلي والخارجي هو <code>&lt;"span slot="username&gt;</code>، وهنا لن يُعاد الاستهداف لأنه عنصر من DOM الظاهرة. من ناحية أخرى، إذا نُقر عنصر يعود إلى شجرة DOM الخفية مثل العنصر <code>&lt;b&gt;Name&lt;/b&gt;</code>، فسُيعاد ضبط هدف الحدث <code>event.target</code> أثناء انسياب الحدث لخارج شجرة DOM الخفية ليصبح <code>&lt;user-card&gt;</code>.
</p>

<h3>
	التابعان Bubbling و()event.composedPath
</h3>

<p>
	تُستخدم DOM المسطحة لدفع الأحداث إلى الخارج bubbling، لذا إذا وُجد عنصر مركب slotted في فتحة ووقع حدث في مكان ما بداخله، فسيندفع الحدث إلى خارج العنصر باتجاه الفتحة <code>&lt;slot&gt;</code> وإلى الأعلى، ويمكن الحصول على المسار الكامل للهدف الأصلي للحدث مع كل عناصر شجرته الخفية باستخدام التابع <code>()event.composedPath</code>، ويؤخذ هذا المسار -كما يدل اسم التابع- بعد عملية التركيب، وإليك شجرة DOM المسطحة للمثال السابق:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4087_75" style="">
<span class="tag">&lt;user-card</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"userCard"</span><span class="tag">&gt;</span><span class="pln">
  #shadow-root
    </span><span class="tag">&lt;div&gt;</span><span class="pln">
      </span><span class="tag">&lt;b&gt;</span><span class="pln">Name:</span><span class="tag">&lt;/b&gt;</span><span class="pln">
      </span><span class="tag">&lt;slot</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"username"</span><span class="tag">&gt;</span><span class="pln">
        </span><span class="tag">&lt;span</span><span class="pln"> </span><span class="atn">slot</span><span class="pun">=</span><span class="atv">"username"</span><span class="tag">&gt;</span><span class="pln">John Smith</span><span class="tag">&lt;/span&gt;</span><span class="pln">
      </span><span class="tag">&lt;/slot&gt;</span><span class="pln">
    </span><span class="tag">&lt;/div&gt;</span><span class="pln">
</span><span class="tag">&lt;/user-card&gt;</span></pre>

<p>
	عند النقر على <code>&lt;span slot="username"&gt;</code>، سيعيد استدعاء التابع <code>()event.composedPath</code> المصفوفة التالية:
</p>

<p>
	[<code>span</code>, <code>slot</code>, <code>div</code>, <code>shadow-root</code>, <code>user-card</code>, <code>body</code>, <code>html</code>, <code>document</code>, <code>window</code>]، وهي شجرة العناصر كاملةً ابتداءًا من العنصر المُستهدف في شجرة DOM المسطحة بعد التركيب.
</p>

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

	<p>
		لا يمكن الحصول على تفاصيل الشجرة الخفية إلا في حالة <code>{'mode:'open}</code>، فإذا أُنشئت الشجرة الخفية باستخدام <code>{'mode: 'closed}</code>، فسيبدأ المسار المركب من المضيف <code>user-card</code> وإلى المستوى الأعلى. يشابه هذا الأمر بقية التوابع التي تعمل مع شجرة DOM الخفية، فالتفاصيل الداخلية للأشجار المغلقة مخفية.
	</p>
</blockquote>

<h3>
	التابع event.composed
</h3>

<p>
	تنساب معظم الأحداث إلى خارج حدود شجرة DOM الخفية، لكن هذا لا ينطبق على بعضها، وذلك بحسب قيمة كائن الحدث <code>composed</code>، فإذا كانت "true" فستعبر الأحداث حدود الشجرة، وإلا فستلتقَط داخل حدود الشجرة فقط.
</p>

<p>
	إذا ألقينا نظرةً على توصيفات أحداث واجهة المستخدم <a data-ss1635250123="1" href="https://www.w3.org/TR/uievents" rel="external nofollow">UI Events specification</a>، فسنجد أن قيمة <code>composed</code> هي "true" للأحداث:
</p>

<ul>
<li>
		<code>blur</code> و<code>focus</code> و<code>focusin</code> و<code>focusout</code>.
	</li>
	<li>
		<code>click</code> و<code>dblclick</code>.
	</li>
	<li>
		<code>mousedown</code> و<code>mouseup</code> و<code>mousemove</code> و<code>mouseout</code> و<code>mouseover</code>.
	</li>
	<li>
		<code>wheel</code>.
	</li>
	<li>
		<code>beforeinput</code> و<code>input</code> و<code>keydown</code> و<code>keyup</code>.
	</li>
	<li>
		جميع أحداث اللمس والتأشير.
	</li>
</ul>
<p>
	أما الأحداث التي يكون فيها <code>composed: false</code> فهي:
</p>

<ul>
<li>
		<code>mouseenter</code> و<code>mouseleave</code>: التي لا تنساب للخارج إطلاقًا.
	</li>
	<li>
		<code>load</code> و<code>unload</code> و<code>abort</code> و<code>error</code>.
	</li>
	<li>
		<code>select</code>.
	</li>
	<li>
		<code>slotchange</code>.
	</li>
</ul>
<p>
	يمكن التقاط هذه الأحداث من قبل العناصر داخل شجرة DOM نفسها، حيث يقيم العنصر المستهدف.
</p>

<h3>
	الأحداث المخصصة
</h3>

<p>
	لا بدّ من ضبط الخاصيتين <code>bubbles</code> و<code>composed</code> على القيمة "true" إذا أردنا إيفاد أحداث مخصصة تنساب إلى مستوى أعلى وإلى خارج المكوّن، وسننشئ في المثال التالي <code>div#inner</code> في شجرة DOM الخفية ضمن <code>div#outer</code> ونطلق حدثين فيها، وسيصل الحدث الذي يمتلك الخاصية <code>composed: true</code> فقط إلى الخارج، وصولًا إلى المستند:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4087_77" style="">
<span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"outer"</span><span class="tag">&gt;&lt;/div&gt;</span><span class="pln">

</span><span class="tag">&lt;script&gt;</span><span class="pln">
outer</span><span class="pun">.</span><span class="pln">attachShadow</span><span class="pun">({</span><span class="pln">mode</span><span class="pun">:</span><span class="pln"> </span><span class="str">'open'</span><span class="pun">});</span><span class="pln">

let inner </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">'div'</span><span class="pun">);</span><span class="pln">
outer</span><span class="pun">.</span><span class="pln">shadowRoot</span><span class="pun">.</span><span class="pln">append</span><span class="pun">(</span><span class="pln">inner</span><span class="pun">);</span><span class="pln">

</span><span class="com">/*
div(id=outer)
  #shadow-dom
    div(id=inner)
*/</span><span class="pln">

document</span><span class="pun">.</span><span class="pln">addEventListener</span><span class="pun">(</span><span class="str">'test'</span><span class="pun">,</span><span class="pln"> event </span><span class="pun">=&gt;</span><span class="pln"> alert</span><span class="pun">(</span><span class="pln">event</span><span class="pun">.</span><span class="pln">detail</span><span class="pun">));</span><span class="pln">

inner</span><span class="pun">.</span><span class="pln">dispatchEvent</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">CustomEvent</span><span class="pun">(</span><span class="str">'test'</span><span class="pun">,</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  bubbles</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">,</span><span class="pln">
  composed</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">,</span><span class="pln">
  detail</span><span class="pun">:</span><span class="pln"> </span><span class="str">"composed"</span><span class="pln">
</span><span class="pun">}));</span><span class="pln">

inner</span><span class="pun">.</span><span class="pln">dispatchEvent</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">CustomEvent</span><span class="pun">(</span><span class="str">'test'</span><span class="pun">,</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  bubbles</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">,</span><span class="pln">
  composed</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">,</span><span class="pln">
  detail</span><span class="pun">:</span><span class="pln"> </span><span class="str">"not composed"</span><span class="pln">
</span><span class="pun">}));</span><span class="pln">
</span><span class="tag">&lt;/script&gt;</span></pre>

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

<p>
	شجرة DOM الخفية هي طريقة لإنشاء شجرة محلية خاصة بالمكوِّن.
</p>

<ol>
<li>
		<code>({shadowRoot = elem.attachShadow({mode: open|closed</code>: ينشئ شجرة DOM خفيةً للعنصر <code>elem</code>، ويمكن الوصول إليها باستخدام الخاصية <code>elem.shadowRoot</code> إذا كانت الخاصية <code>"mode="open</code>.
	</li>
	<li>
		يمكن تعميم الكائن <code>shadowRoot</code> باستخدام <code>innerHTML</code> أو توابع DOM أخرى.
	</li>
</ol>
<p>
	عناصر شجرة DOM الخفية:
</p>

<ul>
<li>
		لها فضاء خاص لقيم المعرّفات id.
	</li>
	<li>
		غير مرئية لمحددات JavaScript الموجودة في المستند الرئيسي، مثل <code>querySelector</code>.
	</li>
	<li>
		تستخدم التنسيق الموجود ضمن الشجرة الخفية فقط، وليس تنسيق المستند الرئيسي.
	</li>
</ul>
<p>
	تُصيّر شجرة DOM الخفية -إن وجدت- ضمن ما يُسمى شجرة DOM الظاهرة light DOM، مثل عناصر أبناء نظاميين.
</p>

<p>
	إذا امتلك عنصر شجرة DOM خفيةً، فلن تُعرض شجرة DOM الظاهرة عادةً، لذلك تسمح الفتحات slots -الناتجة عن عملية تقليم الشجرة- بعرض عناصر من شجرة DOM الظاهرة في أماكن محددة من شجرة DOM الخفية، ويوجد نوعان من الفتحات:
</p>

<ul>
<li>
		الفتحات المسماة <code>&lt;slot name="X"&gt;...&lt;/slot&gt;</code>: الحصول على أبناء شجرة DOM الظاهرة فتحتها <code>slot="X"‎</code>.
	</li>
	<li>
		الفتحة الافتراضية: وهي أول فتحة <code>&lt;slot&gt;</code> لا تحمل اسمًا، وتهمَل الفتحات غير المسماة التي تأتي لاحقًا، كما يحصل على أبناء شجرة DOM الظاهرة الذين لم يُدرجوا في فتحات.
	</li>
	<li>
		إذا وجدَت عدة عناصر في الفتحة نفسها، فستُدرج واحدًا بعد الآخر.
	</li>
	<li>
		يُستخدَم محتوى الفتحة <code>&lt;slot&gt;</code> محتوىً للتراجع، لذا يظهر هذا المحتوى عند عدم وجود أبناء لشجرة DOM الظاهرة في الفتحة.
	</li>
</ul>
<p>
	تُدعى عملية تصيير العناصر المدرجة في فتحات ضمن فتحاتها بالتركيب composition، وتسمى النتيجة شجرة DOM المسطّحة.
</p>

<p>
	لا تنقل عملية التركيب العقد في الواقع، فمن وجهة نظر JavaScript ستبقى شجرة DOM نفسها، ويمكن الوصول إلى الفتحات من خلال توابع JavaScript التالية:
</p>

<ul>
<li>
		<code>()slot.assignedNodes/Elements</code>: يعيد العقد أو العناصر داخل فتحة.
	</li>
	<li>
		<code>node.assignedSlot</code>: وهي الخاصية المعاكسة، وتعيد الفتحة من العقدة التي تشغلها.
	</li>
</ul>
<p>
	إذا أردنا معرفة ما نُظهره، فيمكننا تعقب محتوى الفتحة باستخدام:
</p>

<ul>
<li>
		الحدث <code>slotchange</code>: ويقع في المرة الأولى التي تُملأ بها الفتحة، أو أثناء عمليات الإضافة أو الإزالة أو الاستبدال لعنصر مُدرج في الفتحة وليس لأبنائه، وستكون الفتحة <code>event.target</code>.
	</li>
	<li>
		<a data-ss1635250123="1" href="https://academy.hsoub.com/programming/javascript/%D9%85%D8%B1%D8%A7%D9%82%D8%A8-%D8%A7%D9%84%D8%AA%D8%AD%D9%88%D9%84-mutationobserver-%D8%B9%D8%A8%D8%B1-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA-%D9%84%D9%85%D8%B1%D8%A7%D9%82%D8%A8%D8%A9-%D8%B4%D8%AC%D8%B1%D8%A9-dom-r1239/" rel="">MutationObserver</a> للغوص عميقًا في محتوى الفتحة ومعرفة التغيرات التي حدثت ضمنها.
	</li>
</ul>
<p>
	بعد أن تعرفنا على كيفية إظهار عناصر من شجرة DOM الظاهرة، سنتعرف على كيفية تنسيقها بالشكل الصحيح، وتبقى القاعدة الأساسية هي أن عناصر شجرة DOM الخفية تُنسّق من الداخل، والظاهرة من الخارج -مع بعض الاستثناءات-، وهذا ما سنتعرف عليه في المقال القادم.
</p>

<p>
	يمكن أن تحوي شجرة DOM الخفية تنسيقات مثل <code>&lt;style&gt;</code> أو <code>&lt;"link rel="stylesheet&gt;</code>، وتؤثر التنسيقات المحلية في:
</p>

<ul>
<li>
		الشجرة الخفية.
	</li>
	<li>
		المضيف الخفي عندما يستعمل عائلة المحددات <code>host:</code>.
	</li>
	<li>
		العناصر المركبة القادمة من شجرة DOM الظاهرة، حيث يسمح المحدد <code>(slotted(selector::</code> باختيار العناصر المركبة ذاتها وليس أبنائها.
	</li>
</ul>
<p>
	بينما تؤثر تنسيقات المستند الرئيسي في:
</p>

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

<p>
	تخترق خصائص CSS المخصصة شجرة DOM الخفية، وتستخدم مثل خطافات hooks لتنسيق المكوّن:
</p>

<ol>
<li>
		يستخدم المكوِّن خصائص CSS المخصصة لتنسيق العناصر المفتاحية، مثل <code>(&lt;var(--component-name-title, &lt;default value</code>.
	</li>
	<li>
		ينشر مؤلف المكون هذه الخصائص للمطورين، وهي بأهمية توابع المكوّنات العامة.
	</li>
	<li>
		عندما لا يرغب المطور في قضاء وقت طويل على التنسيق، فسيسند الخاصية <code>‎--component-name-title</code> إلى المضيف الخفي أو الخاصية التي أشرنا إليها في الأعلى.
	</li>
	<li>
		الربح طبعًا!
	</li>
</ol>
<p>
	تتجاوز الأحداث حدود شجرة DOM الخفية إذا كانت قيمة الراية <code>composed</code>هي <code>true</code>، والتي تكون كذلك لمعظم الأحداث المضمنة Built-in، كما هو محدد في التوصيفات:
</p>

<ul>
<li>
		<a data-ss1635250123="1" href="https://www.w3.org/TR/uievents" rel="external nofollow">أحداث واجهة المستخدم</a>.
	</li>
	<li>
		<a data-ss1635250123="1" href="https://w3c.github.io/touch-events" rel="external nofollow">أحداث اللمس</a>.
	</li>
	<li>
		<a data-ss1635250123="1" href="https://www.w3.org/TR/pointerevents" rel="external nofollow">أحداث التأشير</a>.
	</li>
</ul>
<p>
	من الأحداث المضمنة التي يكون فيها <code>composed: false</code>:
</p>

<ul>
<li>
		<code>mouseenter</code> و<code>mouseleave</code>: لا تنساب للخارج إطلاقًا.
	</li>
	<li>
		<code>load</code> و<code>unload</code> و<code>abort</code> و<code>error</code>.
	</li>
	<li>
		<code>select</code>.
	</li>
	<li>
		<code>slotchange</code>.
	</li>
</ul>
<p>
	يمكن التقاط هذه الأحداث من قِبل العناصر داخل شجرة DOM نفسها.
</p>

<p>
	إذا أردنا إيفاد أحداث مخصصة <code>CustomEvent</code> فلا بد من ضبط الخاصية <code>composed</code> على القيمة "true" بشكل صريح.
</p>

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

	<p>
		<strong>ملاحظة</strong>: قد تتداخل شجرة DOM الخفية ضمن أخرى عند وجود مكونات متداخلة، كما تنساب الأحداث المركّبة في هذه الحالة عبر حدود أشجار DOM الخفية جميعها، فإذا أردنا أن نستهدف بالحدث مكوّنًا يقع خارج الشجرة مباشرةً، فيمكن إيفاده إلى المضيف الخفي بعد أن نضبط الراية <code>composed</code> على القيمة "false"، وهكذا سينتقل خارج شجرة الخفية التي تحتوي المكوّن، لكنه لن سينساب إلى مستوىً أعلى.
	</p>
</blockquote>

<h2>
	المراجع
</h2>

<ul>
<li>
		مراجع <a data-ss1635250123="1" href="https://dom.spec.whatwg.org/#shadow-trees" rel="external nofollow">DOM</a>.
	</li>
	<li>
		مراجع <a data-ss1635250123="1" href="https://caniuse.com/#feat=shadowdomv1" rel="external nofollow">التوافقية Compatibility</a>
	</li>
	<li>
		ذكرت الشجرة الخفية في الكثير من المواصفات مثل <a data-ss1635250123="1" href="https://w3c.github.io/DOM-Parsing/#the-innerhtml-mixin" rel="external nofollow">DOM Parsing</a>.
	</li>
</ul>
<p>
	ترجمة -وبتصرف- للفصول <a data-ss1635250123="1" href="https://javascript.info/shadow-dom-events" rel="external nofollow">Shadow DOM and events</a> و<span style="display: none;"> </span><a data-ss1635250123="1" href="https://javascript.info/slots-composition" rel="external nofollow">Shadow DOM slots, Composition</a> و<a data-ss1635250123="1" href="https://javascript.info/shadow-dom" rel="external nofollow">Shadow DOM</a> و<a data-ss1635250123="1" href="https://javascript.info/shadow-dom-style" rel="external nofollow">Shadow DOM Style</a> من سلسلة <a data-ss1635250123="1" href="https://https://javascript.info" rel="external nofollow">The Modern JavaScript Tutorial</a>.
</p>

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

<ul>
<li>
		<a href="https://academy.hsoub.com/programming/javascript/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D8%A7%D9%84%D8%AD%D8%B1%D9%83%D8%A7%D8%AA-%D8%B9%D8%A8%D8%B1-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA-r1351/" rel="">إنشاء الحركات عبر جافاسكربت</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D8%AA%D9%86%D9%82%D9%84-%D9%81%D9%8A-%D8%B4%D8%AC%D8%B1%D8%A9-dom-%D8%B9%D8%A8%D8%B1-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA-r1105/" rel="">التنقل في شجرة DOM عبر جافاسكربت</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/javascript/%D8%AA%D8%B9%D8%AF%D9%8A%D9%84-%D8%A7%D9%84%D8%AE%D8%A7%D8%B5%D9%8A%D8%A7%D8%AA-%D9%88%D8%A7%D9%84%D8%A3%D8%B5%D9%86%D8%A7%D9%81-%D9%88%D8%A7%D9%84%D8%A3%D9%86%D9%85%D8%A7%D8%B7-%D9%81%D9%8A-%D8%B4%D8%AC%D8%B1%D8%A9-dom-r689/" rel="">تعديل الخاصيات والأصناف والأنماط في شجرة DOM</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/javascript/%D8%A5%D8%AC%D8%B1%D8%A7%D8%A1-%D8%AA%D8%B9%D8%AF%D9%8A%D9%84%D8%A7%D8%AA-%D8%B9%D9%84%D9%89-dom-r667/" rel="">إجراء تعديلات على DOM</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/javascript/%D8%B7%D8%B1%D9%8A%D9%82%D8%A9-%D8%A7%D9%84%D9%88%D8%B5%D9%88%D9%84-%D9%84%D9%84%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-%D9%81%D9%8A-dom-r647/" rel="">طريقة الوصول للعناصر في DOM</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1353</guid><pubDate>Sat, 13 Nov 2021 16:05:00 +0000</pubDate></item><item><title>&#x645;&#x643;&#x648;&#x646;&#x627;&#x62A; &#x627;&#x644;&#x648;&#x64A;&#x628;: &#x639;&#x646;&#x627;&#x635;&#x631; HTML &#x627;&#x644;&#x645;&#x62E;&#x635;&#x635;&#x629; &#x648;&#x642;&#x648;&#x627;&#x644;&#x628;&#x647;&#x627;</title><link>https://academy.hsoub.com/programming/html/%D9%85%D9%83%D9%88%D9%86%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-html-%D8%A7%D9%84%D9%85%D8%AE%D8%B5%D8%B5%D8%A9-%D9%88%D9%82%D9%88%D8%A7%D9%84%D8%A8%D9%87%D8%A7-r1352/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2021_11/618273771c4c7_--.png.deede3cfd75f7cd566919ced8e1234fa.png" /></p>

<p>
	يصف هذا القسم مجموعةً من المعايير الحديثة لمكونات الويب، وهذه المعايير بصدد التطوير حاليًا. تُدعم بعض الميزات وتتكامل ضمن معايير HTML/<a href="https://academy.hsoub.com/programming/javascript/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-dom-r644/" rel="">DOM</a>، بينما يبقى البعض الآخر في مرحلة الإعداد. ويمكنك تجربة الأمثلة في أي متصفح، لكن يبقى <a href="https://academy.hsoub.com/marketing/performance-marketing/analytics/20-%D8%A3%D8%AF%D8%A7%D8%A9-%D8%AA%D8%B3%D9%88%D9%8A%D9%82%D9%8A%D8%A9-%D9%84%D8%A7-%D8%AA%D8%B9%D8%B1%D9%81%D9%87%D8%A7-%D8%B9%D9%86-%D8%A7%D9%84%D9%85%D8%AA%D8%B5%D9%81%D8%AD-chrome-r351/" rel="">المتصفح كروم Chrome</a> الأكثر حداثةً فيما يتعلق بدعم هذه الميزات، والسبب طبعًا هو أنّ أشخاصًا من Google هم من وضعوا العديد من هذه المواصفات.
</p>

<h2>
	ما هو الشيء المشترك بين محطة الفضاء ومكونات الويب
</h2>

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

<p style="text-align: center;">
	<img alt="space_station_01.png" class="ipsImage ipsImage_thumbnailed" data-fileid="80755" data-unique="e04cac0kb" src="https://academy.hsoub.com/uploads/monthly_2021_10/space_station_01.png.7d2b65781137d64db4b27031a6e8241b.png" style="width: 450px; height: auto;"></p>

<p>
	إنها محطة الفضاء الدولية، وتمثل الصورة التالية المكوِّنات التي تتألف منها -تقريبيًا طبعًا-:
</p>

<p style="text-align: center;">
	<img alt="space_station_components_02.png" class="ipsImage ipsImage_thumbnailed" data-fileid="80756" data-unique="2ob0qx1y2" src="https://academy.hsoub.com/uploads/monthly_2021_10/space_station_components_02.png.4e0329ac768e82746e53a790e1a23702.png" style="width: 450px; height: auto;"></p>

<p>
	نلاحظ الآتي:
</p>

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

<h2>
	معمارية المكون
</h2>

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

<p>
	يمكن تقسيم <a href="https://academy.hsoub.com/design/user-interface/%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A5%D9%84%D9%89-%D8%AA%D9%87%D9%8A%D8%A6%D8%A9-%D9%88%D8%A7%D8%AC%D9%87%D8%A9-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-ui-r652/" rel="">واجهة المستخدم</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/" rel="">موقع ويب</a>، وليكن تويتر مثلًا، يُقسم الموقع إلى مكوّنات:
</p>

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

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

<p>
	للمكوِّن:
</p>

<ul>
<li>
		<a data-ss1635238889="1" href="https://academy.hsoub.com/programming/javascript/%D8%AA%D8%B9%D8%AF%D9%8A%D9%84-%D8%A7%D9%84%D8%AE%D8%A7%D8%B5%D9%8A%D8%A7%D8%AA-%D9%88%D8%A7%D9%84%D8%A3%D8%B5%D9%86%D8%A7%D9%81-%D9%88%D8%A7%D9%84%D8%A3%D9%86%D9%85%D8%A7%D8%B7-%D9%81%D9%8A-%D8%B4%D8%AC%D8%B1%D8%A9-dom-r689/" rel="">صنف JavaScript</a> خاص به.
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D8%A8%D9%86%D9%8A%D8%A9-%D8%A7%D9%84%D8%B4%D8%AC%D8%B1%D9%8A%D8%A9-%D9%84%D9%80-dom-r646/" rel="">بنية DOM </a>تُدار منفردةً من قبل الصنف الخاص بها، ولا يمكن الوصول إليها من قبل شيفرة خارجية (مبدأ التغليف).
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D8%B3%D8%B1%D9%8A%D8%B9-%D8%A5%D9%84%D9%89-%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%AA%D9%86%D8%B3%D9%8A%D9%82-css-r551/" rel="">تنسيق CSS</a> يُطبَّق على المكوّن.
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D9%88%D8%A7%D8%AC%D9%87%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-api-r1314/" rel="">واجهة برمجية <abbr title="Application Programming Interface | واجهة برمجية">API</abbr></a>، أحداث وتوابع يستخدمها الصنف وغيره من الكائنات التي تتفاعل مع المكوّنات الأخرى.
	</li>
</ul>
<p>
	تذكر أنّ فكرة الكائن ككل لا تفرض وجود أي شيء خاص.
</p>

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

<p>
	تزوّدنا مكوِّنات الويب بإمكانيات تصفّح مدمجةً معها ولا حاجة لمحاولة تقليدها بعد الآن.
</p>

<ul>
<li>
		عناصر مخصصة <a data-ss1635238889="1" href="https://html.spec.whatwg.org/multipage/custom-elements.html#custom-elements" rel="external nofollow">Custom elements</a>: لتعريف <a href="https://wiki.hsoub.com/HTML#.D8.A7.D9.84.D8.B9.D9.86.D8.A7.D8.B5.D8.B1_.D8.A7.D9.84.D8.AA.D9.82.D8.B3.D9.8A.D9.85.D9.8A.D8.A9" rel="external">عناصر HTML</a> مخصصة.
	</li>
	<li>
		شجرة DOM مخفية <a data-ss1635238889="1" href="https://dom.spec.whatwg.org/#shadow-trees" rel="external nofollow">Shadow DOM</a>: لإنشاء شجرة داخلية للمكوّن مخفية عن بقية المكوّنات.
	</li>
	<li>
		مجال لتطبيق أوراق التنسيق <a data-ss1635238889="1" href="https://drafts.csswg.org/css-scoping/" rel="external nofollow">CSS Scoping</a>: لتعريف قواعد تنسيق يمكن تطبيقها على الشجرة الداخلية لمكوّن.
	</li>
	<li>
		إعادة توجيه الحدث <a data-ss1635238889="1" href="https://dom.spec.whatwg.org/#retarget" rel="external nofollow">Event retargeting</a> وغيره من الأمور الثانوية: لتحسين قدرة المكوّنات على التلاؤم مع عملية التطوير.
	</li>
</ul>
<p>
	كل الميزات المدعومة جيدًا لمكوّنات الويب جيدة في الأمور التي تقدر على تنفيذها.
</p>

<h2>
	عناصر HTML المخصصة
</h2>

<p>
	يمكننا إنشاء عناصر HTML مخصصة يصفها الصنف الذي ننشئه لهذا الغرض مزوّدًا بتوابعه وخصائصه وأحداثه الخاصة، وسنتمكن من استخدام العنصر ضمن عناصر HTML الأصلية بعد أن نعرّفه، وهذا أمر جيد، فعلى الرغم من غنى HTML بالعناصر، إلا أنها لا تحوي عناصرًا مثل علامة جداول سهلة التعامل <code>&lt;easy-tabs&gt;</code> أو سير دائري منزلق <code>&lt;sliding-carousel&gt;</code> أو الرفع بطريقة جذابة <code>&lt;beautiful-upload&gt;</code> أو أي عناصر أخرى قد نحتاجها.
</p>

<p>
	يمكن تعريف العناصر المخصصة ضمن أصناف خاصة، واستخدامها كما لو أنها جزء من HTML، ويوجد نوعان من هذه العناصر المخصصة، وهما:
</p>

<ol>
<li>
		عناصر مخصصة ذاتية التصرف Autonomous: وهي عناصر جديدة توّسع عمل الصنف المجرّد <code>HTMLElement</code>.
	</li>
	<li>
		عناصر أصلية مخصصة customized: توسّع العناصر الأصلية، لإنجاز أزرار مخصصة مبنية على أساس الصنف <code>HTMLButtonElement</code> مثلًا.
	</li>
</ol>
<p>
	سنغطي أولًا العناصر ذاتية التصرف، ثم سننتقل إلى العناصر المخصصة، ولإنشاء عنصر مخصص لا بدّ من إخبار المتصفح عن جملة من التفاصيل حوله، مثل كيف سيُظهره؟ وماذا سيفعل عند إضافته أو إزالته من الصفحة؟ يجري ذلك بإنشاء صنف له توابعه الخاصة، وسيكون الأمر بسيطًا، فهي عدة توابع فقط وجميعها اختيارية.
</p>

<p>
	إليك تصورًا مع قائمة كاملة من التوابع:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2163_6" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">MyElement</span><span class="pln"> extends </span><span class="typ">HTMLElement</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  constructor</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    super</span><span class="pun">();</span><span class="pln">
    </span><span class="com">// إنشاء العنصر</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  connectedCallback</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">

  disconnectedCallback</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">static</span><span class="pln"> </span><span class="kwd">get</span><span class="pln"> observedAttributes</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="com">/* مصفوفة من أسماء السمات التي تراقب التغيرات */</span><span class="pun">];</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  attributeChangedCallback</span><span class="pun">(</span><span class="pln">name</span><span class="pun">,</span><span class="pln"> oldValue</span><span class="pun">,</span><span class="pln"> newValue</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">

  adoptedCallback</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="com">// إن كان هناك عناصر أو سمات أخرى</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	نحتاج بعد ذلك إلى تسجيل العنصر:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2163_9" style="">
<span class="com">// سيُخدّم من قبل الصنف الجديد &lt;my-element&gt; أبلغ المتصفح أن </span><span class="pln">
customElements</span><span class="pun">.</span><span class="pln">define</span><span class="pun">(</span><span class="str">"my-element"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">MyElement</span><span class="pun">);</span></pre>

<p>
	ستتولد الآن نسخة عن الصنف <code>MyElement</code> لكل عنصر HTML له الوسم <code>&lt;my-element&gt;</code>، وستستدعى التوابع المذكورة. كما يمكن تنفيذ ذلك باستخدام شيفرة JavaScript كالتالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2163_11" style="">
<span class="pln">document</span><span class="pun">.</span><span class="pln">createElement</span><span class="pun">(</span><span class="str">'my-element'</span><span class="pun">)</span></pre>

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

	<p>
		يجب أن يحتوي اسم العنصر المخصص على الواصلة "-"، فبعض الأسماء مثل <code>my-element</code> و<code>super-button</code>، هي أسماء مقبولة، لكن الاسم <code>myelement</code> مرفوض، وذلك لمنع التضارب مع عناصر HTML الأصلية.
	</p>
</blockquote>

<h3>
	مثال عنصر لتنسيق الوقت
</h3>

<p>
	يُستخدم العنصر الأصلي <code>&lt;time&gt;</code> لإظهار الوقت والتاريخ، لكنه لا يقدم أي تنسيق للبيانات التي يعطيها، لننشئ إذًا العنصر <code>&lt;time-formatted&gt;</code> الذي يعرض الوقت بتنسيق جميل يأخذ اللغة بالحسبان:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2163_13" style="">
<span class="tag">&lt;script&gt;</span><span class="pln">
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">TimeFormatted</span><span class="pln"> extends </span><span class="typ">HTMLElement</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="com">// (1)</span><span class="pln">

  connectedCallback</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    let date </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Date</span><span class="pun">(</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">getAttribute</span><span class="pun">(</span><span class="str">'datetime'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">||</span><span class="pln"> </span><span class="typ">Date</span><span class="pun">.</span><span class="pln">now</span><span class="pun">());</span><span class="pln">

    </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">innerHTML </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Intl</span><span class="pun">.</span><span class="typ">DateTimeFormat</span><span class="pun">(</span><span class="str">"default"</span><span class="pun">,</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      year</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">getAttribute</span><span class="pun">(</span><span class="str">'year'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">||</span><span class="pln"> </span><span class="kwd">undefined</span><span class="pun">,</span><span class="pln">
      month</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">getAttribute</span><span class="pun">(</span><span class="str">'month'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">||</span><span class="pln"> </span><span class="kwd">undefined</span><span class="pun">,</span><span class="pln">
      day</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">getAttribute</span><span class="pun">(</span><span class="str">'day'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">||</span><span class="pln"> </span><span class="kwd">undefined</span><span class="pun">,</span><span class="pln">
      hour</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">getAttribute</span><span class="pun">(</span><span class="str">'hour'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">||</span><span class="pln"> </span><span class="kwd">undefined</span><span class="pun">,</span><span class="pln">
      minute</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">getAttribute</span><span class="pun">(</span><span class="str">'minute'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">||</span><span class="pln"> </span><span class="kwd">undefined</span><span class="pun">,</span><span class="pln">
      second</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">getAttribute</span><span class="pun">(</span><span class="str">'second'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">||</span><span class="pln"> </span><span class="kwd">undefined</span><span class="pun">,</span><span class="pln">
      timeZoneName</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">getAttribute</span><span class="pun">(</span><span class="str">'time-zone-name'</span><span class="pun">)</span><span class="pln"> </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">format</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="pun">}</span><span class="pln">

customElements</span><span class="pun">.</span><span class="pln">define</span><span class="pun">(</span><span class="str">"time-formatted"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">TimeFormatted</span><span class="pun">);</span><span class="pln"> </span><span class="com">// (2)</span><span class="pln">
</span><span class="tag">&lt;/script&gt;</span><span class="pln">

</span><span class="com">&lt;!-- (3) --&gt;</span><span class="pln">
</span><span class="tag">&lt;time-formatted</span><span class="pln"> </span><span class="atn">datetime</span><span class="pun">=</span><span class="atv">"2019-12-01"</span><span class="pln">
  </span><span class="atn">year</span><span class="pun">=</span><span class="atv">"numeric"</span><span class="pln"> </span><span class="atn">month</span><span class="pun">=</span><span class="atv">"long"</span><span class="pln"> </span><span class="atn">day</span><span class="pun">=</span><span class="atv">"numeric"</span><span class="pln">
  </span><span class="atn">hour</span><span class="pun">=</span><span class="atv">"numeric"</span><span class="pln"> </span><span class="atn">minute</span><span class="pun">=</span><span class="atv">"numeric"</span><span class="pln"> </span><span class="atn">second</span><span class="pun">=</span><span class="atv">"numeric"</span><span class="pln">
  </span><span class="atn">time-zone-name</span><span class="pun">=</span><span class="atv">"short"</span><span class="pln">
</span><span class="tag">&gt;&lt;/time-formatted&gt;</span></pre>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" data-ss1635238889="1" frameborder="no" height="155" loading="lazy" scrolling="no" src="https://codepen.io/Hsoub/embed/jOLBjNV?default-tab=html%2Cresult" style="width: 100%;" title="JS-p3-06-Custom-elements -ex1">See the Pen JS-p3-06-Custom-elements -ex1 by Hsoub (@Hsoub) on CodePen.</iframe>
</p>

<ol>
<li>
		تشير (1) إلى الصنف تابع واحد فقط هو <code>()connectedCallback</code>، حيث يستدعيه المتصفح عندما يُضاف العنصر إلى الصفحة، أو عندما يكتشف مفسّر HTML وجوده، ويستخدم العنصر تابع تنسيق البيانات المدمج <a data-ss1635238889="1" href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat" rel="external nofollow">Intl.DateTimeFormat</a> الذي يلقى دعمًا جيدًا من معظم المتصفحات لعرض الوقت بتنسيق جميل.
	</li>
	<li>
		تعني (2) أنه لا بدّ من تسجيل العنصر الجديد باستخدام الأمر <code>(customElements.define(tag, class)</code>.
	</li>
	<li>
		تعني (3) أنه يمكن الآن استخدام العنصر في أي مكان.
	</li>
</ol>
<h4>
	تحديث العنصر المخصص
</h4>

<p>
	إذا صادف المتصفح العنصر <code>&lt;time-formatted&gt;</code> قبل عبارة التعريف <code>customElements.define</code> فلن يعدّ ذلك خطأً، بل سيعدّه مجرد عنصر غير معروف مثل أي وسم غير معياري، ويمكن تنسيق هذه العناصر غير المعروفة باستخدام المحدد <code>(not(:defined:</code>، وهو أحد <a href="http://xn--selectors--css-ubs6h" rel="external nofollow">محددات CSS.</a> ستُحدّث هذه العناصر عندما يُستدعى التابع <code>customElement.define</code>، وستتولد نسخة من الصنف <code>TimeFormatted</code> لكلٍّ منها، ثم يُستدعى التابع <code>connectedCallback</code> وتتحول إلى عناصر معرّفة <code>defined:</code>.
</p>

<p>
	توجد توابع عدة للحصول على معلومات عن عناصر مخصصة:
</p>

<ul>
<li>
		<code>(customElements.get(name</code>: يعيد الصنف الخاص بالعنصر الذي يحمل الاسم المحدد <code>name</code>.
	</li>
	<li>
		<code>(customElements.whenDefined(name</code>: يعيد وعدًا promise يحَلَّ -دون قيمة- عندما يُعرَّف العنصر المخصص الذي له الاسم <code>name</code> المحدد.
	</li>
</ul>
<h4>
	التصيير داخل connectedCallback لا في constructor
</h4>

<p>
	رأينا في المثال السابق كيف جرى تصيير محتوى العنصر ضمن التابع <code>connectedCallback</code>، لكن لماذا لم يُصيّر ضمن الدالة البانية <code>constructor</code>؟
</p>

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

<p>
	يقع الحدث <code>connectedCallback</code> عندما يُضاف العنصر إلى الصفحة، ولن يُضاف إلى عنصر آخر مثل ابن فقط، بل سيغدو عمليًا جزءًا من الصفحة، وهكذا سنتمكن من بناء <a data-ss1635238889="1" href="https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D8%A8%D9%86%D9%8A%D8%A9-%D8%A7%D9%84%D8%B4%D8%AC%D8%B1%D9%8A%D8%A9-%D9%84%D9%80-dom-r646/" rel="">شجرة DOM</a> منفصلة، وإنشاء عناصر وتحضيرها للعمل لاحقًا، وستصيّر هذه العناصر فعليًا عندما تُضاف إلى الصفحة.
</p>

<h2>
	مراقبة السمات
</h2>

<p>
	ليس لتغير السمات attribute في الطريقة الحالية لتنفيذ العنصر <code>&lt;time-formatted&gt;</code> أي تأثير بعد تصييره، وهذا غريب بالنسبة إلى عنصر HTML، فعندما نغيّر في صفة مثل <code>a.href</code>، فسنتوقع عادةً أن نرى التغير مباشرةً. نصلح هذا الأمر إذًا.
</p>

<p>
	يمكن مراقبة السمات بتزويد دالة الإحضار الساكنة <code>()observedAttributes</code> بقائمة تضم أسماءهم، وهكذا ستُستدعى الدالة <code>attributeChangedCallback</code> عندما نجري أي تعديلات على تلك السمات. لن يقع هذا الحدث بالطبع عندما تتغير سمات غير مدرجة في القائمة، لأسباب تتعلق بالأداء.
</p>

<p>
	إليك شيفرة العنصر <code>&lt;time-formatted&gt;</code> الذي يُحدَّث تلقائيًا عندما تتغير سماته:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2163_15" style="">
<span class="tag">&lt;script&gt;</span><span class="pln">
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">TimeFormatted</span><span class="pln"> extends </span><span class="typ">HTMLElement</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

  render</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="com">// (1)</span><span class="pln">
    let date </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Date</span><span class="pun">(</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">getAttribute</span><span class="pun">(</span><span class="str">'datetime'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">||</span><span class="pln"> </span><span class="typ">Date</span><span class="pun">.</span><span class="pln">now</span><span class="pun">());</span><span class="pln">

    </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">innerHTML </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Intl</span><span class="pun">.</span><span class="typ">DateTimeFormat</span><span class="pun">(</span><span class="str">"default"</span><span class="pun">,</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      year</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">getAttribute</span><span class="pun">(</span><span class="str">'year'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">||</span><span class="pln"> </span><span class="kwd">undefined</span><span class="pun">,</span><span class="pln">
      month</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">getAttribute</span><span class="pun">(</span><span class="str">'month'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">||</span><span class="pln"> </span><span class="kwd">undefined</span><span class="pun">,</span><span class="pln">
      day</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">getAttribute</span><span class="pun">(</span><span class="str">'day'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">||</span><span class="pln"> </span><span class="kwd">undefined</span><span class="pun">,</span><span class="pln">
      hour</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">getAttribute</span><span class="pun">(</span><span class="str">'hour'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">||</span><span class="pln"> </span><span class="kwd">undefined</span><span class="pun">,</span><span class="pln">
      minute</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">getAttribute</span><span class="pun">(</span><span class="str">'minute'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">||</span><span class="pln"> </span><span class="kwd">undefined</span><span class="pun">,</span><span class="pln">
      second</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">getAttribute</span><span class="pun">(</span><span class="str">'second'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">||</span><span class="pln"> </span><span class="kwd">undefined</span><span class="pun">,</span><span class="pln">
      timeZoneName</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">getAttribute</span><span class="pun">(</span><span class="str">'time-zone-name'</span><span class="pun">)</span><span class="pln"> </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">format</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">

  connectedCallback</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="com">// (2)</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">rendered</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">render</span><span class="pun">();</span><span class="pln">
      </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">rendered </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">get</span><span class="pln"> observedAttributes</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="com">// (3)</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> </span><span class="pun">[</span><span class="str">'datetime'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'year'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'month'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'day'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'hour'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'minute'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'second'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'time-zone-name'</span><span class="pun">];</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  attributeChangedCallback</span><span class="pun">(</span><span class="pln">name</span><span class="pun">,</span><span class="pln"> oldValue</span><span class="pun">,</span><span class="pln"> newValue</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="com">// (4)</span><span class="pln">
    </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">render</span><span class="pun">();</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

</span><span class="pun">}</span><span class="pln">

customElements</span><span class="pun">.</span><span class="pln">define</span><span class="pun">(</span><span class="str">"time-formatted"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">TimeFormatted</span><span class="pun">);</span><span class="pln">
</span><span class="tag">&lt;/script&gt;</span><span class="pln">

</span><span class="tag">&lt;time-formatted</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"elem"</span><span class="pln"> </span><span class="atn">hour</span><span class="pun">=</span><span class="atv">"numeric"</span><span class="pln"> </span><span class="atn">minute</span><span class="pun">=</span><span class="atv">"numeric"</span><span class="pln"> </span><span class="atn">second</span><span class="pun">=</span><span class="atv">"numeric"</span><span class="tag">&gt;&lt;/time-formatted&gt;</span><span class="pln">

</span><span class="tag">&lt;script&gt;</span><span class="pln">
setInterval</span><span class="pun">(()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> elem</span><span class="pun">.</span><span class="pln">setAttribute</span><span class="pun">(</span><span class="str">'datetime'</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Date</span><span class="pun">()),</span><span class="pln"> </span><span class="lit">1000</span><span class="pun">);</span><span class="pln"> </span><span class="com">// (5)</span><span class="pln">
</span><span class="tag">&lt;/script&gt;</span></pre>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" data-ss1635238889="1" frameborder="no" height="152" loading="lazy" scrolling="no" src="https://codepen.io/Hsoub/embed/eYEvwme?default-tab=html%2Cresult" style="width: 100%;" title="JS-p3-06-Custom-elements -ex2">See the Pen JS-p3-06-Custom-elements -ex2 by Hsoub (@Hsoub) on CodePen.</iframe>
</p>

<ol>
<li>
		يُقصَد بـ (1) أنه قد نُقل منطق التصيير إلى التابع المساعد <code>&lt;time-formatted&gt;</code>.
	</li>
	<li>
		تعني (2) أن هذا التابع يُستدعى مباشرةً في اللحظة التي يضاف فيها العنصر إلى الصفحة.
	</li>
	<li>
		تعني (3) أنه يقع الحدث <code>attributeChangedCallback</code> عند حدوث أي تغير في السمات التي مررت على شكل قائمة إلى <code>()observedAttributes</code>
	</li>
	<li>
		تعني (4) أنه يُعاد تصيير العنصر بعد ذلك.
	</li>
	<li>
		تعني (5) أنه في النهاية يمكننا إنشاء مؤقت مباشر بكل سهولة.
	</li>
</ol>
<h2>
	تسلسل التصيير
</h2>

<p>
	عندما يبني مفسِّر HTML الشجرة DOM، تعالَج العناصر الواحد تلو الآخر والأب قبل الابن، فلو كان لدينا العنصر:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2163_17" style="">
<span class="pun">&lt;</span><span class="pln">outer</span><span class="pun">&gt;&lt;</span><span class="pln">inner</span><span class="pun">&gt;&lt;</span><span class="str">/inner&gt;&lt;/</span><span class="pln">outer</span><span class="pun">&gt;</span></pre>

<p>
	فسيتولد العنصر <code>&lt;outer&gt;</code> أولًا ويضاف إلى DOM، ثم العنصر <code>&lt;inner&gt;</code>، وسيقود ذلك إلى تبعات بالنسبة للعناصر المخصصة، فإذا أراد العنصر المخصص الوصول إلى <code>innerHTML</code> ضمن <code>connectedCallback</code> مثلًا، فلن يحصل على شيء.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2163_19" style="">
<span class="tag">&lt;script&gt;</span><span class="pln">
customElements</span><span class="pun">.</span><span class="pln">define</span><span class="pun">(</span><span class="str">'user-info'</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> extends </span><span class="typ">HTMLElement</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

  connectedCallback</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    alert</span><span class="pun">(</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">innerHTML</span><span class="pun">);</span><span class="pln"> </span><span class="com">// empty (*)</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

</span><span class="pun">});</span><span class="pln">
</span><span class="tag">&lt;/script&gt;</span><span class="pln">

</span><span class="tag">&lt;user-info&gt;</span><span class="pln">محمد</span><span class="tag">&lt;/user-info&gt;</span></pre>

<p>
	إذا نفّذت الشيفرة السابقة فستظهر الرسالة <code>alert</code> فارغة، والسبب في ذلك هو عدم وجود عناصر أبناء في هذه المرحلة، وستكون الشجرة DOM غير مكتملة، يربط مفسِّر HTML العنصر المخصص <code>&lt;user-info&gt;</code> وسيستأنف العمل بعدها لربط أبنائه لكنه لم يفعلها بعد.
</p>

<p>
	إذا أردنا تمرير معلومات إلى عنصر مخصص، فيمكننا استخدام السمات فهي متاحة مباشرةً، وإذا كنا بحاجة فعلًا إلى الأبناء، فيمكن تأجيل الوصول إليهم باستخدام الحدث <code>setTimeout</code>دون تأخير زمني Zero-delay.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2163_21" style="">
<span class="tag">&lt;script&gt;</span><span class="pln">
customElements</span><span class="pun">.</span><span class="pln">define</span><span class="pun">(</span><span class="str">'user-info'</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> extends </span><span class="typ">HTMLElement</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

  connectedCallback</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    setTimeout</span><span class="pun">(()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> alert</span><span class="pun">(</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">innerHTML</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><span class="pln">
</span><span class="tag">&lt;/script&gt;</span><span class="pln">

</span><span class="tag">&lt;user-info&gt;</span><span class="pln">John</span><span class="tag">&lt;/user-info&gt;</span></pre>

<p>
	وهكذا ستُظهر الرسالة <code>alert</code> في السطر (*) الكلمة "محمد" طالما أننا ننفذ الأمر دون تزامن، وذلك بعد اكتمال تفسير شيفرة HTML، ويمكن معالجة الأبناء إذا اقتضى الأمر ثم إنهاء مرحلة التهيئة، لكن هذا الحل ليس مثاليًا.
</p>

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

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2163_23" style="">
<span class="tag">&lt;script&gt;</span><span class="pln">
customElements</span><span class="pun">.</span><span class="pln">define</span><span class="pun">(</span><span class="str">'user-info'</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> extends </span><span class="typ">HTMLElement</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  connectedCallback</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    alert</span><span class="pun">(`</span><span class="pln">$</span><span class="pun">{</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">id</span><span class="pun">}</span><span class="pln"> connected</span><span class="pun">.`);</span><span class="pln">
    setTimeout</span><span class="pun">(()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> alert</span><span class="pun">(`</span><span class="pln">$</span><span class="pun">{</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">id</span><span class="pun">}</span><span class="pln"> initialized</span><span class="pun">.`));</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">});</span><span class="pln">
</span><span class="tag">&lt;/script&gt;</span><span class="pln">

</span><span class="tag">&lt;user-info</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"outer"</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;user-info</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"inner"</span><span class="tag">&gt;&lt;/user-info&gt;</span><span class="pln">
</span><span class="tag">&lt;/user-info&gt;</span></pre>

<p>
	تسلسل الخرج:
</p>

<ol>
<li>
		يُربط العنصر الخارجي بالشجرة.
	</li>
	<li>
		يُربط العنصر الداخلي.
	</li>
	<li>
		يُهيأ العنصر الخارجي.
	</li>
	<li>
		يُهيأ العنصر الداخلي.
	</li>
</ol>
<p>
	يمكننا أن نرى بوضوح أن العنصر الخارجي سينهي تهيئة نفسه (الخطوة 3) قبل الداخلي (الخطوة 4)، ولا يوجد استدعاء مدمج يمكن أن يقع بعد أن يصبح العنصر ضمن الشجرة، كما يمكن تنفيذ استدعاء مثل هذا عند الحاجة بأنفسنا، حيث يمكن للعناصر الداخلية إرسال أحداث مثل <code>initialized</code> تستمع إليها العناصر الخارجية وتتفاعل معها.
</p>

<h2>
	العناصر الأصلية المخصصة
</h2>

<p>
	ليس للعناصر المخصصة -مثل <code>&lt;time-formatted&gt;</code>- أي دلالات تتعلق بها، فهي غير معروفة لمحركات البحث مثلًا، ولا تستطيع الأجهزة التي تدعم مبدأ الوصول السهل accessibility التعامل معها. قد تكون هذه الأشياء مهمةً، فقد يرغب محرّك البحث بمعرفة أن هذا العنصر سيظهر الوقت، فإذا أنشأنا نوعًا خاصًا من الأزرار، فلماذا لا يمكننا إعادة استخدام وظيفة الزر الأصلي <code>&lt;button&gt;</code>؟
</p>

<p>
	يمكننا توسيع وتخصيص العناصر الأصلية بالوراثة من أصنافها، فالأزرار مثلًا هي نسخ عن الصنف <code>HTMLButtonElement</code>، ولإنشاء عنصر يرث منه ويوسّعه عليك باتباع الآتي:
</p>

<ol>
<li>
		وسِّع الصنف <code>HTMLButtonElement</code> عن طريق الصنف الذي سننشئه:
	</li>
</ol>
<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2163_25" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">HelloButton</span><span class="pln"> extends </span><span class="typ">HTMLButtonElement</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="com">/* custom element methods */</span><span class="pln"> </span><span class="pun">}</span></pre>

<ol start="2">
<li>
		أعط قيمةً للوسيط الثالث للدالة <code>customElements.define</code> والذي يمثّل الوسم tag المستهدف:
	</li>
</ol>
<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2163_27" style="">
<span class="pln">customElements</span><span class="pun">.</span><span class="pln">define</span><span class="pun">(</span><span class="str">'hello-button'</span><span class="pun">,</span><span class="pln"> </span><span class="typ">HelloButton</span><span class="pun">,</span><span class="pln"> </span><span class="pun">{</span><span class="pln">extends</span><span class="pun">:</span><span class="pln"> </span><span class="str">'button'</span><span class="pun">});</span></pre>

<p>
	يمكن أن تشترك وسوم مختلفة بصنف DOM، لذلك سنحتاج إلى استخدام التعليمة <code>extends</code>.
</p>

<ol start="3">
<li>
		لكي نستخدم أخيرًا العنصر المخصص، استخدم الوسم الأصلي النظامي <code>&lt;button&gt;</code>، لكن أضف إليه الصفة <code>"is="hello-button</code>.
	</li>
</ol>
<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2163_29" style="">
<span class="tag">&lt;button</span><span class="pln"> </span><span class="atn">is</span><span class="pun">=</span><span class="atv">"hello-button"</span><span class="tag">&gt;</span><span class="pln">...</span><span class="tag">&lt;/button&gt;</span></pre>

<p>
	إليك المثال كاملًا:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2163_31" style="">
<span class="tag">&lt;script&gt;</span><span class="pln">
</span><span class="com">// عند ضغطه "hello" الزر الذي يظهر </span><span class="pln">
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">HelloButton</span><span class="pln"> extends </span><span class="typ">HTMLButtonElement</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  constructor</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    super</span><span class="pun">();</span><span class="pln">
    </span><span class="kwd">this</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"> </span><span class="pun">()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> alert</span><span class="pun">(</span><span class="str">"Hello!"</span><span class="pun">));</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

customElements</span><span class="pun">.</span><span class="pln">define</span><span class="pun">(</span><span class="str">'hello-button'</span><span class="pun">,</span><span class="pln"> </span><span class="typ">HelloButton</span><span class="pun">,</span><span class="pln"> </span><span class="pun">{</span><span class="pln">extends</span><span class="pun">:</span><span class="pln"> </span><span class="str">'button'</span><span class="pun">});</span><span class="pln">
</span><span class="tag">&lt;/script&gt;</span><span class="pln">

</span><span class="tag">&lt;button</span><span class="pln"> </span><span class="atn">is</span><span class="pun">=</span><span class="atv">"hello-button"</span><span class="tag">&gt;</span><span class="pln">Click me</span><span class="tag">&lt;/button&gt;</span><span class="pln">

</span><span class="tag">&lt;button</span><span class="pln"> </span><span class="atn">is</span><span class="pun">=</span><span class="atv">"hello-button"</span><span class="pln"> </span><span class="atn">disabled</span><span class="tag">&gt;</span><span class="pln">Disabled</span><span class="tag">&lt;/button&gt;</span></pre>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" data-ss1635238889="1" frameborder="no" height="156" loading="lazy" scrolling="no" src="https://codepen.io/Hsoub/embed/GRvWboR?default-tab=html%2Cresult" style="width: 100%;" title="JS-p3-06-Custom-elements -ex3">See the Pen JS-p3-06-Custom-elements -ex3 by Hsoub (@Hsoub) on CodePen.</iframe>
</p>

<p>
	يوسِّع الزر الجديد الزر الأصلي، وبالتالي سيحتفظ بتنسيق وميزات الزر الأصلي مثل الصفة <code>disabled</code>.
</p>

<h2>
	قوالب HTML
</h2>

<p>
	يقدم العنصر الأصلي <code>&lt;template&gt;</code> قوالبًا لتخزين شيفرة HTML ويتجاهل محتوياتها، ويتحقق من صحة التركيب اللغوي للشيفرة ضمنها حصرًا، لكن يمكن الوصول إليها واستخدامها في إنشاء عناصر أخرى.
</p>

<p>
	يمكن نظريًا إنشاء أي عناصر مخفية ضمن ملف HTML لتخزين شيفرة HTML، فما الغاية من <code>&lt;template&gt;</code>؟
</p>

<p>
	أولًا: قد يحتوي على أي شيفرة HTM صالحة، حتى تلك التي تتطلب عادةً وسم إغلاق Closing tag، فيمكن أن نضع ضمنها أسطر جدول <code>&lt;tr&gt;</code>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2163_33" style="">
<span class="tag">&lt;template&gt;</span><span class="pln">
  </span><span class="tag">&lt;tr&gt;</span><span class="pln">
    </span><span class="tag">&lt;td&gt;</span><span class="pln">Contents</span><span class="tag">&lt;/td&gt;</span><span class="pln">
  </span><span class="tag">&lt;/tr&gt;</span><span class="pln">
</span><span class="tag">&lt;/template&gt;</span></pre>

<p>
	عندما نحاول عادةً وضع <code>&lt;tr&gt;</code> ضمن <code>&lt;div&gt;</code> مثلًا، فسيكتشف المتصفح الخطأ في بنية DOM ويصلحها بإضافة الوسم <code>&lt;table&gt;</code> وجعل السطر ضمنه تلقائيًا. من الناحية الأخرى سيُبقي <code>&lt;template&gt;</code> ما وضعناه في المكان الذي وضعناه فيه دون تعديل.
</p>

<p>
	يمكننا وضع تنسيقات وسكربتات ضمن <code>&lt;template&gt;</code> أيضًا:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2163_35" style="">
<span class="tag">&lt;template&gt;</span><span class="pln">
  </span><span class="tag">&lt;style&gt;</span><span class="pln">
    p </span><span class="pun">{</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 class="pun">}</span><span class="pln">
  </span><span class="tag">&lt;/style&gt;</span><span class="pln">
  </span><span class="tag">&lt;script&gt;</span><span class="pln">
    alert</span><span class="pun">(</span><span class="str">"Hello"</span><span class="pun">);</span><span class="pln">
  </span><span class="tag">&lt;/script&gt;</span><span class="pln">
</span><span class="tag">&lt;/template&gt;</span></pre>

<p>
	يَعُد المتصفح محتويات <code>&lt;template&gt;</code> "خارج المستند"، أي لن تُطبق قواعد التنسيق الموجودة ضمنه ولن يعمل <code>&lt;video autoplay&gt;</code>، كما سيُصبح المحتوى حيًا -أي يُطبَّق التنسيق وتنفَّذ السكربتات- عندما ندرجه ضمن المستند.
</p>

<h3>
	إدراج القالب
</h3>

<p>
	يُتاح محتوى قالب ضمن الخاصية <code>content</code> العائدة له على شكل عقدة من النوع <a data-ss1635238889="1" href="https://javascript.info/modifying-document#document-fragment" rel="external nofollow">DocumentFragment</a>، وهي نوع خاص من عقد DOM، ويمكن التعامل معها مثلما نتعامل مع أي عقدة DOM عدا خاصية واحدة مميزة، وهي إدراج الأبناء بدلًا من العقدة عندما نحاول إدراجها، فعلى سبيل المثال:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2163_37" style="">
<span class="tag">&lt;template</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"tmpl"</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;script&gt;</span><span class="pln">
    alert</span><span class="pun">(</span><span class="str">"Hello"</span><span class="pun">);</span><span class="pln">
  </span><span class="tag">&lt;/script&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">"message"</span><span class="tag">&gt;</span><span class="pln">Hello, world!</span><span class="tag">&lt;/div&gt;</span><span class="pln">
</span><span class="tag">&lt;/template&gt;</span><span class="pln">

</span><span class="tag">&lt;script&gt;</span><span class="pln">
  let elem </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">'div'</span><span class="pun">);</span><span class="pln">

  </span><span class="com">// انسخ محتوى القالب لاستخدامه مرات عدة</span><span class="pln">
  elem</span><span class="pun">.</span><span class="pln">append</span><span class="pun">(</span><span class="pln">tmpl</span><span class="pun">.</span><span class="pln">content</span><span class="pun">.</span><span class="pln">cloneNode</span><span class="pun">(</span><span class="kwd">true</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">append</span><span class="pun">(</span><span class="pln">elem</span><span class="pun">);</span><span class="pln">
  </span><span class="com">// سيعمل الآن السكربت الموجود ضمن القالب</span><span class="pln">
</span><span class="tag">&lt;/script&gt;</span></pre>

<p>
	دعونا نعيد كتابة مثال شجرة DOM الخفية في الفصل السابق باستخدام القالب <code>&lt;template&gt;</code>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2163_39" style="">
<span class="tag">&lt;template</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"tmpl"</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;style&gt;</span><span class="pln"> p </span><span class="pun">{</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 class="pun">}</span><span class="pln"> </span><span class="tag">&lt;/style&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">"message"</span><span class="tag">&gt;&lt;/p&gt;</span><span class="pln">
</span><span class="tag">&lt;/template&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">"elem"</span><span class="tag">&gt;</span><span class="pln">Click me</span><span class="tag">&lt;/div&gt;</span><span class="pln">

</span><span class="tag">&lt;script&gt;</span><span class="pln">
  elem</span><span class="pun">.</span><span class="pln">onclick </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">
    elem</span><span class="pun">.</span><span class="pln">attachShadow</span><span class="pun">({</span><span class="pln">mode</span><span class="pun">:</span><span class="pln"> </span><span class="str">'open'</span><span class="pun">});</span><span class="pln">

    elem</span><span class="pun">.</span><span class="pln">shadowRoot</span><span class="pun">.</span><span class="pln">append</span><span class="pun">(</span><span class="pln">tmpl</span><span class="pun">.</span><span class="pln">content</span><span class="pun">.</span><span class="pln">cloneNode</span><span class="pun">(</span><span class="kwd">true</span><span class="pun">));</span><span class="pln"> </span><span class="com">// (*)</span><span class="pln">

    elem</span><span class="pun">.</span><span class="pln">shadowRoot</span><span class="pun">.</span><span class="pln">getElementById</span><span class="pun">(</span><span class="str">'message'</span><span class="pun">).</span><span class="pln">innerHTML </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Hello from the shadows!"</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>
	<iframe allowfullscreen="true" allowtransparency="true" data-ss1635238889="1" frameborder="no" height="162" loading="lazy" scrolling="no" src="https://codepen.io/Hsoub/embed/bGrqPog?default-tab=html%2Cresult" style="width: 100%;" title="JS-p3-06-Template-element -ex1">See the Pen JS-p3-06-Template-element -ex1 by Hsoub (@Hsoub) on CodePen.</iframe>
</p>

<p>
	عندما ننسخ وندرج <code>tmpl.content</code> في السطر (*) مثل عقدة من النوع <code>DocumentFragment</code>، فسيُدرج أبناؤها (<code>&lt;style&gt;</code> و<code>&lt;p&gt;</code>) بدلًا منها، وسيشكلان شجرة DOM الخفية:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2163_42" style="">
<span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"elem"</span><span class="tag">&gt;</span><span class="pln">
  #shadow-root
    </span><span class="tag">&lt;style&gt;</span><span class="pln"> p </span><span class="pun">{</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 class="pun">}</span><span class="pln"> </span><span class="tag">&lt;/style&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">"message"</span><span class="tag">&gt;&lt;/p&gt;</span><span class="pln">
</span><span class="tag">&lt;/div&gt;</span></pre>

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

<p>
	للعناصر المخصصة نوعان: الأول عناصر مخصصة ذاتية التصرف Autonomous، لها وسم خاص جديد وتوسع الصنف <code>HTMLElement</code>، وإليك تخطيط التعريف لهذه العناصر:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2163_44" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">MyElement</span><span class="pln"> extends </span><span class="typ">HTMLElement</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  constructor</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> super</span><span class="pun">();</span><span class="pln"> </span><span class="com">/* ... */</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
  connectedCallback</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">
  disconnectedCallback</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">static</span><span class="pln"> </span><span class="kwd">get</span><span class="pln"> observedAttributes</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="com">/* ... */</span><span class="pun">];</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
  attributeChangedCallback</span><span class="pun">(</span><span class="pln">name</span><span class="pun">,</span><span class="pln"> oldValue</span><span class="pun">,</span><span class="pln"> newValue</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">
  adoptedCallback</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><span class="pln">
customElements</span><span class="pun">.</span><span class="pln">define</span><span class="pun">(</span><span class="str">'my-element'</span><span class="pun">,</span><span class="pln"> </span><span class="typ">MyElement</span><span class="pun">);</span><span class="pln">
</span><span class="com">/* &lt;my-element&gt; */</span></pre>

<p>
	أما النوع الثاني، فهو عناصر أصلية معدَّلة customized: توّسع عناصرًا أصليةً موجودة، وتتطلب وسيطًا ثالثًا للدالة <code>define.</code>، وإلى الصفة <code>"..."=is</code> ضمن وسمها.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2163_46" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">MyButton</span><span class="pln"> extends </span><span class="typ">HTMLButtonElement</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">
customElements</span><span class="pun">.</span><span class="pln">define</span><span class="pun">(</span><span class="str">'my-button'</span><span class="pun">,</span><span class="pln"> </span><span class="typ">MyElement</span><span class="pun">,</span><span class="pln"> </span><span class="pun">{</span><span class="pln">extends</span><span class="pun">:</span><span class="pln"> </span><span class="str">'button'</span><span class="pun">});</span><span class="pln">
</span><span class="com">/* &lt;button is="my-button"&gt; */</span></pre>

<p>
	تدعم معظم المتصفحات العناصر المخصصة جيدًا، كما يوجد <a data-ss1635238889="1" href="https://github.com/webcomponents/polyfills/tree/master/packages/webcomponentsjs" rel="external nofollow">موائم polyfill أي تعويض نقص الدعم للمتصفحات غير المدعومة</a>.
</p>

<ul>
<li>
		قد يكون محتوى <code>&lt;template&gt;</code> أي عناصر HTML صالحة قواعديًا.
	</li>
	<li>
		يعُد المتصفح محتويات <code>&lt;template&gt;</code> خارج المستند، إذ لن يكون لها أي تأثير.
	</li>
	<li>
		يمكن الوصول إلى محتوى القالب <code>template.content</code> من JavaScript، ونسخها لإعادة استخدامها في مكوَّن جديد.
	</li>
	<li>
		الوسم فريد لأن:
		<ol>
<li>
				محتويات القالب <code>&lt;template&gt;</code> ستتعرض إلى تدقيق قواعدي من قِبل المتصفح، وهذا مخالف لاستخدام قالب نصي ضمن سكربت.
			</li>
			<li>
				يُسمح باستخدام وسوم HTML عالية المستوى حتى تلك التي لا يجب استخدامها دون عنصر يغلّفها، مثل <code>&lt;tr&gt;</code> التي ينبغي تغليفها بالوسم <code>&lt;table&gt;</code>.
			</li>
			<li>
				تصبح المحتويات حيّةً -أي تُطبَّق وتُنفَّذ- عندما تُدرج ضمن المستند.
			</li>
		</ol>
</li>
	<li>
		لا يدعم العنصر <code>&lt;template&gt;</code> المُكررات iterator، ولا آليات الربط بقواعد البيانات أو تبديل المتغيرات، لكن يمكن إدراجها في أعلى القالب.
	</li>
</ul>
<h2>
	مهام لإنجازها
</h2>

<h3>
	عنصر توقيت مباشر
</h3>

<p>
	أنشئ العنصر <code>&lt;live-timer&gt;</code> الذي يعرض الوقت الحالي:
</p>

<ol>
<li>
		ينبغي أن يستخدم عنصر التوقيت العنصر <code>&lt;time-formatted&gt;</code> الذي أنشأناه سابقًا، بصورة ضمنية وليس بنسخ وظيفته.
	</li>
	<li>
		يُحدَّث المؤقت كل ثانية.
	</li>
	<li>
		مع كل تحديث للمؤقت سيتولد حدث خاص يُدعى <code>tick</code> يحمل التاريخ الحالي ضمن الخاصية <code>event.detail</code>، راجع فصل "<a data-ss1635238889="1" href="https://academy.hsoub.com/programming/javascript/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D8%A3%D8%AD%D8%AF%D8%A7%D8%AB-%D9%85%D8%AE%D8%B5%D8%B5%D8%A9-%D9%81%D9%8A-%D8%A7%D9%84%D9%85%D8%AA%D8%B5%D9%81%D8%AD-%D8%B9%D8%A8%D8%B1-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA-r1144/" rel="">إنشاء أحداث مخصصة في المتصفح عبر جافاسكربت</a>".
	</li>
</ol>
<p>
	طريقة الاستخدام:
</p>

<pre class="ipsCode">
&lt;live-timer id="elem"&gt;&lt;/live-timer&gt;

&lt;script&gt;
  elem.addEventListener('tick', event =&gt; console.log(event.detail));
&lt;/script&gt;
</pre>

<p>
	إليك المثال النموذجي:
</p>

<p>
	<iframe class="code-result__iframe" data-ss1635238889="1" data-trusted="1" src="https://en.js.cx/task/live-timer/solution/" style="display: block; height: 40px;"></iframe>
</p>

<p>
	يمكنك <a data-ss1635238889="1" href="https://plnkr.co/edit/XOf4WbLRLApuuYmr?p=preview&amp;preview" rel="external nofollow">فتح المثال في بيئة تجريبية</a>
</p>

<p>
	لاحظ أن:
</p>

<ol>
<li>
		صفرنا المؤقت <code>setInterval</code> عند إزالة العنصر من الصفحة وهذا أمر مهم إذ بدونه سيستمر الحدث بالعمل كل ثانية في الوقت الذي لا يُستعمَل فيه، ولا يمكن للمتصفح أيضًا أن يمسح الذاكرة من تلقاء نفسه.
	</li>
	<li>
		يمكن الوصول إلى القيمة الحالية عبر الخاصية <code>elem.date</code>، إذ كل توابع الصنف وخاصياته هي توابع للعنصر وخاصياته.
	</li>
</ol>
<p>
	ويمكنك <a data-ss1635238889="1" href="https://plnkr.co/edit/5A1yvhPjyH9RbdoX?p=preview&amp;preview" rel="external nofollow">فتح الحل في بيئة تجريبية</a>.
</p>

<h2>
	المراجع
</h2>

<ul>
<li>
		<a data-ss1635238889="1" href="https://html.spec.whatwg.org/#custom-elements" rel="external nofollow">HTML Living Standard</a>
	</li>
	<li>
		<a data-ss1635238889="1" href="https://caniuse.com/#feat=custom-elementsv1" rel="external nofollow">Compatiblity</a>
	</li>
</ul>
<p>
	ترجمة -وبتصرف- للفصول <a data-ss1635238889="1" href="https://javascript.info/custom-elements" rel="external nofollow">Custom elements</a> و<a data-ss1635238889="1" href="https://javascript.info/webcomponents-intro" rel="external nofollow">From Orbital Height</a> و<a data-ss1635238889="1" href="https://javascript.info/template-element" rel="external nofollow">Template element</a> من سلسلة <a data-ss1635238889="1" href="https://https://javascript.info" rel="external nofollow">The Modern JavaS</a><a data-ss1635238889="1" href="https://https://javascript.info" rel="external nofollow">cript Tutorial.</a>
</p>

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

<ul>
<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/javascript/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D8%A7%D9%84%D8%AD%D8%B1%D9%83%D8%A7%D8%AA-%D8%B9%D8%A8%D8%B1-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA-r1351/" rel="">إنشاء الحركات عبر جافاسكربت</a>
	</li>
	<li>
		المقال التالي: <a href="https://academy.hsoub.com/programming/html/%D9%85%D9%83%D9%88%D9%86%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D8%B4%D8%AC%D8%B1%D8%A9-dom-%D8%A7%D9%84%D8%AE%D9%81%D9%8A%D8%A9-r1353/" rel="">مكونات الويب: التعامل مع شجرة DOM الخفية</a>
	</li>
</ul>
<style type="text/css">
iframe {
   border: 1px solid #e7e5e3 !important;
width: 100%;
}
iframe div#path {
    margin: auto;
}</style>
]]></description><guid isPermaLink="false">1352</guid><pubDate>Sat, 06 Nov 2021 16:00:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x62A;&#x62D;&#x642;&#x642; &#x645;&#x646; &#x633;&#x647;&#x648;&#x644;&#x629; &#x627;&#x644;&#x648;&#x635;&#x648;&#x644; &#x644;&#x635;&#x641;&#x62D;&#x627;&#x62A; &#x627;&#x644;&#x648;&#x64A;&#x628;</title><link>https://academy.hsoub.com/programming/html/%D8%A7%D9%84%D8%AA%D8%AD%D9%82%D9%82-%D9%85%D9%86-%D8%B3%D9%87%D9%88%D9%84%D8%A9-%D8%A7%D9%84%D9%88%D8%B5%D9%88%D9%84-%D9%84%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r1328/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2021_09/6155d36108d1d_------------ARIA---ARIA---ARIA----Progressive-Web-Apps-assistive-technology-screen-reader-ARIA-attribu.png.947e0358b8ca223cdeecfc391124e47e.png" /></p>

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

<h2>
	البدء مع لوحة المفاتيح
</h2>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="78314" href="https://academy.hsoub.com/uploads/monthly_2021_09/001keyboard.png.55fb6f6c530dff0b9af0c6d1f35b4ade.png" rel=""><img alt="001keyboard.png" class="ipsImage ipsImage_thumbnailed" data-fileid="78314" data-unique="wxy4dgv8g" src="https://academy.hsoub.com/uploads/monthly_2021_09/001keyboard.png.55fb6f6c530dff0b9af0c6d1f35b4ade.png"></a>
</p>

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

<h3>
	النقاط الأساسية
</h3>

<p>
	يجب أن تراعى النقاط الأساسية التالية:
</p>

<ul>
<li>
		يُمكن البدء بالتنقل في الموقع باستخدام مفتاح الجدولة <code>tab</code> للتأكد من توفير ترتيب الجدولة المنطقي. يجب أن يكون ترتيب الجدولة موافقًا لترتيب العناصر في شجرة DOM. يُمكن العودة للمقالة <a href="https://academy.hsoub.com/programming/html/%D8%A7%D9%84%D8%AA%D8%B1%D9%83%D9%8A%D8%B2-%D8%B9%D9%84%D9%89-%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-%D8%B5%D9%81%D8%AD%D8%A9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r1324/" rel="">التركيز على عناصر صفحة الويب </a>لمراجعة القاعدة الأساسية في التركيز والتي تنص على أن أي عنصر تحكم يتفاعل المستخدم معه يجب التمكن من وضع التركيز عليه وإظهار مؤشر مرئي واضح للمستخدم عندها (مثلًا: إظهار حلقة تركيز focus ring). من الممارسات الشائعة تعطيل تنسيق الحدود الظاهرة على حواف العنصر عبر ضبط <code>outline: none</code> دون توفير أي تنسيقات بدلية لحدود حواف العنصر في CSS ولا تعد هذه من الممارسات الجيدة.anti-pattern. لن يتمكن مستخدم لوحة المفاتيح من التفاعل مع الصفحة إذا كان لا يستطيع رؤية موضع التركيز. يُمكن استخدام مكتبة برمجية مثل المكتبة <a href="https://github.com/ten1seven/what-input" rel="external nofollow">what-input</a> في حال الرغبة بالتمييز بين التركيز باستخدام الفأرة أو باستخدام لوحة المفاتيح.
	</li>
	<li>
		يجب إتاحة التركيز على العناصر المخصصة التفاعلية. مثلًا: في حال استخدام سكريبت جافا لتحويل مقطع
		<div>
			إلى قائمة منسدلة جميلة فلن تكون قابلة للتركيز آليًا. يجب إسناد القيمة 0 لخاصية ترتيب الجدولة <code>tabindex=0</code> لإتاحة التركيز على العنصر.
		</div>
	</li>
	<li>
		يجب تجنب وضع قيم أكبر من الصفر للخاصية <code>tabindex</code> لأن ذلك سيجعلها في مقدمة ترتيب الجدولة وبغض النظر عن مكانها في شجرة DOM، مما يضع مستخدمي قارئ الشاشة الذين يميلون للتنقل بشكل متسلسل في حيرة والتباس.
	</li>
	<li>
		يجب تجنب وضع التركيز على العناصر التي لا يتفاعل المستخدم معها كالترويسات headings مثلًا. يلجأ بعض المطورين إلى إدراج خاصية ترتيب الجدولة <code>tabindex</code> في الترويسات ظنًا منهم أنها مهمة. يُعدّ هذا السلوك سلوكًا غير شائعًا مما يُقلل من كفاءة الاستخدام عمومًا. أما بالنسبة لمستخدمي قارئ الشاشة يكون التركيز على الترويسات غير ضروري لأن قارئ الشاشة يقرؤها.
	</li>
	<li>
		يجب التأكد من توجيه تركيز المستخدم إلى المحتوى الجديد المُضاف للصفحة كي يتمكن المستخدم من التفاعل معه. يُمكن مراجعة فقرة إدارة التركيز على مستوى الصفحة من المقالة المشار إليها سلفًا، والمعنونة بالتركيز على عناصر صفحة الويب لمزيد من الأمثلة.
	</li>
	<li>
		يجب تجنب قفل التركيز في أي نقطة. قد تؤدي عناصر الإكمال التلقائي autocomplete widgets لقفل التركيز باستخدام لوحة المفاتيح. يُمكن قفل التركيز في بعض الحالات المُحدّدة مثل إظهار نافذة شرطية modal والرغبة بمنع المستخدم من التعامل مع بقية عناصر الصفحة مع الاحتفاظ بإمكانية إغلاق هذه النافذة الشرطية باستخدام لوحة المفاتيح.
	</li>
</ul>
<h3>
	إمكانية التركيز لا تعني إمكانية الاستخدام
</h3>

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

<h3>
	المحتوى خارج الشاشة
</h3>

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

<h2>
	اختبار الصفحة مع قارئ الشاشة
</h2>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="78315" href="https://academy.hsoub.com/uploads/monthly_2021_09/002screen.png.cda8390562980fac7a382cabe72c0983.png" rel=""><img alt="002screen.png" class="ipsImage ipsImage_thumbnailed" data-fileid="78315" data-unique="4yssy9n9p" src="https://academy.hsoub.com/uploads/monthly_2021_09/002screen.png.cda8390562980fac7a382cabe72c0983.png"></a>
</p>

<h3>
	النقاط الأساسية
</h3>

<p>
	يجب أن تراعى النقاط الأساسية التالية:
</p>

<ul>
<li>
		يجب التحقق من أن لجميع الصور الخاصية <code>alt</code> لتوفير النص البديل لها عند الحاجة. يُمكن استثناء الصور التي توضع بهدف العرض فقط ولا تكون جزءًا أساسيًا من المحتوى. يجب إسناد السلسلة الفارغة <code>""=alt</code> لإعلام قارئ الشاشة بوجوب تخطي صورة.
	</li>
	<li>
		يجب التحقق من توفير عناوين labels لجميع عناصر التحكم. يُمكن أن يتطلب ذلك استخدام الخاصيتين <code>aria-label</code> و <code>aria-labelledby</code> للعناصر المخصصة. للمزيد من التفاصيل يُمكن العودة إلى <a href="https://academy.hsoub.com/programming/html/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D9%85%D9%88%D8%A7%D8%B5%D9%81%D8%A7%D8%AA-aria-%D8%A5%D8%B9%D8%B7%D8%A7%D8%A1-%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-html-%D8%AF%D9%84%D8%A7%D9%84%D8%A7%D8%AA-%D8%AE%D8%A7%D8%B5%D8%A9-%D9%84%D8%AA%D8%B3%D9%87%D9%8A%D9%84-%D8%A7%D9%84%D9%88%D8%B5%D9%88%D9%84-r1327/" rel="">العناوين والعلاقات في ARIA</a>.
	</li>
	<li>
		يجب التحقق من أن لجميع عناصر التحكم الدور <code>role</code> المناسب وخصائص ARIA المطلوبة لضبط حالتها. مثلًا: يحتاج مربع الاختيار المخصص إلى الدور <code>"role="checkbox</code> وإلى الخاصية <code>"aria-checked="true|false</code> للإعلام عن حالة العنصر بشكل صحيح.
	</li>
	<li>
		يجب التحقق من التسلسل المنطقي للانتقال بين عناصر الصفحة. بما أن برامج قراءة الشاشة تنتقل في الصفحة وفق ترتيب شجرة DOM فستؤدي عملية استخدام أنماط CSS لتغيير أماكن توضع العناصر إلى الإعلان عن هذه العناصر وفق تسلسل غير منطقي. يجب على المطور وضع العناصر في شجرة DOM وفق ترتيب الإظهار الذي يرغبه.
	</li>
	<li>
		يجب عدم السماح بإخفاء أي قسم من أقسام الموقع أو حظر وصول قارئ الشاشة إليه بشكل دائم إذا كان دعم تنقل قارئ الشاشة في كل محتوى الصفحة مطلوبًا.
	</li>
	<li>
		يجب التأكد من إسناد القيمة <code>true</code> إلى الخاصية <code>aria-hidden</code> إذا كان المطلوب إخفاء محتوى ما عن قارئ الشاشة كأن يكون خارج الشاشة أو عبارة عن شيئٍ للعرض فقط.
	</li>
</ul>
<h3>
	التعرف على قارئ شاشة واحد يُساعد في فهم المسائل والمشاكل
</h3>

<p>
	قد يبدو تعلم استخدام قارئ الشاشة للوهلة الأولى أمرًا صعبًا، إلا أنه عملية سهلة في الواقع إذ يُمكن للمطورين التعامل معه باستخدام بضعة أوامر من لوحة المفاتيح. يُمكن استخدام قارئ الشاشة <a href="https://www.youtube.com/watch?v=5R-6WvAihms&amp;list=PLNYkxOF6rcICWx0C9LVWWVqvHlYJyqw7g&amp;index=7" rel="external nofollow">VoiceOver</a> الذي يتوفر في أنظمة Mac OS.كما يُمكن لمستخدمي النظام Windows مشاهدة هذا الفيديو عن قارئ الشاشة <a href="https://www.youtube.com/watch?v=Jao3s_CwdRU&amp;list=PLNYkxOF6rcICWx0C9LVWWVqvHlYJyqw7g&amp;index=5" rel="external nofollow">NVDA</a> والذي هو برنامج مفتوح المصدر مدعوم بالتبرعات.
</p>

<h3>
	لا تمنع الخاصية <code>aria-hidden</code> التركيز باستخدام لوحة المفاتيح
</h3>

<p>
	يجب أن نتذكر أن خصائص ARIA تؤثر على دلالات العناصر فقط وليس على سلوكها. يُمكن إخفاء عنصر عن قارئ الشاشة باستخدام <code>hidden=true</code> إلا أن هذا لن يغير من سلوك التركيز على العنصر. أما بالنسبة للمحتوى التفاعلي الموجود خارج الصفحة فنحتاج غالبًا للجمع بين <code>aria-hidden=true</code> و <code>"tabindex=”-1</code> للتأكد من إزالة العنصر من تسلسل استخدام لوحة المفاتيح. تهدف السمة الجديدة المقترحة <a href="https://github.com/WICG/inert" rel="external nofollow">inert</a> إلى تسهيل ذلك بالجمع بين سلوك كلتا الخاصيتين.
</p>

<h2>
	الإشارة إلى حالة العناصر التفاعلية مثل الروابط والأزرار والهدف منها
</h2>

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

<h3>
	النقاط الأساسية
</h3>

<p>
	تراعى النقاط الأساسية التالية:
</p>

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

<p>
	تُعطي العناوين Headings والعلامات landmarks بنية دلالية للصفحة، وتزيد من كفاءة التنقل لمستخدمي التقنية المساعدة بشكل كبير. أفاد العديد من مستخدمي برامج قراءة الشاشة أنهم عندما يصلون إلى صفحة غير مألوفة لأول مرة فإنهم يحاولون التنقل عن طريق الترويسات عادةً. وبالمثل، توفر برامج قراءة الشاشة أيضًا القدرة على الانتقال إلى علامات مهمة مثل <code>&lt;main&gt;</code> و <code>&lt;nav&gt;</code>. لذا فمن المهم دراسة كيفية استخدام بنية الصفحة لتوجيه تجربة الاستخدام.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="78316" href="https://academy.hsoub.com/uploads/monthly_2021_09/003headings.png.175a4b25b7e93f272ef018b17e40e522.png" rel=""><img alt="003headings.png" class="ipsImage ipsImage_thumbnailed" data-fileid="78316" data-unique="1a5aejz5y" src="https://academy.hsoub.com/uploads/monthly_2021_09/003headings.png.175a4b25b7e93f272ef018b17e40e522.png"></a>
</p>

<h3>
	النقاط الأساسية
</h3>

<p>
	تراعى النقاط الأساسية التالية:
</p>

<ul>
<li>
		يجب استخدام التسلسل الهرمي للترويسات h1-h6 بالشكل المناسب والتفكير بالترويسات كأدوات لإنشاء مخطط outline الصفحة. يجب عدم ترك الترويسات بالأنماط المبنية مسبقًا لها بل يجب الآخذ بعين الاعتبار فيما لو كانت جميع الترويسات بنفس الحجم واستخدام المستوى المناسب دلاليًا للمستوى الأول والثاني والثالث. وفي النهاية استخدام أنماط CSS لجعل الترويسات تتماشى مع تصميم الصفحة.
	</li>
	<li>
		يجب استخدام عناصر العلامات landmarks والأدوار roles لتمكين المستخدمين من تجاوز المحتوى المكرر. توفر العديد من التقنيات المساعدة الاختصارات shortcuts اللازمة للانتقال إلى أقسام محدّدة من الصفحة مثل الأقسام المُعرّفة باستخدام العناصر <code>&lt;main&gt;</code> أو <code>&lt;nav&gt;</code> والتي تلعب دور علامات ضمنية. يُمكن استخدام خاصية الدور role في ARIA لتعريف المناطق بشكل صريح في الصفحة مثلًا: <code>&lt;"div role="search&gt;</code>. يُمكن العودة لفقرة <a href="https://academy.hsoub.com/programming/html/%D8%A7%D9%84%D8%AF%D9%84%D8%A7%D9%84%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D8%B6%D9%85%D9%86%D8%A9-%D9%84%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-%D8%B5%D9%81%D8%AD%D8%A9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D9%88%D8%AF%D9%88%D8%B1%D9%87%D8%A7-%D9%81%D9%8A-%D8%AA%D8%B9%D8%B2%D9%8A%D8%B2-%D8%B3%D9%87%D9%88%D9%84%D8%A9-%D8%A7%D9%84%D9%88%D8%B5%D9%88%D9%84-r1325/" rel="">الدلالات والتنقل في المحتوى</a> للمزيد من الأمثلة.
	</li>
	<li>
		يجب على المطور تجنب استخدام الخاصية <code>role</code> مع القيمة <code>application</code> إلا في حال تمتعه بالخبرة السابقة في العمل معها. إذ يؤدي هذا الاستخدام إلى إعلام التقنية المساعدة بتعطيل جميع اختصاراتها shortcuts وتمرير جميع ضغطات المفاتيح إلى الصفحة، مما يعني أن مفاتيح قارئ الشاشة التي يستعملها المستخدمون عادةً للتنقل في الصفحة لن تعمل بعد الآن، وسيحتاج المطور إلى معالجة جميع أحداث لوحة المفاتيح بنفسه.
	</li>
</ul>
<h3>
	استخدام قارئ الشاشة للتحقق السريع من الترويسات والعلامات
</h3>

<p>
	توفر برامج قراءة الشاشة مثل VoiceOver و NVDA قائمة سياقية context menu تسمح بالوصول السريع للمناطق الهامة في الصفحة. يُمكن استخدام هذه القوائم للحصول على نظرة عامة سريعة على الصفحة وتحديد ما إذا كانت مستويات الترويسات مناسبة وما هي العلامات المستخدمة. راجع مقاطع الفيديو التعليمية هذه حول أساسيات <a href="https://www.youtube.com/watch?v=5R-6WvAihms&amp;list=PLNYkxOF6rcICWx0C9LVWWVqvHlYJyqw7g&amp;index=7" rel="external nofollow">VoiceOver</a> و <a href="https://www.youtube.com/watch?v=Jao3s_CwdRU&amp;list=PLNYkxOF6rcICWx0C9LVWWVqvHlYJyqw7g&amp;index=5" rel="external nofollow">NVDA</a>.
</p>

<h2>
	أتمتة العملية
</h2>

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

<p style="text-align: center;">
	<img alt="004automate.png" class="ipsImage ipsImage_thumbnailed" data-fileid="78317" data-unique="1k8mhf7bd" src="https://academy.hsoub.com/uploads/monthly_2021_09/004automate.png.6177a0f66ddf3c9eb0ecc9c11a7205cc.png"></p>

<h3>
	النقاط الأساسية
</h3>

<p>
	يمكنك اتباع الخطوات التالية:
</p>

<ul>
<li>
		يُمكن التحقق من اجتياز الصفحة لجميع الاختبارات باستخدام إضافات المتصفح <a href="https://chrome.google.com/webstore/detail/axe-devtools-web-accessib/lhdoppojpmngadmnindnejefpokejbdd" rel="external nofollow">aXe</a> أو <a href="https://chrome.google.com/webstore/detail/wave-evaluation-tool/jbbplnpkjmmeebjpijfedlgcdilocofh" rel="external nofollow">WAVE</a>. هذه الإضافات ليست سوى خيارين متاحين ويمكن أن تكون إضافة مفيدة لأي عملية اختبار يدوي حيث تستطيع التعرف على المشكلات الدقيقة بسرعة مثل فشل نسب التباين failing contrast ratios وخصائص ARIA المفقودة. يُمكن استخدام سطر الأوامر واستخدام <a href="https://github.com/dequelabs/axe-cli" rel="external nofollow">ax-cli</a> الذي يوفر نفس الوظائف التي يوفرها امتداد المتصفح aXe، ولكن يمكن تشغيله بسهولة من الطرفية.
	</li>
	<li>
		يُمكن تضمين مكتبة برمجية مثل <a href="https://github.com/dequelabs/axe-core" rel="external nofollow">axe-core</a> لمجموعة الاختبار المؤتمتة وذلك لضمان تجانس الاختبارات وتكاملها لا سيما في بيئة عمل تكاملي مستمر. وهي المكتبة نفسها التي تدعم الامتداد aXe إلا أنها أسهل للاستخدام عن طريق سطر الأوامر.
	</li>
	<li>
		في حال استخدام إطار عمل أو مكتبة فيُمكن أن يُطرح السؤال: هل توفر أدوات سهولة الوصول الخاصة بها؟ تتضمن بعض الأمثلة استخدام المكتبة البرمجية <a href="https://github.com/angular/protractor-accessibility-plugin/" rel="external nofollow">protractor-accessibility-plugin</a> في Angular و <a href="https://github.com/Polymer/web-component-tester#a11ysuite" rel="external nofollow">a11ysuite</a> في Polymer و Web Components. يجب دومًا الاستفادة من الأدوات المتاحة كلما أمكن ذلك تجنبًا لإعادة اختراع الدولاب.
	</li>
</ul>
<h3>
	استخدام الأداة Lighthouse عند تطوير صفحات الويب التقدميّة
</h3>

<p>
	تُساعد الأداة Lighthouse في قياس أداء تطبيق الويب التقدمي وتستخدم أيضًا المكتبة ax-core لتشغيل مجموعة من اختبارات سهولة الوصول. يُمكّن استخدام هذه الأداة في تحديد حالات فشل الوصول والتي يُساهم إصلاحها في تحسين تجربة المستخدم الإجمالية للموقع.
</p>

<h2>
	النتيجة
</h2>

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

<p>
	ترجمة -وبتصرف- للمقالة <a href="https://developers.google.com/web/fundamentals/accessibility/how-to-review" rel="external nofollow">How To Do an Accessibility Review </a> للمؤلف Rob Dodson.
</p>

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

<ul>
<li>
		<a href="https://academy.hsoub.com/programming/html/%D8%B3%D9%87%D9%88%D9%84%D8%A9-%D9%88%D8%B5%D9%88%D9%84-%D8%AC%D9%85%D9%8A%D8%B9-%D8%A7%D9%84%D8%B2%D9%88%D8%A7%D8%B1-%D9%84%D9%85%D9%88%D8%A7%D9%82%D8%B9-%D9%88%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r1323/" 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">1328</guid><pubDate>Thu, 30 Sep 2021 15:00:00 +0000</pubDate></item></channel></rss>
