Aplicar estilo a la ventana de información de Google Maps

116

He intentado diseñar mi Google Maps InfoWindow, pero la documentación es muy limitada sobre este tema. ¿Cómo peinas un InfoWindow?

Víctor
fuente

Respuestas:

120

Google escribió un código para ayudar con esto. Aquí hay algunos ejemplos: Ejemplo usando InfoBubble , Marcadores con estilo y Ventana de información personalizada (usando OverlayView).

El código en los enlaces anteriores toma diferentes rutas para lograr resultados similares. La esencia de esto es que no es fácil diseñar InfoWindows directamente, y podría ser más fácil usar la clase InfoBubble adicional en lugar de InfoWindow, o anular GOverlay. Otra opción sería modificar los elementos de la InfoWindow usando javascript (o jQuery), como sugirió posteriormente ATOzTOA.

Posiblemente, el más simple de estos ejemplos es utilizar InfoBubble en lugar de InfoWindow. InfoBubble está disponible importando este archivo (que debe alojar usted mismo):http://google-maps-utility-library-v3.googlecode.com/svn/trunk/infobubble/src/infobubble.js

Página del proyecto Github de InfoBubble .

InfoBubble tiene mucho estilo, en comparación con 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();

También puede llamarlo con un mapa y un marcador determinados para abrir en:

infoBubble.open(map, marker);

Como otro ejemplo, el ejemplo de la ventana de información personalizada extiende la clase GOverlay de la API de Google Maps y lo usa como base para crear una ventana de información más flexible. Primero crea la clase:

/* 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_);
}

después de lo cual procede a anular GOverlay:

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

A continuación, debe invalidar los métodos que necesita: createElement, draw, removey panMap. Se complica bastante, pero en teoría ahora solo está dibujando un div en el mapa, en lugar de usar una ventana de información normal.

Herman Schaaf
fuente
@ShyamK Aquí tienes una pregunta relacionada con el estilo de las ventanas de información KML , que puede ayudarte. Creo que muchos de los ejemplos de mi respuesta podrían no ser aplicables a KML (no estoy seguro), pero también se pueden ajustar fácilmente para que funcionen en ese caso.
Herman Schaaf
11
Cabe señalar que uno de sus enlaces aquí son ejemplos del objeto InfoBox (otro tipo de ventana de información) y no el objeto InfoWindow (la ventana de información original de Google). Es bueno saber si lo está buscando en Google y tal vez confundido sobre por qué puede encontrar un nuevo InfoBox () y un nuevo InfoWindow (). InfoBox es el más nuevo y es más fácil de personalizar IMO y hay mucho más que puede personalizar. Otro ejemplo de eso también se puede ver en esta respuesta SO
Don Vaughn
1
Oh, no, el último tampoco: eso es sobre InfoBox también.
matteo
Bien, esto es lo que he estado buscando, por cierto, ¿cómo agrego un botón para cerrar?
Yusuf1494
36

Puede modificar toda la ventana de información utilizando jquery solo ...

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

Aquí, el elemento <p> actuará como un enlace a la ventana de información real. Una vez que el domready se activa, el elemento se activará y se podrá acceder a él usando javascript / jquery, como$('#hook').parent().parent().parent().parent() .

El siguiente código solo establece un borde de 2 píxeles alrededor de la ventana de información.

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

Puede hacer cualquier cosa como configurar una nueva clase de CSS o simplemente agregar un nuevo elemento.

Juega con los elementos para conseguir lo que necesitas ...

ATOzTOA
fuente
4
Esto funciona para mí (con un padre menos), y funciona con navegadores acorss (opera, ff, es decir, safari, chrome), pero no funciona por debajo de IE9.
johntrepreneur
Apoyos para incluir un código adicional que estaba buscando cómo usar. Gracias
MetalPhoenix
Obtengo 'la ventana emergente no está definida' cuando la incluyo en el documento (lista), en la ventana (carga) o si la pego directamente en la consola una vez que se carga la página. ¿Me falta un archivo js externo o algo así?
user1380540
Esta no es una buena idea ya que las lógicas de renderizado de mapas de Google no son perpetuas. Utilice ventanas emergentes en su lugar: 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 puesto en hoja de estilo

.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;
}
Vinod Kumar
fuente
este código tiene un problema con la cola en Chrome. Tienes que hacer clic 2x para que la cola muestre la posición correcta
cpcdev
3

Usé el siguiente código para aplicar CSS externo:

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);
leochab
fuente
1
Pude apuntar al CSS directamente usando .gm-style> div> div: nth-child (3)> div: nth-child (4)> div> div> div: nth-child (2) {
Charlie- Greenman
1

Utilice el InfoBox complemento de la biblioteca de utilidades de Google Maps. Facilita mucho el diseño y la gestión de las ventanas emergentes de mapas.

Tenga en cuenta que deberá asegurarse de que se cargue después de la API de Google Maps:

<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>
Yarin
fuente
1

He diseñado la ventana de información del mapa de Google con imagen y contenido como se muestra a continuación.

ingrese la descripción de la imagen aquí

map_script (solo como referencia html de la ventana de información)

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

Lo más importante es 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;
}
Mayank Dudakiya
fuente
1
¡gracias! CSS no funcionó, pero se hizo fácilmente mediante el uso de herramientas de desarrollo y yendo directamente a la clase, sin necesidad del estilo .gm.
user2060451
-1

También podrías usar una clase css.

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

¡Buen día!

mariofertc
fuente