Trung tâm Google Maps (V3) trên thay đổi kích thước trình duyệt (phản hồi)


124

Tôi có Google Maps (V3) trong trang của mình với chiều rộng 100% trang với một điểm đánh dấu ở giữa. Khi tôi thay đổi kích thước chiều rộng cửa sổ trình duyệt của mình, tôi muốn bản đồ ở giữa (phản hồi). Bây giờ bản đồ chỉ ở bên trái của trang và nhỏ hơn.

CẬP NHẬT Làm cho nó hoạt động chính xác như được mô tả nhờ duncan. Đây là mã cuối cùng:

var center;
function calculateCenter() {
  center = map.getCenter();
}
google.maps.event.addDomListener(map, 'idle', function() {
  calculateCenter();
});
google.maps.event.addDomListener(window, 'resize', function() {
  map.setCenter(center);
});

1
làm tốt lắm! có, bạn phải liên tục xuất giá trị trung tâm hiện tại sang phạm vi toàn cầu để người nghe có thể chọn nó
efwjames

Nếu bạn đang đi đầu làm theo cách này, thì centerkhông cần phải toàn cầu. Cung cấp center(và calculateCenter) trong cùng một phạm vi map, sau đó mọi thứ sẽ hoạt động. Tất nhiên, nếu maplà toàn cầu thì bạn cũng sẽ cần sửa nó :)
Roamer-1888

Có thể nó rõ ràng với hầu hết, nhưng mã này xuất hiện SAU khi bản đồ được tải, do đó, nó phải có ít nhất trên windows.onload
Victoria Ruiz

cảm ơn, đây phải là beaviours mặc định của google maps
Yukulélé

Câu trả lời:


143

Bạn cần phải có một trình lắng nghe sự kiện khi cửa sổ thay đổi kích thước. Điều này làm việc cho tôi (đặt nó trong chức năng khởi tạo của bạn):

google.maps.event.addDomListener(window, 'resize', function() {
    map.setCenter(center);
});

Điều này làm việc hoàn hảo, cảm ơn! Nhưng nếu ai đó đã di chuyển bản đồ, làm thế nào để tôi có được trung tâm mới của bản đồ? Tôi đã tìm thấy hàm getCenter (), nhưng không thể làm cho nó hoạt động chính xác. map.setCenter (map.getCenter ()); không hoạt động.
Gregory Bolkenstijn

Bạn muốn một người nghe sự kiện khác, tôi nghĩ cho "centre_changed" trên đối tượng bản đồ, cập nhật một biến toàn cục với tọa độ mới, sau đó bạn có thể sử dụng trong setCenter của mình.
duncan

1
Tôi cũng đã thử điều đó: var center; google.maps.event.addListener(map, 'center_changed', function() { center = map.getCenter(); }); google.maps.event.addDomListener(window, 'resize', function() { map.setCenter(center); }); Không hoạt động. Bất kỳ trợ giúp sẽ được đánh giá cao.
Gregory Bolkenstijn

Thay vào đó, "bound_changed" thì sao?
duncan

49
Đây là cách dễ nhất: hsmoore.com/blog/ khăn
AO_

83

Phát hiện sự kiện thay đổi kích thước trình duyệt, thay đổi kích thước Google Map trong khi duy trì điểm trung tâm:

var map = ...; // your map initialisation code

google.maps.event.addDomListener(window, "resize", function() {
    var center = map.getCenter();
    google.maps.event.trigger(map, "resize");
    map.setCenter(center); 
});

Bạn có thể sử dụng cùng một mã trong các trình xử lý sự kiện khác khi thay đổi kích thước bản đồ google thông qua các phương tiện khác (ví dụ: với điều khiển 'thay đổi kích thước' của jQuery-UI).

Nguồn: http://hsmoore.com/blog/keep-google-map-v3-centered-when-browser-is-resized/ tín dụng cho @smftre cho liên kết.

Lưu ý: Mã này đã được liên kết trong nhận xét của @ smftre về câu trả lời được chấp nhận. Tôi nghĩ rằng nó đáng để thêm nó như là câu trả lời của riêng mình vì nó thực sự vượt trội so với câu trả lời được chấp nhận. Nó loại bỏ sự cần thiết của một biến toàn cục để theo dõi điểm trung tâm và một bộ xử lý sự kiện để cập nhật biến đó.


Đồng ý với @William, phương pháp này dẫn đến vị trí trung tâm chính xác hơn khi bản đồ được thay đổi kích thước.
thứ mười

câu trả lời được chấp nhận không hoạt động chính xác, câu trả lời này đã tạo ra mánh khóe
Tom

Đây là giải pháp tốt nhất và làm việc. Hoạt động trên mọi sự kiện thay đổi kích thước cửa sổ. Các giải pháp khác không hoạt động đúng.
zdarsky.peter

1
Điều này thực sự nên được đăng dưới dạng wiki cộng đồng.
gustavohenke

Nó hoạt động, nhưng tôi muốn hiểu nó nhiều hơn. Chính xác thì làm google.maps.event.trigger(map, "resize");gì?
meduz '


0

html: Tạo một div với id bạn chọn

<div id="map"></div>

js: Tạo bản đồ và đính kèm vào div bạn vừa tạo

var map = new google.maps.Map(document.getElementById('map'), {
    zoom: 16,
    center: new google.maps.LatLng(-33.890542, 151.274856)
});

Trung tâm khi cửa sổ thay đổi kích thước

var center = map.getCenter();

google.maps.event.addDomListener(window, 'resize', function() {
    map.setCenter(center);
});

0

Cập nhật các giải pháp trên cho es6.

let center;
const addMapListener = google.maps.event.addDomListener;

addMapListener(map, 'idle', () => center = map.getCenter());
addMapListener(window, 'resize', () => map.setCenter(center));

Bạn đang sử dụng addDomListenercho cả hai window, đó là một yếu tố DOM và mapkhông phải là một yếu tố . Đối tượng bản đồ nên sử dụng google.maps.event.addListenerhoặc map.addListenerxử lý sự kiện riêng của nó .
duncan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.