Il semble que mon InfoWindow, lorsque vous cliquez sur l'icône d'accueil sur mon Google Maps v3, ne soit pas correctement dimensionné automatiquement au contenu de l'InfoWindow.
Il donne des barres de défilement quand il ne le devrait pas. L'InfoWindow doit être correctement dimensionné automatiquement.
Des idées sur pourquoi?
Par requête, le JavaScript pertinent qui injecte le HTML pour l'InfoWindow:
listing = '<div>Content goes here</div>';
MISE À JOUR
Ce bogue a été géré par Google en cause
https://issuetracker.google.com/issues/35823659
Le correctif a été mis en œuvre en février 2015 dans la version 3.19 de l'API JavaScript Maps.
javascript
html
css
google-maps
JacobT
la source
la source
Réponses:
Ajouter un div dans votre infowindow
<div id=\"mydiv\">YourContent</div>
Ensuite, définissez la taille en utilisant css. travaille pour moi. Cela suppose que toutes les infowindows sont de la même taille!
#mydiv{ width:500px; height:100px; }
la source
<div class=\"mydiv\">YourContent</div>
et.mydiv{ width:500px; height:100px; }
Réponse courte: définissez la propriété d'options maxWidth dans le constructeur . Oui, même si la définition de la largeur maximale n'était pas ce que vous vouliez faire.
Histoire plus longue: lors de la migration d'une carte v2 vers la v3, j'ai vu exactement le problème décrit. Les fenêtres variaient en largeur et en hauteur, certaines avaient des barres de défilement verticales et d'autres non. Certains avaient <br /> incorporé dans les données, mais au moins un avec cette taille OK.
Je ne pensais pas que la propriété InfoWindowsOptions.maxWidth était pertinente, car je ne voulais pas contraindre la largeur ... mais en la définissant avec le constructeur InfoWindow, j'ai obtenu ce que je voulais, et les fenêtres se redimensionnent maintenant automatiquement (verticalement) et afficher le contenu complet sans barre de défilement verticale. Cela n'a pas beaucoup de sens pour moi, mais ça marche!
Voir: http://fortboise.org/maps/sailing-spots.html
la source
maxWidth
un pourcentage, Google Maps reconnaîtra un flottant en tant que pourcentage du parent et le convertira en équivalent pixel: declare{"maxWidth":0.25}
, l'élément parent a une largeur de 1000 pixels, InfoWindow aura unwidth: 250px
. Je ne pense pas qu'il soit possible de forcer la largeur d'InfoWindow à rester un pourcentage (la valeur demaxWidth
doit être un nombre, donc{"maxWidth":"25%"}
ne fonctionnera pas et{"maxWidth":25%}
est traitée comme un module de 25 non défini et déclenche une erreur de syntaxe).Vous devez donner le contenu à InfoWindow à partir de l'objet jQuery.
var $infoWindowContent = $("<div class='infowin-content'>Content goes here</div>"); var infoWindow = new google.maps.InfoWindow(); infowindow.setContent($infoWindowContent[0]);
la source
overflow: auto
sur InfoWindow DIV lorsque vous passez des nœuds DOM au lieu d'une chaîne. Cela résout le problème si le contenu n'est sorti que de 1 à 2 pixels. Malheureusement, cela signifie qu'un contenu plus long se bloque en fait hors d'InfoWindow au lieu d'avoir des barres de défilement ajoutées.infoWindow's
afficher correctement. La réponse complète à la raison pour laquelle cela fonctionne est répertoriée dans ma réponse -jQuery
crée un arbre DOM détaché qui force le contenu à être correctement rendu et sa taille est déterminée avec précision avant que Google tente de placer leinfoWindow
sur la carte.gm-style-iw{ height: 100% !important; overflow: hidden !important; }
ça marche pour moi
la source
EDITED (pour se démarquer): Croyez-moi, sur les cent autres réponses à cette question, c'est la seule correcte qui explique également POURQUOI cela se produit
Ok, donc je sais que ce fil est vieux et qu'il contient mille réponses, mais aucune d'entre elles n'est correcte et je ressens le besoin de poster la bonne réponse.
Tout d'abord, vous n'avez jamais besoin de spécifier
width's
ouheight's
sur quoi que ce soit pour que votre infoWindow s'affiche sans barres de défilement, bien que parfois vous puissiez accidentellement le faire fonctionner en faisant cela (mais cela finira par échouer).Deuxièmement, l'API Google Maps n'a
infoWindow's
pas de bogue de défilement, il est juste très difficile de trouver les informations correctes sur leur fonctionnement. Eh bien, la voici:Lorsque vous dites à l'API Google Maps d'ouvrir dans infoWindow comme ceci:
var infoWindow = new google.maps.InfoWindow({...}); .... infoWindow.setContent('<h1>Hello!</h1><p>And welcome to my infoWindow!</p>'); infoWindow.open(map);
À toutes fins utiles, google maps place temporairement un
div
à la fin de votre page (en fait, cela crée undetached DOM tree
- mais il est conceptuellement plus facile à comprendre si je dis que vous imaginez undiv
être placé à la fin de votre page ) avec le contenu HTML que vous spécifié. Il mesure ensuite ce div (ce qui signifie que, dans cet exemple, quelles que soient les règles CSS de mon document qui s'appliquenth1
et lesp
balises lui seront appliquées) pour obtenir sonwidth
etheight
. Google le prend ensuitediv
, lui attribue les mesures qu'il a obtenues lorsqu'il a été ajouté à votre page et le place sur la carte à l'emplacement que vous avez spécifié.Voici où le problème se produit pour beaucoup de gens - ils peuvent avoir du HTML qui ressemble à ceci:
<body> <div id="map-canvas"><!-- google map goes here --></div> </body>
et, pour une raison quelconque, CSS qui ressemble à ceci:
h1 { font-size: 18px; } #map-canvas h1 { font-size: 32px; }
Pouvez-vous voir le problème? Lorsque l'API essaie de prendre les mesures pour votre
infoWindow
(immédiatement avant de l'afficher), lah1
partie du contenu aura une taille de18px
(car le «div de mesure» temporaire est ajouté au corps), mais lorsque l'API place réellement leinfoWindow
sur la carte, le#map-canvas h1
sélecteur aura la priorité, ce qui rendra la taille de la police très différente de ce qu'elle était lorsque l'API a mesuré la taille duinfoWindow
et dans ce cas, vous serez toujours barres de défilement.Il peut y avoir des nuances plus légèrement différentes pour la raison spécifique pour laquelle vous avez des barres de défilement dans votre
infoWindow
, mais la raison derrière cela est à cause de ceci:Donc, ce que je fais toujours, c'est quelque chose comme ça:
infoWindow.setContent('<div class="info-window-content">...your content here...</div>');
et dans mon CSS:
.info-window-content { ... } .info-window-content h1 { .... } .info-window-content p { ... } etc...
Ainsi, peu importe où l'API ajoute sa mesure
div
- avant la fermeturebody
ou à l'intérieur d'un#map-canvas
, les règles CSS qui lui sont appliquées seront toujours les mêmes.EDIT RE: Familles de polices
Google semble travailler activement sur le problème de chargement des polices (décrit ci-dessous) et la fonctionnalité a changé très récemment, vous pouvez donc ou non voir le chargement de la police Roboto lors de
infoWindow
la première ouverture, en fonction de la version de l'API que vous utilisez. Il y a un rapport de bogue ouvert (même si dans le journal des modifications, ce rapport de bogue était déjà marqué comme corrigé) qui illustre que Google rencontre toujours des difficultés avec ce problème.UNE PLUS CHOSE: REGARDEZ VOS FAMILLES DE POLICES !!!
Dans la dernière incarnation de l'API, Google a essayé d'être intelligent et d'envelopper son contenu infoWindow dans quelque chose qui pourrait être ciblé avec un sélecteur CSS -
.gm-style-iw
. Pour les personnes qui ne comprenaient pas les règles que j'ai expliquées ci-dessus, cela n'a pas vraiment aidé, et dans certains cas, les choses ont même empiré. Les barres de défilement apparaissaient presque toujours la première fois que uninfoWindow
était ouvert, mais si vous en rouvriezinfoWindow
, même avec exactement le même contenu, les barres de défilement disparaîtraient. Sérieusement, si vous n'étiez pas confus auparavant, cela vous ferait perdre la tête. Voici ce qui se passait:Si vous regardez les styles que Google charge sur la page lors du chargement de l'API, vous pourrez voir ceci:
Ok, donc Google voulait rendre ses cartes un peu plus cohérentes en les faisant toujours utiliser la
Roboto
famille de polices. Le problème est que, pour la majorité des gens, avant d'ouvrir uninfoWindow
, le navigateur n'avait pas encore téléchargé laRoboto
police (car rien d'autre sur votre page ne l'utilisait, donc le navigateur est assez intelligent pour savoir qu'il n'a pas besoin de télécharger cette police). Le téléchargement de cette police n'est pas instantané, même s'il est très rapide. La première fois que vous ouvrez uninfoWindow
et que l'API ajoute lediv
avec votreinfoWindow
contenu au corps pour prendre ses mesures, il commence à télécharger laRoboto
police, mais vosinfoWindow's
mesures sont prises et la fenêtre est placée sur la carte avantRoboto
fin du téléchargement. Le résultat, assez souvent, était uninfoWindow
dont les mesures ont été prises lorsque son contenu a été rendu à l'aide d'Arial
unesans-serif
police ou d'une police, mais lorsqu'il a été affiché sur la carte (etRoboto
a terminé le téléchargement), son contenu était affiché dans une police de taille différente vous ouvrez le fichierinfoWindow
. Ouvrez exactement la même choseinfoWindow
une deuxième fois - à quel point leRoboto
a été téléchargé et sera utilisé lorsque l'API prendra ses mesures deinfoWindow
contenu et vous ne verrez aucune barre de défilement.la source
J'ai essayé chacune des réponses énumérées. Aucun n'a fonctionné pour moi. Cela a finalement réglé le problème de manière permanente. Le code dont j'ai hérité avait un
DIV
wrapper autour de toutes les entrées<h#>
et<p>
. J'ai simplement forcé un certain "style" dans le même DIV, en tenant compte de la largeur maximale souhaitée, j'ai ajouté le changement de hauteur de ligne juste au cas où (le correctif de quelqu'un d'autre) et le mienwhite-space: nowrap
, ce qui a ensuite obligé le débordement automatique à faire les ajustements corrects. Pas de barre de défilement, pas de troncature et pas de problèmes!html = '<div class="map-overlay" style="max-width: 400px; line-height: normal; white-space: nowrap; overflow: auto; ">';
la source
white-space: nowrap
qui avait la magie - les autres styles étaient inutiles. À votre santé!font-family: sans-serif !important; font-weight: normal !important;
au CSS.Je sais que c'est un vieux fil, mais je viens de rencontrer le même problème. J'avais
<h2>
et des<p>
éléments dans l'InfoWindow, et ces deux avaient des marges inférieures. J'ai supprimé les marges et InfoWindow a été dimensionné correctement. Aucun des autres correctifs suggérés n'a fonctionné. Je soupçonne que le calcul de la taille d'InfoWindow ne prend pas en compte les marges.la source
<div style='overflow:hidden;'></div>
Ça a l'air bien maintenant.Je vais ajouter ma réponse à la liste, car AUCUN de ceux-ci n'a résolu mon problème. J'ai fini par envelopper mon contenu dans un div, en donnant à ce div une classe, et en spécifiant le
min-width
sur le div, ET en spécifiant lemaxWidth
sur l'infoWindow, ET ils devaient tous deux être de la même taille, sinon la largeur ou la hauteur déborderait sur des boîtes avec juste la mauvaise quantité de contenu.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; }
la source
min-width
contenu était la seule chose qui fonctionnait pour moi aussi. Je n'ai pas eu à définir lemaxWidth
sur infoWindow.J'ai essayé toutes ces solutions et aucune n'a fonctionné. Après quelques essais et erreurs, je l'ai compris.
<style type="text/css"> #map_canvas { line-height:normal; } </style>
Définir la hauteur de ligne: normale pour la division du canevas de la carte.
la source
#map_canvas
dans Google Maps v3 que je peux voir. Cela doit provenir de l'ancienne v2.#map_canvas
est le div que vous utilisez pour la carte. Cela peut être le nom que vous voulez.Il semble que le problème soit lié à la police Web Roboto.
L'infowindow est rendu avec des propriétés de largeur et de hauteur en ligne basées sur le contenu fourni. Cependant, il n'est pas calculé avec la police Web déjà rendue / chargée. Une fois que la police est rendue APRÈS que la carte entière soit imprimée à l'écran, alors elle fait apparaître les barres de défilement en raison des propriétés "overflow: auto" en ligne à l'intérieur des DIV de la fenêtre.
La solution que j'ai trouvée pour fonctionner consiste à envelopper le contenu dans un DIV, puis à appliquer CSS pour remplacer la police Web:
.gmap_infowin { font-family: sans-serif !important; font-weight: normal !important; } <div class="gmap_infowin">Your info window content here.</div>
la source
Assez drôle, alors que le code suivant corrigera la barre de défilement WIDTH:
.gm-style-iw { overflow: hidden !important; line-height: 1.35; }
Il a fallu cela pour corriger la barre de défilement HEIGHT:
.gm-style-iw div { overflow: hidden !important; }
EDIT: Ajout d'espaces blancs: nowrap; dans l'un ou l'autre style peut corriger le problème d'espacement qui semble persister lorsque les barres de défilement sont supprimées. Super point Nathan.
la source
Cela fonctionne pour moi. Mettez un
div
dans lesetContent
sh_map.infoWindow.setContent([ '<div id=\"mydiv\">', 'Your content goes here', ].join(''));
Ajoutez ensuite ce CSS à votre page:
<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>
Par exemple, voir http://www.student-homes-northampton.co.uk ; cliquez sur les liens sous les photos de la maison pour afficher la carte Google.
la source
Cela a complètement résolu mon problème:
.gm-style-iw { overflow: visible !important; height: auto !important; width: auto !important; }
la source
J'avais le même problème avec IE et j'ai essayé de nombreux correctifs détaillés dans ces réponses, mais je n'ai pas réussi à supprimer les barres de défilement verticales dans IE de manière fiable.
Ce qui fonctionnait le mieux pour moi était de passer à des tailles de police fixes dans la fenêtre infowindow - 'px' ... J'utilisais ems. En corrigeant la taille de la police, je n'avais plus besoin de déclarer explicitement la largeur ou la hauteur de la fenêtre infowindow et les barres de défilement avaient disparu pour de bon.
la source
La hauteur du conteneur de carte est également importante. Si à petite infoWindow sera toujours sur une hauteur de 80px. Sinon
maxWidth
et#innerDiv
réparer fonctionne comme un charme.la source
Si rien d'autre, essayez d'ajouter le contenu une fois la fenêtre ouverte. Cela devrait le forcer à se redimensionner.
infoWindow = new google.maps.InfoWindow() infoWindow.open(map, marker) infoWindow.setContent(content)
la source
Utilisez l'événement domready et rouvrez la fenêtre d'informations et affichez le contenu caché après le déclenchement de l'événement domready deux fois pour vous assurer que tous les éléments dom ont été chargés.
// 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); } }
J'ai juste essayé de faire un setTimeout (/ * show infowin callback * /, 100), mais parfois cela ne fonctionnait toujours pas si le contenu (c'est-à-dire: les images) prenait trop de temps à charger.
J'espère que cela fonctionne pour toi.
la source
J'avais le même problème, particulièrement perceptible lorsque mon
<h2>
élément était enveloppé dans une deuxième ligne.J'ai appliqué une classe à a
<div>
dans infoWindow et j'ai changé les polices en une police système générique (dans mon cas, Helvetica) par rapport à une police Web @ font-face qu'elle utilisait. Problème résolu.la source
//infowindow.setContent(response); var infowindowopts = { maxWidth: 274, content: response }; infowindow.setOptions(infowindowopts);
la source
Ajoutez un
min-height
à votre élément de classe infoWindow.Cela résoudra le problème si vos infoWindows sont toutes de la même taille.
Sinon, ajoutez cette ligne de jQuery à votre fonction de clic pour infoWindow:
//remove overflow scrollbars $('#myDiv').parent().css('overflow','');
la source
Je ne pouvais pas le faire fonctionner sous aucune forme ou forme, j'incluais 3 divs dans la boîte. Je les ai enveloppés dans un div externe, avec des largeurs et des hauteurs correctement réglées, et rien n'a fonctionné.
À la fin, je l'ai corrigé en définissant le div en haut à gauche absolu, puis avant le div, j'ai défini deux images, une de 300 pixels de large et 1 px de haut, une de 120 pixels de haut et 1 px de large, d'un gif transparent.
Il s'est alors mis à l'échelle correctement!
C'est moche mais ça marche.
Vous pouvez également faire une image et définir un zindex que j'attends, ou même une seule image si votre fenêtre n'a pas d'interaction, mais qu'elle contenait un formulaire, ce n'était donc pas une option ...
la source
Je pense que ce comportement est dû à un style css dans un conteneur externe, j'ai eu le même problème mais je l'ai résolu en utilisant un div interne en y ajoutant un peu de rembourrage, je sais que c'est bizarre mais cela a résolu le problème
<div id="fix_height"> <h2>Title</h2> <p>Something</p> </div>
Et dans mon style.css
div#fix_height{ padding: 5px; }
la source
J'avais un élément en ligne (une balise a) directement à l'intérieur du
div
avecstyle="overflow:auto"[...
enveloppé dans unp
balise et corrigé.Il semble que tout élément en ligne qui n'est pas imbriqué dans un élément de bloc directement à l'intérieur de l'infowindow provoquera cela.
la source
Ma réponse est d'ajouter un écouteur (en utilisant addListenerOnce) pour vérifier si l'infoWindow a été ajoutée au DOM, puis d'ouvrir à nouveau l'infoWindow (pas besoin de la fermer).
// 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); });
la source
L'ajout de ce qui suit à mon CSS a fait l'affaire pour moi:
la source
Juste pour résumer toutes les solutions qui ont fonctionné pour moi dans tous les navigateurs:
Définissez une largeur maximale pour l'infowindow:
this.infowindow = new google.maps.InfoWindow({ maxWidth: 200 });
Enveloppez le contenu de l'infowindow avec
<div style="overflow:hidden;line-height:1.35;min-width:200px;">*CONTENT*</div>
(modifiez la largeur minimale de la valeur que vous avez définie dans la fenêtre d'information maxWidth)
Je l'ai testé et cela a fonctionné sur tous les navigateurs, et j'avais plus de 400 marqueurs ...
la source
Je sais que beaucoup d'autres personnes ont trouvé des solutions qui ont fonctionné pour leur cas particulier, mais comme aucune d'elles n'a fonctionné pour mon cas particulier, j'ai pensé que cela pourrait être utile à quelqu'un d'autre.
Quelques détails:
J'utilise l'API google maps v3 sur un projet où le CSS en ligne est quelque chose que nous voulons vraiment éviter. Mes infowindows fonctionnaient pour tout sauf pour IE11, où la largeur n'était pas calculée correctement. Cela a entraîné des débordements de div, qui ont déclenché des barres de défilement.
J'ai dû faire trois choses:
Supprimer tout affichage: règles de style de bloc en ligne de tout ce qui se trouve à l'intérieur du contenu de l'infowindow (j'ai remplacé par display: block) - j'ai eu l'idée d'essayer cela à partir d'un fil (que je ne peux plus trouver) où quelqu'un avait le même problème avec IE6.
Transmettez le contenu en tant que nœud DOM plutôt qu'en tant que chaîne. J'utilise jQuery, donc je pourrais le faire en remplaçant:
infowindow.setContent(infoWindowDiv.html());
parinfowindow.setContent($(infoWindowDiv.html())[0]);
Cela s'est avéré être le plus simple pour moi, mais il existe de nombreuses autres façons d'obtenir le même résultat.Utilisez le hack "setMaxWidth" - définissez l'option MaxWidth dans le constructeur - la définition de l'option plus tard ne fonctionne pas. Si vous ne voulez pas vraiment une largeur maximale, définissez-la simplement sur un très grand nombre.
Je ne sais pas pourquoi ceux-ci ont fonctionné, et je ne sais pas si un sous-ensemble d'entre eux fonctionnerait. Je sais qu'aucun d'entre eux ne fonctionne pour tous mes cas d'utilisation individuellement, et que 2 + 3 ne fonctionne pas. Je n'ai pas eu le temps de tester 1 + 2 ou 1 + 3.
la source
Il n'était pas acceptable pour moi de coder en dur la largeur et la hauteur de la fenêtre d'informations, ou de définir
white-space: nowrap
lemaxWidth
solution ne m'a pas aidé et tout le reste ne fonctionnait pas ou était inapproprié pour mon cas d'utilisation.Ma solution était de définir le contenu, d'ouvrir la fenêtre puis, lorsque l'
domready
événement est déclenché, de définir leheight
propriété CSS du contenu sur quelle que soit la hauteur, puis de forcer Google Maps à redimensionner l'InfoWindow en conséquence.infoWindow
est l'objet InfoWindow,$infoWindowContents
est un objet Jquery du contenu que je veux y mettre,map
est mon objet Map.marker
est un marqueur qui a été cliqué.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);
(J'ai posté la même solution sur une question similaire Comment puis-je faire redimensionner une InfoWindow google-maps pour l'adapter au contenu qui y est placé? )
la source
Après avoir perdu du temps et lu pendant un moment, je voulais juste quelque chose de simple, ce css fonctionnait pour mes besoins.
.gm-style-iw > div { overflow: hidden !important; }
Ce n'est pas non plus une solution instantanée, mais mettre en vedette / commenter le problème pourrait leur permettre de le résoudre, car ils pensent qu'il est résolu: http://code.google.com/p/gmaps-api-issues/issues/detail?id= 5713
la source
Et bien c'est celui qui a fait l'affaire pour moi:
.gm-style-iw>div { overflow: visible !important; }
Réglage avec
overflow: visible
le.gm-style-iw
fait aggravé le problème! J'ai remarqué dans l'inspecteur des outils de développement Chrome qu'il y a deux div à l'intérieur de l'.gm-style-iw
élément, tous deux qui ontoverflow: auto
définis par défaut.J'affiche beaucoup de texte au format HTML dans mes InfoWindows, c'est peut-être pourquoi les autres solutions ne fonctionnent pas du tout pour moi.
la source