Google Maps API v3:信息窗口大小不正确

IT技术 javascript html css google-maps
2021-01-26 07:24:52

当您单击我的 Google Maps v3 上的主页图标时,我的 InfoWindow 似乎没有根据 InfoWindow 的内容正确自动调整大小。

它在不应该时提供滚动条。InfoWindow 应该正确地自动调整大小。

关于为什么的任何想法?

每个请求,为 InfoWindow 注入 HTML 的相关 JavaScript:

listing = '<div>Content goes here</div>';

更新

这个错误是由谷歌在问题中处理的

https://issuetracker.google.com/issues/35823659

该修复于 2015 年 2 月在 Maps JavaScript API 3.19 版中实施。

6个回答

在您的信息窗口中添加一个 div

<div id=\"mydiv\">YourContent</div>

然后使用css设置大小。为我工作。这假设所有信息窗口的大小都相同!

#mydiv{
width:500px;
height:100px;
}
确切地。相同的大小或者你在你的 css 中创建了足够多的不同维度的类。
2021-03-21 07:24:52
它适用于台式机,但不适用于移动设备(Android)/
2021-03-26 07:24:52
根据您使用信息窗口的方式,使用类而不是 ID 可能更安全,以避免在同一页面上出现重复的 ID,例如<div class=\"mydiv\">YourContent</div>.mydiv{ width:500px; height:100px; }
2021-04-12 07:24:52

简短回答:在构造函数中设置 maxWidth 选项属性是的,即使设置最大宽度不是您想要的。

更长的故事:将 v2 地图迁移到 v3,我看到了所描述的问题。Windows 的宽度和高度各不相同,有些有垂直滚动条,有些没有。有些在数据中嵌入了 <br /> ,但至少有一个大小合适。

我不认为 InfoWindowsOptions.maxWidth 属性是相关的,因为我不在乎限制宽度......但是通过使用 InfoWindow 构造函数设置它,我得到了我想要的,并且窗口现在自动调整大小(垂直)和在没有垂直滚动条的情况下显示完整内容。对我来说没有多大意义,但它有效!

请参阅:http : //fortboise.org/maps/sailing-spots.html

如果其他人试图设置maxWidth一个百分比,谷歌地图会将浮点数识别{"maxWidth":0.25}为父元素的百分比,并将其转换为等效像素:声明,父元素宽度为 1000 像素,信息窗口将有一个width: 250px. 我认为不可能强制 InfoWindow 的宽度保持百分比(的值maxWidth必须是一个数字,所以{"maxWidth":"25%"}不会工作,{"maxWidth":25%}并被视为未定义的 25 模数并触发语法错误)。
2021-03-19 07:24:52
这可能在 2010 年有效,但在 2014 年没有帮助。
2021-03-27 07:24:52
@Simon 新年,新问题……这次有什么解决方案吗?
2021-03-29 07:24:52
有趣的。当前的 Google 文档说 google.maps.InfoWindowOptions.maxWidth 属性是“一个数字”,我们推断出像素单位。解析器没有理由不能同时接受十进制数并将其解释为分数……而这将被保留为未记录的“功能”。除了可能是明智的。
2021-04-03 07:24:52
好的,+1 表示工作出色,但是为什么我在研究 gMap 功能时总是会出现在该航行页面上。
2021-04-08 07:24:52

您应该将内容从 jQuery 对象提供给 InfoWindow。

var $infoWindowContent = $("<div class='infowin-content'>Content goes here</div>");
var infoWindow = new google.maps.InfoWindow();
infowindow.setContent($infoWindowContent[0]);
这是我见过的最奇怪的修复之一。除了这个,这个问题的其他黑客都没有对我有用。难以置信的。
2021-03-24 07:24:52
虽然这确实有效,但要求人们在页面上包含 jQuery 只是为了infoWindow's正确显示是非常讨厌的我的答案中列出了有关为什么这样做的完整答案 -jQuery创建一个分离的 DOM 树,强制正确呈现内容,并在 google 尝试将其放置infoWindow在地图上之前准确确定其大小
2021-03-28 07:24:52
好的,这工作得很好,非常感谢......现在我想知道为什么:)
2021-03-30 07:24:52
出于某种原因,overflow: auto当您传入 DOM 节点而不是字符串时,地图 API 似乎没有放在InfoWindow DIV 上。如果内容仅超出 1-2px,这将解决问题。不幸的是,这意味着更长的内容实际上在信息窗口之外,而不是添加滚动条。
2021-04-06 07:24:52
.gm-style-iw{
    height: 100% !important;
    overflow: hidden !important;
}

这个对我有用

这不是一个很好的解决方案作为任何内容大于信息窗口将被切断和隐藏。
2021-03-16 07:24:52
对于不同长度的内容并不完美,但对于应用宽度 !important 和高度 !important 的每个指针,我的内容几乎相同!对我来说已经足够了!
2021-04-11 07:24:52

编辑(突出):相信我,在这个问题的一百个其他答案中,这是唯一一个也解释了为什么会发生的正确答案

好的,所以我知道这个帖子很旧,并且有一千个答案,但没有一个是正确的,我觉得有必要发布正确的答案。

首先,你不会永远需要指定width'sheight's在为了让您的信息窗口,以显示没有滚动任何东西,虽然有时候你可能会意外地得到它做这个工作(但它最终会失败)。

其次,Google Maps APIinfoWindow's 没有滚动错误,只是很难找到有关它们如何工作的正确信息。嗯,这里是:

当您告诉 Google Maps API 在 infoWindow 中打开时,如下所示:

var infoWindow = new google.maps.InfoWindow({...});
....
infoWindow.setContent('<h1>Hello!</h1><p>And welcome to my infoWindow!</p>');
infoWindow.open(map);

出于所有意图和目的,谷歌地图暂时div在您的页面末尾放置了一个实际上它创建了一个detached DOM tree- 但如果我说您想象一个div存在在您的页面末尾,它在概念上更容易理解以及您的 HTML 内容指定的。然后它测量该 div(这意味着,在本例中,我的文档中的任何 CSS 规则适用于h1p标签都将适用于它)以获取它的widthand height然后,Google 获取它div,将它附加到您的页面时获得的测量值分配给它,并将其放置在地图上您指定的位置。

这就是很多人出现问题的地方 - 他们的 HTML 可能如下所示:

<body>
 <div id="map-canvas"><!-- google map goes here --></div>
</body>

并且,无论出于何种原因,CSS 如下所示:

h1 { font-size: 18px; }
#map-canvas h1 { font-size: 32px; }

你能看出问题吗?当API试图进行测量您infoWindow(立即显示它之前),该h1部分内容将有一个大小18px(因为临时“测量格”被附加到体),但是当API实际上是放置infoWindow在地图,#map-canvas h1选择器将优先导致字体大小与 API 测量大小时的字体大小大不相同infoWindow,在这种情况下,您将始终获得滚动条。

由于您的 中有滚动条的具体原因,可能会有更多略有不同的细微差别infoWindow,但其背后的原因是因为:

infoWindow 无论实际 HTML 元素出现在标记中的何处,都必须将相同的 CSS 规则应用于您的内容如果他们不这样做,那么您将保证在您的信息窗口中获得滚动条

所以我一直在做的事情是这样的:

infoWindow.setContent('<div class="info-window-content">...your content here...</div>');

在我的 CSS 中:

.info-window-content { ... }
.info-window-content h1 { .... }
.info-window-content p { ... }
etc...

因此,无论 API 在哪里附加它的测量值div- 在关闭之前body或在 a 内部#map-canvas,应用于它的 CSS 规则将始终相同。

编辑 RE:字体系列

Google 似乎正在积极解决字体加载问题(如下所述)并且功能最近发生了变化,因此您infoWindow在第一次打开时可能会或可能不会看到 Roboto 字体加载,具体取决于您使用的 API 版本。有一个开放的错误报告(即使在更新日志中这个错误报告已经被标记为已修复)说明谷歌仍然有这个问题的困难。

还有一件事:注意你的字体系列!!!

在 API 的最新版本中,谷歌试图巧妙地将它的 infoWindow 内容包装在可以使用 CSS 选择器定位的内容中 - .gm-style-iw对于不理解我上面解释的规则的人来说,这并没有真正的帮助,在某些情况下甚至更糟。滚动条几乎总是在第一次infoWindow打开时出现,但是如果infoWindow再次打开,即使内容完全相同,滚动条也会消失。说真的,如果你之前不糊涂,这会让你失去理智。这是发生的事情:

如果您查看 google 在页面上加载 API 时加载的样式,您将能够看到:

.gm-style {
     font-family: Roboto,Arial,sans-serif
 ...
}

好的,所以谷歌希望通过始终使用Roboto字体系列来使其地图更加一致问题是,对于大多数人来说,在你打开之前infoWindow,浏览器还没有下载Roboto字体(因为你的页面上没有其他东西使用它,所以浏览器足够聪明,知道它不需要下载这种字体)。下载这种字体不是即时的,即使它非常快。当您第一次打开 aninfoWindow并且 API 将div您的infoWindow内容附加到正文以进行测量时,它会开始下载Roboto字体,但您的infoWindow's测量已完成,并且窗口会在Roboto下载完成之前放置在地图上结果往往是infoWindow其测量值是在使用Arialsans-serif字体呈现内容时进行,但是当它显示在地图上(并Roboto完成下载)时,它的内容以不同大小的字体显示 - 瞧 - 滚动条第一次出现你打开infoWindow. infoWindow再次打开完全相同- 此时Roboto已下载并将在 API 对其infoWindow内容进行测量时使用,您将看不到任何滚动条。

亚当。非常感谢您提供这个答案。你为我节省了一堆不必要的黑客攻击!
2021-03-15 07:24:52
亚当那里有一些很棒的细节,是的,我发现了与你相似的事情。然而,报告给谷歌的bug 实际上似乎仍与系统字体,没有后代CSS选择器,甚至发生。请参阅此示例(在 Chrome 40 Win 中有一个滚动条)。
2021-03-17 07:24:52
@Simon - 你是对的,你提交的链接是一个错误(极端情况,但仍然是一个错误)。我可以想象 > 98% 的时间,当人们报告他们的 infoWindows 有但他们不知道为什么 - 这是因为这个答案中解决的问题。
2021-04-03 07:24:52