Panoramica dei controlli
Le mappe visualizzate tramite l'API Maps JavaScript contengono elementi dell'interfaccia utente per consentire l'interazione dell'utente con la mappa. Questi elementi sono noti come controlli e puoi includere variazioni di questi controlli nella tua applicazione. In alternativa, puoi non fare nulla e lasciare che l'API Maps JavaScript gestisca tutto il comportamento dei controlli.
La mappa seguente mostra il set predefinito di controlli visualizzati dall'API Maps JavaScript:
In senso orario da in alto a sinistra: Tipo di mappa, Schermo intero, Videocamera, Street View, Scorciatoie da tastiera.
Di seguito è riportato un elenco completo dei controlli che puoi utilizzare nelle tue mappe:
- Il controllo Tipo di mappa è disponibile in un menu a discesa
o in una barra dei pulsanti orizzontale, che consente all'utente di scegliere un tipo di mappa
(
ROADMAP,SATELLITE,HYBRIDoTERRAIN). Questo controllo viene visualizzato per impostazione predefinita nell'angolo in alto a sinistra della mappa. - Il controllo a schermo intero offre la possibilità di aprire la mappa in modalità a schermo intero. Questo controllo è attivo per impostazione predefinita su computer e dispositivi mobili. Nota:iOS non supporta la funzionalità a schermo intero. Il controllo a schermo intero non è quindi visibile sui dispositivi iOS.
- La funzionalità Controllo fotocamera include i controlli di zoom e panoramica.
- Il controllo Street View contiene un'icona di Pegman che può essere trascinata sulla mappa per attivare Street View. Questo controllo viene visualizzato per impostazione predefinita vicino all'angolo in basso a destra della mappa.
- Il controllo di rotazione offre una combinazione di opzioni di inclinazione e rotazione per le mappe contenenti immagini 3D. Questo controllo viene visualizzato per impostazione predefinita vicino all'angolo in basso a destra della mappa. Per saperne di più, consulta la panoramica 3D.
- Il controllo scala mostra un elemento della scala della mappa. Questo controllo è disattivato per impostazione predefinita.
- Il controllo Scorciatoie da tastiera mostra un elenco di scorciatoie da tastiera per interagire con la mappa.
Non accedere o modificare direttamente questi controlli della mappa. Modifica invece i campi MapOptions della mappa, che influiscono sulla visibilità e sulla presentazione dei controlli. Puoi regolare la presentazione dei controlli al momento
dell'istanza della mappa (con MapOptions appropriato) o modificare una
mappa in modo dinamico chiamando setOptions() per modificare le
opzioni della mappa.
Non tutti questi controlli sono attivati per impostazione predefinita. Per scoprire di più sul comportamento dell'interfaccia utente predefinita (e su come modificarlo), consulta L'interfaccia utente predefinita di seguito.
Interfaccia utente predefinita
Per impostazione predefinita, tutti i controlli scompaiono se la mappa è troppo piccola (200 x 200 px). Puoi ignorare questo comportamento impostando esplicitamente il controllo in modo che sia visibile. Consulta la sezione Aggiunta di controlli alla mappa.
Il comportamento e l'aspetto dei controlli sono gli stessi su dispositivi mobili e computer, ad eccezione del controllo a schermo intero (vedi il comportamento descritto nell'elenco dei controlli).
Inoltre, la gestione della tastiera è attiva per impostazione predefinita su tutti i dispositivi.
Disattiva l'interfaccia utente predefinita
Potresti voler disattivare completamente i pulsanti dell'interfaccia utente predefinita dell'API. Per farlo,
imposta la proprietà disableDefaultUI della mappa (all'interno dell'oggetto MapOptions) su true. Questa proprietà
disattiva tutti i pulsanti di controllo dell'interfaccia utente dell'API Maps JavaScript. Tuttavia,
non influisce sui movimenti del mouse o sulle scorciatoie da tastiera sulla mappa
di base, che sono controllati rispettivamente dalle proprietà gestureHandling e
keyboardShortcuts.
Il seguente codice disattiva i pulsanti della UI:
TypeScript
innerMap.setOptions({ // Disable the default UI. disableDefaultUI: true, });
JavaScript
innerMap.setOptions({ // Disable the default UI. disableDefaultUI: true, });
Prova campione
Aggiungere controlli alla mappa
Potresti voler personalizzare l'interfaccia rimuovendo, aggiungendo o modificando il comportamento o i controlli dell'interfaccia utente e assicurarti che gli aggiornamenti futuri non alterino questo comportamento. Se vuoi solo aggiungere o modificare il comportamento esistente, devi assicurarti che il controllo venga aggiunto esplicitamente alla tua applicazione.
Alcuni controlli vengono visualizzati sulla mappa per impostazione predefinita, mentre altri non vengono visualizzati
a meno che tu non li richieda specificamente. L'aggiunta o la rimozione dei controlli dalla mappa è specificata nei seguenti campi dell'oggetto MapOptions, che imposti su true per renderli visibili o su false per nasconderli:
{ cameraControl: boolean, mapTypeControl: boolean, scaleControl: boolean, streetViewControl: boolean, rotateControl: boolean, fullscreenControl: boolean }
Per impostazione predefinita, tutti i controlli scompaiono se la mappa è più piccola di 200 x 200 px.
Puoi ignorare questo comportamento impostando esplicitamente il controllo in modo che sia
visibile. Ad esempio, la seguente tabella mostra se il controllo della videocamera è
visibile o meno, in base alle dimensioni della mappa e all'impostazione del
campo cameraControl:
| Dimensioni mappa | cameraControl |
Visibile? |
|---|---|---|
| Qualsiasi | false |
No |
| Qualsiasi | true |
Sì |
| >= 200x200px | undefined |
Sì |
| < 200x200px | undefined |
No |
L'esempio seguente imposta la mappa in modo da nascondere il controllo della videocamera e visualizzare il controllo della scala. Tieni presente che non disattiviamo esplicitamente l'UI predefinita, quindi queste modifiche si aggiungono al comportamento dell'UI predefinita.
TypeScript
innerMap.setOptions({ cameraControl: false, scaleControl: true, });
JavaScript
innerMap.setOptions({ cameraControl: false, scaleControl: true, });
Prova campione
Opzioni di controllo
Diversi controlli sono configurabili, il che ti consente di modificarne il comportamento o l'aspetto. Il controllo Tipo di mappa, ad esempio, può essere visualizzato come una barra orizzontale o un menu a discesa.
Questi controlli vengono modificati alterando i campi delle opzioni
di controllo appropriati all'interno dell'oggetto MapOptions al momento della creazione della mappa.
Ad esempio, le opzioni per modificare il controllo Tipo di mappa sono indicate nel campo
mapTypeControlOptions. Il controllo Tipo di mappa può essere visualizzato in
una delle seguenti opzioni style:
google.maps.MapTypeControlStyle.HORIZONTAL_BARmostra l'array di controlli come pulsanti in una barra orizzontale, come mostrato su Google Maps.google.maps.MapTypeControlStyle.DROPDOWN_MENUmostra un singolo controllo pulsante che ti consente di selezionare il tipo di mappa utilizzando un menu a discesa.google.maps.MapTypeControlStyle.DEFAULTmostra il comportamento predefinito, che dipende dalle dimensioni dello schermo e potrebbe cambiare nelle versioni future dell'API.
Tieni presente che, se modifichi le opzioni di controllo, devi attivare
esplicitamente il controllo impostando il valore MapOptions appropriato
su true. Ad esempio, per impostare un controllo del tipo di mappa
in modo che mostri lo stile DROPDOWN_MENU, utilizza il seguente codice all'interno
dell'oggetto MapOptions:
... mapTypeControl: true, mapTypeControlOptions: { style: google.maps.MapTypeControlStyle.DROPDOWN_MENU } ...
L'esempio seguente mostra come modificare la posizione e lo stile predefiniti dei controlli.
TypeScript
innerMap.setOptions({ mapTypeControl: true, mapTypeControlOptions: { style: google.maps.MapTypeControlStyle.DROPDOWN_MENU, mapTypeIds: [ google.maps.MapTypeId.ROADMAP, google.maps.MapTypeId.TERRAIN, ], position: google.maps.ControlPosition.TOP_CENTER, }, });
JavaScript
innerMap.setOptions({ mapTypeControl: true, mapTypeControlOptions: { style: google.maps.MapTypeControlStyle.DROPDOWN_MENU, mapTypeIds: [ google.maps.MapTypeId.ROADMAP, google.maps.MapTypeId.TERRAIN, ], position: google.maps.ControlPosition.TOP_CENTER, }, });
Prova campione
I controlli vengono in genere configurati al momento della creazione della mappa. Tuttavia,
puoi modificare la presentazione dei controlli in modo dinamico
chiamando il metodo setOptions() di Map
e passando nuove opzioni di controllo.
Modifica controlli
Specifichi la presentazione di un controllo quando crei la mappa
tramite i campi all'interno dell'oggetto MapOptions della mappa. Questi
campi sono indicati di seguito:
cameraControlattiva/disattiva il controllo della videocamera che consente all'utente di eseguire lo zoom e la panoramica della mappa. Questo controllo è visibile per impostazione predefinita su tutte le mappe. Il campocameraControlOptionsspecifica inoltre ilCameraControlOptionsda utilizzare per questo controllo.mapTypeControlattiva/disattiva il controllo Tipo di mappa che consente all'utente di alternare i tipi di mappa (ad esempio Mappa e Satellite). Per impostazione predefinita, questo controllo è visibile e viene visualizzato nell'angolo in alto a sinistra della mappa. Il campomapTypeControlOptionsspecifica inoltre ilMapTypeControlOptionsda utilizzare per questo controllo.streetViewControlattiva/disattiva il controllo Pegman che consente all'utente di attivare un panorama di Street View. Per impostazione predefinita, questo controllo è visibile e viene visualizzato in basso a destra della mappa. Il campostreetViewControlOptionsspecifica inoltre ilStreetViewControlOptionsda utilizzare per questo controllo.rotateControlattiva/disattiva la visualizzazione di un controllo di rotazione per controllare l'orientamento delle immagini 3D. Per impostazione predefinita, la presenza del controllo è determinata dalla presenza o dall'assenza di immagini 3D per il tipo di mappa specificato al livello di zoom e nella posizione attuali. Puoi modificare il comportamento del controllo impostandorotateControlOptionsdella mappa per specificareRotateControlOptionsda utilizzare. Il controllo viene visualizzato solo sulle mappe base 3D.scaleControlattiva/disattiva il controllo Scala che fornisce una scala della mappa. Per impostazione predefinita, questo controllo non è visibile. Se attivata, verrà sempre visualizzata nell'angolo in basso a destra della mappa. IlscaleControlOptionsspecifica inoltre ilScaleControlOptionsda utilizzare per questo controllo.fullscreenControlattiva/disattiva il controllo che apre la mappa in modalità a schermo intero. Per impostazione predefinita, questo controllo è attivo su computer e dispositivi Android. Se abilitato, il controllo viene visualizzato in alto a destra sulla mappa. IlfullscreenControlOptionsspecifica inoltre ilFullscreenControlOptionsda utilizzare per questo controllo.
Tieni presente che puoi specificare le opzioni per i controlli che disattivi inizialmente.
Posizionamento dei controlli
La maggior parte delle opzioni di controllo contiene una proprietà position
(di tipo ControlPosition) che indica in quale punto della mappa
posizionare il controllo. Il posizionamento di questi controlli non è assoluto. Al contrario,
l'API disporrà i controlli in modo intelligente, facendoli scorrere intorno
agli elementi della mappa esistenti o ad altri controlli, entro i vincoli dati (ad esempio
le dimensioni della mappa).
Esistono due tipi di posizioni di controllo: legacy e logiche. L'utilizzo di valori logici è consigliato per poter supportare automaticamente i contesti di layout da sinistra a destra (LTR) e da destra a sinistra (RTL). Consulta la guida di riferimento.
Le tabelle seguenti mostrano le posizioni dei controlli supportate nei contesti LTR e RTL.
Posizioni da sinistra a destra
| Posizione (contesto da sinistra a destra) | Costante logica (consigliato) | Costante legacy |
|---|---|---|
| Top Left | BLOCK_START_INLINE_START |
TOP_LEFT |
| Top Center | BLOCK_START_INLINE_CENTER |
TOP_CENTER |
| In alto a destra | BLOCK_START_INLINE_END |
TOP_RIGHT |
| In alto a sinistra | INLINE_START_BLOCK_START |
LEFT_TOP |
| Centro sinistra | INLINE_START_BLOCK_CENTER |
LEFT_CENTER |
| In basso a sinistra | INLINE_START_BLOCK_END |
LEFT_BOTTOM |
| In alto a destra | INLINE_END_BLOCK_START |
RIGHT_TOP |
| Centro destra | INLINE_END_BLOCK_CENTER |
RIGHT_CENTER |
| In basso a destra | INLINE_END_BLOCK_END |
RIGHT_BOTTOM |
| In basso a sinistra | BLOCK_END_INLINE_START |
BOTTOM_LEFT |
| Centro in basso | BLOCK_END_INLINE_CENTER |
BOTTOM_CENTER |
| In basso a destra | BLOCK_END_INLINE_END |
BOTTOM_RIGHT |
Posizioni RTL
| Posizione (contesto RTL) | Costante logica (consigliato) | Costante legacy |
|---|---|---|
| In alto a destra | BLOCK_START_INLINE_START |
TOP_RIGHT |
| Top Center | BLOCK_START_INLINE_CENTER |
TOP_CENTER |
| Top Left | BLOCK_START_INLINE_END |
TOP_LEFT |
| In alto a destra | INLINE_START_BLOCK_START |
RIGHT_TOP |
| Centro destra | INLINE_START_BLOCK_CENTER |
RIGHT_CENTER |
| In basso a destra | INLINE_START_BLOCK_END |
RIGHT_BOTTOM |
| In alto a sinistra | INLINE_END_BLOCK_START |
LEFT_TOP |
| Centro sinistra | INLINE_END_BLOCK_CENTER |
LEFT_CENTER |
| In basso a sinistra | INLINE_END_BLOCK_END |
LEFT_BOTTOM |
| In basso a destra | BLOCK_END_INLINE_START |
BOTTOM_RIGHT |
| Centro in basso | BLOCK_END_INLINE_CENTER |
BOTTOM_CENTER |
| In basso a sinistra | BLOCK_END_INLINE_END |
BOTTOM_LEFT |
Fai clic sulle etichette per passare dalla modalità da sinistra a destra a quella da destra a sinistra e viceversa.
Tieni presente che queste posizioni potrebbero coincidere con quelle degli elementi dell'interfaccia utente di cui non puoi modificare i posizionamenti (ad esempio copyright e logo Google). In questi casi, i controlli seguiranno la logica indicata per ogni posizione e verranno visualizzati il più vicino possibile alla posizione indicata. Non è possibile garantire che i controlli non si sovrappongano a causa di layout complessi, anche se l'API tenterà di disporli in modo intelligente.
L'esempio seguente mostra una mappa di base con tutti i controlli attivati, in posizioni diverse.
TypeScript
function initMap(): void { const map = new google.maps.Map( document.getElementById("map") as HTMLElement, { zoom: 12, center: { lat: -28.643387, lng: 153.612224 }, mapTypeControl: true, mapTypeControlOptions: { style: google.maps.MapTypeControlStyle.HORIZONTAL_BAR, position: google.maps.ControlPosition.TOP_CENTER, }, zoomControl: true, zoomControlOptions: { position: google.maps.ControlPosition.LEFT_CENTER, }, scaleControl: true, streetViewControl: true, streetViewControlOptions: { position: google.maps.ControlPosition.LEFT_TOP, }, fullscreenControl: true, } ); } declare global { interface Window { initMap: () => void; } } window.initMap = initMap;
JavaScript
function initMap() { const map = new google.maps.Map(document.getElementById("map"), { zoom: 12, center: { lat: -28.643387, lng: 153.612224 }, mapTypeControl: true, mapTypeControlOptions: { style: google.maps.MapTypeControlStyle.HORIZONTAL_BAR, position: google.maps.ControlPosition.TOP_CENTER, }, zoomControl: true, zoomControlOptions: { position: google.maps.ControlPosition.LEFT_CENTER, }, scaleControl: true, streetViewControl: true, streetViewControlOptions: { position: google.maps.ControlPosition.LEFT_TOP, }, fullscreenControl: true, }); } window.initMap = initMap;
Prova campione
Controlli personalizzati
Oltre a modificare lo stile e la posizione dei controlli API esistenti, puoi
creare controlli personalizzati per gestire l'interazione con l'utente. I controlli
sono widget fissi che fluttuano sopra una mappa in posizioni assolute, a differenza degli overlay, che si muovono con la mappa sottostante. Più
fondamentalmente, un controllo è un elemento <div> che
ha una posizione assoluta sulla mappa, mostra all'utente un'interfaccia utente e
gestisce l'interazione con l'utente o la mappa, di solito tramite un gestore
di eventi.
Per creare un controllo personalizzato, sono necessarie poche regole. Tuttavia, le seguenti linee guida possono fungere da best practice:
- Definisci il CSS appropriato per visualizzare gli elementi di controllo.
- Gestisci l'interazione con l'utente o la mappa tramite i gestori di eventi per
le modifiche alle proprietà della mappa o gli eventi utente (ad esempio,
eventi
'click'). - Crea un elemento
<div>per contenere il controllo e aggiungi questo elemento alla proprietàcontrolsdiMap.
Ciascuna di queste preoccupazioni è discussa di seguito.
Disegnare controlli personalizzati
Il modo in cui disegni il controllo dipende da te. In genere, ti consigliamo di
inserire tutta la presentazione del controllo all'interno di un unico
elemento <div> in modo da poter manipolare il controllo come
un'unica unità. Utilizzeremo questo pattern di progettazione negli esempi mostrati di seguito.
La progettazione di controlli accattivanti richiede una certa conoscenza di CSS e della struttura DOM. Gli esempi di codice seguenti mostrano l'aggiunta di un controllo personalizzato utilizzando metodi HTML dichiarativi e programmatici.
CSS dichiarativo
I seguenti stili CSS forniscono un aspetto coerente con i controlli predefiniti. Utilizza questi stili con entrambi gli esempi riportati di seguito:
.streetview-toggle-button { align-items: center; background: white; border: none; border-radius: 2px; box-shadow: 0 1px 4px -1px rgba(0, 0, 0, 0.3); color: rgb(86, 86, 86); cursor: pointer; display: flex; font-family: Roboto, Arial, sans-serif; font-size: 18px; font-weight: 400; height: 40px; justify-content: center; margin: 10px 0; padding: 0 17px; } .streetview-toggle-button:hover { background: #f4f4f4; color: #000; }
HTML dichiarativo
Questi snippet di codice mostrano come creare un controllo personalizzato in modo dichiarativo.
Nell'HTML, un DIV con l'ID container viene utilizzato per posizionare
il controllo. Questo è nidificato all'interno dell'elemento gmp-map e
il pulsante viene aggiunto al DIV. L'attributo slot è impostato su
control-inline-start-block-start per posizionare il controllo nell'angolo in alto a sinistra della mappa.
<gmp-map
center="41.027748173921374, -92.41852445367961"
zoom="13"
map-id="DEMO_MAP_ID">
<div id="container" slot="control-inline-start-block-start">
<input type="button"
id="streetview-toggle-button"
class="button"
value="Click this button" />
</div>
</gmp-map>In JavaScript, getElementById() viene utilizzato per trovare il DIV e il pulsante, al pulsante viene aggiunto un listener di eventi e il pulsante viene aggiunto al DIV.
// Create a DIV to attach the control UI to the Map. const container = document.getElementById("container"); // Get the control button from the HTML page. const controlButton = document.getElementById("streetview-toggle-button"); // Add a click event listener. controlButton.addEventListener("click", () => { window.alert("You clicked the button!"); }); // Add the control to the DIV. container.append(controlButton);
JavaScript programmatico
Questo snippet di codice mostra la creazione programmatica di un controllo pulsante. Gli stili CSS sono definiti sopra.
// Create a DIV to attach the control UI to the Map. const container = document.getElementById("container"); // Position the control in the top left corner of the map. container.slot = "control-block-start-inline-start"; // Create the control. const controlButton = document.createElement("button"); controlButton.classList.add("streetview-toggle-button"); controlButton.textContent = "Click this button"; controlButton.type = "button"; // Add a click event listener. controlButton.addEventListener("click", () => { window.alert("You clicked the button!"); }); // Add the control to the DIV. container.append(controlButton);
Gestire gli eventi dai controlli personalizzati
Affinché un controllo sia utile, deve effettivamente fare qualcosa. La funzione del controllo
dipende da te. Il controllo può rispondere all'input dell'utente o alle modifiche dello stato di Map.
Per rispondere all'input utente, utilizza addEventListener(), che gestisce gli eventi DOM supportati. Il
seguente snippet di codice aggiunge un listener per l'evento 'click'
del browser. Tieni presente che questo evento viene ricevuto dal DOM, non dalla mappa.
// Setup the click event listener: set the map to center on Chicago var chicago = {lat: 41.850, lng: -87.650}; controlButton.addEventListener('click', () => { map.setCenter(chicago); });
Rendere accessibili i controlli personalizzati
Per assicurarti che i controlli ricevano eventi da tastiera e vengano visualizzati correttamente dagli screen reader:
- Utilizza sempre elementi HTML nativi per pulsanti, elementi del modulo ed etichette. Utilizza solo un elemento DIV come contenitore per i controlli nativi; non riutilizzare mai un elemento DIV come elemento UI interattivo.
- Utilizza l'elemento
label, l'attributotitleo l'attributoaria-label, se appropriato, per fornire informazioni su un elemento dell'interfaccia utente.
Posizionare i controlli personalizzati
Utilizza l'attributo slot per posizionare i controlli personalizzati, specificando la posizione del controllo necessaria.
Per informazioni su queste posizioni, vedi Posizionamento dei controlli
sopra.
Ogni ControlPosition memorizza un MVCArray dei
controlli visualizzati in quella posizione. Di conseguenza, quando i controlli vengono aggiunti o
rimossi dalla posizione, l'API aggiornerà i controlli di conseguenza.
Il seguente codice crea un nuovo controllo personalizzato (il relativo costruttore non è
mostrato) e lo aggiunge alla mappa nella posizione BLOCK_START_INLINE_END
(in alto a destra nel contesto LTR).
// Create a DIV to attach the control UI to the Map.
const centerControlDiv = document.createElement("div");
// Create the control. This code calls a function that
// creates a new instance of a button control.
const centerControl = createCenterControl(map);
// Append the control to the DIV.
centerControlDiv.appendChild(centerControl);
// Push the control to the BLOCK_START_INLINE_END position.
innerMap.controls[google.maps.ControlPosition.BLOCK_START_INLINE_END].push(centerControlDiv);Per impostare la posizione di un controllo personalizzato in modo dichiarativo, imposta l'attributo slot nell'HTML:
<gmp-map center="30.72851568848909, -81.54675994068873" zoom="12">
<div slot="control-block-start-inline-end">
<!-- Control HTML -->
</div>
</gmp-map>Esempio di controllo personalizzato
Il seguente controllo è semplice (anche se non particolarmente utile) e
combina i pattern mostrati sopra. Questo controllo risponde agli eventi DOM
'click' centrando la mappa in una determinata posizione
predefinita:
TypeScript
let map: google.maps.Map; const chicago = { lat: 41.85, lng: -87.65 }; /** * Creates a control that recenters the map on Chicago. */ function createCenterControl(map) { const controlButton = document.createElement('button'); // Set CSS for the control. controlButton.style.backgroundColor = '#fff'; controlButton.style.border = '2px solid #fff'; controlButton.style.borderRadius = '3px'; controlButton.style.boxShadow = '0 2px 6px rgba(0,0,0,.3)'; controlButton.style.color = 'rgb(25,25,25)'; controlButton.style.cursor = 'pointer'; controlButton.style.fontFamily = 'Roboto,Arial,sans-serif'; controlButton.style.fontSize = '16px'; controlButton.style.lineHeight = '38px'; controlButton.style.margin = '8px 0 22px'; controlButton.style.padding = '0 5px'; controlButton.style.textAlign = 'center'; controlButton.textContent = 'Center Map'; controlButton.title = 'Click to recenter the map'; controlButton.type = 'button'; // Setup the click event listeners: simply set the map to Chicago. controlButton.addEventListener('click', () => { map.setCenter(chicago); }); return controlButton; } function initMap() { map = new google.maps.Map(document.getElementById('map') as HTMLElement, { zoom: 12, center: chicago, }); // Create the DIV to hold the control. const centerControlDiv = document.createElement('div'); // Create the control. const centerControl = createCenterControl(map); // Append the control to the DIV. centerControlDiv.appendChild(centerControl); map.controls[google.maps.ControlPosition.TOP_CENTER].push(centerControlDiv); } declare global { interface Window { initMap: () => void; } } window.initMap = initMap;
JavaScript
let map; const chicago = { lat: 41.85, lng: -87.65 }; /** * Creates a control that recenters the map on Chicago. */ function createCenterControl(map) { const controlButton = document.createElement("button"); // Set CSS for the control. controlButton.style.backgroundColor = "#fff"; controlButton.style.border = "2px solid #fff"; controlButton.style.borderRadius = "3px"; controlButton.style.boxShadow = "0 2px 6px rgba(0,0,0,.3)"; controlButton.style.color = "rgb(25,25,25)"; controlButton.style.cursor = "pointer"; controlButton.style.fontFamily = "Roboto,Arial,sans-serif"; controlButton.style.fontSize = "16px"; controlButton.style.lineHeight = "38px"; controlButton.style.margin = "8px 0 22px"; controlButton.style.padding = "0 5px"; controlButton.style.textAlign = "center"; controlButton.textContent = "Center Map"; controlButton.title = "Click to recenter the map"; controlButton.type = "button"; // Setup the click event listeners: simply set the map to Chicago. controlButton.addEventListener("click", () => { map.setCenter(chicago); }); return controlButton; } function initMap() { map = new google.maps.Map(document.getElementById("map"), { zoom: 12, center: chicago, }); // Create the DIV to hold the control. const centerControlDiv = document.createElement("div"); // Create the control. const centerControl = createCenterControl(map); // Append the control to the DIV. centerControlDiv.appendChild(centerControl); map.controls[google.maps.ControlPosition.TOP_CENTER].push(centerControlDiv); } window.initMap = initMap;
Prova campione
Aggiungere lo stato ai controlli
I controlli possono anche memorizzare lo stato. L'esempio seguente è simile a quello
mostrato in precedenza, ma il controllo contiene un pulsante aggiuntivo "Imposta casa" che
imposta il controllo in modo che mostri una nuova posizione della casa. A questo scopo, creiamo una proprietà home_ all'interno del controllo per memorizzare questo stato e forniamo getter e setter per questo stato.
TypeScript
let map: google.maps.Map; const chicago: google.maps.LatLngLiteral = { lat: 41.85, lng: -87.65 }; /** * The CenterControl adds a control to the map that recenters the map on * Chicago. */ class CenterControl { private map_: google.maps.Map; private center_: google.maps.LatLng; constructor( controlDiv: HTMLElement, map: google.maps.Map, center: google.maps.LatLngLiteral ) { this.map_ = map; // Set the center property upon construction this.center_ = new google.maps.LatLng(center); controlDiv.style.clear = "both"; // Set CSS for the control border const goCenterUI = document.createElement("button"); goCenterUI.id = "goCenterUI"; goCenterUI.title = "Click to recenter the map"; controlDiv.appendChild(goCenterUI); // Set CSS for the control interior const goCenterText = document.createElement("div"); goCenterText.id = "goCenterText"; goCenterText.innerHTML = "Center Map"; goCenterUI.appendChild(goCenterText); // Set CSS for the setCenter control border const setCenterUI = document.createElement("button"); setCenterUI.id = "setCenterUI"; setCenterUI.title = "Click to change the center of the map"; controlDiv.appendChild(setCenterUI); // Set CSS for the control interior const setCenterText = document.createElement("div"); setCenterText.id = "setCenterText"; setCenterText.innerHTML = "Set Center"; setCenterUI.appendChild(setCenterText); // Set up the click event listener for 'Center Map': Set the center of // the map // to the current center of the control. goCenterUI.addEventListener("click", () => { const currentCenter = this.center_; this.map_.setCenter(currentCenter); }); // Set up the click event listener for 'Set Center': Set the center of // the control to the current center of the map. setCenterUI.addEventListener("click", () => { const newCenter = this.map_.getCenter()!; if (newCenter) { this.center_ = newCenter; } }); } } function initMap(): void { map = new google.maps.Map(document.getElementById("map") as HTMLElement, { zoom: 12, center: chicago, }); // Create the DIV to hold the control and call the CenterControl() // constructor passing in this DIV. const centerControlDiv = document.createElement("div"); const control = new CenterControl(centerControlDiv, map, chicago); // @ts-ignore centerControlDiv.index = 1; centerControlDiv.style.paddingTop = "10px"; map.controls[google.maps.ControlPosition.TOP_CENTER].push(centerControlDiv); } declare global { interface Window { initMap: () => void; } } window.initMap = initMap;
JavaScript
let map; const chicago = { lat: 41.85, lng: -87.65 }; /** * The CenterControl adds a control to the map that recenters the map on * Chicago. */ class CenterControl { map_; center_; constructor(controlDiv, map, center) { this.map_ = map; // Set the center property upon construction this.center_ = new google.maps.LatLng(center); controlDiv.style.clear = "both"; // Set CSS for the control border const goCenterUI = document.createElement("button"); goCenterUI.id = "goCenterUI"; goCenterUI.title = "Click to recenter the map"; controlDiv.appendChild(goCenterUI); // Set CSS for the control interior const goCenterText = document.createElement("div"); goCenterText.id = "goCenterText"; goCenterText.innerHTML = "Center Map"; goCenterUI.appendChild(goCenterText); // Set CSS for the setCenter control border const setCenterUI = document.createElement("button"); setCenterUI.id = "setCenterUI"; setCenterUI.title = "Click to change the center of the map"; controlDiv.appendChild(setCenterUI); // Set CSS for the control interior const setCenterText = document.createElement("div"); setCenterText.id = "setCenterText"; setCenterText.innerHTML = "Set Center"; setCenterUI.appendChild(setCenterText); // Set up the click event listener for 'Center Map': Set the center of // the map // to the current center of the control. goCenterUI.addEventListener("click", () => { const currentCenter = this.center_; this.map_.setCenter(currentCenter); }); // Set up the click event listener for 'Set Center': Set the center of // the control to the current center of the map. setCenterUI.addEventListener("click", () => { const newCenter = this.map_.getCenter(); if (newCenter) { this.center_ = newCenter; } }); } } function initMap() { map = new google.maps.Map(document.getElementById("map"), { zoom: 12, center: chicago, }); // Create the DIV to hold the control and call the CenterControl() // constructor passing in this DIV. const centerControlDiv = document.createElement("div"); const control = new CenterControl(centerControlDiv, map, chicago); // @ts-ignore centerControlDiv.index = 1; centerControlDiv.style.paddingTop = "10px"; map.controls[google.maps.ControlPosition.TOP_CENTER].push(centerControlDiv); } window.initMap = initMap;