איך יוצרים כפתורי רדיו ב-HTML
כפתורי רדיו מאפשרים לקורא לבחור בדיוק אפשרות אחת מתוך קבוצה. כל אפשרות היא <input type="radio">, ומה שהופך אותן לקבוצה הוא אותו name. בחרו מידה ולחצו על Order:
הטופס שולח זוג אחד, size=m: ה-name של הקבוצה וה-value של הכפתור הנבחר. החלקים:
- אותו
nameעל כל כפתור בקבוצה. בחירה באחד מבטלת את הבחירה באחרים. valueשונה על כל אחד. זה מה שהשרת מקבל. רדיו בליvalueשולחon, וזה לא אומר לשרת כלום.checkedעל אפשרות ברירת המחדל.<label>סביב כל אחד, כדי שהטקסט יהיה לחיץ, וגם<fieldset>עם<legend>כדי שקוראי מסך יכריזו על השאלה ("Size") יחד עם כל אפשרות.
ה-name יוצר את הקבוצה
כפתורי רדיו עם שמות שונים הם קבוצות נפרדות, ולכל קבוצה יש בחירה משלה. בדוגמה הזו יש שתי קבוצות, ועוד סט שבור שבו כל רדיו קיבל בטעות שם משלו:
לחצו על שלושתם בקבוצה השבורה: כולם נשארים נבחרים ואף אחד לא יכול להתבטל שוב, וזה הגרוע משני העולמות. כפתורי רדיו מתקבצים לפי name בתוך אותו טופס, כך שלשני טפסים יכולה להיות לכל אחד קבוצת name="size" משלו.
קבוצות חובה ובלי ברירת מחדל
required על רדיו כלשהו בקבוצה אומר שאחד מהם חייב להיבחר לפני שהטופס נשלח. השמטת checked מחייבת את הקורא לבחור באופן פעיל, וזה נכון כשאין ברירת מחדל הגיונית:
לחצו על Continue בלי לבחור והדפדפן עוצר את השליחה עם הודעה. ברגע שנבחרת אפשרות כלשהי, כל הקבוצה תקינה. קבוצה שלא נבחר בה כלום ושאינה חובה לא שולחת כלום, כמו checkbox לא מסומן.
לחיצה יכולה לבחור רדיו אבל אף פעם לא לבטל את הבחירה בו. אם צריך לאפשר "אין תשובה" אחרי שכבר נבחר משהו, הוסיפו לזה אפשרות מפורשת.
קריאת הערך הנבחר ב-JavaScript
form.elements.name מחזיר את כל הקבוצה, וה-.value שלה הוא הערך של הרדיו הנבחר (מחרוזת ריקה כשאין כזה). האירוע change נורה על הרדיו שנבחר:
המאזין נמצא על הטופס, כך שהוא תופס שינוי בכל אחד מהשדות שלו. מחוץ לטופס, מצאו את הרדיו הנבחר עם document.querySelector('input[name="period"]:checked').
התנהגות מקלדת
קבוצת רדיו היא עצירה אחת בסדר ה-Tab. Tab נכנס לקבוצה ונוחת על הרדיו הנבחר (או, כשאף אחד לא נבחר, על הראשון), ומקשי החצים מעבירים את הבחירה בין האפשרויות. Tab נוסף יוצא מהקבוצה. זה מגיע בחינם עם קלטי רדיו אמיתיים שחולקים name, וזו עוד סיבה לא לבנות רדיו מחדש מאלמנטי <div>.
עיצוב כפתורי רדיו
accent-color צובע מחדש את הרדיו המקורי. appearance: none מאפשר לצייר עיגול משלכם. ומכיוון שרדיו מוסתר עדיין אפשר לבחור דרך התווית שלו, קבוצה יכולה להיראות כמו סט של כרטיסים ולשמור על כל התנהגות הרדיו:
העיגול המותאם הוא פשוט מסגרת עבה כשהוא מסומן. הכרטיסים מסתירים את ה-input עם opacity: 0 ולא עם display: none, כך שאפשר עדיין להעביר אליו פוקוס ומקשי החצים ממשיכים לעבוד, ו-:has(input:checked) מעצב את הכרטיס הנבחר. :has() עובד בגרסאות הנוכחיות של Chrome, Firefox ו-Safari.
רדיו, checkbox או select?
| שימוש | מתי |
|---|---|
| כפתורי רדיו | בחירה אחת מתוך מעט אפשרויות (בערך 2 עד 6) שכולן צריכות להיות גלויות |
| תיבות סימון | כל מספר של בחירות, כולל אף אחת |
<select> | בחירה אחת מרשימה ארוכה, כמו מדינות (ראו HTML select) |
טעויות נפוצות
nameשונה בתוך קבוצה אחת. אפשר לבחור כל רדיו ואי אפשר לנקות אף אחד.- אין
value. השרת מקבלonלא משנה מה נבחר. - הסתרת ה-input עם
display: noneבעיצוב מותאם. כבר אי אפשר להעביר אליו פוקוס או להשתמש בו במקלדת. - אין
<fieldset>ו-<legend>. קוראי מסך מכריזים "Small, radio button" בלי שאלה שתלווה את זה. - כפתור רדיו בודד לתיבת "I agree". אי אפשר לבטל את הסימון שלו אף פעם; השתמשו ב-checkbox.
checkedעל כמה כפתורי רדיו באותה קבוצה. רק האחרון נשאר נבחר.
שאלות נפוצות
איך יוצרים כפתורי רדיו ב-HTML?
כתבו <input type="radio"> אחד לכל אפשרות, תנו לכולם אותו name ו-value שונה, ושימו כל אחד בתוך <label>: <label><input type="radio" name="size" value="m"> Medium</label>. השם המשותף הופך אותם לקבוצה אחת שבה אפשר לבחור רק אחד.
למה אפשר לבחור יותר מכפתור רדיו אחד?
לכפתורים אין אותו name. כפתורי רדיו יוצרים קבוצה רק דרך name זהה (באותו טופס), ורק כפתור אחד בכל קבוצה יכול להיות נבחר.
איך קוראים את הערך של כפתור הרדיו הנבחר ב-JavaScript?
השתמשו ב-form.elements.size.value, כאשר size הוא שם הקבוצה; הוא מחזיר את הערך של הכפתור הנבחר, או מחרוזת ריקה אם אף אחד לא נבחר. בלי טופס: document.querySelector('input[name="size"]:checked')?.value.
איך קובעים כפתור רדיו כברירת מחדל?
הוסיפו checked לכפתור אחד בקבוצה: <input type="radio" name="plan" value="free" checked>. אם יש אותו לכמה כפתורים, האחרון גובר.
אפשר לבטל בחירה של כפתור רדיו?
לא בלחיצה עליו; לחיצה רק בוחרת. הציעו אפשרות "None", אפסו את הטופס, או הגדירו button.checked = false ב-JavaScript. אם הבחירה צריכה להיות אופציונלית וניתנת להסרה, checkbox או select עשויים להתאים יותר.