כדי להפוך את הסמנים לנגישים יותר, אתם יכולים להפעיל טיפול באירועים מסוג קליק, להוסיף טקסט תיאורי לקוראי מסך ולשנות את קנה המידה של הסמן.
- כשסמן הוא קישור (או ניתן לגרירה), הוא יכול להגיב לקלט של המקלדת והעכבר.
- קוראי מסך יכולים לקרוא את הטקסט שצוין באפשרות
title, והוא יוצג כשהמשתמש יחזיק את סמן העכבר מעל הסמן. - הגדלת הגודל של הסמנים מפחיתה את רמת הדיוק הנדרשת כדי ליצור אינטראקציה עם הסמן בכל המכשירים – במיוחד במכשירים עם מסך מגע – ומשפרת את הנגישות. סמני ברירת המחדל עומדים בתקן הגודל המינימלי של WCAG AA, אבל מפתחים שרוצים לעמוד בתקן גודל היעד של WCAG AAA צריכים להגדיל את הסמן.
במאמר התאמה אישית בסיסית של סמנים מוסבר איך לשנות את קנה המידה של הסמן, להוסיף טקסט לכותרת ועוד.
בדוגמה הבאה מוצגת מפה עם חמישה סמנים שאפשר ללחוץ עליהם ולהתמקד בהם, שכוללים טקסט כותרת ושהוגדרו לקנה מידה של 1.5x:
כדי לנווט בין הסמנים באמצעות המקלדת:
- משתמשים במקש Tab כדי להתמקד בסמן הראשון. אם יש כמה סמנים באותה מפה, משתמשים במקשי החיצים כדי לעבור בין הסמנים.
- אם אפשר ללחוץ על הסמן, מקישים על Enter כדי "ללחוץ" עליו. אם לסמן יש חלון מידע, אפשר לפתוח אותו בלחיצה, או בלחיצה על מקש Enter או על מקש הרווח. כשהחלון נסגר, המיקוד חוזר לסמן המשויך.
- כדי להמשיך לעבור בין שאר אמצעי הבקרה של המפה, לוחצים שוב על Tab.
הפיכת סמן לניתן ללחיצה
בקטע הזה מוסבר איך לגרום לסמנים להגיב לאירועים מסוג קליק. כדי להפוך סמן ללחיץ:
- מגדירים את המאפיין
gmpClickableלערךtrue.
TypeScript
const pin = new PinElement({ glyphText: `${i + 1}`, scale: 1.5, }); const marker = new AdvancedMarkerElement({ position, title: `${i + 1}. ${title}`, gmpClickable: true, }); marker.append(pin); mapElement.append(marker);
JavaScript
const pin = new PinElement({ glyphText: `${i + 1}`, scale: 1.5, }); const marker = new AdvancedMarkerElement({ position, title: `${i + 1}. ${title}`, gmpClickable: true, }); marker.append(pin); mapElement.append(marker);
- מוסיפים רכיב event listener מסוג
gmp-clickכדי להגיב לקלט של משתמשים.
TypeScript
// Add a click listener for each marker, and set up the info window. marker.addEventListener('gmp-click', () => { infoWindow.close(); infoWindow.setContent(marker.title); infoWindow.open(marker.map, marker); });
JavaScript
// Add a click listener for each marker, and set up the info window. marker.addEventListener('gmp-click', () => { infoWindow.close(); infoWindow.setContent(marker.title); infoWindow.open(marker.map, marker); });
כדי להפוך סמן ללא ניתן ללחיצה שוב:
- מפעילים את
removeEventListenerכדי להסיר את רכיב ה-event listener שלgmp-click:
// Remove the listener. marker.removeEventListener('gmp-click', clickListener);- אפשרות אחרת היא להגדיר את המאפיין
gmpClickableלערךfalse.
- מפעילים את
כדי לשפר עוד יותר את הנגישות:
- מגדירים טקסט תיאורי לסמן באמצעות האפשרות
AdvancedMarkerElement.title. - כדי להגדיל את גודל הסמן, משתמשים במאפיין
scaleשלPinElement.
קוד לדוגמה מלא
קוד מקור מלא לדוגמה
TypeScript
const mapElement = document.querySelector('gmp-map')!; async function init() { // Request needed libraries. const [{ InfoWindow }, { AdvancedMarkerElement, PinElement }] = await Promise.all([ google.maps.importLibrary('maps'), google.maps.importLibrary('marker'), ]); // Set LatLng and title text for the markers. The first marker (Boynton Pass) // receives the initial focus when tab is pressed. Use arrow keys to move // between markers; press tab again to cycle through the map controls. const tourStops = [ { position: { lat: 34.8791806, lng: -111.8265049 }, title: 'Boynton Pass', }, { position: { lat: 34.8559195, lng: -111.7988186 }, title: 'Airport Mesa', }, { position: { lat: 34.832149, lng: -111.7695277 }, title: 'Chapel of the Holy Cross', }, { position: { lat: 34.823736, lng: -111.8001857 }, title: 'Red Rock Crossing', }, { position: { lat: 34.800326, lng: -111.7665047 }, title: 'Bell Rock', }, ]; // Create an info window to share between markers. const infoWindow = new InfoWindow(); // Create the markers. tourStops.forEach(({ position, title }, i) => { const pin = new PinElement({ glyphText: `${i + 1}`, scale: 1.5, }); const marker = new AdvancedMarkerElement({ position, title: `${i + 1}. ${title}`, gmpClickable: true, }); marker.append(pin); mapElement.append(marker); // Add a click listener for each marker, and set up the info window. marker.addEventListener('gmp-click', () => { infoWindow.close(); infoWindow.setContent(marker.title); infoWindow.open(marker.map, marker); }); }); } void init();
JavaScript
const mapElement = document.querySelector('gmp-map'); async function init() { // Request needed libraries. const [{ InfoWindow }, { AdvancedMarkerElement, PinElement }] = await Promise.all([ google.maps.importLibrary('maps'), google.maps.importLibrary('marker'), ]); // Set LatLng and title text for the markers. The first marker (Boynton Pass) // receives the initial focus when tab is pressed. Use arrow keys to move // between markers; press tab again to cycle through the map controls. const tourStops = [ { position: { lat: 34.8791806, lng: -111.8265049 }, title: 'Boynton Pass', }, { position: { lat: 34.8559195, lng: -111.7988186 }, title: 'Airport Mesa', }, { position: { lat: 34.832149, lng: -111.7695277 }, title: 'Chapel of the Holy Cross', }, { position: { lat: 34.823736, lng: -111.8001857 }, title: 'Red Rock Crossing', }, { position: { lat: 34.800326, lng: -111.7665047 }, title: 'Bell Rock', }, ]; // Create an info window to share between markers. const infoWindow = new InfoWindow(); // Create the markers. tourStops.forEach(({ position, title }, i) => { const pin = new PinElement({ glyphText: `${i + 1}`, scale: 1.5, }); const marker = new AdvancedMarkerElement({ position, title: `${i + 1}. ${title}`, gmpClickable: true, }); marker.append(pin); mapElement.append(marker); // Add a click listener for each marker, and set up the info window. marker.addEventListener('gmp-click', () => { infoWindow.close(); infoWindow.setContent(marker.title); infoWindow.open(marker.map, marker); }); }); } void init();
CSS
/* * Always set the map height explicitly to define the size of the div element * that contains the map. */ #map { height: 100%; } /* * Optional: Makes the sample page fill the window. */ html, body { height: 100%; margin: 0; padding: 0; }
HTML
<html>
<head>
<title>Advanced Marker Accessibility</title>
<link rel="stylesheet" type="text/css" href="./style.css" />
<script type="module" src="./index.js"></script>
<script>
// prettier-ignore
(g=>{var h,a,k,p="The Google Maps JavaScript API",c="google",l="importLibrary",q="__ib__",m=document,b=window;b=b[c]||(b[c]={});var d=b.maps||(b.maps={}),r=new Set,e=new URLSearchParams,u=()=>h||(h=new Promise(async(f,n)=>{await (a=m.createElement("script"));e.set("libraries",[...r]+"");for(k in g)e.set(k.replace(/[A-Z]/g,t=>"_"+t[0].toLowerCase()),g[k]);e.set("callback",c+".maps."+q);a.src=`https://maps.${c}apis.com/maps/api/js?`+e;d[q]=f;a.onerror=()=>h=n(Error(p+" could not load."));a.nonce=m.querySelector("script[nonce]")?.nonce||"";m.head.append(a)}));d[l]?console.warn(p+" only loads once. Ignoring:",g):d[l]=(f,...n)=>r.add(f)&&u().then(()=>d[l](f,...n))})({
key: "GOOGLE_MAPS_API_KEY"
});
</script>
</head>
<body>
<gmp-map
zoom="12"
center="34.84555,-111.8035"
map-id="4504f8b37365c3d0"></gmp-map>
</body>
</html>