UIDex

حقل النموذج

Form Field

<label for>

اسمه كمانفورم فيلد، حقل الاستمارة، مجموعة الحقل، الحقل المعنون، خانة النموذج، حقل إدخال بتسمية، labelled input، form group، field group، input group، form control، labeled field

حقل النموذج هو الوحدة الكاملة التي يُدخل بها المستخدم قيمة واحدة: تسمية مرئية، وعنصر التحكّم، ونصّ مساعد، ورسالة خطأ عند رفض القيمة، وعلامة تقول إن الحقل مطلوب. والذي يجمع هذه القطع في حقل واحد هو الربط في الكود لا القرب في التصميم: for/id بين التسمية والعنصر، و aria-describedby بين العنصر وبين نصّه المساعد ورسالة خطئه، و aria-invalid ليقول إن القيمة مرفوضة. وهو ليس عنصر الإدخال وحده، فـ <input> الذي لا يسمّيه شيء ليس له اسم مقروء ويُعلَن صندوقاً بلا عنوان، ولا يعرف قارئ الشاشة ماذا يطلب منك. وهو ليس النصّ النائب (placeholder): النائب مثال يُرسم داخل الصندوق وهو فارغ، وهو آخر ما يلجأ إليه حساب الاسم المقروء، والسمة نفسها لا تُحذف بالكتابة، فيبقى القارئ ينطق اسماً بينما يفقد المستخدم المبصر التسمية الوحيدة على الحقل عند أول حرف. وهو ليس التنبيه المضمّن (inline alert) الذي يخصّ النموذج كلّه أو الصفحة، لأن رسالة الحقل معلّقة بعنصر واحد بعينه عبر aria-describedby وتُقرأ معه. وحين يكون المُدخل مجموعة أزرار راديو أو مربّعات اختيار فالتسمية وحدها لا تكفي، لأن <label> يسمّي عنصراً واحداً فقط، ومكان النصّ هنا <legend> داخل <fieldset>.

لو قلت عليه…

«العنوان اللي فوق الخانة»«الكلام الصغير اللي تحت مربّع الكتابة»«النجمة اللي جنب اسم الحقل»«الرسالة اللي بتقول الإيميل غلط»«الكتابة الباهتة اللي بتختفي أول ما تكتب»

العيّنة الحيّة

تفاعل مع الديمو. كل الأجزاء حقيقية ومرقّمة.

إنشاء حساب

النجمة تعني حقلاً مطلوباً
نرسل رمز التفعيل إلى هذا العنوان مرّة واحدة.
RTLالقيمة وحدها بـ dir="ltr"، والتسمية والرسائل مع اتجاه الصفحة

تشريح العنصر: كل جزء واسمه

مرّر على أي سطر ليتحدّد مكانه في الديمو فوق.

برومبت البناء

ابنِ حقل نموذج كاملاً لا عنصر إدخال وحده. ولّد معرّفاً واحداً بـ useId واشتقّ منه معرّف العنصر ومعرّف النصّ المساعد ومعرّف رسالة الخطأ، ووجّه for التسمية إلى معرّف العنصر، واجعل التسمية نصّاً مرئياً دائماً فوق الحقل، ولا تستبدل بها النصّ النائب أبداً. اربط النصّ المساعد ورسالة الخطأ بالعنصر عبر aria-describedby بقائمة معرّفات مفصولة بمسافة، وضع aria-invalid="true" لحظة رفض القيمة وأزلها فور تصحيحها. اجعل حاوية الرسالة موجودة في DOM من أول عرض وحدّث نصّها فقط، وأعطها role="alert" حتى تُنطق دون نقل التركيز. علّم الحقل المطلوب بسمة required، واجعل النجمة aria-hidden، وأضف في أعلى النموذج سطراً يشرح معناها. لا تبدأ التحقّق قبل أن يترك المستخدم الحقل: استعمل :user-invalid أو تحقّق عند blur ثم حدّث الرسالة مع كل حرف بعد أول خطأ. عطّل فقاعة المتصفّح بـ novalidate وتولّ الرسائل بنفسك، وانقل التركيز إلى أول حقل مرفوض عند الإرسال. واستعمل الخصائص المنطقية في كل مكان: text-align: start و padding-inline و margin-inline و inset-inline-end لأيقونة الحالة، ولا تكتب left أو right أو padding-right. ضع dir="ltr" على حقول البريد وعناوين URL وحدها مع بقاء التسمية والرسائل باتجاه الصفحة، ولُفّ أي قيمة لاتينية داخل جملة عربية بـ <bdi>.

سلوكه في الاتجاه من اليمين لليسار

الجزء ده حصري عندنا.

موضع التسمية والنجمة

ينعكس

التسمية تجلس عند بداية السطر والنجمة تليها، فتنتقل المجموعة كلها إلى اليمين في العربية. اكتب text-align: start على التسمية والنصّ المساعد ورسالة الخطأ بدلاً من text-align: left، وباعد النجمة بـ margin-inline-start، فالنجمة المزاحة بـ margin-left تلتصق بالكلمة في اتجاه وتبتعد عنها في الاتجاه الآخر. وفي النماذج ذات التسمية الجانبية استعمل grid-template-columns مع الخصائص المنطقية، ولا تبنِ الصفّ على float: left.

اتجاه القيمة نفسها

لا ينعكس

البريد الإلكتروني وعناوين URL وأسماء المستخدمين ومسارات الملفات نصّ لاتيني، واتجاهه الأساسي يؤخذ من العنصر الذي يحمله لا من الصفحة. ضع dir="ltr" على <input> وحده حتى تستقرّ علامات @ و / و . في مواضعها ويقف المؤشّر عند اليسار، مع بقاء <label> والرسائل تحت اتجاه الصفحة. وانتبه أن dir على العنصر يعيد تعريف start و end داخله، فـ text-align: start صارت يساراً هنا، و text-align: end هي ما يعيد محاذاة الصندوق إلى جهة بقية النموذج. أمّا الحقل الذي يستقبل عربية أو لاتينية مثل حقل الاسم فاستعمل فيه dir="auto" ليحسمه أول محرف قويّ الاتجاه.

أيقونة الحالة داخل الصندوق

ينعكس

الأيقونة الموضوعة داخل الحقل عند النهاية في الإنجليزية تنتقل إلى النهاية المنطقية نفسها في العربية، أي إلى اليسار. ثبّت الأيقونة بـ inset-inline-end واحجز مكانها بـ padding-inline-end على عنصر <input> نفسه، فالحجز المكتوب padding-right يترك الفراغ في الجهة الخاطئة ويجعل القيمة تمرّ تحت الأيقونة بعد الانعكاس. والفخّ هنا اختلاط الاتجاهين: حين يحمل الحقل dir="ltr" لقيمة لاتينية يُحسب padding-inline-end باتجاهه هو فيقع يميناً، بينما ترث الأيقونة اتجاه الصفحة من الحاوية فيقع inset-inline-end يساراً، فاجمع الحاوية والحقل والأيقونة تحت dir واحد.

عزل القيمة اللاتينية داخل الرسالة

لا ينعكس

رسالة الخطأ التي تُدرج قيمة لاتينية داخل جملة عربية تترك المحارف المحايدة عند طرفي القيمة، مثل النقطة الأخيرة أو القوس أو علامة @ الشاردة، تُحسَب بالنسبة للسطر العربي المحيط، فتقفز إلى الطرف الآخر وتقرأ العين شيئاً غير الذي كتبه المستخدم. لُفّ القيمة بـ <bdi>، وهو المعرَّف في ورقة أنماط المتصفّح بـ unicode-bidi: isolate، فتصير مقطعاً اتجاهياً مستقلاً لا يتأثّر بما حوله. وخارج HTML، في نصّ داخل JavaScript أو في ملف ترجمة، ضع U+2068 قبل القيمة و U+2069 بعدها لتحصل على العزل نفسه.

رسالة المتصفّح الأصلية

لا ينعكس

الفقاعة التي يعرضها المتصفّح عند required أو type="email" مكتوبة بلغة واجهة المتصفّح لا بلغة الصفحة، فقد يقرأ مستخدم نموذجك العربي «Please fill out this field» بمحاذاة يسارية، وهي فقاعة لا تُنسَّق ولا يُنقل موضعها بـ CSS. إن كان النموذج معرَّباً فعطّل التحقّق الأصلي بـ novalidate على <form> واعرض رسائلك داخل الصفحة، أو اكتب النصّ بنفسك عبر setCustomValidity. وأبقِ سمة required في الترميز على أيّ حال لأنها ما يعلنه قارئ الشاشة.

أسماؤه في الكود

كل سطر هو كلمة مكتبة واحدة عن نفس الشيء. خد السطر اللي بيكلّم مشروعك.

HTML<label for="email"> + <input id="email">الربط الذي يمنح العنصر اسمه المقروء ويجعل النقر على الكلمة يضع المؤشّر فيه.
ARIAaria-describedby="hint err"يقبل عدّة معرّفات مفصولة بمسافة، وتُقرأ بالترتيب الذي كتبتها به.
ARIAaria-invalid="true"يعلن أن القيمة مرفوضة ولا يرسم شيئاً، فالشكل يبقى على عاتق CSS.
HTML<fieldset> + <legend>تسمية مجموعة كاملة، وهي البديل حين يعجز <label> عن تسمية عدّة أزرار راديو.
CSS:user-invalidلا يطابق إلا بعد أن يغادر المستخدم الحقل أو يرسل النموذج، فلا يُرفض الحقل وهو يكتب لأول مرّة.
shadcn/ui<FormField> + <FormMessage>يولّد المعرّفات بـ useId ويصل aria-describedby و aria-invalid نيابة عنك.
Material UI<TextField required error helperText>مكوّن واحد يرسم التسمية والصندوق والسطر تحته، و error يعيد تلوينه فقط فالنصّ عليك أنت.

شوف كمان

آخر تحديث · 2026-08-19