كيف تنشئ أزرار اختيار في HTML
أزرار الاختيار تتيح للقارئ اختيار خيار واحد بالضبط من مجموعة. كل خيار هو <input type="radio">، وإعطاؤها الاسم name نفسه هو ما يجعلها مجموعة. اختر مقاسًا واضغط Order:
يرسل النموذج زوجًا واحدًا، size=m: اسم المجموعة name وقيمة الزر المختار value. الأجزاء:
- الاسم
nameنفسه على كل زر في المجموعة. اختيار واحد يلغي اختيار الآخرين. - قيمة
valueمختلفة لكل زر. وهي ما يستقبله الخادم. زر الاختيار بلاvalueيرسلon، وهذا لا يخبر الخادم بشيء. checkedعلى الخيار الافتراضي.<label>حول كل زر، كي يكون النص قابلًا للنقر، و<fieldset>مع<legend>كي تعلن قارئات الشاشة السؤال («Size») مع كل خيار.
الاسم هو ما يصنع المجموعة
أزرار الاختيار ذات الأسماء المختلفة مجموعات منفصلة، ولكل مجموعة اختيارها الخاص. في هذا المثال مجموعتان، إضافة إلى مجموعة معطوبة حصل فيها كل زر على اسم خاص به عن طريق الخطأ:
انقر الأزرار الثلاثة في المجموعة المعطوبة: تبقى كلها مختارة ولا يمكن إلغاء أي منها، وهذا أسوأ ما في الخيارين. تتجمع أزرار الاختيار بحسب name داخل النموذج نفسه، لذلك يمكن لنموذجين أن يملك كل منهما مجموعة name="size" خاصة به.
المجموعات الإلزامية وغياب الخيار الافتراضي
required على أي زر في المجموعة تعني أن أحدها يجب أن يُختار قبل إرسال النموذج. وترك checked يجعل القارئ يختار بنفسه، وهذا صحيح حين لا يوجد خيار افتراضي منطقي:
اضغط Continue من دون اختيار وسيوقف المتصفح الإرسال برسالة. وبمجرد اختيار أي خيار تصبح المجموعة كلها صالحة. أما المجموعة غير المختارة وغير الإلزامية فلا ترسل شيئًا على الإطلاق، مثل مربع الاختيار غير المحدد.
يمكن للنقر أن يختار زر اختيار لكنه لا يلغي اختياره أبدًا. إذا كان يجب أن تكون «لا إجابة» ممكنة بعد الاختيار، فأضف خيارًا صريحًا لذلك.
قراءة القيمة المختارة في JavaScript
form.elements.name تُرجع المجموعة كلها، و.value الخاصة بها هي قيمة الزر المختار (نص فارغ إن لم يُختر شيء). وحدث change ينطلق على الزر الذي صار مختارًا:
المستمع على النموذج، فيلتقط التغيير في أي من حقوله. وخارج النموذج، جِد الزر المختار بـ document.querySelector('input[name="period"]:checked').
سلوك لوحة المفاتيح
مجموعة أزرار الاختيار محطة واحدة في ترتيب Tab. ينقلك Tab إلى داخل المجموعة، فيقع على الزر المختار (أو على الأول إن لم يُختر شيء)، ومفاتيح الأسهم تنقل الاختيار بين الخيارات. وTab مرة أخرى يغادر المجموعة. هذا يأتي مجانًا مع أزرار الاختيار الحقيقية التي تشترك في name، وهو سبب آخر لعدم إعادة بنائها من عناصر <div>.
تنسيق أزرار الاختيار
accent-color تعيد تلوين زر الاختيار الأصلي. وappearance: none تتيح لك رسم دائرتك الخاصة. وبما أن زر الاختيار المخفي ما زال يمكن اختياره عبر تسميته، يمكن للمجموعة أن تبدو كمجموعة بطاقات مع الاحتفاظ بكل سلوك أزرار الاختيار:
الدائرة المخصصة مجرد حد سميك عند الاختيار. والبطاقات تخفي الحقل بـ opacity: 0 لا بـ display: none، فيبقى قابلًا للتركيز وتظل مفاتيح الأسهم تعمل، و:has(input:checked) تنسّق البطاقة المختارة. تعمل :has() في الإصدارات الحالية من Chrome وFirefox وSafari.
radio أم checkbox أم select؟
| استخدم | متى |
|---|---|
| أزرار الاختيار | خيار واحد من خيارات قليلة (نحو 2 إلى 6) يجب أن تكون كلها ظاهرة |
| مربعات الاختيار | أي عدد من الخيارات، بما في ذلك لا شيء |
<select> | خيار واحد من قائمة طويلة، مثل الدول (راجع القائمة المنسدلة select) |
أخطاء شائعة
- أسماء
nameمختلفة في مجموعة واحدة. يمكن اختيار كل زر ولا يمكن مسح أي منها. - غياب
value. يستقبل الخادمonأيًا كان الاختيار. - إخفاء الحقل بـ
display: noneفي تصميم مخصص. لا يعود بالإمكان التركيز عليه أو استخدامه بلوحة المفاتيح. - غياب
<fieldset>و<legend>. تعلن قارئات الشاشة «Small، زر اختيار» بلا سؤال يرافقه. - زر اختيار واحد لمربع «أوافق». لا يمكن إلغاء تحديده أبدًا، فاستخدم مربع الاختيار.
checkedعلى عدة أزرار في مجموعة واحدة. الأخير وحده ينتهي مختارًا.
الأسئلة الشائعة
كيف أنشئ أزرار اختيار في HTML؟
اكتب <input type="radio"> لكل خيار، وأعطها كلها الاسم name نفسه وقيمة value مختلفة، وضع كل واحد داخل <label>: <label><input type="radio" name="size" value="m"> Medium</label>. الاسم المشترك يجعلها مجموعة واحدة لا يُختار منها إلا زر واحد.
لماذا أستطيع اختيار أكثر من زر radio؟
لأن الأزرار لا تشترك في الاسم name نفسه. أزرار الاختيار لا تشكّل مجموعة إلا عبر name متطابق (في النموذج نفسه)، ولا يمكن اختيار إلا زر واحد في كل مجموعة.
كيف أحصل على قيمة زر radio المختار في JavaScript؟
استخدم form.elements.size.value، حيث size هو اسم المجموعة، فتُرجع قيمة الزر المختار، أو نصًا فارغًا إن لم يُختر شيء. ومن دون نموذج: document.querySelector('input[name="size"]:checked')?.value.
كيف أحدد زر radio افتراضيًا؟
أضف checked إلى زر واحد في المجموعة: <input type="radio" name="plan" value="free" checked>. وإن حملها أكثر من زر، يفوز الأخير.
هل يمكن إلغاء اختيار زر radio؟
ليس بالنقر عليه، فالنقر يختار فقط. قدّم خيار «لا شيء»، أو أعد ضبط النموذج، أو اضبط button.checked = false في JavaScript. وإذا كان يجب أن يكون الاختيار اختياريًا وقابلًا للإلغاء، فقد يناسب مربع الاختيار أو select أكثر.