O elemento Place Details e o elemento Place Details Compact são elementos HTML que renderizam detalhes de um lugar:
-
O
PlaceDetailsElement
oferece suporte a todos os dados de lugar visualizáveis e pode incluir várias fotos. -
O
PlaceDetailsCompactElement
foi projetado para consumir o mínimo de espaço e mostrar um conjunto conciso de informações sobre um lugar, incluindo nome, endereço, classificação etc. Ele também pode incluir uma única foto.
Elemento Place Details
Clique em um marcador no mapa para ver os detalhes do lugar em um elemento de detalhes do lugar.
O
PlaceDetailsElement
é compatível com uma ampla variedade de elementos de conteúdo, incluindo horário de funcionamento completo, site, número de telefone, resumo editorial, destaques específicos do tipo, avaliações, plus code e listas de recursos.
Para mostrar os detalhes de um lugar em um mapa, adicione um elemento gmp-place-details
ao elemento gmp-map
na página HTML. Inclua um elemento filho, gmp-place-details-place-request
, para selecionar o lugar. Pode ser um objeto Place, um ID de lugar ou o nome do recurso de um lugar no formato "places/{place_id}":
<gmp-map center="47.759737, -122.250632" zoom="16" map-id="DEMO_MAP_ID"> <gmp-advanced-marker></gmp-advanced-marker> </gmp-map>
<gmp-map center="47.759737, -122.250632" zoom="16" map-id="DEMO_MAP_ID"> <div class="widget-container" slot="control-inline-start-block-start"> <gmp-place-details> <gmp-place-details-place-request place="ChIJC8HakaIRkFQRiOgkgdHmqkk"></gmp-place-details-place-request> <gmp-place-all-content></gmp-place-all-content> </gmp-place-details> </div> <gmp-advanced-marker></gmp-advanced-marker> </gmp-map>
Configurar o conteúdo
Você pode controlar o conteúdo específico do lugar exibido pelo elemento
gmp-place-details
usando um elemento aninhado
gmp-place-content-config
para selecionar e configurar os detalhes
do lugar, conforme mostrado neste exemplo:
<gmp-map center="47.759737, -122.250632" zoom="16" map-id="DEMO_MAP_ID"> <div class="widget-container" slot="control-inline-start-block-start"> <gmp-place-details> <gmp-place-details-place-request place="ChIJC8HakaIRkFQRiOgkgdHmqkk"></gmp-place-details-place-request> <gmp-place-content-config> <gmp-place-address></gmp-place-address> <gmp-place-rating></gmp-place-rating> <gmp-place-type></gmp-place-type> <gmp-place-price></gmp-place-price> <gmp-place-accessible-entrance-icon></gmp-place-accessible-entrance-icon> <gmp-place-opening-hours></gmp-place-opening-hours> <gmp-place-website></gmp-place-website> <gmp-place-phone-number></gmp-place-phone-number> <gmp-place-summary></gmp-place-summary> <gmp-place-type-specific-highlights></gmp-place-type-specific-highlights> <gmp-place-reviews></gmp-place-reviews> <gmp-place-feature-list></gmp-place-feature-list> <gmp-place-media lightbox-preferred ></gmp-place-media> <gmp-place-attribution light-scheme-color="gray" dark-scheme-color="white"></gmp-place-attribution> </gmp-place-content-config> </gmp-place-details> </div> <gmp-advanced-marker></gmp-advanced-marker> </gmp-map>
O elemento gmp-place-content-config
contém vários elementos de conteúdo filhos, e cada um seleciona um detalhe do lugar correspondente para mostrar: PlaceAddressElement
seleciona o endereço do lugar, PlacePriceElement
seleciona o nível de preço do lugar etc. A ordem dos elementos filhos é irrelevante, já que os detalhes selecionados são sempre renderizados em uma ordem fixa predefinida.
Alguns desses elementos podem ser configurados ainda mais usando atributos específicos do conteúdo:
-
O elemento
gmp-place-media
é usado para mostrar uma única foto e inclui um atributolightbox-preferred
que abre a foto em um lightbox quando clicado. A caixa de luz fica desativada por padrão. -
O elemento
gmp-place-attribution
é usado para mostrar a origem da foto. Os atributoslight-scheme-color
edark-scheme-color
são usados para definir a cor do texto de atribuição nos modos claro e escuro.
PlaceContentConfigElement
para mais informações sobre todos os elementos de conteúdo compatíveis.
Para simplificar, o elemento
gmp-place-content-config
pode ser substituído por
gmp-place-all-content
para mostrar todos os detalhes disponíveis no elemento "Detalhes do lugar" ou por
gmp-place-standard-content
para exibir uma configuração padrão.
Configurar a aparência
O intervalo de largura recomendado para o elemento gmp-place-details
é de 250 a 400 pixels.
Larguras menores que 250 px podem não ser exibidas corretamente. Defina a altura de acordo com seu aplicativo.
O elemento Place Details foi projetado para rolar no espaço alocado conforme necessário.
O elemento gmp-place-details
também é compatível com várias propriedades CSS
personalizadas para configurar as cores e fontes do elemento. Consulte Kit de estilização personalizada da interface do usuário do Places para mais detalhes.
Confira o exemplo de código completo
JavaScript
// Use querySelector to select elements for interaction. const map = document.querySelector('gmp-map'); const placeDetails = document.querySelector('gmp-place-details'); const placeDetailsRequest = document.querySelector('gmp-place-details-place-request'); const marker = document.querySelector('gmp-advanced-marker'); let center = { lat: 47.759737, lng: -122.250632 }; async function initMap() { // Request needed libraries. await google.maps.importLibrary("maps"); await google.maps.importLibrary("marker"); await google.maps.importLibrary("places"); // Hide the map type control. map.innerMap.setOptions({ mapTypeControl: false }); // Function to update map and marker based on place details const updateMapAndMarker = () => { if (placeDetails.place && placeDetails.place.location) { let adjustedCenter = offsetLatLngRight(placeDetails.place.location, -0.005); map.innerMap.panTo(adjustedCenter); map.innerMap.setZoom(16); // Set zoom after panning if needed marker.position = placeDetails.place.location; marker.collisionBehavior = google.maps.CollisionBehavior.REQUIRED_AND_HIDES_OPTIONAL; marker.style.display = 'block'; } }; // Set up map once widget is loaded. placeDetails.addEventListener('gmp-load', (event) => { updateMapAndMarker(); }); // Add an event listener to handle clicks. map.innerMap.addListener('click', async (event) => { marker.position = null; event.stop(); if (event.placeId) { // Fire when the user clicks a POI. placeDetailsRequest.place = event.placeId; updateMapAndMarker(); } else { // Fire when the user clicks the map (not on a POI). console.log('No place was selected.'); marker.style.display = 'none'; } }); } // Helper function to offset marker placement for better visual appearance. function offsetLatLngRight(latLng, longitudeOffset) { const newLng = latLng.lng() + longitudeOffset; return new google.maps.LatLng(latLng.lat(), newLng); } initMap();
CSS
/* * Optional: Makes the sample page fill the window. */ html, body { display: flex; /* Use flexbox for layout */ justify-content: center; /* Center the content horizontally */ align-items: flex-start; /* Align items to the top */ width: 100% } h1 { font-size: 16px; text-align: center; } gmp-map { height: 500px; } gmp-place-details { border-radius: 0px; margin: 20px; width: 400px; height: 500px; margin-top: 0px; } gmp-advanced-marker { display: none; } .widget-container { min-width: 400px; overflow-y: none; overflow-x: none; }
HTML
<!DOCTYPE html> <html> <head> <title>Click on the map to view place details</title> <meta charset="utf-8"> <link rel="stylesheet" href="style.css"> <script type="module" src="./index.js"></script> </head> <body> <gmp-map center="47.759737, -122.250632" zoom="16" map-id="DEMO_MAP_ID"> <gmp-advanced-marker></gmp-advanced-marker> </gmp-map> <div class="widget-container" slot="control-inline-start-block-start"> <gmp-place-details> <gmp-place-details-place-request place="ChIJC8HakaIRkFQRiOgkgdHmqkk"></gmp-place-details-place-request> <gmp-place-all-content></gmp-place-all-content> </gmp-place-details> </div> <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: "weekly"});</script> </body> </html>
Elemento compacto de Place Details
Clique em um marcador no mapa para ver os detalhes do lugar em um elemento compacto de detalhes do lugar.
O
PlaceDetailsCompactElement
renderiza detalhes de um lugar selecionado usando o mínimo de espaço. Isso pode ser útil em uma janela de informações que destaca um lugar em um mapa, em uma experiência de mídia social, como compartilhar um local em uma conversa, como uma sugestão para selecionar seu local atual ou em um artigo de mídia para referenciar o lugar no Google Maps.O PlaceDetailsCompactElement
pode mostrar nome, endereço, classificação, tipo, preço, ícone de acessibilidade, status de aberto e uma única foto. Ele pode ser
mostrado na horizontal ou vertical, conforme selecionado pelo atributo orientation
.
No snippet a seguir, gmp-place-details-compact
está aninhado em um
elemento gmp-map
, com orientation
definido como horizontal
. Um atributo adicional, truncation-preferred
, trunca determinado conteúdo para caber em uma linha em vez de quebrar. O elemento gmp-place-details-compact
contém um elemento filho, gmp-place-details-place-request
, para selecionar o lugar. Pode ser um objeto Place, um ID de lugar ou o nome do recurso de um lugar no formato "places/{place_id}":
<gmp-map center="47.75972, -122.25094" zoom="19" map-id="DEMO_MAP_ID"> <gmp-place-details-compact orientation = "horizontal" truncation-preferred slot="control-block-start-inline-center" > <gmp-place-details-place-request place = "ChIJC8HakaIRkFQRiOgkgdHmqkk"></gmp-place-details-place-request> <gmp-place-content-config> <gmp-place-media lightbox-preferred></gmp-place-media> <gmp-place-rating></gmp-place-rating> <gmp-place-type></gmp-place-type> <gmp-place-price></gmp-place-price> <gmp-place-accessible-entrance-icon></gmp-place-accessible-entrance-icon> <gmp-place-open-now-status></gmp-place-open-now-status> <gmp-place-attribution light-scheme-color="gray" dark-scheme-color="white"></gmp-place-attribution> </gmp-place-content-config> </gmp-place-details-compact> <gmp-advanced-marker></gmp-advanced-marker> </gmp-map>
Configurar o conteúdo
Você pode controlar o conteúdo específico do lugar exibido pelo elemento
gmp-place-details-compact
usando um elemento aninhado
gmp-place-content-config
para selecionar e configurar os detalhes
do lugar. O elemento gmp-place-content-config
contém vários elementos de conteúdo filhos, e cada um seleciona um detalhe de lugar correspondente para mostrar.
A ordem dos elementos filhos é irrelevante, já que os detalhes selecionados são sempre renderizados em uma ordem fixa predefinida. Alguns desses elementos podem ser configurados ainda mais usando atributos específicos do conteúdo.
PlaceContentConfigElement
para mais informações sobre todos os elementos de conteúdo compatíveis.
Para simplificar, o elemento
gmp-place-content-config
pode
ser substituído por
gmp-place-all-content
para mostrar todos os detalhes disponíveis no elemento "Detalhes do lugar compacto" ou por
gmp-place-standard-content
para exibir uma configuração padrão.
Configurar a aparência
O intervalo de largura recomendado para o elemento gmp-place-details-compact
na orientação vertical é de 180 px a 300 px. Larguras menores que 160 px podem não ser exibidas corretamente. Não defina uma altura fixa.
O intervalo de largura recomendado para o elemento gmp-place-details-compact
na orientação horizontal é de 180 a 500 pixels. Larguras menores que 160 px podem não ser exibidas corretamente. Em larguras menores que 350 px, a imagem em miniatura não será mostrada. Não defina uma altura fixa.
O elemento gmp-place-details-compact
também é compatível com várias propriedades CSS
personalizadas para configurar as cores e fontes do elemento. Consulte Kit de estilização personalizada da interface do usuário do Places para mais detalhes.
Confira um exemplo de código completo
Este exemplo demonstra como adicionar um
PlaceDetailsCompactElement
a um mapa de modo programático usando um
AdvancedMarkerElement
.
JavaScript
// Use querySelector to select elements for interaction. const mapContainer = document.getElementById("map-container"); const placeDetails = document.querySelector("gmp-place-details-compact"); const placeDetailsRequest = document.querySelector("gmp-place-details-place-request"); let gMap; let marker; async function initMap() { const { PlaceDetailsCompactElement, PlaceDetailsPlaceRequestElement } = await google.maps.importLibrary("places"); const { Map } = await google.maps.importLibrary("maps"); const { AdvancedMarkerElement } = await google.maps.importLibrary("marker"); gMap = new Map(mapContainer, { mapId: 'DEMO_MAP_ID' }); marker = new AdvancedMarkerElement({ map: gMap }); // Hide the map type control. gMap.setOptions({ mapTypeControl: false }); // Set up map, marker, and infowindow once widget is loaded. placeDetails.style.visibility = 'visible'; placeDetails.addEventListener('gmp-load', (event) => { console.log("placeDetails initialized!"); updateMapAndMarker(); }); // Add an event listener to handle clicks. gMap.addListener("click", async (event) => { event.stop(); // Fire when the user clicks on a POI. if (event.placeId) { console.log("clicked on POI"); console.log(event.placeId); placeDetailsRequest.place = event.placeId; updateMapAndMarker(); } else { // Fire when the user clicks the map (not on a POI). console.log('No place was selected.'); } ; }); // Function to update map, marker, and infowindow based on place details const updateMapAndMarker = () => { console.log("function called"); if (placeDetails.place && placeDetails.place.location) { marker.gMap = null; let adjustedCenter = offsetLatLngRight(placeDetails.place.location, 0.002); gMap.panTo(adjustedCenter); gMap.setZoom(16); // Set zoom after panning if needed marker.content = placeDetails; marker.position = placeDetails.place.location; } else { console.log("else"); } }; } // Helper function to offset marker placement for better visual appearance. function offsetLatLngRight(latLng, latitudeOffset) { const newLat = latLng.lat() + latitudeOffset; return new google.maps.LatLng(newLat, latLng.lng()); } initMap();
CSS
html, body { display: flex; width: 100%; height: 400px; margin: 0; } h1 { font-size: 16px; text-align: center; } #map-container { box-sizing: border-box; width: 100%; } gmp-place-details-compact { /* Sets the color for text and icons on the surface */ /* Adapts automatically to the user's system light/dark mode preference */ --gmp-mat-color-on-surface: light-dark(black, white); /* Sets the background color of the surface */ /* Adapts automatically to the user's system light/dark mode preference */ --gmp-mat-color-surface: light-dark(white, black); /* Defines the primary font stack used within the component */ --gmp-mat-font-family: Google Sans Text, sans-serif; /* Defines the style for medium body text (e.g., address, descriptions) */ --gmp-mat-font-body-medium: normal 400 0.875em/1.25em var(--gmp-mat-font-family, 'Google Sans Text'); width: 360px; border: none; padding: 0; margin: 0; position: relative; transform: translate(0, calc(-20px)); } /* This creates the pointer attached to the bottom of the element. */ gmp-place-details-compact::after { content: ""; position: absolute; top: 100%; left: 50%; transform: translateX(-50%); width: 0; height: 0; border-left: 16px solid transparent; border-right: 16px solid transparent; border-top: 20px solid var(--gmp-mat-color-surface, light-dark(white, black)); }
HTML
<!DOCTYPE html> <html> <head> <title>Click on the map to view place details</title> <meta charset="utf-8"> <link rel="stylesheet" href="style.css"> <script type="module" src="./index.js"></script> </head> <body> <div id = "map-container"></div> <gmp-place-details-compact orientation="horizontal"> <gmp-place-details-place-request place = ChIJn97JQNpC1moRIcJsVMEQLI8></gmp-place-details-place-request> <gmp-place-all-content></gmp-place-all-content> </gmp-place-details-compact> <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: "weekly" }); </script> </body> </html>