Styling Google Maps InfoWindow


116

Saya sudah mencoba menata Google Maps saya InfoWindow, tetapi dokumentasinya sangat terbatas pada topik ini. Bagaimana Anda menata InfoWindow?

Jawaban:


120

Google menulis beberapa kode untuk membantu ini. Berikut ini beberapa contohnya: Contoh menggunakan InfoBubble , Spidol Bergaya dan Info Window Custom (menggunakan OverlayView).

Kode pada tautan di atas mengambil rute yang berbeda untuk mencapai hasil yang serupa. Intinya adalah tidak mudah untuk menata InfoWindows secara langsung, dan mungkin lebih mudah untuk menggunakan kelas InfoBubble tambahan daripada InfoWindow, atau untuk mengganti GOverlay. Pilihan lain adalah memodifikasi elemen InfoWindow menggunakan javascript (atau jQuery), seperti yang disarankan ATOzTOA nanti.

Mungkin yang paling sederhana dari contoh ini adalah menggunakan InfoBubble daripada InfoWindow. InfoBubble tersedia dengan mengimpor file ini (yang harus Anda hosting sendiri):http://google-maps-utility-library-v3.googlecode.com/svn/trunk/infobubble/src/infobubble.js

Halaman proyek Github InfoBubble .

InfoBubble sangat bergaya, dibandingkan dengan InfoWindow:

 infoBubble = new InfoBubble({
      map: map,
      content: '<div class="mylabel">The label</div>',
      position: new google.maps.LatLng(-32.0, 149.0),
      shadowStyle: 1,
      padding: 0,
      backgroundColor: 'rgb(57,57,57)',
      borderRadius: 5,
      arrowSize: 10,
      borderWidth: 1,
      borderColor: '#2c2c2c',
      disableAutoPan: true,
      hideCloseButton: true,
      arrowPosition: 30,
      backgroundClassName: 'transparent',
      arrowStyle: 2
});

infoBubble.open();

Anda juga dapat menyebutnya dengan peta dan penanda yang diberikan untuk dibuka di:

infoBubble.open(map, marker);

Sebagai contoh lain, contoh Kustom Jendela Info memperluas kelas GOverlay dari Google Maps API dan menggunakan ini sebagai dasar untuk membuat jendela info yang lebih fleksibel. Ini pertama kali membuat kelas:

/* An InfoBox is like an info window, but it displays
 * under the marker, opens quicker, and has flexible styling.
 * @param {GLatLng} latlng Point to place bar at
 * @param {Map} map The map on which to display this InfoBox.
 * @param {Object} opts Passes configuration options - content,
 *   offsetVertical, offsetHorizontal, className, height, width
 */
function InfoBox(opts) {
  google.maps.OverlayView.call(this);
  this.latlng_ = opts.latlng;
  this.map_ = opts.map;
  this.offsetVertical_ = -195;
  this.offsetHorizontal_ = 0;
  this.height_ = 165;
  this.width_ = 266;

  var me = this;
  this.boundsChangedListener_ =
    google.maps.event.addListener(this.map_, "bounds_changed", function() {
      return me.panMap.apply(me);
    });

  // Once the properties of this OverlayView are initialized, set its map so
  // that we can display it.  This will trigger calls to panes_changed and
  // draw.
  this.setMap(this.map_);
}

setelah itu melanjutkan untuk menimpa GOverlay:

InfoBox.prototype = new google.maps.OverlayView();

Anda kemudian harus menimpa metode yang Anda butuhkan: createElement, draw, removedan panMap. Ini agak terlibat, tetapi secara teori Anda hanya menggambar div pada peta sendiri sekarang, daripada menggunakan Jendela Info normal.


@ShyamK Berikut adalah pertanyaan yang terkait dengan mengatur gaya jendela info KML , yang mungkin bisa membantu Anda. Saya rasa banyak contoh di jawaban saya mungkin tidak berlaku untuk KML (saya tidak yakin), tetapi dapat dengan mudah disesuaikan untuk berfungsi dalam kasus itu juga.
Herman Schaaf

11
Perlu dicatat bahwa salah satu tautan Anda di sini adalah contoh objek InfoBox (tipe lain dari jendela info) dan bukan objek InfoWindow (jendela info google asli). Baik untuk mengetahui apakah Anda googling dan mungkin bingung mengapa Anda dapat menemukan InfoBox baru () dan InfoWindow () baru. InfoBox adalah yang lebih baru dan lebih mudah untuk menyesuaikan IMO dan masih banyak lagi yang dapat Anda sesuaikan. Contoh lain dari yang satu itu juga dapat dilihat dalam jawaban SO ini
Don Vaughn

1
Oh, tidak, yang terakhir juga tidak: itu tentang infoBox juga.
matteo

Bagus, ini yang saya cari-cari, btw bagaimana cara menambahkan tombol tutup?
Yusuf1494

36

Anda dapat memodifikasi seluruh InfoWindow menggunakan jquery saja ...

var popup = new google.maps.InfoWindow({
    content:'<p id="hook">Hello World!</p>'
});

Di sini elemen <p> akan bertindak sebagai pengait ke InfoWindow yang sebenarnya. Setelah domready diaktifkan, elemen tersebut akan menjadi aktif dan dapat diakses menggunakan javascript / jquery, seperti $('#hook').parent().parent().parent().parent().

Kode di bawah ini hanya menetapkan batas 2 piksel di sekitar InfoWindow.

google.maps.event.addListener(popup, 'domready', function() {
    var l = $('#hook').parent().parent().parent().siblings();
    for (var i = 0; i < l.length; i++) {
        if($(l[i]).css('z-index') == 'auto') {
            $(l[i]).css('border-radius', '16px 16px 16px 16px');
            $(l[i]).css('border', '2px solid red');
        }
    }
});

Anda dapat melakukan apa saja seperti menyetel kelas CSS baru atau hanya menambahkan elemen baru.

Bermain-main dengan elemen untuk mendapatkan apa yang Anda butuhkan ...


4
Ini berfungsi untuk saya (dengan satu orang tua lebih sedikit), dan berfungsi di browser acorss (opera, ff, ie, safari, chrome), tetapi tidak berfungsi di bawah IE9.
johntrepreneur

Alat peraga untuk memasukkan beberapa kode tambahan yang saya cari cara menggunakannya. Terima kasih
MetalPhoenix

Saya mendapatkan 'popup tidak ditentukan' ketika saya memasukkannya ke dalam dokumen (siap), di jendela (memuat) atau jika saya menempel langsung ke konsol setelah halaman dimuat. Apakah saya kehilangan file js eksternal atau sesuatu?
pengguna1380540

Ini bukan ide yang baik karena logika rendering peta Google tidak abadi. Alih-alih, gunakan popup: developers.google.com/maps/documentation/javascript/examples/…
Ali Sheikhpour

5
google.maps.event.addListener(infowindow, 'domready', function() {

    // Reference to the DIV that wraps the bottom of infowindow
    var iwOuter = $('.gm-style-iw');

    /* Since this div is in a position prior to .gm-div style-iw.
     * We use jQuery and create a iwBackground variable,
     * and took advantage of the existing reference .gm-style-iw for the previous div with .prev().
    */
    var iwBackground = iwOuter.prev();

    // Removes background shadow DIV
    iwBackground.children(':nth-child(2)').css({'display' : 'none'});

    // Removes white background DIV
    iwBackground.children(':nth-child(4)').css({'display' : 'none'});

    // Moves the infowindow 115px to the right.
    iwOuter.parent().parent().css({left: '115px'});

    // Moves the shadow of the arrow 76px to the left margin.
    iwBackground.children(':nth-child(1)').attr('style', function(i,s){ return s + 'left: 76px !important;'});

    // Moves the arrow 76px to the left margin.
    iwBackground.children(':nth-child(3)').attr('style', function(i,s){ return s + 'left: 76px !important;'});

    // Changes the desired tail shadow color.
    iwBackground.children(':nth-child(3)').find('div').children().css({'box-shadow': 'rgba(72, 181, 233, 0.6) 0px 1px 6px', 'z-index' : '1'});

    // Reference to the div that groups the close button elements.
    var iwCloseBtn = iwOuter.next();

    // Apply the desired effect to the close button
    iwCloseBtn.css({opacity: '1', right: '38px', top: '3px', border: '7px solid #48b5e9', 'border-radius': '13px', 'box-shadow': '0 0 5px #3990B9'});

    // If the content of infowindow not exceed the set maximum height, then the gradient is removed.
    if($('.iw-content').height() < 140){
      $('.iw-bottom-gradient').css({display: 'none'});
    }

    // The API automatically applies 0.7 opacity to the button after the mouseout event. This function reverses this event to the desired value.
    iwCloseBtn.mouseout(function(){
      $(this).css({opacity: '1'});
    });
  });

// CSS dimasukkan ke dalam lembar gaya

.gm-style-iw {
  background-color: rgb(237, 28, 36);
    border: 1px solid rgba(72, 181, 233, 0.6);
    border-radius: 10px;
    box-shadow: 0 1px 6px rgba(178, 178, 178, 0.6);
    color: rgb(255, 255, 255) !important;
    font-family: gothambook;
    text-align: center;
    top: 15px !important;
    width: 150px !important;
}

kode ini bermasalah dengan ekor di Chrome. Anda harus mengklik 2x agar ekornya menunjukkan posisi yang benar
cpcdev


3

Saya menggunakan kode berikut untuk menerapkan beberapa CSS eksternal:

boxText = document.createElement("html");
boxText.innerHTML = "<head><link rel='stylesheet' href='style.css'/></head><body>[some html]<body>";

infowindow.setContent(boxText);
infowindow.open(map, marker);

1
Saya dapat menargetkan css secara langsung menggunakan .gm-style> div> div: nth-child (3)> div: nth-child (4)> div> div> div: nth-child (2) {
Charlie- Greenman

1

Gunakan plugin InfoBox dari Perpustakaan Utilitas Google Maps. Itu membuat penataan / pengelolaan pop-up peta jauh lebih mudah.

Perhatikan bahwa Anda harus memastikannya dimuat setelah Google Maps API:

<script src="https://maps.googleapis.com/maps/api/js?key=YOUR_KEY&callback=initMap" async defer></script>
<script src="/js/infobox_packed.js" async defer></script>

1

Saya telah mendesain jendela infowindow google dengan gambar & beberapa konten seperti di bawah ini.

masukkan deskripsi gambar di sini

map_script (Hanya untuk referensi html infowindow)

for (i = 0; i < locations.length; i++) { 
    var latlng = new google.maps.LatLng(locations[i][1], locations[i][2]);
    marker = new google.maps.Marker({
        position: latlng,
        map: map,
        icon: "<?php echo plugins_url( 'assets/img/map-pin.png', ELEMENTOR_ES__FILE__ ); ?>"
    });

    var property_img = locations[i][6],
    title = locations[i][0],
    price = locations[i][3],
    bedrooms = locations[i][4],
    type = locations[i][5],
    listed_on = locations[i][7],
    prop_url = locations[i][8];

    content = "<div class='map_info_wrapper'><a href="+prop_url+"><div class='img_wrapper'><img src="+property_img+"></div>"+
    "<div class='property_content_wrap'>"+
    "<div class='property_title'>"+
    "<span>"+title+"</span>"+
    "</div>"+

    "<div class='property_price'>"+
    "<span>"+price+"</span>"+
    "</div>"+

    "<div class='property_bed_type'>"+
    "<span>"+bedrooms+"</span>"+
    "<ul><li>"+type+"</li></ul>"+
    "</div>"+

    "<div class='property_listed_date'>"+
    "<span>Listed on "+listed_on+"</span>"+
    "</div>"+
    "</div></a></div>";

    google.maps.event.addListener(marker, 'click', (function(marker, content, i) {
        return function() {
            infowindow.setContent(content);
            infowindow.open(map, marker);
        }
    })(marker, content, i));
}

Yang terpenting adalah CSS

 #propertymap .gm-style-iw{
    box-shadow:none;
    color:#515151;
    font-family: "Georgia", "Open Sans", Sans-serif;
    text-align: center;
    width: 100% !important;
    border-radius: 0;
    left: 0 !important;
    top: 20px !important;
}

 #propertymap .gm-style > div > div > div > div > div > div > div {
    background: none!important;
}

.gm-style > div > div > div > div > div > div > div:nth-child(2) {
     box-shadow: none!important;
}
 #propertymap .gm-style-iw > div > div{
    background: #FFF!important;
}

 #propertymap .gm-style-iw a{
    text-decoration: none;
}

 #propertymap .gm-style-iw > div{
    width: 245px !important
}

 #propertymap .gm-style-iw .img_wrapper {
    height: 150px;  
    overflow: hidden;
    width: 100%;
    text-align: center;
    margin: 0px auto;
}

 #propertymap .gm-style-iw .img_wrapper > img {
    width: 100%;
    height:auto;
}

 #propertymap .gm-style-iw .property_content_wrap {
    padding: 0px 20px;
}

 #propertymap .gm-style-iw .property_title{
    min-height: auto;
}

1
Terima kasih! CSS tidak berfungsi tetapi mudah dilakukan dengan menggunakan alat pengembang dan langsung ke kelas, tidak perlu untuk gaya .gm.
pengguna2060451

-1

Anda juga bisa menggunakan kelas css.

$('#hook').parent().parent().parent().siblings().addClass("class_name");

Selamat siang!

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.