Parece que mi InfoWindow, cuando hace clic en el icono de inicio en mi Google Maps v3, no se ajusta correctamente al contenido de InfoWindow.
Da barras de desplazamiento cuando no debería. La ventana de información debe tener un tamaño automático adecuado.
¿Alguna idea de por qué?
Por solicitud, el JavaScript relevante que inyecta el HTML para la ventana de información:
listing = '<div>Content goes here</div>';
ACTUALIZAR
Este error fue manejado por Google en cuestión.
https://issuetracker.google.com/issues/35823659
La corrección se implementó en febrero de 2015 en la versión 3.19 de la API de JavaScript de Maps.
javascript
html
css
google-maps
JacobT
fuente
fuente
Respuestas:
Agregue un div dentro de su ventana de información
<div id=\"mydiv\">YourContent</div>
Luego configure el tamaño usando css. funciona para mi. ¡Esto supone que todas las ventanas de información son del mismo tamaño!
#mydiv{ width:500px; height:100px; }
fuente
<div class=\"mydiv\">YourContent</div>
y.mydiv{ width:500px; height:100px; }
Respuesta corta: establezca la propiedad de opciones maxWidth en el constructor . Sí, incluso si establecer el ancho máximo no era lo que deseaba hacer.
Historia más larga: Al migrar un mapa v2 a v3, vi exactamente el problema descrito. Las ventanas variaban en ancho y alto, y algunas tenían barras de desplazamiento verticales y otras no. Algunos tenían <br /> incrustados en los datos, pero al menos uno con ese tamaño estaba bien.
No pensé que la propiedad InfoWindowsOptions.maxWidth fuera relevante, ya que no me importaba limitar el ancho ... pero al configurarlo con el constructor InfoWindow, obtuve lo que quería, y las ventanas ahora se ajustan automáticamente (verticalmente) y muestra el contenido completo sin una barra de desplazamiento vertical. No tiene mucho sentido para mí, ¡pero funciona!
Ver: http://fortboise.org/maps/sailing-spots.html
fuente
maxWidth
un porcentaje, los mapas de Google reconocerán un flotante como un porcentaje del elemento principal y lo convertirán al equivalente en píxeles: declare{"maxWidth":0.25}
, el elemento principal tiene 1000px de ancho, InfoWindow tendrá unwidth: 250px
. No creo que sea posible forzar que el ancho de InfoWindow siga siendo un porcentaje (el valor demaxWidth
debe ser un número, por{"maxWidth":"25%"}
lo que no funcionará y{"maxWidth":25%}
se trata como un módulo de 25 indefinido y desencadena un error de sintaxis).Debe dar el contenido a InfoWindow desde el objeto jQuery.
var $infoWindowContent = $("<div class='infowin-content'>Content goes here</div>"); var infoWindow = new google.maps.InfoWindow(); infowindow.setContent($infoWindowContent[0]);
fuente
overflow: auto
en InfoWindow DIV cuando pasa nodos DOM en lugar de una cadena. Esto resuelve el problema si el contenido solo aparece entre 1 y 2 píxeles. Desafortunadamente, esto significa que el contenido más largo en realidad se cuelga de la ventana de información en lugar de agregar barras de desplazamiento.infoWindow's
muestre correctamente. La respuesta completa de por qué esto funciona se enumera en mi respuesta:jQuery
crea un árbol DOM separado que obliga al contenido a renderizarse correctamente y su tamaño se determina con precisión antes de que Google intente colocarloinfoWindow
en el mapa.gm-style-iw{ height: 100% !important; overflow: hidden !important; }
esto funciona para mi
fuente
EDITADO (para destacar): Créame, de las otras cien respuestas a esta pregunta, esta es la única correcta que también explica POR QUÉ está sucediendo
Bien, sé que este hilo es antiguo y tiene mil respuestas, pero ninguna de ellas es correcta y siento la necesidad de publicar la respuesta correcta.
En primer lugar, no siempre es necesario especificar
width's
oheight's
en cualquier cosa con el fin de obtener su infoWindow a la pantalla sin barras de desplazamiento, aunque a veces sin darse cuenta puede conseguir que funcione al hacer esto (pero se fallarán en el futuro).En segundo lugar, la API de Google Maps
infoWindow's
no tiene un error de desplazamiento, es muy difícil encontrar la información correcta sobre cómo funcionan. Bueno, aquí está:Cuando le dice a la API de Google Maps que se abra en infoWindow de esta manera:
var infoWindow = new google.maps.InfoWindow({...}); .... infoWindow.setContent('<h1>Hello!</h1><p>And welcome to my infoWindow!</p>'); infoWindow.open(map);
Para todos los efectos, Google Maps coloca temporalmente un
div
al final de su página (en realidad crea undetached DOM tree
, pero es conceptualmente más fácil de entender si digo que imagina que undiv
ser coloca al final de su página ) con el contenido HTML que usted especificado. Luego mide ese div (lo que significa que, en este ejemplo, las reglas CSS de mi documento se aplicanh1
y lasp
etiquetas se le aplicarán) para obtener suwidth
yheight
. Luego, Google lo tomadiv
, le asigna las medidas que obtuvo cuando se agregó a su página y lo coloca en el mapa en la ubicación que especificó.Aquí es donde ocurre el problema para muchas personas: pueden tener HTML con este aspecto:
<body> <div id="map-canvas"><!-- google map goes here --></div> </body>
y, por la razón que sea, CSS que se ve así:
h1 { font-size: 18px; } #map-canvas h1 { font-size: 32px; }
¿Puedes ver el problema? Cuando los intentos de API para realizar las medidas para su
infoWindow
(inmediatamente antes de mostrarla), lah1
parte del contenido tendrá un tamaño de18px
(debido a que el "div medir" temporal se anexa al cuerpo), pero cuando la API realidad coloca elinfoWindow
sobre el mapa, el#map-canvas h1
selector tendrá prioridad haciendo que el tamaño de la fuente sea muy diferente de lo que era cuando la API midió el tamaño delinfoWindow
y, en esta circunstancia, siempre obtendrá barras de desplazamiento.Puede haber matices más ligeramente diferentes por la razón específica por la que tiene barras de desplazamiento en su
infoWindow
, pero la razón detrás de esto es por esto:Entonces, lo que siempre hago es algo como esto:
infoWindow.setContent('<div class="info-window-content">...your content here...</div>');
y en mi CSS:
.info-window-content { ... } .info-window-content h1 { .... } .info-window-content p { ... } etc...
Entonces, no importa dónde la API agregue su medición
div
, antes del cierrebody
o dentro de una#map-canvas
, las reglas CSS que se le apliquen siempre serán las mismas.EDITAR RE: Familias de fuentes
Google parece estar trabajando activamente en el problema de carga de fuentes (que se describe a continuación) y la funcionalidad ha cambiado muy recientemente, por lo que es posible que vea o no la carga de la fuente Roboto cuando se
infoWindow
abre por primera vez, según la versión de la API que esté utilizando. Hay un informe de error abierto (aunque en el registro de cambios este informe de error ya estaba marcado como corregido) que ilustra que Google todavía tiene dificultades con este problema.UNA COSA MÁS: ¡¡¡MIRA A TUS FAMILIAS DE FUENTES !!!
En la última encarnación de la API, Google trató de ser inteligente y envolver el contenido de su ventana de información en algo que pudiera ser dirigido con un selector de CSS -
.gm-style-iw
. Para las personas que no entendieron las reglas que expliqué anteriormente, esto realmente no ayudó y, en algunos casos, lo empeoró aún más. Las barras de desplazamiento casi siempre aparecían la primera vez queinfoWindow
se abría una, pero si abría alguna deinfoWindow
nuevo, incluso con el mismo contenido exacto, las barras de desplazamiento desaparecerían. En serio, si no estuvieras confundido antes, esto te haría perder la cabeza. Esto es lo que estaba pasando:Si observa los estilos que carga Google en la página cuando se carga la API, podrá ver esto:
De acuerdo, Google quería que sus mapas fueran un poco más consistentes haciéndoles siempre usar la
Roboto
familia de fuentes. El problema es que, para la mayoría de las personas, antes de abrir uninfoWindow
, el navegador aún no había descargado laRoboto
fuente (porque nada más en su página la usaba, por lo que el navegador es lo suficientemente inteligente como para saber que no necesita descargar esta fuente). La descarga de esta fuente no es instantánea, aunque es muy rápida. La primera vez que abra unainfoWindow
y la API añade eldiv
con suinfoWindow
contenido al cuerpo para llevarlo de mediciones, se inicia la descarga de laRoboto
fuente, pero susinfoWindow's
se toman las mediciones y la ventana se coloca en el mapa antesRoboto
termine la descarga. El resultado, con bastante frecuencia, fue uninfoWindow
cuyas medidas se tomaron cuando su contenido se renderizó usandoArial
o unasans-serif
fuente, pero cuando se mostró en el mapa (yRoboto
había terminado de descargarse), su contenido se mostraba en una fuente que era de un tamaño diferente, y listo, las barras de desplazamiento aparecen la primera vez abres elinfoWindow
. Abra exactamente lo mismoinfoWindow
por segunda vez, momento en el queRoboto
se ha descargado y se utilizará cuando la API esté tomando sus medidas deinfoWindow
contenido y no verá ninguna barra de desplazamiento.fuente
Probé cada una de las respuestas enumeradas. Ninguno funcionó para mí. Esto finalmente lo arregló PERMANENTEMENTE. El código que heredé tenía un
DIV
envoltorio alrededor de todas las entradas<h#>
y<p>
. Simplemente forcé algo de "estilo" en el mismo DIV, teniendo en cuenta el ancho máximo deseado, introduje el cambio de altura de la línea por si acaso (solución de otra persona) y el míowhite-space: nowrap
, que luego hizo que el desbordamiento automático hiciera los ajustes correctos. ¡Sin barra de desplazamiento, sin truncamiento y sin problemas!html = '<div class="map-overlay" style="max-width: 400px; line-height: normal; white-space: nowrap; overflow: auto; ">';
fuente
white-space: nowrap
que tenía la magia, los otros estilos eran innecesarios. ¡Salud!font-family: sans-serif !important; font-weight: normal !important;
CSS.Sé que este es un hilo antiguo, pero acabo de encontrar el mismo problema. Tenía elementos
<h2>
y<p>
en la ventana de información, y ambos tenían márgenes inferiores. Eliminé los márgenes y la ventana de información se dimensionó correctamente. Ninguna de las otras correcciones sugeridas funcionó. Sospecho que el cálculo del tamaño de la ventana de información no tiene en cuenta los márgenes.fuente
<div style='overflow:hidden;'></div>
ve bien ahora.Voy a agregar mi respuesta a la lista, ya que NINGUNO de estos solucionó mi problema. Terminé envolviendo mi contenido en un div, dándole una clase a ese div y especificando
min-width
en el div, Y especificandomaxWidth
en la ventana de información, Y ambos debían tener el mismo tamaño, de lo contrario, el ancho o la altura se desbordarían en cajas con la cantidad incorrecta de contenido.Javascript:
// Set up the content for the info box var content = "<div class='infowindow-content'>" + content + "</div>"; // create a map info box var infoWindow = new google.maps.InfoWindow({ maxWidth: 350, content: content });
CSS:
div.infowindow-content { min-width: 350px; }
fuente
min-width
contenido fue lo único que funcionó para mí también.maxWidth
Sin embargo, no tuve que configurar el en la ventana de información.Probé todas estas soluciones y ninguna funcionó. Después de un poco de prueba y error lo descubrí.
<style type="text/css"> #map_canvas { line-height:normal; } </style>
Establecer altura de línea: normal para el div del lienzo del mapa.
fuente
#map_canvas
en Google Maps v3 que pueda ver. Debe ser del antiguo v2.#map_canvas
es el div que usas para el mapa. Puede ser el nombre que quieras.Parece que el problema está en la fuente web Roboto.
La ventana de información se representa con las propiedades de ancho y alto en línea según el contenido proporcionado. Sin embargo, no se calcula con la fuente web ya renderizada / cargada. Una vez que la fuente se renderiza DESPUÉS de que todo el mapa se imprime en la pantalla, hace que aparezcan las barras de desplazamiento debido a las propiedades "overflow: auto" en línea dentro de los DIV de la ventana.
La solución que encontré que funciona es envolver el contenido en un DIV y luego aplicar CSS para anular la fuente web:
.gmap_infowin { font-family: sans-serif !important; font-weight: normal !important; } <div class="gmap_infowin">Your info window content here.</div>
fuente
Es bastante divertido, mientras que el siguiente código corregirá la barra de desplazamiento ANCHO:
.gm-style-iw { overflow: hidden !important; line-height: 1.35; }
Se necesitó esto para corregir la barra de desplazamiento ALTURA:
.gm-style-iw div { overflow: hidden !important; }
EDITAR: Agregar espacios en blanco: nowrap; cualquiera de los dos estilos podría corregir el problema de espaciado que parece persistir cuando se eliminan las barras de desplazamiento. Gran punto Nathan.
fuente
Esto funciona para mi. Pon un
div
en elsetContent
sh_map.infoWindow.setContent([ '<div id=\"mydiv\">', 'Your content goes here', ].join(''));
Luego agregue este CSS a su página:
<style type="text/css"> #map-canvas { text-align: center; vertical-align: middle; } #mydiv { font-family: "Comic Sans MS", cursive; font-size: 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; letter-spacing: normal; text-align: center; vertical-align: middle; word-spacing: normal; } </style>
Por ejemplo, consulte http://www.student-homes-northampton.co.uk ; haga clic en los enlaces debajo de las fotos de la casa para mostrar el mapa de Google.
fuente
Esto resolvió mi problema por completo:
.gm-style-iw { overflow: visible !important; height: auto !important; width: auto !important; }
fuente
Estaba teniendo el mismo problema con IE y probé muchas de las correcciones detalladas en estas respuestas, pero no pude eliminar las barras de desplazamiento verticales en IE de manera confiable.
Lo que funcionó mejor para mí fue cambiar a tamaños de fuente fijos dentro de la ventana de información - 'px' ... Estaba usando ems. Al arreglar el tamaño de la fuente, ya no necesitaba declarar explícitamente el ancho o alto de la ventana de información y las barras de desplazamiento desaparecieron para siempre.
fuente
También es importante la altura del contenedor del mapa. Si es pequeña, la ventana de información siempre tendrá una altura de 80 píxeles. De lo contrario,
maxWidth
y#innerDiv
arreglar funciona a las mil maravillas.fuente
Si nada más, intente agregar el contenido después de que se haya abierto la ventana. Esto debería obligarlo a cambiar de tamaño.
infoWindow = new google.maps.InfoWindow() infoWindow.open(map, marker) infoWindow.setContent(content)
fuente
Utilice el evento domready y vuelva a abrir la ventana de información y muestre el contenido oculto después de que el evento domready se active dos veces para asegurarse de que se hayan cargado todos los elementos dom.
// map is created using google.maps.Map() // marker is created using google.maps.Marker() // set the css for the content div .infowin-content { visibility: hidden; } infowindow = new google.maps.InfoWindow(); infowindow.setContent("<div class='infowin-content'>Content goes here</div>"); infowindow.setPosition(marker.getPosition()); infowindow.set("isdomready", false); infowindow.open(map); // On Dom Ready google.maps.event.addListener(infowindow, 'domready', function () { if (infowindow.get("isdomready")) { // show the infowindow by setting css jQuery('.infowin-content').css('visibility', 'visible'); } else { // trigger a domready event again. google.maps.event.trigger(infowindow, 'content_changed'); infowindow.set("isdomready", true); } }
Intenté hacer un setTimeout (/ * show infowin callback * /, 100), pero a veces eso no funcionaba si el contenido (es decir, las imágenes) tardaba demasiado en cargarse.
Espero que esto funcione para usted.
fuente
Estaba teniendo el mismo problema, particularmente notable cuando mi
<h2>
elemento se ajustaba a una segunda línea.<div>
Apliqué una clase a una en la ventana de información y cambié las fuentes a una fuente genérica del sistema (en mi caso, Helvetica) frente a una fuente web @ font-face que había estado usando. Problema resuelto.fuente
//infowindow.setContent(response); var infowindowopts = { maxWidth: 274, content: response }; infowindow.setOptions(infowindowopts);
fuente
Agregue
min-height
a su elemento de clase infoWindow.Eso resolverá el problema si sus infoWindows son todas del mismo tamaño.
De lo contrario, agregue esta línea de jQuery a su función de clic para la ventana de información:
//remove overflow scrollbars $('#myDiv').parent().css('overflow','');
fuente
No pude hacer que funcionara de ninguna manera, estaba incluyendo 3 divs en la caja. Los envolví en un div externo, con anchos y alturas todos configurados correctamente, y nada funcionó.
Al final, lo arreglé configurando el div como parte superior izquierda absoluta, y luego, antes del div, configuré dos imágenes, una de 300px de ancho y 1px de alto, una de 120px de alto y 1px de ancho, de un gif transparente.
¡Entonces escaló correctamente!
Es feo pero funciona.
También podría hacer una imagen y establecer un zindex que espero, o incluso solo una imagen si su ventana no tiene interacción, pero esto contenía un formulario, entonces, esa no era una opción ...
fuente
Creo que este comportamiento se debe a algunos estilos CSS en un contenedor externo, tuve el mismo problema pero lo resolví usando un div interno y agregando algo de relleno, sé que es extraño pero resolvió el problema
<div id="fix_height"> <h2>Title</h2> <p>Something</p> </div>
Y a mi estilo.css
div#fix_height{ padding: 5px; }
fuente
Tenía un elemento en línea (una etiqueta a) directamente dentro del
div
constyle="overflow:auto"[...
envuelto en unap
etiqueta y lo arreglé.Parece que cualquier elemento en línea que no esté anidado en un elemento de bloque directamente dentro de la ventana de información provocará esto.
fuente
Mi respuesta es agregar un oyente (usando addListenerOnce) para verificar si la infoWindow se ha agregado al DOM, luego abrir la infoWindow nuevamente (no es necesario cerrarla).
// map, marker and infoWindow code, we'll call them // myMap, myMarker and myInfoWindow myInfoWindow.open(myMap, myMarker); google.maps.event.addListenerOnce(myInfoWindow, 'domready', function(){ myInfoWindow.open(myMap, myMarker); });
fuente
Agregar lo siguiente a mi CSS funcionó para mí:
fuente
Solo para resumir todas las soluciones que me funcionaron en todos los navegadores:
Establezca un ancho máximo para la ventana de información:
this.infowindow = new google.maps.InfoWindow({ maxWidth: 200 });
Envuelva el contenido de la ventana de información con
<div style="overflow:hidden;line-height:1.35;min-width:200px;">*CONTENT*</div>
(cambie el ancho mínimo por el valor que estableció en la ventana de información maxWidth)
Lo probé y funcionó en todos los navegadores, y tenía más de 400 marcadores ...
fuente
Sé que muchas otras personas han encontrado soluciones que funcionaron para su caso particular, pero como ninguna de ellas funcionó para mi caso particular, pensé que esto podría ser útil para otra persona.
Algunos detalles:
Estoy usando la API de Google Maps v3 en un proyecto donde CSS en línea es algo que realmente queremos evitar. Mis ventanas de información funcionaban para todo excepto para IE11, donde el ancho no se calculó correctamente. Esto resultó en desbordamientos de div, que activaron barras de desplazamiento.
Tuve que hacer tres cosas:
Eliminar todas las reglas de estilo display: inline-block de cualquier cosa dentro del contenido de la ventana de información (reemplacé con display: block) - Tuve la idea de probar esto desde un hilo (que ya no puedo encontrar) donde alguien estaba teniendo lo mismo problema con IE6.
Pase el contenido como un nodo DOM en lugar de como una cadena. Estoy usando jQuery, por lo que podría hacer esto reemplazando:
infowindow.setContent(infoWindowDiv.html());
coninfowindow.setContent($(infoWindowDiv.html())[0]);
Esto resultó ser más fácil para mí, pero hay muchas otras formas de obtener el mismo resultado.Utilice el truco "setMaxWidth" - configure la opción MaxWidth en el constructor - configurar la opción más tarde no funciona. Si realmente no desea un ancho máximo, configúrelo en un número muy grande.
No sé por qué funcionaron, y no estoy seguro de si un subconjunto de ellos funcionaría. Sé que ninguno de ellos funciona para todos mis casos de uso individualmente, y que 2 + 3 no funciona. No tuve tiempo de probar 1 + 2 o 1 + 3.
fuente
No era aceptable para mí codificar de forma rígida el ancho y el alto de la ventana de información, o configurarlo
white-space: nowrap
, lamaxWidth
solución no me ayudó y todo lo demás no funcionó o fue inapropiado para mi caso de uso.Mi solución fue configurar el contenido, abrir la ventana y luego, cuando se activa el
domready
evento, configurar laheight
propiedad CSS en el contenido a la altura que sea, y luego forzar a Google Maps a cambiar el tamaño de la ventana de información en consecuencia.infoWindow
es el objeto InfoWindow,$infoWindowContents
es un objeto Jquery del contenido que quiero poner allí,map
es mi objeto Map.marker
es un marcador en el que se hizo clic.infoWindow.setContent($infoWindowContents.get(0)); var listener = google.maps.event.addListener(infoWindow, 'domready', function() { // Stop listening, otherwise the listeners stack up if the window is opened again google.maps.event.removeListener(listener); // Set the height on the container to however tall the browser is currently rendering it $infoWindowContents.height($infoWindowContents.height()); // Force Google Maps to recalculate the InfoWindow height infoWindow.setContent($infoWindowContents.get(0)); }); infoWindow.open(map, marker);
(Publiqué la misma solución en una pregunta similar ¿ Cómo consigo que una InfoWindow de google-maps cambie de tamaño para adaptarse al contenido que se coloca dentro de ella? )
fuente
Después de perder tiempo y leer por un tiempo, solo quería algo simple, este CSS funcionó para mis requisitos.
.gm-style-iw > div { overflow: hidden !important; }
Además, no es una solución instantánea, pero destacar / comentar el problema podría hacer que lo solucionen, ya que creen que está solucionado: http://code.google.com/p/gmaps-api-issues/issues/detail?id= 5713
fuente
Bueno, este es el que me hizo el truco:
.gm-style-iw>div { overflow: visible !important; }
Sólo el establecimiento
overflow: visible
en.gm-style-iw
realidad empeorado el problema! Noté en el inspector de herramientas para desarrolladores de Chrome que hay dos divs dentro del.gm-style-iw
elemento, ambosoverflow: auto
configurados de forma predeterminada.Estoy mostrando una gran cantidad de texto en formato HTML en mi InfoWindows, esa podría ser la razón por la que las otras soluciones no funcionaron en absoluto para mí.
fuente