ابدأ بالمعنى والبنية
لا يقتصر HTML على وضع النصوص على الشاشة؛ فالعناوين ومناطق الصفحة والروابط والقوائم والنماذج توضّح للناس والمتصفحات كيفية تنظيم المحتوى. وتسهل البنية المدروسة التنقل والصيانة وتوسيع الصفحة لاحقاً.
اجعل التخطيط مناسباً لكل شاشة
يحوّل CSS هذه البنية إلى تجربة بصرية. ستتدرب على المسافات والتسلسل البصري والتخطيط المتجاوب كي تظل الصفحة مقروءة على الهاتف والشاشة الكبيرة. فالهدف ليس تصغير تصميم الحاسوب، بل جعل المحتوى يتكيف بطبيعته.
أضف السلوك مع الحفاظ على الوضوح
تعرّفك أساسيات JavaScript إلى التفاعل: الاستجابة للمدخلات وتحديث الواجهة وربط السلوك بالمحتوى. وتصبح إتاحة الوصول وSEO اختبارات عملية: هل يستطيع الناس التنقل؟ وهل تفهم محركات البحث بنية الصفحة؟ تجمع المرحلة هذه الأسس في صفحات نظيفة ومتجاوبة.
من الفكرة إلى كود يعمل فعلياً
توضح هذه المقاطع كيف تظهر مفاهيم كل مستوى داخل المشاريع الحقيقية. إنها نقاط بداية للقراءة والتحليل والتعديل والاختبار، وليست كوداً للنسخ دون فهم.
امنح المحتوى بنية ذات معنى
تستخدم الصفحة منطقة رئيسية وتسلسلاً واضحاً للعناوين وقائمة فعلية. تجمع شبكة CSS بين minmax() وauto-fit لإعادة ترتيب البطاقات حسب المساحة بدلاً من فرض تخطيط ثابت.
<main class="program-page">
<section class="intro" aria-labelledby="page-title">
<p class="eyebrow">Community learning</p>
<h1 id="page-title">Build your first web project</h1>
<p>Learn by making a page people can actually use.</p>
<a class="button" href="#apply">Explore the program</a>
</section>
<section aria-labelledby="outcomes-title">
<h2 id="outcomes-title">What you will practise</h2>
<ul class="outcomes">
<li>Structure content with HTML</li>
<li>Shape a responsive layout with CSS</li>
<li>Add useful behavior with JavaScript</li>
</ul>
</section>
</main>
<style>
.outcomes {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(14rem, 1fr));
gap: 1rem;
}
</style>أضف تفاعلاً متاحاً للجميع
يتحكم الزر بالإجابة ويكشف حالتها عبر aria-expanded. يدعم الزر الأصلي لوحة المفاتيح؛ ويحدّث JavaScript الإجابة الظاهرة والحالة التي تعلنها التقنيات المساعدة.
const questions = document.querySelectorAll("[data-faq]");
questions.forEach((question) => {
const button = question.querySelector("button");
const answer = question.querySelector("[data-answer]");
button.addEventListener("click", () => {
const isOpen = button.getAttribute("aria-expanded") === "true";
button.setAttribute("aria-expanded", String(!isOpen));
answer.hidden = isOpen;
});
});اقرأ ثم عدّل بنفسكغيّر أحد المتطلبات، وتوقّع النتيجة، ثم شغّل الكود للتحقق. أثناء المراجعة، اشرح سبب اختيارك واقتراحاً للتحسين التالي.