Pusatkan Google Maps (V3) pada perubahan ukuran browser (responsif)


124

Saya memiliki Google Maps (V3) di halaman saya dengan lebar halaman 100% dengan satu penanda di tengah. Ketika saya mengubah ukuran lebar jendela browser saya, saya ingin peta tetap berada di tengah (responsif). Sekarang peta hanya berada di sisi kiri halaman dan semakin kecil.

UPDATE Dapat berfungsi persis seperti yang dijelaskan berkat duncan. Ini adalah kode terakhir:

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
kerja bagus! ya, Anda harus terus-menerus menampilkan nilai tengah saat ini ke lingkup global sehingga dapat diambil oleh pendengar dom
efwjames

Jika Anda ke atas lakukan dengan cara ini, maka centertidak perlu menjadi global. Menyediakan center(dan calculateCenter) berada dalam cakupan yang sama dengan map, maka semuanya harus berfungsi. Tentu saja, jika mapbersifat global maka Anda harus memperbaikinya juga :)
Roamer-1888

Mungkin sudah jelas bagi sebagian besar orang, tetapi kode ini muncul SETELAH peta dimuat, jadi setidaknya harus ada di windows.onload
Victoria Ruiz

terima kasih, ini harus menjadi beaviours peta google default
Yukulélé

Jawaban:


143

Anda harus memiliki event listener untuk mengetahui kapan jendela diubah ukurannya. Ini berhasil untuk saya (taruh di fungsi inisialisasi Anda):

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

Ini bekerja dengan sempurna, terima kasih! Tetapi jika seseorang telah memindahkan peta, bagaimana cara mendapatkan pusat peta yang baru? Saya menemukan fungsi getCenter (), tetapi tidak bisa berfungsi dengan benar. map.setCenter (map.getCenter ()); tidak bekerja.
Gregory Bolkenstijn

Anda ingin pendengar acara lain, saya pikir untuk "center_changed" pada objek peta, yang memperbarui variabel global dengan koordinat baru, yang kemudian dapat Anda gunakan di setCenter Anda.
duncan

1
Saya juga mencobanya: var center; google.maps.event.addListener(map, 'center_changed', function() { center = map.getCenter(); }); google.maps.event.addDomListener(window, 'resize', function() { map.setCenter(center); }); Tidak berhasil. Bantuan apa pun akan dihargai.
Gregory Bolkenstijn

Bagaimana dengan "bounds_changed"?
duncan

49
Ini adalah cara termudah: hsmoore.com/blog/…
AO_

83

Deteksi acara pengubahan ukuran browser, ubah ukuran Google Map sambil mempertahankan titik tengah:

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); 
});

Anda dapat menggunakan kode yang sama di event handler lain saat mengubah ukuran peta google melalui cara lain (misalnya dengan kontrol 'resizable' jQuery-UI).

Sumber: http://hsmoore.com/blog/keep-google-map-v3-centered-when-browser-is-resized/ kredit ke @smftre untuk tautannya.

Catatan: Kode ini ditautkan dalam komentar @ smftre pada jawaban yang diterima. Saya pikir ada baiknya menambahkannya sebagai jawaban sendiri karena ini benar-benar lebih unggul dari jawaban yang diterima. Ini menghilangkan kebutuhan variabel global untuk melacak titik pusat dan penangan kejadian untuk memperbarui variabel itu.


Setuju dengan @William, metode ini menghasilkan posisi tengah yang lebih akurat saat peta diubah ukurannya.
lantai sepuluh

jawaban yang diterima tidak berfungsi dengan benar, yang ini berhasil
Tom

Ini adalah solusi terbaik dan berhasil. Bekerja pada setiap acara jendela pengubahan ukuran. Solusi lain tidak berfungsi dengan baik.
zdarsky.peter

1
Ini seharusnya sudah diposting sebagai wiki komunitas.
gustavohenke

Ini berhasil, tetapi saya ingin lebih memahaminya. Apa tepatnya yang dilakukannya google.maps.event.trigger(map, "resize");?
meduz '26


0

html: Buat div dengan id pilihan Anda

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

js: Buat peta dan lampirkan ke div yang baru saja Anda buat

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

Pusatkan saat jendela berubah ukuran

var center = map.getCenter();

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

0

Diperbarui dari solusi di atas ke es6.

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

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

Anda menggunakan addDomListeneruntuk window, yang merupakan elemen DOM, dan map, yang bukan. Objek peta harus menggunakan google.maps.event.addListeneratau map.addListenerpengendali kejadiannya sendiri .
duncan
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.