ה-API של רכיבי select שניתנים להתאמה אישית מאפשר לעצב רכיבי <select> באופן הצהרתי, באמצעות CSS, כך שיתאימו באופן מושלם למערכת העיצוב של המותג. כשמפעילים את appearance: base-select, מקבלים גישה ל-shadow DOM הפנימי של רכיב הבחירה, וכך אפשר לעצב את הכפתור, את רשימת בורר האפשרויות, את סמל החץ ואת סימן הווי באמצעות מאפייני CSS רגילים.
בעבר, כדי ליצור רכיב select ממותג לחלוטין, היה צריך לבנות מחדש את הרכיב מאפס באמצעות JavaScript. לעיתים קרובות, הפעולה הזו פגעה בנגישות, בניווט באמצעות המקלדת ובשילוב של הטופס המקורי. בעזרת appearance: base-select, אתם מקבלים מראה מותאם אישית בזמן שהדפדפן מטפל בניהול המיקוד, ברינדור של השכבה העליונה ובקישורי הנגישות.
איך להטמיע
כדי להטמיע סגנון מותאם אישית של רכיב הבחירה:
- הבעת הסכמה להתאמה אישית: מחילים את
appearance: base-selectגם על הרכיב<select>וגם על הרכיב המדומה::picker(select)(שמטרגט את הרשימה הנפתחת של האפשרויות). - מבנה הכפתור בהתאמה אישית (אופציונלי): מגדירים רכיב
<button>ישירות בתוך<select>כדי להחליף את הטריגר שמוגדר כברירת מחדל. משתמשים ברכיב<selectedcontent>בתוך הכפתור הזה כדי לייצג את הטקסט או התוכן של האפשרות שנבחרה כרגע. - עיצוב רשימת הבחירה: משתמשים ברכיב המדומה
::picker(select)כדי להחיל טיפוגרפיה, צבעי רקע, גבולות וצללים על הרשימה הנפתחת. הדפדפן מעבד את זה בשכבה העליונה, כך שבעיות שקשורות ל-z-indexהן נחלת העבר. - סמלים פנימיים של סגנון:
- אפשר להשתמש ב-
select::picker-iconכדי לעצב או להחליף את סמל החץ. - משתמשים ב-
option::checkmarkכדי לעצב את סימן הווי לצד האפשרות הפעילה.
- אפשר להשתמש ב-
- אפשרויות סגנון: אפשר להחיל סגנונות על רכיבי
<option>למצבי ריחוף, מרווח פנימי ופריסה.
קוד לדוגמה: Branded Courier Select
בדוגמה הבאה מוצג רכיב בחירה בהתאמה אישית עם גופן ברוחב אחיד וגבולות מקווקווים, שמתאים לאסתטיקה של מותג "חבילות" ספציפי.
/* Enable customization for the select and its picker */
.brand-select,
.brand-select::picker(select) {
appearance: base-select;
}
/* Style the visible trigger button */
.brand-select {
font-family: 'Courier New', monospace;
background-color: #fffaf0;
color: #8b4513;
border: 2px dashed #8b4513;
border-radius: 4px;
padding: 0.75rem;
font-size: 1rem;
cursor: pointer;
}
/* Style the dropdown options list */
.brand-select::picker(select) {
font-family: 'Courier New', monospace;
background-color: #fffaf0;
border: 2px dashed #8b4513;
border-radius: 4px;
padding: 0.5rem;
}
/* Customize internal part colors to match text */
.brand-select::picker-icon {
color: #8b4513;
}
.brand-select option::checkmark {
color: #8b4513;
}
/* Style individual options and hover effects */
.brand-select option {
padding: 0.5rem;
border-radius: 4px;
color: #8b4513;
cursor: pointer;
}
.brand-select option:hover {
background-color: #fdf5e6;
}
<label for="preferences">Select shipping preference</label>
<select class="brand-select" id="preferences" name="preferences">
<button>
<selectedcontent></selectedcontent>
</button>
<option value="standard">Standard Shipping</option>
<option value="express" selected>Express Shipping</option>
<option value="overnight">Overnight Delivery</option>
</select>
הטמעה אסטרטגית ושיטות מומלצות
- מומלץ להשתמש ב-
appearance: base-selectכשמערכת העיצוב דורשת עקביות חזותית ברמת דיוק גבוהה בכל פקדי הטפסים, שלא ניתן להשיג באמצעות שינויים סטנדרטיים בבחירה בדפדפנים שונים. - אל תשתמשו באפשרות הזו אם אתם מסתמכים על חוויית הבחירה המקורית של מערכת ההפעלה (למשל, בורר גלגל הגלילה הרגיל במכשירי iOS). הפעלת
base-selectמבטלת את ההסכמה לרכיבים אינטראקטיביים מקוריים בממשק המשתמש לנייד לטובת תפריטים בשכבה העליונה שעברו עיבוד באינטרנט. - חשוב לוודא שניגודיות הצבעים עומדת בתקני WCAG. הבורר שניתן להתאמה אישית מאפשר לכם להגדיר צבעים אד-הוק, אבל אתם אחראים לוודא שהטקסט נשאר קריא על רקעים מותאמים אישית.
- בודקים את ההתנהגות של הפריסה. ההגדרה
appearance: base-selectמסירה את התנהגות ברירת המחדל של הדפדפן, שבה גודל הבחירה נקבע לפי רוחב האפשרות הארוכה ביותר. יכול להיות שתצטרכו להגדיר רוחב קבוע או להשתמש באילוצים של flex/grid כדי למנוע שינויי פריסה. - מוודאים של-
<select>יש מאפייןnameו-<label>משויך. כך אפשר לוודא שגם עם ממשק משתמש מותאם אישית, הרכיב נשאר נגיש לקוראי מסך ופועל בצורה תקינה עם שליחת טפסים רגילים. - כדי לוודא ששליחת הטופס פועלת בדיוק כמו קודם, צריך להשתמש במאפייני
valueרגילים באפשרויות.
אסטרטגיות חלופיות
חלופות ותמיכה בדפדפנים ל-<select> שניתן להתאמה אישית
בדפדפנים שעדיין לא תומכים ב-appearance: base-select, הרכיב <select> משתנה בצורה חלקה לתפריט נפתח רגיל של מערכת ההפעלה.
- התעלמות מתוכן שאינו טקסט: דפדפנים ישנים יותר מסירים תגי HTML (כמו
<svg>או<div>) בתוך תגי<option>ומציגים רק את צומתי הטקסט. חשוב לוודא שתוכן הטקסט של ה-<option>קריא ובעל משמעות בפני עצמו. - טיפול במבנה HTML: מנתחי HTML רגילים עשויים להתעלם מהתגים
<button>ו-<selectedcontent>בתוך<select>או להתייחס אליהם כלא תקינים. אם אתם רואים טקסט רגיל כחלופה קריאה, אין צורך ב-polyfills כבדים של JavaScript לשיפור הדרגתי.
document.addEventListener("DOMContentLoaded", () => {
// Check if browser supports base-select value
if (!CSS.supports("appearance", "base-select")) {
// Custom select overrides are not supported natively.
}
});