Los elementos Place Details y Place Details Compact son elementos HTML que renderizan detalles de un lugar:
-
El objeto
PlaceDetailsElement
admite todos los datos de lugares visualizables y puede incluir varias fotos. -
El elemento
PlaceDetailsCompactElement
está diseñado para ocupar el mínimo espacio y mostrar un conjunto conciso de información sobre un lugar, como el nombre, la dirección, la calificación, etcétera. También puede incluir una sola foto.
Elemento Place Details
Haz clic en un marcador del mapa para ver los detalles del lugar en un elemento Place Details.
El objeto
PlaceDetailsElement
admite una amplia variedad de elementos de contenido, incluidos el horario de atención completo, el sitio web, el número de teléfono, el resumen editorial, los aspectos destacados específicos del tipo, las opiniones, el plus code y las listas de funciones.
Para mostrar los detalles de un lugar en un mapa, agrega un elemento gmp-place-details
al elemento gmp-map
en la página HTML. Incluye un elemento secundario, gmp-place-details-place-request
, para seleccionar el lugar. Puede ser un objeto Place, un ID de lugar o el nombre del recurso de un lugar en el 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>
Configura el contenido
Puedes controlar el contenido específico del lugar que se muestra en el elemento gmp-place-details
con un elemento gmp-place-content-config
anidado para seleccionar y configurar los detalles del lugar, como se muestra en este ejemplo:
<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>
El elemento gmp-place-content-config
en sí contiene varios elementos de contenido secundarios, y cada uno selecciona un detalle del lugar correspondiente para mostrarlo: PlaceAddressElement
selecciona la dirección del lugar, PlacePriceElement
selecciona el nivel de precios del lugar, etcétera. El orden de los elementos secundarios es irrelevante, ya que los detalles seleccionados siempre se renderizan en un orden predefinido fijo.
Algunos de estos elementos se pueden configurar aún más con atributos específicos del contenido:
-
El elemento
gmp-place-media
se usa para mostrar una sola foto y contiene un atributolightbox-preferred
que abre la foto en una lightbox cuando se hace clic en ella. La Lightbox está inhabilitada de forma predeterminada. -
El elemento
gmp-place-attribution
se usa para mostrar la fuente de la foto. Los atributoslight-scheme-color
ydark-scheme-color
se usan para establecer el color del texto de atribución en el modo claro y oscuro.
PlaceContentConfigElement
para obtener más información sobre todos los elementos de contenido admitidos.
Para simplificar, el elemento
gmp-place-content-config
se puede reemplazar por
gmp-place-all-content
para mostrar todos los detalles disponibles en el elemento Place Details, o bien por
gmp-place-standard-content
para mostrar una configuración estándar.
Configura la apariencia
El rango de ancho recomendado para el elemento gmp-place-details
es de 250 a 400 px.
Es posible que los anchos inferiores a 250 px no se muestren correctamente. Establece la altura para que se adapte a tu aplicación.
El elemento Place Details está diseñado para desplazarse dentro del espacio asignado según sea necesario.
El elemento gmp-place-details
también admite una variedad de propiedades CSS personalizadas para configurar los colores y las fuentes del elemento. Consulta Personalización del kit de IU de Places para obtener más detalles.
Consulta el ejemplo 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
Haz clic en un marcador del mapa para ver los detalles del lugar en un elemento compacto de detalles del lugar.
El elemento
PlaceDetailsCompactElement
renderiza detalles de un lugar seleccionado con el mínimo espacio posible. Esto puede ser útil en una ventana de información que destaca un lugar en un mapa, en una experiencia de redes sociales, como compartir una ubicación en un chat, como sugerencia para seleccionar tu ubicación actual o dentro de un artículo de medios para hacer referencia al lugar en Google Maps.El objeto PlaceDetailsCompactElement
puede mostrar el nombre visible, la dirección, la calificación, el tipo, el precio, el ícono de accesibilidad, el estado de apertura y una sola foto. Se puede mostrar de forma horizontal o vertical, según lo seleccionado por el atributo orientation
.
En el siguiente fragmento, gmp-place-details-compact
está anidado dentro de un elemento gmp-map
, con orientation
establecido en horizontal
. Un atributo adicional, truncation-preferred
, trunca cierto contenido para que quepa en una línea en lugar de ajustarse. El elemento gmp-place-details-compact
contiene un elemento secundario, gmp-place-details-place-request
, para seleccionar el lugar. Puede ser un objeto Place, un ID de lugar o el nombre del recurso de un lugar en el 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>
Configura el contenido
Puedes controlar el contenido específico del lugar que se muestra con el elemento
gmp-place-details-compact
usando un elemento
gmp-place-content-config
anidado para seleccionar y configurar los detalles
del lugar. El elemento gmp-place-content-config
en sí contiene varios elementos de contenido secundarios, y cada uno selecciona un detalle de lugar correspondiente para mostrar.
El orden de los elementos secundarios es irrelevante, ya que los detalles seleccionados siempre se renderizan en un orden predefinido fijo. Algunos de estos elementos se pueden configurar aún más con atributos específicos del contenido.
PlaceContentConfigElement
para obtener más información sobre todos los elementos de contenido admitidos.
Para simplificar, el elemento
gmp-place-content-config
se puede reemplazar por
gmp-place-all-content
para mostrar todos los detalles disponibles en el elemento compacto de Place Details, o bien por
gmp-place-standard-content
para mostrar una configuración estándar.
Configura la apariencia
El rango de ancho recomendado para el elemento gmp-place-details-compact
en orientación vertical es de 180 px a 300 px. Es posible que los anchos inferiores a 160 px no se muestren correctamente. No establezcas una altura fija.
El rango de ancho recomendado para el elemento gmp-place-details-compact
en orientación horizontal es de 180 a 500 px. Es posible que los anchos inferiores a 160 px no se muestren correctamente. Con anchos inferiores a 350 px, no se mostrará la imagen en miniatura. No establezcas una altura fija.
El elemento gmp-place-details-compact
también admite una variedad de propiedades CSS personalizadas para configurar los colores y las fuentes del elemento. Consulta Personalización del kit de IU de Places para obtener más detalles.
Consulta un ejemplo de código completo
En este ejemplo, se muestra cómo agregar un PlaceDetailsCompactElement
a un mapa de forma programática con un 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>