Отображение карты Google в модальном режиме, созданном с помощью Twitter Bootstrap
Я пытаюсь вставить карту Google в модальный с помощью Twitter Bootstrap. Модальный отображается с формой карты присутствует, но отображается только часть карты, остальное серое. При изменении размера экрана карта всегда отображается правильно, хотя и центрирована в неправильном месте.
Я искал и нашел предложения, такие как вызов события изменения размера карты или установка максимальной ширины изображения карты в none, но ни одно из этих предложений не помогло до сих пор. Кажется как будто карта не может понять, что это правильный размер, пока он находится в скрытом элементе.
JS
function initialize() {
var mapOptions = {
center: new google.maps.LatLng(51.219987, 4.396237),
zoom: 12,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
var map = new google.maps.Map(document.getElementById("mapCanvas"),
mapOptions);
var marker = new google.maps.Marker({
position: new google.maps.LatLng(51.219987, 4.396237)
});
marker.setMap(map);
}
HTML
<div class="modal hide fade" id="myModal">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal">×</button>
<h3></h3>
</div>
<div class="modal-body">
<div id="mapCanvas" style="width: 500px; height: 400px"></div>
</div>
<div class="modal-footer">
<a href="#" class="btn" data-dismiss="modal">Close</a>
</div>
</div>
Я использую Twitter Bootstrap v2.0.4. Мне нужна помощь, потому что я не могу правильно запустить событие изменения размера или отредактировать css, чтобы оставить карту Google в покое.
11 ответов:
Google Maps действительно отображает "серую" область, когда она помещается внутри динамического элемента (например: тот, который изменяет размер, исчезает и т. д.). Вы правы о запуске функции" изменить размер", которая должна быть вызвана после завершения анимации (
shown.bs.modal
событие в Bootstrap 3 илиshown
событие в Bootstrap 2):$("#myModal").on("shown.bs.modal", function () { google.maps.event.trigger(map, "resize"); });
в Bootstrap 2, вы будете делать:
$('#myModal').on('shown', function () { google.maps.event.trigger(map, "resize"); });
(где
map
- это имя переменной вашей карты (см. Google Maps документация для более подробной информации), и#myModal
идентификатор из вашего элемента).обновление 2018-05-22
С новым выпуском рендерера в версии 3.32 Maps JavaScript API событие изменения размера больше не является частью
Map
класса.в документации говорится
при изменении размера карты центр карты фиксируется
полноэкранный режим теперь сохраняет центр.
больше нет необходимости запускать событие изменения размера вручную.
источник:https://developers.google.com/maps/documentation/javascript/new-renderer
google.maps.event.trigger(map, "resize");
не имеет никакого эффекта, начиная с версии 3.32
для меня это работает так (Boostrap 3):
$("#contact-modal").on("shown.bs.modal", function () { google.maps.event.trigger(map, "resize"); });
отображение карты правильно и по центру
Я хотел бы указать на несколько изменений, которые я сделал, основываясь на исходном ответе, чтобы заставить его работать с Bootstrap 3 (Проверьте о использование глагола).
// Resize map to show on a Bootstrap's modal $('#map-modal').on('shown.bs.modal', function() { var currentCenter = map.getCenter(); // Get current center before resizing google.maps.event.trigger(map, "resize"); map.setCenter(currentCenter); // Re-set previous center });
в этом случае я также забочусь о повторном центрировании карты, основываясь на этот вопрос предложил в комментарии Ян-Хенк к первому ответу.
при использовании Bootstrap 3. Вы должны использовать то, что указано в их документации, т. е. вместо 'показано' использовать ', как показано.БС.модальное'
пример:
$('#modal').on('shown.bs.modal', function () { initialiseMap(); });
принятый ответ действительно работает в этом случае, когда содержимое div локально. К сожалению, у меня была такая же проблема с отображением карты, которая была включена как часть удаленных данных. Получение дескриптора карты и вызов resize не правильно центрировали мою карту. Вот как я исправил проблему в моей ситуации с удаленными данными.
включите тег скрипта как часть ваших удаленных данных с функцией инициализации карты
<script type="text/javascript"> function renderMap() { var point = new google.maps.LatLng(51.219987, 4.396237); var map = new google.maps.Map(document.getElementById('map'), { mapTypeId: google.maps.MapTypeId.ROADMAP, zoom: 13, center: point }); var marker = new google.maps.Marker({ position: point, map: map, icon: 'http://www.google.com/intl/en_us/mapfiles/ms/icons/red-dot.png' }); } </script>
вызов функции в показано событие диалога на главной странице
<script type="text/javascript"> $(document).ready(function () { $('#dlgReportInfo').on('shown', function () { renderMap(); }); }) </script>
таким образом, карта уже имеет размер в диалоговом окне перед ее инициализацией. Надеюсь, это поможет любым другим в подобной ситуации.
принятый ответ избавился от серых ящиков, но не центрирует карту в нужных для меня координатах. Мое решение было просто ждать, чтобы отобразить карту до тех пор, пока модальное не будет завершено отображение.
$('#modal').on('shown', function () { initialize(); });
следующий код прекрасно работает для bootstrap 3
$("#mapModal").on("shown.bs.modal", function () {initialize();});
this works for me **<!-- Modal -->** <div class="modal fade" id="myModal" role="dialog"> <div class="modal-dialog"> <!-- Modal content--> <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal">×</button> <h4 class="modal-title">Google Maps</h4> </div> <div class="modal-body"> <div id="map_canvas" style="width:auto; height: 500px;"></div> </div> <div class="modal-footer"> <button type="button" class="btn btn-default" data-dismiss="modal">Close</button> </div> </div> </div> </div> **Button** <button type="button" class="btn btn-primary" data-toggle="modal" data-target="#myModal">View Map</button> **javascript** <script type="text/javascript"> function initializeMap() { var mapOptions = { center: new google.maps.LatLng(51.219987, 4.396237), zoom: 12, mapTypeId: google.maps.MapTypeId.HYBRID }; var map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions); var marker = new google.maps.Marker({ position: new google.maps.LatLng(51.219987, 4.396237) }); marker.setMap(map); } //show map on modal $('#myModal').on('shown.bs.modal', function () { initializeMap(); }); </script>
надеюсь, что это поможет
я исправил с решением:
$('#myId').on('shown.bs.modal', function () { initializeMap() // with initializeMap function get map. });
//событие показано.БС.модальные на модальные начальной загрузки будет показывать после модальный шоу, а не использовать показать.БС.модальные, потому что он будет звонить прежде чем модальный шоу.
попробуйте это !
<div class="modal fade" id="map_modal" tabindex="-1" role="dialog" aria- labelledby="myModalLabel" aria-hidden="true"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> <h4 class="modal-title" id="myModalLabel">Modal title</h4> </div> <div class="modal-body"><div id="map_canvas" style="width:530px; height:300px"></div></div> </div><!-- /.modal-content --> </div><!-- /.modal-dialog -->
var map = marker = new Array(); geocoder = NULL; function addPoint(location, id, mapId) { if (!marker[id]) { marker[id] = new google.maps.Marker({ position: location, map: map[mapId], draggable: true }); } } function placeMarker(location, editStr, id) { if (!marker[id]) { marker[id] = new google.maps.Marker({ position: location, map: map[id], draggable: false }); } marker[id].setPosition(location); map[id].setCenter(location); $("#longitud").val(location.lat()); $("#latitud").val(location.lng()); } function initializeMap(id, div_id, lat, lng, editStr) { if (!geocoder) geocoder = new google.maps.Geocoder(); if (!map[id]) { var coordinates = new google.maps.LatLng(lat, lng); var myOptions = {zoom: 8, center: coordinates, mapTypeId: google.maps.MapTypeId.ROADMAP} map[id] = new google.maps.Map(document.getElementById(div_id), myOptions); google.maps.event.addListener(map[id], 'click', function(event) { placeMarker(event.latLng, editStr, id); }); placeMarker(coordinates, editStr, id); } } $('#map_modal').on('shown.bs.modal', function(e) { initializeMap("#newMaps", "map_canvas", 10.444598, -66.9287, ""); })
Я также сталкиваюсь с той же проблемой, но я решаю ее, ожидая состояния "простоя" карты (т. е. когда она закончена), а затем вызывая resize:
google.maps.event.addListenerOnce(map, 'idle', function () { var currentCenter = map.getCenter(); google.maps.event.trigger(map, 'resize'); map.setCenter(currentCenter); map.setZoom(15); });
после
map = new google.maps.Map(document.getElementById('map-canvas2'),mapOptions);