شرح الوسوم HTML

شرح أوامر HTML - الوسوم (Tags)

في الدرس الأول، قمنا بتجهيز بيئة العمل وتعرفنا على الأدوات المطلوبة (المحررات والمتصفحات). الآن، ندخل إلى المرحلة التأسيسية الفعلية. هذا الدرس مخصص بالكامل لفهم "حجر الأساس" في لغة HTML: وهو "الوسم" (Tag).

لن نهتم في هذا الدرس بـ "ماذا" تفعل الوسوم (مثل `head` أو `body` التي رأيناها في القالب الأولي)، بل سنهتم "فقط" بـ "كيف" تتم كتابتها. سنتناول تشريح الوسوم، صيغتها، قواعد الفتح والإغلاق، والأخطاء الشائعة في كتابتها. هذا الدرس هو درس في "الصيغة" (Syntax) وليس "الوظيفة" (Function).

ما هو "الوسم" (Tag)؟ التعريف الأساسي

الوسم (Tag) هو "الأمر" أو "الكلمة المفتاحية" التي نستخدمها للتواصل مع المتصفح. إنه الوحدة البنائية الأساسية في HTML.

من المهم أن ندرك أن الوسوم هي "لغة توصيف" (Markup)، وليست "محتوى" (Content). هذا يعني أن المستخدم النهائي (زائر الموقع) لا يرى الوسوم نفسها، بل يرى "تأثير" هذه الوسوم على المحتوى.

تشبيه: إرشادات المخرج

يمكن تشبيه ملف HTML بـ "نص مسرحي".

  • المحتوى (Content): هو الحوار الذي يقوله الممثلون (مثال: "مرحباً بالعالم").
  • الوسم (Tag): هو "الإرشاد المكتوب" من المخرج للممثل (مثال: (يقولها بصوت عالٍ وغاضب)).

الجمهور (زائر الموقع) لا يسمع المخرج وهو يقول "قلها بصوت عالٍ"، بل يسمع "نتيجة" هذا الأمر (الممثل وهو يصرخ "مرحباً بالعالم").

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

(مفهوم أساسي):
الوسوم هي تعليمات للمتصفح (الممثل)، والمحتوى هو ما يظهر للمستخدم (الجمهور). وظيفة HTML هي "توصيف" هذا المحتوى.

الأقواس المعقوفة (< >): إشارة البدء والانتهاء

كيف يميز المتصفح بين "المحتوى" العادي الذي يجب عرضه، و "الأمر" (الوسم) الذي يجب تنفيذه؟

الإجابة تكمن في استخدام "الأقواس المعقوفة" (Angle Brackets):

  • علامة "أقل من" <
  • علامة "أكبر من" >

هذه الرموز تعمل كـ "مُحدِدات" (Delimiters).

آلية عمل الأقواس

عندما يبدأ المتصفح في قراءة ملف HTML، فإنه يعتبر كل شيء نصاً عادياً... إلى أن يصطدم برمز <.

عندما يرى <، فإنه يتوقف عن "العرض" ويدخل في "وضع الاستماع للأوامر". يبدأ في قراءة ما بداخل القوس ليفهم ما هو الأمر المطلوب منه (مثل `p` أو `h1`).

عندما يصل إلى رمز >، فإنه يفهم أن "الأمر قد اكتمل"، فيقوم بتنفيذه، ثم يعود إلى "وضع العرض" العادي للنص الذي يليه.

لماذا هذه الرموز تحديداً؟

تم اختيارها لأنها نادراً ما تُستخدم في الكتابة العادية (النثر). هذا يجعلها مثالية للعمل كـ "علامات تنبيه" للمتصفح دون أن تتعارض مع المحتوى الفعلي.

(صيغة ثابتة):
الصيغة الأساسية لأي وسم هي دائماً: < متبوعاً بـ [اسم الوسم] ثم >.
مثال: <p>.

النوع الأول: الوسوم المزدوجة (Container Tags)

الآن بعد أن عرفنا "الأقواس"، لنتعرف على النوع الأكثر شيوعاً من الوسوم. تُسمى "الوسوم المزدوجة" (Paired Tags) أو "الوسوم الحاوية" (Container Tags).

هذا النوع من الوسوم سُمي "حاوياً" لأنه مصمم لـ "احتواء" محتوى بداخله. إنه يلف المحتوى ليخبر المتصفح "كل ما هو موجود بيني وبين شريكي يجب أن يتأثر بهذا الأمر".

لهذا السبب، هي دائماً تأتي في "زوج":

  1. وسم الفتح (Opening Tag): لبدء تطبيق الأمر.
  2. وسم الإغلاق (Closing Tag): لإنهاء تطبيق الأمر.

تشبيه: شطيرة الخبز

يمكن التفكير في الوسم المزدوج كشطيرة:

  • وسم الفتح <p>: هو قطعة الخبز العلوية.
  • المحتوى هذا نص...: هو الحشوة (اللحم، الجبن).
  • وسم الإغلاق </p>: هو قطعة الخبز السفلية.

لا يمكنك الحصول على شطيرة (عنصر مكتمل) بقطعة خبز واحدة فقط. أنت بحاجة إلى بداية ونهاية لتحديد أين تبدأ الحشوة وأين تنتهي.

ما الذي يمكن أن تحتويه؟

"المحتوى" الموجود داخل الوسم الحاوي يمكن أن يكون:

  • نصاً بسيطاً (كما في مثال الشطيرة).
  • وسوماً أخرى (وهذا ما يُعرف بـ "التداخل" - Nesting، وسنناقشه لاحقاً).

التشريح الدقيق: وسم الفتح مقابل وسم الإغلاق

بما أن الوسوم المزدوجة هي "أزواج"، فمن الضروري التمييز بين وسم الفتح ووسم الإغلاق.

أولاً: وسم الفتح (Opening Tag)

الصيغة: <[TagName]>

أمثلة: <h1>، <p>، <div>

وظيفته: إبلاغ المتصفح بـ "البدء". (مثال: "من هذه النقطة، ابدأ في تطبيق قاعدة 'الخط الكبير'").

ثانياً: وسم الإغلاق (Closing Tag)

الصيغة: </[TagName]>

أمثلة: </h1>، </p>، </div>

وظيفته: إبلاغ المتصفح بـ "التوقف". (مثال: "من هذه النقطة، توقف عن تطبيق قاعدة 'الخط الكبير' وعد إلى الوضع الطبيعي").

(سؤال للملاحظة):
قارن بين <p> و </p>.
ما هو الاختلاف "الوحيد" في الصيغة بينهما؟
الإجابة: وجود "الشرطة المائلة" (/).

أهمية "الشرطة المائلة" (/) في الإغلاق

إن الرمز الأكثر أهمية في الوسوم المزدوجة، والذي يسبب 90% من أخطاء المبتدئين، هو "الشرطة المائلة" (Forward Slash) /.

هذا الرمز هو "الإشارة" الحصرية التي يستخدمها المتصفح ليعرف أن هذا "وسم إغلاق" وليس "وسم فتح" جديد.

أخطاء شائعة يجب تجنبها

  • الخطأ الأول: نسيان الشرطة المائلة.
    الكتابة: <p>نص<p>
    كيف يراها المتصفح: "افتح وسم فقرة"، "اعرض نص"، "افتح وسم فقرة جديد". لم يتم إغلاق الوسم الأول أبداً. هذا يسبب فوضى في التنسيق.
  • الخطأ الثاني: استخدام الشرطة المائلة العكسية (\).
    الكتابة: <\p>
    هذا رمز خاطئ تماماً. الشرطة المائلة العكسية تُستخدم في مسارات الملفات (C:\Files)، وليست لها أي معنى في صيغة HTML.
  • الخطأ الثالث: وضع الشرطة في المكان الخاطئ.
    الكتابة: <p/>
    هذه صيغة مختلفة تماماً (تُستخدم للوسوم الفارغة في معايير XHTML القديمة) ولا تعمل كوسم إغلاق لوسم حاوٍ.

(قاعدة صارمة):
وسم الإغلاق "دائماً" وأبداً يبدأ بـ < ثم "فوراً" / ثم اسم الوسم.
صحيح: </body>
خاطئ: <body/>، <\body>، <body> (كنسخة مكررة).

مفهوم "النطاق" (Scope) ولماذا الإغلاق ضروري

لماذا كل هذا التشديد على "الإغلاق"؟ لأن وسم الإغلاق هو الذي يحدد "نطاق" (Scope) أو "منطقة تأثير" وسم الفتح.

عندما تفتح وسماً مثل <h1>، فأنت تخبر المتصفح: "ابدأ بتطبيق تنسيق العنوان الكبير". السؤال المنطقي التالي للمتصفح هو: "إلى متى أستمر في تطبيق هذا التنسيق؟".

وسم الإغلاق </h1> هو الإجابة. إنه يقول: "توقف هنا".

تشبيه: فرشاة الدهان

  • <h1>: هو غمس الفرشاة في علبة "الدهان الأحمر الكبير".
  • المحتوى: هو الجدار الذي تقوم بطلائه.
  • </h1>: هو وضع الفرشاة الحمراء جانباً والإمساك بفرشاة "الدهان الأسود العادي".

ماذا يحدث لو نسيت وسم الإغلاق </h1>؟

سيستمر المتصفح في "الطلاء باللون الأحمر الكبير" إلى الأبد. كل شيء يأتي بعده (فقرات أخرى، صور، روابط) سيحاول المتصفح تطبيق تنسيق "العنوان الكبير" عليه، مما يدمر تصميم الصفحة بالكامل.

مثال عملي (صحيح وخاطئ)

الكود الصحيح (مع إغلاق):
<h1>هذا عنوان</h1>
<p>وهذه فقرة عادية.</p>
النتيجة: عنوان كبير، متبوع بفقرة عادية.

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

(مبدأ أساسي):
وسم الإغلاق لا يُنشئ شيئاً. وظيفته الوحيدة هي "إنهاء" تأثير وسم الفتح المقابل له.

النوع الثاني: الوسوم الفارغة (Empty Tags)

بينما تحتاج معظم الوسوم إلى "احتواء" محتوى (مثل وسم الفقرة <p> الذي يحتوي نصاً)، يوجد نوع آخر من الوسوم لا يحتوي على شيء.

تسمى "الوسوم الفارغة" (Empty Tags) أو "الوسوم ذاتية الإغلاق" (Self-Closing).

هذه الوسوم هي "الأمر والمحتوى في آن واحد". وظيفتها هي إدراج شيء ما في الصفحة، أو القيام بفعل لمرة واحدة، وليس "تغليف" محتوى موجود.

أمثلة على الوسوم الفارغة

  • <br> (Line Break):
    هذا الوسم يعني "انزل سطراً جديداً الآن". لا يوجد "محتوى" يمكن تغليفه. هو نفسه الأمر.
  • <img> (Image):
    هذا الوسم يعني "أدرج صورة هنا". (سنتعلم كيف نحدد "أي" صورة لاحقاً). لا يوجد محتوى "داخله"، بل هو يضع شيئاً في مكانه.
  • <hr> (Horizontal Rule):
    هذا الوسم يعني "ارسم خطاً أفقياً هنا".

كيفية كتابتها (مهم)

بما أنها لا تحتوي على محتوى، فهي لا تحتاج إلى وسم إغلاق.

الكتابة الصحيحة: <br>

الكتابة الخاطئة: <br>...</br> (هذا غير صحيح ولا معنى له).

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

(قاعدة للتمييز):
اسأل نفسك: "هل هذا الوسم يصف محتوى (مثل فقرة نصية) أم يُدرج شيئاً (مثل صورة أو فاصل أسطر)؟"
إذا كان يصف، فهو "مزدوج" (حاوي). إذا كان يُدرج، فهو "فارغ".

القاعدة الذهبية: التداخل السليم (Nesting)

ماذا يحدث عندما تضع وسماً "مزدوجاً" داخل وسم "مزدوج" آخر؟ هذا ما يسمى بـ "التداخل" (Nesting)، وهو أساس بناء هياكل الويب المعقدة.

التداخل مسموح به تماماً، ولكنه يخضع لقاعدة صارمة واحدة: "الوسم الذي يُفتح آخراً، يُغلق أولاً".

تشبيه: الصناديق المتداخلة

تخيل أن لديك "صندوقاً كبيراً" (وسم <div>) وتريد وضع "صندوق صغير" (وسم <p>) بداخله.

التسلسل المنطقي (صحيح):

  1. تفتح الصندوق الكبير: <div>
  2. تفتح الصندوق الصغير: <p>
  3. تضع المحتوى في الصندوق الصغير: ...نص...
  4. تُغلق الصندوق الصغير أولاً: </p>
  5. ثم تُغلق الصندوق الكبير: </div>

الكود الصحيح: <div><p>...نص...</p></div>

التداخل الخاطئ (Overlapping)

التسلسل غير المنطقي (خاطئ):

  1. تفتح الصندوق الكبير: <div>
  2. تفتح الصندوق الصغير: <p>
  3. تضع المحتوى...
  4. تحاول إغلاق الصندوق الكبير (رغم أن الصندوق الصغير ما زال مفتوحاً!): </div>
  5. ثم تغلق الصندوق الصغير: </p>

هذا مستحيل فيزيائياً، وهو أيضاً "غير قانوني" في HTML.

الكود الخاطئ: <div><p>...نص...</div></p> (تداخل فوضوي).

قد "يحاول" المتصفح تخمين ما تقصده وتصحيح الخطأ، ولكنه غالباً سيفشل، مما يؤدي إلى انهيار التصميم.

(قاعدة LIFO):
يتبع التداخل مبدأ "Last In, First Out" (LIFO). آخر وسم قمت بفتحه هو أول وسم يجب عليك إغلاقه.

قواعد إضافية: حالة الأحرف والمسافات

أخيراً، هناك قاعدتان تتعلقان بـ "أفضل الممارسات" (Best Practices) لضمان أن يكون الكود الخاص بك نظيفاً ومقروءاً ومتوافقاً مع المعايير.

أولاً: حالة الأحرف (Case Sensitivity)

هل <p> هو نفسه <P> أو <P>؟

الإجابة الفنية: في معيار HTML5 الحديث، المتصفحات لا تهتم بحالة الأحرف (Case-Insensitive) وستتعامل معها جميعاً على أنها نفس الوسم.

الإجابة الاحترافية: لا تفعل ذلك أبداً. "المعيار المتعارف عليه" (Convention) عالمياً هو كتابة جميع وسوم HTML بأحرف صغيرة (lowercase).

لماذا؟

  • الاتساق: الكود الذي يخلط بين الأحرف الكبيرة والصغيرة فوضوي وصعب القراءة.
  • التوافقية: المعايير الأكثر صرامة (مثل XHTML أو XML) "تهتم" بحالة الأحرف (Case-Sensitive)، لذا فإن التعود على الأحرف الصغيرة يجعلك مبرمجاً أفضل للمستقبل.

ثانياً: المسافات (Spacing)

هل يمكن وضع مسافات داخل الأقواس المعقوفة؟

خاطئ: < p > أو < /p >

صحيح: <p> أو </p>

القاعدة: يجب أن يلتصق اسم الوسم بـ < مباشرة. ويجب أن يلتصق / بـ < مباشرة في وسم الإغلاق.

إذا وضعت مسافة < p>، فإن معظم المتصفحات ستفشل في التعرف عليها كوسم وستقوم بطباعة < p> على الشاشة كنص عادي. (ملاحظة: المسافات "بعد" اسم الوسم <p class="x"> مسموحة وتُستخدم لـ "الخصائص" (Attributes)، وهو موضوع لدرس آخر متقدم جداً).

(خلاصة القواعد):
1. اكتب جميع الوسوم بـ أحرف صغيرة.
2. لا تضع مسافات بين < واسم الوسم.
3. الوسوم الحاوية تحتاج لوسم فتح <p> ووسم إغلاق </p>.
4. الوسوم الفارغة لا تحتاج لإغلاق <br>.
5. احترم قاعدة التداخل (الأخير فتحاً هو الأول إغلاقاً).