Es scheint, dass mein InfoWindow, wenn Sie auf das Startsymbol in Google Maps v3 klicken, die Größe des Inhalts des InfoWindow nicht automatisch ändert.
Es gibt Bildlaufleisten, wenn es nicht sollte. Das InfoWindow sollte die richtige Größe haben.
Irgendwelche Ideen warum?
Auf Anfrage das relevante JavaScript, das den HTML-Code für das InfoWindow einfügt:
listing = '<div>Content goes here</div>';
AKTUALISIEREN
Dieser Fehler wurde von Google behoben
https://issuetracker.google.com/issues/35823659
Das Update wurde im Februar 2015 in Version 3.19 der Maps JavaScript API implementiert.
javascript
html
css
google-maps
JacobT
quelle
quelle
Antworten:
Fügen Sie ein Div in Ihr Infofenster ein
Stellen Sie dann die Größe mit CSS ein. funktioniert bei mir. Dies setzt voraus, dass alle Infofenster gleich groß sind!
quelle
<div class=\"mydiv\">YourContent</div>
.mydiv{ width:500px; height:100px; }
Kurze Antwort: Legen Sie die Eigenschaft maxWidth options im Konstruktor fest . Ja, auch wenn das Einstellen der maximalen Breite nicht das war, was Sie tun wollten.
Längere Geschichte: Bei der Migration einer v2-Karte auf v3 habe ich genau das beschriebene Problem gesehen. Fenster variierten in Breite und Höhe, und einige hatten vertikale Bildlaufleisten, andere nicht. Einige hatten <br /> in die Daten eingebettet, aber mindestens eine mit dieser Größe OK.
Ich dachte nicht, dass die InfoWindowsOptions.maxWidth-Eigenschaft relevant ist, da ich die Breite nicht einschränken wollte ... aber durch Festlegen mit dem InfoWindow-Konstruktor bekam ich, was ich wollte, und die Fenster werden jetzt automatisch (vertikal) und automatisch angepasst Zeigen Sie den gesamten Inhalt ohne vertikale Bildlaufleiste an. Macht für mich nicht viel Sinn, aber es funktioniert!
Siehe: http://fortboise.org/maps/sailing-spots.html
quelle
maxWidth
einen Prozentsatz festzulegen, erkennt Google Maps einen Float als Prozentsatz des{"maxWidth":0.25}
übergeordneten Elements und konvertiert ihn in das Pixeläquivalent: Deklarieren Sie, das übergeordnete Element ist 1000 Pixel breit, InfoWindow hat einwidth: 250px
. Ich denke nicht, dass es möglich ist, die Breite von InfoWindow zu erzwingen, um ein Prozentsatz zu bleiben (der Wert vonmaxWidth
muss eine Zahl sein,{"maxWidth":"25%"}
funktioniert also nicht und{"maxWidth":25%}
wird mit einem undefinierten 25-Modul behandelt und löst einen Syntaxfehler aus).Sie sollten den Inhalt vom jQuery-Objekt an InfoWindow übergeben.
quelle
overflow: auto
den InfoWindow-DIV nicht zu aktivieren, wenn Sie DOM-Knoten anstelle einer Zeichenfolge übergeben. Dies löst das Problem, wenn der Inhalt nur um 1-2px herauskommt. Leider bedeutet dies, dass längerer Inhalt tatsächlich aus dem InfoWindow heraushängt, anstatt Bildlaufleisten hinzuzufügen.infoWindow's
korrekt angezeigt wird. Die vollständige Antwort, warum dies funktioniert, ist in meiner Antwort aufgeführt -jQuery
erstellt einen getrennten DOM-Baum, der das korrekte Rendern des Inhalts erzwingt und dessen Größe genau bestimmt, bevor Google versucht, deninfoWindow
auf der Karte zu platzierenFür mich geht das
quelle
EDITIERT (um hervorzuheben): Vertrauen Sie mir, von den hundert anderen Antworten auf diese Frage ist dies die einzig richtige, die auch erklärt, WARUM es passiert
Ok, ich weiß, dass dieser Thread alt ist und tausend Antworten hat, aber keine davon ist korrekt und ich habe das Bedürfnis, die richtige Antwort zu posten.
Erstens Sie nicht brauchen , um überhaupt angeben
width's
oderheight's
um auf alles , was Ihr Infowindow - Display zu bekommen , ohne Scrollbalken, obwohl Sie manchmal versehentlich diese Arbeit erhalten , indem Sie (aber es wird schließlich scheitern).Zweitens hat die Google Maps-API
infoWindow's
keinen Bildlauffehler. Es ist nur sehr schwierig, die richtigen Informationen zu ihrer Funktionsweise zu finden. Nun, hier ist es:Wenn Sie die Google Maps-API anweisen, in infoWindow wie folgt zu öffnen:
In jeder Hinsicht platziert Google Maps vorübergehend ein
div
am Ende Ihrer Seite ( tatsächlich wird eindetached DOM tree
- aber es ist konzeptionell einfacher zu verstehen, wenn Sie sich vorstellen, dass eindiv
Wesen am Ende Ihrer Seite steht ) mit dem HTML-Inhalt, den Sie haben spezifiziert. Anschließend wird das div gemessen (was bedeutet, dass in diesem Beispiel alle CSS-Regeln in meinem Dokument geltenh1
undp
Tags darauf angewendet werden), um eswidth
und zu erhaltenheight
. Google nimmt das danndiv
, weist ihm die Maße zu, die es erhalten hat, als es an Ihre Seite angehängt wurde, und platziert es auf der Karte an dem von Ihnen angegebenen Ort.Hier tritt das Problem bei vielen Menschen auf - sie haben möglicherweise HTML, das so aussieht:
und aus irgendeinem Grund CSS, das so aussieht:
Kannst du das Problem sehen? Wenn die API versucht , die Messungen zu nehmen für die
infoWindow
(unmittelbar vor der Anzeige), dash1
wird ein Teil des Inhalts eine Größe von18px
(weil die temporären „Messen div“ an den Körper angehängt), aber wenn die API stellt eigentlich deninfoWindow
auf In der Karte hat der#map-canvas h1
Selektor Vorrang, wodurch sich die Schriftgröße stark von der Größe unterscheidet, in der die API die Größe der gemessen hat. UnterinfoWindow
diesen Umständen erhalten Sie immer Bildlaufleisten.Es gibt möglicherweise etwas andere Nuancen für den spezifischen Grund, warum Sie Bildlaufleisten in Ihrem haben
infoWindow
, aber der Grund dafür ist folgender:Was ich also immer mache, ist ungefähr so:
und in meinem CSS:
Unabhängig davon, wo die API ihre Messung anhängt
div
- vor dem Schließenbody
oder innerhalb von a#map-canvas
sind die darauf angewendeten CSS-Regeln immer dieselben.EDIT RE: Schriftfamilien
Google scheint aktiv an dem Problem beim Laden von Schriftarten (siehe unten) zu arbeiten, und die Funktionalität hat sich in letzter Zeit geändert.
infoWindow
Je nach Version der von Ihnen verwendeten API wird die Roboto-Schrift beim ersten Öffnen möglicherweise nicht angezeigt . Es gibt einen offenen Fehlerbericht (obwohl dieser Fehlerbericht im Änderungsprotokoll bereits als behoben markiert war), der zeigt, dass Google immer noch Probleme mit diesem Problem hat.EINE MEHR SACHE: SEHEN SIE IHRE FONT-FAMILIEN AN !!!
In der neuesten Version der API hat Google versucht, klug zu sein und den Inhalt von infoWindow in etwas zu verpacken, auf das mit einem CSS-Selektor abgezielt werden kann
.gm-style-iw
. Für Leute, die die oben erläuterten Regeln nicht verstanden haben, hat dies nicht wirklich geholfen und in einigen Fällen sogar noch schlimmer gemacht. Bildlaufleisten werden fast immer beim ersten Öffnen angezeigtinfoWindow
, aber wenn Sie sieinfoWindow
erneut öffnen, werden die Bildlaufleisten auch bei genau demselben Inhalt nicht mehr angezeigt. Im Ernst, wenn Sie vorher nicht verwirrt wären, würden Sie den Verstand verlieren. Folgendes geschah:Wenn Sie sich die Stile ansehen, die Google beim Laden der API auf der Seite lädt, sehen Sie Folgendes:
Ok, also wollte Google die Karten ein bisschen konsistenter machen, indem sie immer die
Roboto
Schriftfamilie verwenden. Das Problem ist, dass derinfoWindow
Browser für die meisten Benutzer dieRoboto
Schriftart noch nicht heruntergeladen hat , bevor Sie sie geöffnet haben (da nichts anderes auf Ihrer Seite sie verwendet hat, sodass der Browser intelligent genug ist, um zu wissen, dass sie nicht heruntergeladen werden muss diese Schriftart). Das Herunterladen dieser Schriftart erfolgt nicht sofort, obwohl sie sehr schnell ist.infoWindow
Wenn Sie ein zum ersten Mal öffnen und die API dasdiv
mit IhreminfoWindow
Inhalt an den Textkörper anfügt , um seine Messungen durchzuführen, wird dieRoboto
Schriftart heruntergeladen , aber IhreinfoWindow's
Messungen werden durchgeführt und das Fenster wird auf der Karte platziert, bevor derRoboto
Download abgeschlossen ist. Das Ergebnis war ziemlich oft eininfoWindow
Wessen Messungen wurden vorgenommen, als der Inhalt mitArial
einersans-serif
Schriftart gerendert wurde , aber als er auf der Karte angezeigt wurde (undRoboto
der Download abgeschlossen war), wurde der Inhalt in einer Schriftart mit einer anderen Größe angezeigt - und Voila-Bildlaufleisten werden beim ersten Mal angezeigt Sie öffnen dieinfoWindow
. Öffnen Sie das gleicheinfoWindow
ein zweites Mal - zu diesem Zeitpunkt wurde dasRoboto
heruntergeladen und wird verwendet, wenn die API deninfoWindow
Inhalt misst und Sie keine Bildlaufleisten sehen.quelle
Ich habe jede der aufgelisteten Antworten ausprobiert. Keiner hat für mich gearbeitet. Dies hat es schließlich dauerhaft behoben. Der Code, den ich geerbt habe, hatte einen
DIV
Wrapper um alle<h#>
und<p>
Einträge. Ich habe einfach einen "Stil" in demselben DIV erzwungen, unter Berücksichtigung einer gewünschten maximalen Breite, die Änderung der Zeilenhöhe für alle Fälle (die Korrektur eines anderen) und meine eigene vorgenommenwhite-space: nowrap
, wodurch der automatische Überlauf die richtigen Anpassungen vorgenommen hat. Keine Bildlaufleiste, kein Abschneiden und keine Probleme!quelle
white-space: nowrap
, was die Magie hatte - die anderen Stile waren unnötig. Prost!font-family: sans-serif !important; font-weight: normal !important;
sie dem CSS hinzufügte .Ich weiß, dass dies ein alter Thread ist, aber ich bin gerade auf das gleiche Problem gestoßen. Ich hatte
<h2>
und<p>
Elemente im InfoWindow, und beide hatten untere Ränder. Ich habe die Ränder entfernt und InfoWindow richtig dimensioniert. Keine der anderen vorgeschlagenen Korrekturen funktionierte. Ich vermute, dass die InfoWindow-Größenberechnung die Ränder nicht berücksichtigt.quelle
<div style='overflow:hidden;'></div>
jetzt alles in Sieht gut aus.Ich werde meine Antwort zur Liste hinzufügen, da KEINE davon mein Problem behoben hat.
min-width
Am Ende habe ich meinen Inhalt in ein Div gewickelt, diesem Div eine Klasse gegeben und das auf dem Div angegeben UND dasmaxWidth
auf dem infoWindow angegeben, UND beide mussten dieselbe Größe haben, sonst würde entweder die Breite oder die Höhe überlaufen auf Boxen mit nur der falschen Menge an Inhalten.Javascript:
CSS:
quelle
min-width
Inhalts war das einzige, was auch für mich funktioniert hat. Musste das aber nichtmaxWidth
auf dem infoWindow einstellen.Ich habe alle diese Lösungen ausprobiert und keine hat funktioniert. Nach einigem Ausprobieren habe ich es herausgefunden.
Zeilenhöhe einstellen: Normal für das Map Canvas Div.
quelle
#map_canvas
In Google Maps v3 gibt es keine , die ich sehen kann. Dies muss aus der alten Version 2 stammen.#map_canvas
ist das Div, das Sie für die Karte verwenden. Es kann jeder Name sein, den Sie möchten.Es scheint, dass das Problem mit dem Roboto-Webfont zusammenhängt.
Das Infofenster wird mit Inline-Eigenschaften für Breite und Höhe basierend auf dem bereitgestellten Inhalt gerendert. Es wird jedoch nicht mit dem bereits gerenderten / geladenen Webfont berechnet. Sobald die Schriftart gerendert wurde, nachdem die gesamte Karte auf dem Bildschirm gedruckt wurde, werden die Bildlaufleisten aufgrund der Inline-Eigenschaften "Überlauf: Auto" in den DIVs des Fensters angezeigt.
Die Lösung, die ich gefunden habe, besteht darin, den Inhalt in ein DIV zu packen und dann CSS anzuwenden, um den Webfont zu überschreiben:
quelle
Witzig genug, während der folgende Code die WIDTH-Bildlaufleiste korrigiert:
Dies erforderte die Korrektur der HEIGHT-Bildlaufleiste:
BEARBEITEN: Hinzufügen von Leerzeichen: nowrap; Bei beiden Stilen wird möglicherweise das Abstandsproblem behoben, das beim Entfernen der Bildlaufleisten zu bestehen scheint. Großartiger Punkt, Nathan.
quelle
Das funktioniert bei mir. Setzen Sie ein
div
in diesetContent
Fügen Sie dann dieses CSS zu Ihrer Seite hinzu:
Siehe beispielsweise http://www.student-homes-northampton.co.uk ; Klicken Sie auf die Links unter den Hausbildern, um die Google-Karte anzuzeigen.
quelle
Dies löste mein Problem vollständig:
quelle
Ich hatte das gleiche Problem mit dem IE und habe viele der in diesen Antworten beschriebenen Korrekturen ausprobiert, konnte jedoch die vertikalen Bildlaufleisten im IE nicht zuverlässig entfernen.
Was für mich am besten funktionierte, war, im Infofenster auf feste Schriftgrößen umzuschalten - 'px' ... Ich habe ems verwendet. Durch das Festlegen der Schriftgröße musste ich die Breite oder Höhe des Infofensters nicht mehr explizit deklarieren, und die Bildlaufleisten waren endgültig verschwunden.
quelle
Wichtig ist auch die Höhe des Kartencontainers. Wenn zu klein infoWindow wird immer auf 80px Höhe sein. Ansonsten funktioniert
maxWidth
und#innerDiv
fix wie ein Zauber.quelle
Wenn nichts anderes, versuchen Sie, den Inhalt hinzuzufügen, nachdem das Fenster geöffnet wurde. Dies sollte die Größenänderung erzwingen.
quelle
Verwenden Sie das Domready-Ereignis, öffnen Sie das Infofenster erneut und zeigen Sie den verborgenen Inhalt an, nachdem das Domready-Ereignis zweimal ausgelöst wurde, um sicherzustellen, dass alle Dom-Elemente geladen wurden.
Ich habe versucht, nur ein setTimeout durchzuführen (/ * show infowin callback * /, 100), aber manchmal funktionierte das immer noch nicht, wenn das Laden des Inhalts (dh der Bilder) zu lange dauerte.
Hoffe das funktioniert bei dir.
quelle
Ich hatte das gleiche Problem, das sich besonders bemerkbar machte, als mein
<h2>
Element in eine zweite Zeile eingeschlossen wurde.Ich habe eine Klasse auf eine
<div>
im infoWindow angewendet und die Schriftarten in eine generische Systemschriftart (in meinem Fall Helvetica) im Vergleich zu einer @ font-face-Webschriftart geändert, die sie verwendet hatte. Problem gelöst.quelle
quelle
Fügen Sie
min-height
Ihrem infoWindow-Klassenelement ein hinzu.Dadurch wird das Problem behoben, wenn Ihre infoWindows alle dieselbe Größe haben.
Wenn nicht, fügen Sie diese Zeile von jQuery zu Ihrer Klickfunktion für das infoWindow hinzu:
quelle
Ich konnte es nicht in irgendeiner Form zum Laufen bringen, ich habe 3 Divs in die Box aufgenommen. Ich wickelte sie in ein äußeres Div, wobei die Breiten und Höhen richtig eingestellt waren, und nichts funktionierte.
Am Ende habe ich es behoben, indem ich das div als absolut oben links festgelegt habe, und dann habe ich vor dem div zwei Bilder eines transparenten Gifs eingestellt, eines mit einer Breite von 300 Pixel und einer Höhe von 1 Pixel, eines mit einer Höhe von 120 Pixel und einer Breite von 1 Pixel.
Dann hat es richtig skaliert!
Es ist hässlich, aber es funktioniert.
Sie können auch ein Bild erstellen und einen Zindex festlegen, den ich erwarte, oder sogar nur ein Bild, wenn Ihr Fenster keine Interaktion aufweist, dieses jedoch ein Formular enthält. Das war also keine Option ...
quelle
Ich denke, dass dieses Verhalten auf ein CSS-Styling in einem äußeren Container zurückzuführen ist. Ich hatte das gleiche Problem, aber ich habe es mit einem inneren Div gelöst und etwas Polster hinzugefügt. Ich weiß, dass es seltsam ist, aber es hat das Problem gelöst
Und in meinem style.css
quelle
Ich hatte ein Inline-Element (ein a-Tag) direkt im Inneren des
div
withstyle="overflow:auto"[...
, das in einp
Tag eingewickelt und repariert wurde.Es sieht so aus, als würde jedes Inline-Element, das nicht in einem Blockelement direkt im Infofenster verschachtelt ist, dies verursachen.
quelle
Meine Antwort ist, einen Listener hinzuzufügen (mit addListenerOnce), um zu überprüfen, ob das infoWindow zum DOM hinzugefügt wurde, und dann das infoWindow erneut zu öffnen (es muss nicht geschlossen werden).
quelle
Das Hinzufügen von Folgendem zu meinem CSS hat den Trick für mich getan:
quelle
Um alle Lösungen zusammenzufassen, die in allen Browsern für mich funktioniert haben:
Legen Sie eine maximale Breite für das Infofenster fest:
this.infowindow = new google.maps.InfoWindow({ maxWidth: 200 });
Wickeln Sie den Inhalt des Infofensters mit ein
<div style="overflow:hidden;line-height:1.35;min-width:200px;">*CONTENT*</div>
(Ändern Sie die Mindestbreite für den Wert, den Sie im Infofenster maxWidth festgelegt haben.)
Ich habe es getestet und es funktionierte in jedem Browser und ich hatte über 400 Marker ...
quelle
Ich weiß, dass viele andere Leute Lösungen gefunden haben, die für ihren speziellen Fall funktionieren, aber da keiner von ihnen für meinen speziellen Fall funktioniert hat , dachte ich, dass dies für jemand anderen hilfreich sein könnte.
Ein paar Details:
Ich verwende Google Maps API v3 in einem Projekt, in dem Inline-CSS wirklich vermieden werden soll. Meine Infofenster funktionierten für alles außer für IE11, wo die Breite nicht korrekt berechnet wurde. Dies führte zu Div-Überläufen, die Bildlaufleisten auslösten.
Ich musste drei Dinge tun:
Entfernen Sie alle Regeln für den Inline-Block-Stil von allen Elementen im Infowindow-Inhalt (ich habe sie durch display: block ersetzt). Ich hatte die Idee, dies in einem Thread (den ich nicht mehr finden kann) zu versuchen, in dem jemand dasselbe hatte Problem mit IE6.
Übergeben Sie den Inhalt als DOM-Knoten anstatt als Zeichenfolge. Ich verwende jQuery, also könnte ich dies durch Ersetzen tun:
infowindow.setContent(infoWindowDiv.html());
mitinfowindow.setContent($(infoWindowDiv.html())[0]);
Dies stellte sich für mich als am einfachsten heraus, aber es gibt viele andere Möglichkeiten, um das gleiche Ergebnis zu erzielen.Verwenden Sie den Hack "setMaxWidth" - setzen Sie die Option MaxWidth im Konstruktor - das spätere Setzen der Option funktioniert nicht. Wenn Sie nicht wirklich eine maximale Breite wünschen, stellen Sie sie einfach auf eine sehr große Zahl ein.
Ich weiß nicht, warum diese funktionierten, und ich bin mir nicht sicher, ob eine Teilmenge davon funktionieren würde. Ich weiß, dass keiner von ihnen für alle meine Anwendungsfälle einzeln funktioniert und dass 2 + 3 nicht funktioniert. Ich hatte keine Zeit, 1 + 2 oder 1 + 3 zu testen.
quelle
Es war für mich nicht akzeptabel, die Breite und Höhe des Infofensters fest zu codieren oder festzulegen
white-space: nowrap
, diemaxWidth
Lösung half mir nicht und alles andere funktionierte entweder nicht oder war für meinen Anwendungsfall auf andere Weise ungeeignet.Meine Lösung bestand darin, den Inhalt festzulegen , das Fenster zu öffnen und dann, wenn das
domready
Ereignis ausgelöst wird, dieheight
CSS-Eigenschaft für den Inhalt auf eine beliebige Höhe festzulegen und dann Google Maps zu zwingen, die Größe des InfoWindow entsprechend zu ändern.infoWindow
ist das InfoWindow-Objekt,$infoWindowContents
ist ein Jquery-Objekt des Inhalts, den ich dort einfügen möchte,map
ist mein Map-Objekt.marker
ist eine Markierung, die angeklickt wurde.(Ich habe dieselbe Lösung zu einer ähnlichen Frage veröffentlicht. Wie kann ich die Größe eines Google Maps-InfoWindows an den darin enthaltenen Inhalt anpassen? )
quelle
Nachdem ich Zeit verloren und eine Weile gelesen hatte, wollte ich nur etwas Einfaches, dieses CSS funktionierte für meine Anforderungen.
Es ist auch keine sofortige Lösung, aber wenn sie das Problem markieren oder kommentieren, können sie es möglicherweise beheben, da sie glauben, dass es behoben ist: http://code.google.com/p/gmaps-api-issues/issues/detail?id= 5713
quelle
Nun, das ist derjenige, der den Trick für mich getan hat:
Einstellung nur
overflow: visible
auf.gm-style-iw
tatsächlich machte das Problem noch schlimmer! Ich habe im Inspektor für Chrome-Entwicklertools festgestellt, dass das.gm-style-iw
Element zwei Divs enthält , die beideoverflow: auto
standardmäßig festgelegt sind.Ich zeige in meinen InfoWindows ziemlich viel HTML-formatierten Text an, weshalb die anderen Lösungen für mich möglicherweise überhaupt nicht funktionierten.
quelle