Bạn có thể giúp người dùng dễ tiếp cận điểm đánh dấu hơn bằng cách bật tính năng xử lý sự kiện nhấp chuột, thêm văn bản mô tả cho trình đọc màn hình và điều chỉnh tỷ lệ điểm đánh dấu.
- Khi có thể nhấp (hoặc kéo) vào một điểm đánh dấu, điểm đánh dấu đó có thể phản hồi thao tác đầu vào bằng bàn phím và chuột.
- Văn bản được chỉ định trong tuỳ chọn
titlecó thể đọc được bằng trình đọc màn hình và sẽ hiển thị khi người dùng giữ con trỏ chuột trên điểm đánh dấu. - Việc tăng kích thước của điểm đánh dấu giúp giảm độ chính xác cần thiết để tương tác với điểm đánh dấu đó trên tất cả thiết bị (đặc biệt là thiết bị có màn hình cảm ứng) và cải thiện khả năng hỗ trợ tiếp cận. Điểm đánh dấu mặc định đáp ứng tiêu chuẩn kích thước tối thiểu WCAG AA, nhưng đối với những nhà phát triển muốn tuân thủ tiêu chuẩn kích thước mục tiêu WCAG AAA, thì kích thước điểm đánh dấu phải được tăng lên.
Hãy xem phần tuỳ chỉnh điểm đánh dấu cơ bản để tìm hiểu cách thay đổi tỷ lệ điểm đánh dấu, thêm văn bản tiêu đề và nhiều nội dung khác.
Ví dụ sau đây cho thấy một bản đồ có 5 điểm đánh dấu có thể nhấp và có thể làm tâm điểm, bao gồm cả văn bản tiêu đề và đã được đặt thành tỷ lệ 1, 5 lần:
Cách di chuyển giữa các điểm đánh dấu bằng bàn phím:
- Sử dụng phím tab để tập trung vào điểm đánh dấu đầu tiên; nếu có nhiều điểm đánh dấu trên cùng một bản đồ, hãy sử dụng các phím mũi tên để chuyển qua các điểm đánh dấu.
- Nếu điểm đánh dấu có thể nhấp, hãy nhấn phím Enter để "nhấp". Nếu một điểm đánh dấu có cửa sổ thông tin, bạn có thể mở cửa sổ đó bằng cách nhấp hoặc nhấn phím Enter hoặc phím cách. Khi cửa sổ thông tin đóng, tiêu điểm sẽ quay lại điểm đánh dấu được liên kết.
- Nhấn phím Tab một lần nữa để tiếp tục di chuyển qua các nút điều khiển còn lại trên bản đồ.
Đặt điểm đánh dấu có thể nhấp vào
Phần này hướng dẫn bạn cách làm cho điểm đánh dấu phản hồi các sự kiện nhấp chuột. Cách làm cho điểm đánh dấu có thể nhấp được:
- Đặt thuộc tính
gmpClickablethànhtrue.
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);
- Thêm trình nghe sự kiện
gmp-clickđể phản hồi hoạt động đầu vào của người dùng.
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); });
Cách đặt điểm đánh dấu thành không nhấp được:
- Gọi
removeEventListenerđể xoá trình nghe sự kiệngmp-click:
// Remove the listener. marker.removeEventListener('gmp-click', clickListener);- Hoặc đặt thuộc tính
gmpClickablethànhfalse.
- Gọi
Để cải thiện hơn nữa khả năng hỗ trợ tiếp cận, hãy làm như sau:
- Đặt văn bản mô tả cho điểm đánh dấu bằng tuỳ chọn
AdvancedMarkerElement.title. - Tăng tỷ lệ điểm đánh dấu bằng thuộc tính
scalecủaPinElement.
Mã ví dụ hoàn chỉnh
Xem mã nguồn ví dụ hoàn chỉnh
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>