Los elementos Place Details y Place Details Compact son elementos HTML que renderizan detalles de un lugar:
-
El objeto
PlaceDetailsElementadmite todos los datos de lugares visualizables y puede incluir varias fotos. -
El elemento
PlaceDetailsCompactElementestá 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:
<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-mediase usa para mostrar una sola foto y contiene un atributolightbox-preferredque abre la foto en una lightbox cuando se hace clic en ella. La Lightbox está inhabilitada de forma predeterminada. -
El elemento
gmp-place-attributionse usa para mostrar la fuente de la foto. Los atributoslight-scheme-colorydark-scheme-colorse 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.
<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 px 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>