编辑(突出):相信我,在这个问题的一百个其他答案中,这是唯一一个也解释了为什么会发生的正确答案
好的,所以我知道这个帖子很旧,并且有一千个答案,但没有一个是正确的,我觉得有必要发布正确的答案。
首先,你不会永远需要指定width's
或height'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 规则适用于h1
和p
标签都将适用于它)以获取它的width
and 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
其测量值是在使用Arial
或sans-serif
字体呈现内容时进行的,但是当它显示在地图上(并Roboto
完成下载)时,它的内容以不同大小的字体显示 - 瞧 - 滚动条第一次出现你打开infoWindow
. infoWindow
再次打开完全相同- 此时Roboto
已下载并将在 API 对其infoWindow
内容进行测量时使用,您将看不到任何滚动条。