Элементы Place Details и Place Details Compact — это элементы HTML, которые отображают подробную информацию о месте:
-
PlaceDetailsElement
поддерживает все визуализируемые данные Place и может включать несколько фотографий. - Элемент
PlaceDetailsCompactElement
предназначен для использования минимального пространства и отображения краткого набора информации о месте, включая название, адрес, рейтинг и т. д. Он также может включать одну фотографию.
Элемент сведений о месте
Щелкните маркер на карте, чтобы увидеть подробную информацию о нем в элементе «Сведения о месте».
PlaceDetailsElement
поддерживает широкий спектр элементов контента, включая полные часы работы, веб-сайт, номер телефона, редакционное резюме, основные сведения по типу объекта, обзоры, плюс-код и списки функций.
Чтобы отобразить информацию о месте на карте, добавьте элемент gmp-place-details
к элементу gmp-map
на HTML-странице. Добавьте дочерний элемент gmp-place-details-place-request
для выбора места. Это может быть объект Place , идентификатор места или имя ресурса Place в формате «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>
Настройте содержимое
Вы можете управлять определенным содержимым места, отображаемым элементом gmp-place-details
используя вложенный элемент gmp-place-content-config
для выбора и настройки сведений о месте, как показано в этом примере:
<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>
Элемент gmp-place-content-config
сам по себе содержит ряд дочерних элементов контента, каждый из которых выбирает соответствующую информацию о месте для отображения: PlaceAddressElement
выбирает адрес места, PlacePriceElement
выбирает уровень цен места и т. д. Порядок дочерних элементов не имеет значения, поскольку выбранные данные всегда отображаются в фиксированном предопределенном порядке.
Некоторые из этих элементов можно дополнительно настроить с помощью атрибутов, специфичных для контента:
- Элемент
gmp-place-media
используется для отображения одной фотографии и включает атрибутlightbox-preferred
, который открывает фотографию в лайтбоксе при нажатии. По умолчанию лайтбокс отключен. - Элемент
gmp-place-attribution
используется для отображения источника фотографии. Атрибутыlight-scheme-color
иdark-scheme-color
задают цвет текста с указанием источника в светлом и тёмном режимах.
PlaceContentConfigElement
Для простоты элемент gmp-place-content-config
можно заменить на gmp-place-all-content
чтобы отобразить все сведения, доступные в элементе Place Details, или на gmp-place-standard-content
чтобы отобразить стандартную конфигурацию.
Настроить внешний вид
Рекомендуемый диапазон ширины элемента gmp-place-details
— от 250 до 400 пикселей. Значения ширины менее 250 пикселей могут отображаться некорректно. Задайте высоту в соответствии с вашим приложением. Элемент Place Details прокручивается в пределах отведённого пространства по мере необходимости.
Элемент gmp-place-details
также поддерживает множество пользовательских CSS-свойств для настройки цветов и шрифтов элемента. Подробнее см. в разделе «Настройка стилей Places UI Kit» .
Посмотреть полный пример кода
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>
Компактный элемент деталей места
Щелкните маркер на карте, чтобы увидеть подробную информацию о нем в компактном элементе «Сведения о месте».
Элемент PlaceDetailsCompactElement
отображает информацию о выбранном месте, занимая минимальное пространство. Это может быть полезно в информационном окне, выделяющем место на карте, в социальных сетях, например, для публикации местоположения в чате, в качестве подсказки для выбора текущего местоположения или в медиа-статье для упоминания места на Google Картах. PlaceDetailsCompactElement
может отображать название, адрес, рейтинг, тип, цену, значок доступности, статус открытости и одну фотографию. Он может отображаться горизонтально или вертикально в зависимости от атрибута orientation
.
В следующем фрагменте кода элемент gmp-place-details-compact
вложен в элемент gmp-map
с horizontal
orientation
. Дополнительный атрибут truncation-preferred
обрезает определённое содержимое, чтобы оно умещалось на одной строке вместо переноса. Элемент gmp-place-details-compact
содержит дочерний элемент gmp-place-details-place-request
для выбора места. Это может быть объект Place , идентификатор места или имя ресурса Place в формате «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>
Настройте содержимое
Вы можете управлять содержимым конкретного места, отображаемым элементом gmp-place-details-compact
используя вложенный элемент gmp-place-content-config
для выбора и настройки информации о месте. Сам элемент gmp-place-content-config
содержит ряд дочерних элементов, каждый из которых выбирает соответствующую информацию о месте для отображения. Порядок дочерних элементов не имеет значения, поскольку выбранные данные всегда отображаются в фиксированном, предопределенном порядке. Некоторые из этих элементов можно дополнительно настроить с помощью атрибутов, специфичных для конкретного места.
PlaceContentConfigElement
Для простоты элемент gmp-place-content-config
можно заменить на gmp-place-all-content
чтобы отобразить все сведения, доступные в компактном элементе Place Details, или на gmp-place-standard-content
чтобы отобразить стандартную конфигурацию.
Настроить внешний вид
Рекомендуемый диапазон ширины элемента gmp-place-details-compact
в вертикальной ориентации составляет 180–300 пикселей. Ширина менее 160 пикселей может отображаться некорректно. Не устанавливайте фиксированную высоту.
Рекомендуемый диапазон ширины элемента gmp-place-details-compact
в горизонтальной ориентации составляет 180–500 пикселей. Ширина менее 160 пикселей может отображаться некорректно. При ширине менее 350 пикселей миниатюра не будет отображаться. Не устанавливайте фиксированную высоту.
Элемент gmp-place-details-compact
также поддерживает множество пользовательских CSS-свойств для настройки цветов и шрифтов элемента. Подробнее см. в разделе «Настройка стилей Places UI Kit» .
Посмотреть полный пример кода
В этом примере демонстрируется программное добавление PlaceDetailsCompactElement
на карту с помощью 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>