Google Maps: ¿Cómo crear una ventana de información personalizada?

99

La ventana de información de Google Maps predeterminada para un marcador de mapa es muy redonda. ¿Cómo creo una ventana de información personalizada con esquinas cuadradas?

SarahBeale
fuente
Actualicé mi respuesta con un enlace a algo que parece bastante personalizable. Puede elegir su propio radio y otras configuraciones.
Drew Noakes
Consulte esta respuesta para ver otro ejemplo de creación de InfoBoxes personalizados
Don Vaughn,

Respuestas:

83

EDITAR Después de buscar, esta parece ser la mejor opción:

https://github.com/googlemaps/js-info-bubble/blob/gh-pages/examples/example.html

Puede ver una versión personalizada de este InfoBubble que usé en Dive Seven, un sitio web para el registro de buceo en línea . Se parece a esto:


Hay algunos ejemplos más aquí . Sin embargo, definitivamente no se ven tan bien como el ejemplo de la captura de pantalla.

Dibujó Noakes
fuente
1
@TWilly, gracias. El proyecto se trasladó a GitHub. Actualicé las URL.
Drew Noakes
Actualice sus enlaces y mapa de demostración, ya que no funcionan.
MrUpsidown
17

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
¡Este es un truco sucio que podría dejar de funcionar en cualquier momento!
Billy
2
hack - seguro. genio - ¡absolutamente!
Nick Mitchell
1
Un ID de un elemento que seguramente se repetirá en la página, esa no es una buena práctica. La identificación debe ser única en la página.
Philippe Lavoie
@PhilippeLavoie Puede agregar un recuento a la identificación cada vez que crea una nueva ventana de información.
ATOzTOA
8

Encontré InfoBox perfecto para estilos avanzados.

Un InfoBox se comporta como un google.maps.InfoWindow , pero admite varias propiedades adicionales para un estilo avanzado. Un InfoBox también se puede utilizar como etiqueta de mapa. Un InfoBox también activa los mismos eventos que un google.maps.InfoWindow .

Incluya http://code.google.com/p/google-maps-utility-library-v3/source/browse/trunk/infobox/src/infobox.js en su página

Maulik bengalí
fuente
3
Tus enlaces están muertos.
Netsi1964
5

Diseñar la ventana de información es bastante sencillo con javascript vanilla. Usé parte de la información de este hilo al escribir esto. También tomé en cuenta los posibles problemas con versiones anteriores de ie (aunque no lo he probado con ellas).

var infowindow = new google.maps.InfoWindow({
  content: '<div id="gm_content">'+contentString+'</div>'
});

google.maps.event.addListener(infowindow,'domready',function(){
  var el = document.getElementById('gm_content').parentNode.parentNode.parentNode;
  el.firstChild.setAttribute('class','closeInfoWindow');
  el.firstChild.setAttribute('title','Close Info Window');
  el = (el.previousElementSibling)?el.previousElementSibling:el.previousSibling;
  el.setAttribute('class','infoWindowContainer');
  for(var i=0; i<11; i++){
    el = (el.previousElementSibling)?el.previousElementSibling:el.previousSibling;
    el.style.display = 'none';
  }
});

El código crea la ventana de información como de costumbre (sin necesidad de complementos, superposiciones personalizadas o código enorme), usando un div con una identificación para contener el contenido. Esto proporciona un gancho en el sistema que podemos usar para obtener los elementos correctos para manipularlos con una simple hoja de estilo externa.

Hay un par de piezas adicionales (que no son estrictamente necesarias) que manejan cosas como darle un gancho al div con la imagen de la ventana de información de cierre.

El bucle final oculta todas las piezas de la flecha del puntero. Yo mismo necesitaba esto, ya que quería tener transparencia en la ventana de información y la flecha se interpuso en el camino. Por supuesto, con el gancho, cambiar el código para reemplazar la imagen de la flecha con un png de su elección también debería ser bastante simple.

Si desea cambiarlo a jquery (no tengo idea de por qué lo haría), entonces debería ser bastante simple.

Por lo general, no soy un desarrollador de JavaScript, por lo que cualquier pensamiento, comentario o crítica son bienvenidos :)

Rafe
fuente
1
No sé si lo has escuchado, pero hay cosas nuevas llamadas "entrar" y "espacio" que en realidad crean espacio cuando escribes en una computadora. Suele ser útil al escribir cosas como código para que sus ojos no se desangren al intentar leerlo :)
Chrillewoodz
4

El siguiente fragmento de código puede ayudarlo.

var infowindow = new google.maps.InfoWindow();
 google.maps.event.addListener(marker, 'mouseover', (function(marker) {
            return function() {
                var content = address;
                infowindow.setContent(content);
                infowindow.open(map, marker);
            }
          })(marker));

Aquí hay un artículo < Cómo localizar varias direcciones en Google Maps con zoom perfecto > que me ayudó a lograrlo. Puede consultar el enlace JS Fiddle y el ejemplo completo.

Ashish Gupta
fuente
2

No estoy seguro de cómo lo está haciendo FWIX.com específicamente, pero apuesto a que están usando superposiciones personalizadas .

Scott Mitchell
fuente
¿Tiene un OVerlay personalizado las mismas propiedades que un marcador de mapa de Google normal? Es decir, todavía puedo hacer setIcon, setZIndex, etc. con una superposición personalizada O ¿tengo que volver a implementar toda esa funcionalidad?
SarahBeale
No, las superposiciones personalizadas solo permiten la funcionalidad básica de renderizado en el mapa, si desea setIcon, setZindex, etc., tendrá que implementarlas usted mismo.
Timothy Groote
2

Puede usar el siguiente código para eliminar la ventana de información predeterminada de estilo. Después, puede usar el código HTML para inforwindow:

var inforwindow = "<div style="border-radius: 50%"><img src='URL'></div>"; // show inforwindow image circle
marker.addListener('click', function() {
    $('.gm-style-iw').next().css({'height': '0px'}); //remove arrow bottom inforwindow
    $('.gm-style-iw').prev().html(''); //remove style default inforwindows
});
Teo Em
fuente
eliminar las ventanas de información predeterminadas de estilo - la mejor solución en todos los SO por ahora
djdance
1

Aquí hay una solución CSS pura basada en el ejemplo actual de la ventana de información en Google:

https://developers.google.com/maps/documentation/javascript/examples/infowindow-simple

#map *{
  overflow: visible;
}
#content{
  display: block;
  position: absolute;
  bottom: -8px;
  left: -20px;
  background-color: white;
  z-index: 10001;
}

Esta es una solución rápida que funcionará bien para pequeñas ventanas de información. No olvides votar a favor si te ayuda: P

Parche92
fuente
1

Incluso puede agregar su propia clase css en el contenedor / lienzo emergente o cómo lo desee. Los mapas actuales de Google 3.7 tienen ventanas emergentes diseñadas por un elemento de lienzo que antepone el contenedor div emergente en el código. Entonces, en googlemaps 3.7 puede ingresar al proceso de renderización mediante el evento domready de popup como este:

var popup = new google.maps.InfoWindow();
google.maps.event.addListener(popup, 'domready', function() {
  if (this.content && this.content.parentNode && this.content.parentNode.parentNode) {
    if (this.content.parentNode.parentNode.previousElementSibling) {
      this.content.parentNode.parentNode.previousElementSibling.className = 'my-custom-popup-container-css-classname';
    }
  }
});

element.previousElementSibling no está presente en IE8, así que si quieres que funcione, sigue esto .

consulte la última referencia de InfoWindow para eventos y más ...

Encontré esto más limpio en algunos casos.

palmic
fuente
0

Creo que la mejor respuesta que he encontrado está aquí: https://codepen.io/sentrathis96/pen/yJPZGx

No puedo atribuirme el mérito de esto, lo bifurqué de otro usuario de codepen para corregir la dependencia de Google Maps para cargar realmente

Anote la llamada a:

InfoWindow() // constructor
NomNomCameron
fuente