Możesz zwiększyć dostępność znaczników, włączając obsługę zdarzeń kliknięcia, dodając tekst opisowy dla czytników ekranu i dostosowując skalę znacznika.
- Gdy znacznik jest klikalny (lub można go przeciągać), może reagować na dane wejściowe z klawiatury i myszy.
- Tekst określony w opcji
title
jest odczytywany przez czytniki ekranu i wyświetlany, gdy użytkownik przytrzyma wskaźnik myszy nad znacznikiem. - Zwiększenie rozmiaru znaczników zmniejsza precyzję wymaganą do interakcji z nimi na wszystkich urządzeniach, zwłaszcza na urządzeniach z ekranem dotykowym, i poprawia dostępność. Domyślne znaczniki spełniają minimalny rozmiar określony w standardzie WCAG AA, ale w przypadku deweloperów, którzy chcą spełnić rozmiar docelowy określony w standardzie WCAG AAA, należy zwiększyć rozmiar znacznika.
Więcej informacji o zmianie skali znacznika, dodawaniu tekstu tytułu i innych opcjach znajdziesz w sekcji Podstawowe dostosowywanie znaczników.
Poniższy przykład pokazuje mapę z 5 kliknięciami, na których można się skupić, zawierającą tekst tytułu i ustawioną na skalę 1,5x:
Aby poruszać się po markerach za pomocą klawiatury:
- Użyj klawisza Tab, aby ustawić fokus na pierwszym znaczniku. Jeśli na mapie jest kilka znaczników, użyj klawiszy strzałek, aby przełączać się między nimi.
- Jeśli znacznik jest klikalny, naciśnij klawisz Enter, aby go „kliknąć”. Jeśli znacznik ma okno informacyjne, możesz je otworzyć, klikając lub naciskając klawisz Enter lub spację. Gdy okno informacyjne zostanie zamknięte, fokus wróci do powiązanego markera.
- Ponownie naciśnij Tab, aby przejść do pozostałych elementów sterujących mapy.
Umożliwianie klikania znacznika
Z tej sekcji dowiesz się, jak sprawić, aby markery reagowały na zdarzenia kliknięcia. Aby umożliwić klikanie markera:
- Ustaw właściwość
gmpClickable
natrue
.
TypeScript
const marker = new AdvancedMarkerElement({ position, map, title: `${i + 1}. ${title}`, content: pin.element, gmpClickable: true, });
JavaScript
const marker = new AdvancedMarkerElement({ position, map, title: `${i + 1}. ${title}`, content: pin.element, gmpClickable: true, });
- Dodaj detektor zdarzeń kliknięcia, aby reagować na działania użytkownika.
TypeScript
// Add a click listener for each marker, and set up the info window. marker.addListener('click', ({ domEvent, latLng }) => { const { target } = domEvent; 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.addListener('click', ({ domEvent, latLng }) => { const { target } = domEvent; infoWindow.close(); infoWindow.setContent(marker.title); infoWindow.open(marker.map, marker); });
Aby ponownie umożliwić klikanie markera, wywołaj funkcję
removeListener
, aby usunąć odbiornik zdarzenia kliknięcia:// Remove the listener. google.maps.event.removeListener(clickListener);
Aby jeszcze bardziej zwiększyć dostępność:
- Ustaw tekst opisowy znacznika za pomocą opcji
AdvancedMarkerElement.title
. - Zwiększ skalę znacznika za pomocą właściwości
scale
elementuPinElement
.
Pełny przykładowy kod
Zobacz pełny przykładowy kod źródłowy
TypeScript
async function initMap() { // Request needed libraries. const { Map, InfoWindow } = await google.maps.importLibrary("maps") as google.maps.MapsLibrary; const { AdvancedMarkerElement, PinElement } = await google.maps.importLibrary("marker") as google.maps.MarkerLibrary; const map = new Map(document.getElementById("map") as HTMLElement, { zoom: 12, center: { lat: 34.84555, lng: -111.8035 }, mapId: '4504f8b37365c3d0', }); // 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({ glyph: `${i + 1}`, scale: 1.5, }); const marker = new AdvancedMarkerElement({ position, map, title: `${i + 1}. ${title}`, content: pin.element, gmpClickable: true, }); // Add a click listener for each marker, and set up the info window. marker.addListener('click', ({ domEvent, latLng }) => { const { target } = domEvent; infoWindow.close(); infoWindow.setContent(marker.title); infoWindow.open(marker.map, marker); }); }); } initMap();
JavaScript
async function initMap() { // Request needed libraries. const { Map, InfoWindow } = await google.maps.importLibrary("maps"); const { AdvancedMarkerElement, PinElement } = await google.maps.importLibrary("marker"); const map = new Map(document.getElementById("map"), { zoom: 12, center: { lat: 34.84555, lng: -111.8035 }, mapId: '4504f8b37365c3d0', }); // 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({ glyph: `${i + 1}`, scale: 1.5, }); const marker = new AdvancedMarkerElement({ position, map, title: `${i + 1}. ${title}`, content: pin.element, gmpClickable: true, }); // Add a click listener for each marker, and set up the info window. marker.addListener('click', ({ domEvent, latLng }) => { const { target } = domEvent; infoWindow.close(); infoWindow.setContent(marker.title); infoWindow.open(marker.map, marker); }); }); } initMap();
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> </head> <body> <div id="map"></div> <!-- prettier-ignore --> <script>(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: "AIzaSyA6myHzS10YXdcazAFalmXvDkrYCp5cLc8", v: "beta"});</script> </body> </html>