Вы можете сделать маркеры более доступными, включив обработку событий кликов, добавив описательный текст для программ чтения с экрана и изменив масштаб маркера.
- Если маркер кликабелен (или перетаскиваемый), он может реагировать на управление мышью и ввод с клавиатуры.
- Текст, добавленный с помощью атрибута
title, будет доступен для программ чтения с экрана и отображаться при наведении указателя мыши на маркер. - При увеличении размера маркера уменьшается точность взаимодействия с ним на разных устройствах – особенно на устройствах с сенсорным экраном, – но зато он становится более доступным. По умолчанию маркеры соответствуют стандарту минимального размера WCAG AA, однако для разработчиков, которым требуется обеспечить соответствие стандарту WCAG AAA для целевых устройств, размер маркера нужно увеличить.
В статье о базовой настройке маркеров рассказывается, как изменить масштаб маркера, добавить текст названия и т. д.
Ниже показана карта, на которой настроено пять кликабельных фокусируемых маркеров с текстом заголовка и масштабом 1, 5.
Как переходить между маркерами с помощью клавиатуры
- Чтобы выбрать первый маркер, нажмите клавишу Tab. Если на карте несколько маркеров, вы можете переключаться между ними с помощью клавиш со стрелками.
- Если маркер кликабелен, нажать на него можно с помощью клавиши Ввод. Информационное окно маркера (если оно есть) можно открыть кнопкой мыши, клавишей Ввод или клавишей Пробел. После закрытия такого окна снова выделяется связанный с ним маркер.
- Повторное нажатие клавиши 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);
- Добавьте прослушиватель событий
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, чтобы удалить прослушиватель событий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>