HTML

ماذا يفعل DOCTYPE؟

DOCTYPE هو اختصار لـ Document Type (نوع المستند). يرتبط DOCTYPE دائمًا بـ DTD - اختصار لـ Document Type Definition (تعريف نوع المستند).

يحدد DTD كيفية هيكلة المستندات من نوع معين (أي، يمكن أن يحتوي button على span ولكن ليس div)، بينما يعلن DOCTYPE عن أي DTD يفترض أن يحترمه المستند (أي، هذا المستند يحترم DTD HTML).

بالنسبة لصفحات الويب، إعلان DOCTYPE مطلوب. يستخدم لإخبار وكلاء المستخدم بأي إصدار من مواصفات HTML يحترمه مستندك. بمجرد أن يتعرف وكيل المستخدم على DOCTYPE صحيح، فإنه سيقوم بتشغيل وضع عدم المحاكاة (no-quirks mode) المطابق لهذا DOCTYPE لقراءة المستند. إذا لم يتعرف وكيل المستخدم على DOCTYPE صحيح، فإنه سيقوم بتشغيل وضع المحاكاة (quirks mode).

إعلان DOCTYPE لمعايير HTML5 هو <!DOCTYPE html>.

كيف تقدم صفحة بمحتوى بلغات متعددة؟

سأفترض أن السؤال يدور حول الحالة الأكثر شيوعًا، وهي كيفية تقديم صفحة بمحتوى متاح بلغات متعددة، ولكن يجب عرض المحتوى داخل الصفحة بلغة واحدة متسقة فقط.

عندما يتم تقديم طلب HTTP إلى خادم، عادةً ما يرسل وكيل المستخدم المُرسل معلومات حول تفضيلات اللغة، كما هو الحال في رأس Accept-Language. يمكن للخادم بعد ذلك استخدام هذه المعلومات لإرجاع نسخة من المستند باللغة المناسبة إذا كان هذا البديل متاحًا. يجب أن يعلن مستند HTML المُعاد أيضًا عن السمة lang في وسم <html>، مثل <html lang="en">...</html>.

بالطبع هذا عديم الفائدة لإخبار محرك البحث بأن نفس المحتوى متاح بلغات مختلفة، ولذا يجب عليك أيضًا استخدام السمة hreflang في <head>. على سبيل المثال: <link rel="alternate" hreflang="de" href="http://de.example.com/page.html" />

في الواجهة الخلفية، سيحتوي ترميز HTML على عناصر نائبة i18n ومحتوى للغة المحددة مخزنًا بتنسيقات YML أو JSON. ثم يقوم الخادم بإنشاء صفحة HTML ديناميكيًا مع المحتوى بتلك اللغة المحددة، عادةً بمساعدة إطار عمل الواجهة الخلفية.

ما نوع الأشياء التي يجب أن تكون حذرًا منها عند تصميم أو تطوير مواقع متعددة اللغات؟

  • استخدم سمة lang في HTML الخاص بك.
  • توجيه المستخدمين إلى لغتهم الأم - اسمح للمستخدم بتغيير بلده/لغته بسهولة ودون عناء.
  • النص في الصور المستندة إلى البكسل (مثل png، gif، jpg، إلخ) ليس نهجًا قابلاً للتطوير - لا يزال وضع النص في صورة طريقة شائعة للحصول على خطوط جميلة وغير نظامية لعرضها على أي جهاز كمبيوتر. ومع ذلك، لترجمة نص الصورة، سيحتاج كل سطر نص إلى إنشاء صورة منفصلة لكل لغة. أي شيء أكثر من عدد قليل من هذه الاستبدالات يمكن أن يخرج عن السيطرة بسرعة.
  • طول الكلمات/الجملة المقيد - يمكن أن يكون بعض المحتوى أطول عند كتابته بلغة أخرى. كن حذرًا من مشاكل التخطيط أو تجاوز المحتوى في التصميم. من الأفضل تجنب التصميم حيث يمكن أن يؤدي حجم النص إلى نجاح أو فشل التصميم. تدخل عدد الأحرف في الاعتبار في أشياء مثل العناوين والتسميات والأزرار. وهي أقل إشكالية مع النص الحر مثل نص الجسم أو التعليقات.
  • انتبه لكيفية إدراك الألوان - تختلف الألوان في إدراكها عبر اللغات والثقافات. يجب أن يستخدم التصميم اللون بشكل مناسب.
  • تنسيق التواريخ والعملات - يتم تقديم تواريخ التقويم أحيانًا بطرق مختلفة. على سبيل المثال، "May 31, 2012" في الولايات المتحدة مقابل "31 May 2012" في أجزاء من أوروبا.
  • لا تقم بربط السلاسل المترجمة - لا تفعل أي شيء مثل "التاريخ اليوم هو " + date. سوف يتعطل في اللغات ذات ترتيب الكلمات المختلف. استخدم سلسلة قوالب مع استبدال المعلمات لكل لغة بدلاً من ذلك. على سبيل المثال، انظر إلى الجملتين التاليتين باللغة الإنجليزية والصينية على التوالي: I will travel on {% date %} و {% date %} 我会出发. لاحظ أن موضع المتغير مختلف بسبب قواعد قواعد اللغة.
  • اتجاه قراءة اللغة - في اللغة الإنجليزية، نقرأ من اليسار إلى اليمين، من الأعلى إلى الأسفل، في اللغة اليابانية التقليدية، يُقرأ النص من الأعلى إلى الأسفل، من اليمين إلى اليسار.
  • مفيد أن يكون لديك - قم بتضمين الإعدادات المحلية في المسار (مثل en_US، zh_CN، إلخ).

ما فائدة سمات `data-`؟

قبل أن تصبح أطر عمل JavaScript شائعة، استخدم مطورو الواجهة الأمامية سمات data- لتخزين بيانات إضافية داخل DOM نفسه، دون حيل أخرى مثل السمات غير القياسية أو الخصائص الإضافية على DOM. الغرض منها هو تخزين بيانات مخصصة خاصة بالصفحة أو التطبيق، والتي لا توجد لها سمات أو عناصر أكثر ملاءمة.

في هذه الأيام، لا يُشجع بشكل عام على استخدام سمات data-. أحد الأسباب هو أن المستخدمين يمكنهم تعديل سمة البيانات بسهولة باستخدام فحص العنصر في المتصفح. من الأفضل تخزين نموذج البيانات داخل JavaScript نفسه والبقاء محدثًا مع DOM عبر ربط البيانات ربما من خلال مكتبة أو إطار عمل.

ومع ذلك، أحد الاستخدامات الصحيحة تمامًا لسمات البيانات هو إضافة ربط لأطر عمل الاختبار الشامل (end-to-end) مثل Selenium و Capybara دون الحاجة إلى إنشاء فئات أو سمات ID لا معنى لها. يحتاج العنصر إلى طريقة للعثور عليه بواسطة مواصفات Selenium معينة، وشيء مثل data-selector='the-thing' هو طريقة صحيحة للقيام بذلك دون تعقيد الترميز الدلالي خلاف ذلك.

اعتبر HTML5 كمنصة ويب مفتوحة. ما هي اللبنات الأساسية لـ HTML5؟

  • الدلالات (Semantics) - تسمح لك بوصف محتواك بشكل أكثر دقة.
  • الاتصال (Connectivity) - تسمح لك بالتواصل مع الخادم بطرق جديدة ومبتكرة.
  • عدم الاتصال بالإنترنت والتخزين (Offline and storage) - تسمح لصفحات الويب بتخزين البيانات على جانب العميل محليًا والعمل دون اتصال بالإنترنت بكفاءة أكبر.
  • الوسائط المتعددة (Multimedia) - تجعل الفيديو والصوت مواطنين من الدرجة الأولى في الويب المفتوح.
  • رسومات وتأثيرات ثنائية وثلاثية الأبعاد (2D/3D graphics and effects) - تسمح بمجموعة أكثر تنوعًا من خيارات العرض التقديمي.
  • الأداء والتكامل (Performance and integration) - توفر تحسينًا أكبر للسرعة واستخدامًا أفضل لأجهزة الكمبيوتر.
  • الوصول إلى الجهاز (Device access) - تسمح باستخدام أجهزة إدخال وإخراج مختلفة.
  • التصميم (Styling) - تتيح للمؤلفين كتابة سمات أكثر تعقيدًا.

صف الفرق بين `cookie` و `sessionStorage` و `localStorage`.

جميع التقنيات المذكورة أعلاه هي آليات تخزين قيم مفتاحية على جانب العميل. وهي قادرة فقط على تخزين القيم كسلاسل.

| | cookie | localStorage | sessionStorage | | --- | --- | --- | --- | | المبتدئ | العميل أو الخادم. يمكن للخادم استخدام رأس Set-Cookie | العميل | العميل | | انتهاء الصلاحية | يتم تعيينها يدويًا | للأبد | عند إغلاق علامة التبويب | | استمرارية عبر جلسات المتصفح | يعتمد على ما إذا تم تعيين انتهاء الصلاحية | نعم | لا | | تُرسل إلى الخادم مع كل طلب HTTP | تُرسل ملفات تعريف الارتباط تلقائيًا عبر رأس Cookie | لا | لا | | السعة (لكل مجال) | 4 كيلوبايت | 5 ميجابايت | 5 ميجابايت | | إمكانية الوصول | أي نافذة | أي نافذة | نفس علامة التبويب |

ملاحظة: إذا قرر المستخدم مسح بيانات التصفح بأي آلية يوفرها المتصفح، فسيؤدي ذلك إلى مسح أي cookie أو localStorage أو sessionStorage مخزنة. من المهم مراعاة ذلك عند التصميم للاستمرارية المحلية، خاصة عند المقارنة ببدائل مثل التخزين على جانب الخادم في قاعدة بيانات أو ما شابه (والتي ستستمر بالطبع على الرغم من إجراءات المستخدم).

صف الفرق بين `<script>` و `<script async>` و `<script defer>`.

  • <script> - يتم حظر تحليل HTML، يتم جلب السكريبت وتنفيذه على الفور، يستأنف تحليل HTML بعد تنفيذ السكريبت.
  • <script async> - سيتم جلب السكريبت بالتوازي مع تحليل HTML وتنفيذه بمجرد توفره (ربما قبل اكتمال تحليل HTML). استخدم async عندما يكون السكريبت مستقلاً عن أي سكريبتات أخرى في الصفحة، على سبيل المثال، التحليلات.
  • <script defer> - سيتم جلب السكريبت بالتوازي مع تحليل HTML وتنفيذه عندما تنتهي الصفحة من التحليل. إذا كان هناك العديد منها، يتم تنفيذ كل سكريبت مؤجل بالترتيب الذي تم العثور عليه في المستند. إذا كان السكريبت يعتمد على DOM تم تحليله بالكامل، فستكون سمة defer مفيدة في ضمان تحليل HTML بالكامل قبل التنفيذ. يجب ألا يحتوي السكريبت المؤجل على document.write.

ملاحظة: يتم تجاهل سمات async و defer للسكريبتات التي لا تحتوي على سمة src.

لماذا من الجيد عمومًا وضع روابط CSS `<link>`s بين `<head></head>` و JavaScript `<script>`s قبل `</body>` مباشرة؟ هل تعرف أي استثناءات؟

وضع <link>s في <head>

يُعد وضع <link>s في <head> جزءًا من المواصفات الصحيحة في بناء موقع ويب محسن. عند تحميل صفحة لأول مرة، يتم تحليل HTML و CSS في وقت واحد؛ يُنشئ HTML نموذج كائن المستند (DOM) ويُنشئ CSS نموذج كائن CSS (CSSOM). كلاهما ضروري لإنشاء العناصر المرئية في موقع الويب، مما يسمح بتوقيت "أول رسم ذي معنى" سريع. هذا العرض التدريجي هو فئة تقاس بها مواقع التحسين في درجات أدائها. إن وضع أوراق الأنماط بالقرب من أسفل المستند هو ما يمنع العرض التدريجي في العديد من المتصفحات. تحظر بعض المتصفحات العرض لتجنب إعادة رسم عناصر الصفحة إذا تغيرت أنماطها. ثم يتعثر المستخدم في رؤية صفحة بيضاء فارغة. وفي أوقات أخرى، يمكن أن تكون هناك ومضات من المحتوى غير المصمم (FOUC)، والتي تعرض صفحة ويب بدون تطبيق أي أنماط.

وضع <script>s قبل </body> مباشرة

تُحظر علامات <script> تحليل HTML أثناء تنزيلها وتنفيذها مما قد يبطئ صفحتك. سيسمح وضع السكريبتات في الأسفل بتحليل HTML وعرضه للمستخدم أولاً.

استثناء لموضع <script>s في الأسفل هو عندما يحتوي السكريبت الخاص بك على document.write()، ولكن في هذه الأيام ليس من الممارسات الجيدة استخدام document.write(). أيضًا، يعني وضع <script>s في الأسفل أن المتصفح لا يمكنه بدء تنزيل السكريبتات حتى يتم تحليل المستند بأكمله. وهذا يضمن أن الكود الخاص بك الذي يحتاج إلى معالجة عناصر DOM لن يرمي خطأ ويوقف السكريبت بأكمله. إذا كنت بحاجة إلى وضع <script>s في <head>، فاستخدم سمة defer، والتي ستحقق نفس تأثير تشغيل السكريبت فقط بعد تحليل HTML ولكن يمكن للمتصفح تنزيل السكريبت في وقت مبكر.

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

علامات <head> و <body> اختيارية الآن

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

ما هو العرض التدريجي؟

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

لقد كان أكثر انتشارًا في الأيام التي سبقت الإنترنت واسع النطاق ولكنه لا يزال يُستخدم في التطوير الحديث مع تزايد شعبية اتصالات البيانات المتنقلة (وعدم موثوقيتها)!

أمثلة على هذه التقنيات:

  • التحميل الكسول للصور (Lazy loading of images) - لا يتم تحميل الصور على الصفحة دفعة واحدة. سيتم استخدام JavaScript لتحميل الصورة عندما يقوم المستخدم بالتمرير إلى الجزء من الصفحة الذي يعرض الصورة.
  • إعطاء الأولوية للمحتوى المرئي (أو العرض فوق الطي) (Prioritizing visible content (or above-the-fold rendering)) - قم بتضمين الحد الأدنى فقط من CSS/المحتوى/السكريبتات الضرورية لكمية الصفحة التي ستُعرض في متصفح المستخدم أولاً لعرضها بأسرع ما يمكن، ثم يمكنك استخدام السكريبتات المؤجلة أو الاستماع لحدث DOMContentLoaded/load لتحميل الموارد والمحتوى الآخر.
  • أجزاء HTML غير المتزامنة (Async HTML fragments) - إفراغ أجزاء من HTML إلى المتصفح أثناء بناء الصفحة في الواجهة الخلفية. يمكن العثور على مزيد من التفاصيل حول هذه التقنية.

لماذا تستخدم سمة `srcset` في وسم الصورة؟ اشرح العملية التي يستخدمها المتصفح عند تقييم محتوى هذه السمة.

ستستخدم سمة srcset عندما ترغب في تقديم صور مختلفة للمستخدمين بناءً على عرض شاشة أجهزتهم - تقديم صور عالية الجودة للأجهزة ذات شاشات Retina يعزز تجربة المستخدم بينما تقديم صور ذات دقة أقل للأجهزة ذات الإمكانيات المنخفضة يزيد الأداء ويقلل من هدر البيانات (لأن تقديم صورة أكبر لن يحدث أي فرق مرئي). على سبيل المثال: <img srcset="small.jpg 500w, medium.jpg 1000w, large.jpg 2000w" src="..." alt=""> يخبر المتصفح بعرض الرسم jpg الصغير أو المتوسط أو الكبير اعتمادًا على دقة العميل. القيمة الأولى هي اسم الصورة والقيمة الثانية هي عرض الصورة بالبكسل. بالنسبة لعرض جهاز يبلغ 320 بكسل، يتم إجراء العمليات الحسابية التالية:

  • 500 / 320 = 1.5625
  • 1000 / 320 = 3.125
  • 2000 / 320 = 6.25

إذا كانت دقة العميل 1x، فإن 1.5625 هي الأقرب، وسيختار المتصفح 500w الموافق لـ small.jpg.

إذا كانت الدقة Retina (2x)، فسيستخدم المتصفح أقرب دقة فوق الحد الأدنى. وهذا يعني أنه لن يختار 500w (1.5625) لأنه أكبر من 1 وقد تبدو الصورة سيئة. سيختار المتصفح بعد ذلك الصورة التي لها نسبة ناتجة أقرب إلى 2 وهي 1000w (3.125).

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

هل استخدمت لغات قوالب HTML مختلفة من قبل؟

نعم، Pug (Jade سابقًا)، ERB، Slim، Handlebars، Jinja، Liquid، و EJS على سبيل المثال لا الحصر. في رأيي، هي متشابهة إلى حد كبير وتوفر وظائف مماثلة لتحديد محتوى ومرشحات مفيدة لمعالجة البيانات التي سيتم عرضها. ستسمح لك معظم محركات القوالب أيضًا بحقن المرشحات الخاصة بك في حال احتجت إلى معالجة مخصصة قبل العرض.

ما الفرق بين Canvas و SVG؟

Canvas يعتمد على البكسل، ويعمل مع وحدات البكسل، بينما SVG يعتمد على المتجهات، ويستخدم الأوصاف الرياضية للأشكال. Canvas يستخدم الرسم الإلزامي، حيث يتم تحديد كل خطوة باستخدام JavaScript، وهو مثالي للرسومات الديناميكية والتفاعلية مثل الرسوم المتحركة والألعاب.

على العكس من ذلك، يستخدم SVG الرسم التصريحي، مع تعريف الأشكال والمسارات مباشرة في HTML، مما يجعله أكثر سهولة في الوصول إليه وصديقًا لمحركات البحث. Canvas مثالي للمشاهد المعقدة نظرًا لتكاليفه المنخفضة، ولكن القياس قد يؤدي إلى فقدان جودة الصورة. SVG، كونه مستقلاً عن الدقة، يتكيف مع أحجام الشاشات المختلفة دون التضحية بالجودة.

في النهاية، يناسب Canvas الرسومات الديناميكية عالية الأداء، بينما يتفوق SVG في الرسومات القابلة للتطوير والمستقلة عن الدقة، مع مزايا الوصول وتحسين محركات البحث المتأصلة.

ما هي العناصر الفارغة في HTML؟

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

  • <img>: يستخدم لتضمين الصور في المستند.
  • <input>: يستخدم لقبول مدخلات المستخدم.
  • <br>: يستخدم لإدراج فواصل أسطر أو فواصل أسطر قسرية.
  • <hr>: يستخدم لإنشاء خطوط أفقية أو فواصل.