[英]Google Maps API v3: InfoWindow not sizing correctly
当您单击我的Google Maps v3上的主页图标时,我的InfoWindow似乎无法自动调整InfoWindow的内容。
当它不应该时,它给滚动条。 InfoWindow应该正确自动调整大小。
有什么想法吗?
根据请求,为InfoWindow注入HTML的相关JavaScript:
listing = '<div>Content goes here</div>';
UPDATE
此错误由Google负责处理
https://issuetracker.google.com/issues/35823659
该修复程序于2015年2月在Maps JavaScript API 3.19版中实施。
在你的infowindow中添加一个div
<div id=\"mydiv\">YourContent</div>
然后使用css设置大小。 适合我。 这假设所有的infowindows都是相同的大小!
#mydiv{
width:500px;
height:100px;
}
简答: 在构造函数中设置maxWidth选项属性 。 是的,即使设置最大宽度不是您想要做的。
更长的故事:将v2地图迁移到v3,我看到了所描述的问题。 Windows的宽度和高度各不相同,有些有垂直滚动条,有些没有。 有些已经嵌入数据中,但至少有一个具有那么大的OK。
我没想到InfoWindowsOptions.maxWidth财产是相关的,因为我没在意......但通过与信息窗口构造函数将其设置为约束的宽度,我得到了我想要的东西,而现在的Windows自动调整(垂直)和显示没有垂直滚动条的完整内容。 对我来说没有多大意义,但它确实有效!
您应该从jQuery对象将内容提供给InfoWindow。
var $infoWindowContent = $("<div class='infowin-content'>Content goes here</div>");
var infoWindow = new google.maps.InfoWindow();
infowindow.setContent($infoWindowContent[0]);
.gm-style-iw{
height: 100% !important;
overflow: hidden !important;
}
这个对我有用
编辑(突出):相信我,在这个问题的其他一百个答案中,这是唯一正确的解释为什么它正在发生
好的,所以我知道这个帖子已经老了,并且有一千个答案,但是没有一个是正确的 ,我觉得需要发布正确的答案。
首先,你不需要在任何东西上指定width's
或height's
,以便在没有滚动条的情况下显示你的infoWindow,尽管有时候你可能会意外地让它工作(但它最终会失败)。
其次,Google Maps API infoWindow'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
和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
的大小(因为临时的“测量div”附加到正文),但是当API实际上将infoWindow
放置在地图上, #map-canvas h1
选择器将优先使字体大小与API测量infoWindow
的大小时的字体大小infoWindow
,在这种情况下,您将始终获得滚动条。
由于您在infoWindow
有滚动条的具体原因,可能会有稍微不同的细微差别,但其背后的原因是因为:
无论实际HTML元素在标记中出现在何处,相同的CSS规则都必须应用于
infoWindow
的内容。 如果他们不这样做,那么您将保证在infoWindow中获得滚动条
所以我一直这样做,是这样的:
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
之前或在#map-canvas
内部,应用于它的CSS规则将始终是相同的。
编辑RE:字体系列
Google似乎正在积极处理字体加载问题(如下所述),并且最近功能发生了变化,因此当您的infoWindow
第一次打开时,您可能会看到Roboto字体加载,也可能看不到,这取决于您使用的API的版本。 有一个开放的错误报告(即使在更改日志中这个错误报告已被标记为已修复),这说明谷歌仍然遇到此问题的困难。
还有一件事:看你的家庭!
在API的最新版本中,谷歌试图巧妙地将它的infoWindow内容包装在可以用CSS选择器 - .gm-style-iw
定位的内容中。 对于那些不理解我上面解释过的规则的人来说,这并没有真正帮助,在某些情况下甚至更糟。 滚动条几乎总是在第一次打开infoWindow
时出现,但如果再次打开任何infoWindow
,即使内容完全相同 ,滚动条也会消失。 说真的,如果你之前没有感到困惑会让你失去理智。 这是发生的事情:
如果您在API加载时查看Google在页面上加载的样式,您将能够看到:
.gm-style {
font-family: Roboto,Arial,sans-serif
...
}
好的,所以Google希望通过总是让它们使用Roboto
字体系列来使它的地图更加一致。 问题是,对于大多数人来说,在你打开一个infoWindow
之前,浏览器还没有下载Roboto
字体(因为你的页面上没有其他内容使用它,所以浏览器足够聪明,知道它不需要下载此字体)。 下载此字体不是即时的,即使它非常快。 第一次打开infoWindow
并且API将带有infoWindow
内容的div
附加到正文以进行测量时,它会开始下载Roboto
字体,但是在Roboto
完成下载之前,您的infoWindow's
测量并将窗口放在地图上。 结果,通常是一个infoWindow
,当它的内容使用Arial
或sans-serif
字体呈现时进行测量,但当它显示在地图上(并且Roboto
已完成下载)时,它的内容以字体显示这是一个不同的大小 - 瞧 - 滚动条出现在你第一次打开infoWindow
。 第二次打开完全相同的infoWindow
- 此时已经下载了Roboto
并且当API正在测量infoWindow
内容时将使用它,您将看不到任何滚动条。
我尝试了列出的每个答案。 没有人为我工作。 这终于永久修复了它。 我继承的代码在所有<h#>
和<p>
条目周围都有一个DIV
包装器。 我只是在同一个DIV中强制一些“风格”,考虑到所需的最大宽度,投入线高度变化以防万一(别人的修复)和我自己的white-space: nowrap
,然后使自动溢出使正确的调整。 没有滚动条,没有截断,没有问题!
html = '<div class="map-overlay" style="max-width: 400px;
line-height: normal;
white-space: nowrap;
overflow: auto;
">';
要将我的答案添加到列表中,因为这些都没有解决我的问题。 我结束了包裹我在一个div的内容,给该分区的一类,并指定min-width
的DIV,并指定maxWidth
上的信息窗口,他们都需要是相同的大小,否则无论是宽度还是只有错误的内容量,盒子上的高度才会溢出。
使用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;
}
我知道这是一个旧线程,但我刚遇到同样的问题。 我在InfoWindow中有<h2>
和<p>
元素,这两个元素都有底边距。 我删除了边距,InfoWindow的大小正确。 没有其他建议的修复工作。 我怀疑InfoWindow大小计算没有考虑边距。
我已经尝试了所有这些解决方案,没有一个工作。 经过一些试验和错误,我想出来了。
<style type="text/css">
#map_canvas {
line-height:normal;
}
</style>
设置line-height:地图canvas div的normal。
似乎问题出在Roboto webfont上。
根据提供的内容,使用内联宽度和高度属性呈现信息窗口。 但是,它不是使用已经渲染/加载的webfont计算的。 在整个地图打印到屏幕后渲染字体后,由于窗口DIV内部的“溢出:自动”属性内嵌,导致滚动条出现。
我发现工作的解决方案是将内容包装在DIV中,然后应用CSS来覆盖webfont:
.gmap_infowin {
font-family: sans-serif !important;
font-weight: normal !important;
}
<div class="gmap_infowin">Your info window content here.</div>
有趣的是,以下代码将更正WIDTH滚动条:
.gm-style-iw
{
overflow: hidden !important;
line-height: 1.35;
}
这需要更正高度滚动条:
.gm-style-iw div
{
overflow: hidden !important;
}
编辑:添加空格:nowrap; 任何一种样式都可以纠正在删除滚动条时似乎停留的间距问题。 伟大的内森。
这完全解决了我的问题:
.gm-style-iw {
overflow: visible !important;
height: auto !important;
width: auto !important;
}
这适合我。 在setContent
放一个div
sh_map.infoWindow.setContent([
'<div id=\"mydiv\">',
'Your content goes here',
].join(''));
然后将此CSS添加到您的页面:
<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>
例如,请访问http://www.student-homes-northampton.co.uk ; 点击房子图片下方的链接即可显示Google地图。
我遇到了与IE相同的问题并尝试了这些响应中详细介绍的许多修复程序,但无法可靠地删除IE中的垂直滚动条。
对我来说最有效的是在infowindow内切换到固定的字体大小 - 'px'......我正在使用ems。 通过修复字体大小,我不再需要明确声明infowindow宽度或高度,滚动条已经消失了。
如果没有别的,请尝试在打开窗口后添加内容。 这应该强制它调整大小。
infoWindow = new google.maps.InfoWindow()
infoWindow.open(map, marker)
infoWindow.setContent(content)
同样重要的是地图容器的高度。 如果小信息窗口总是在80px高度。 否则maxWidth
和#innerDiv
修复就像一个魅力。
我认为这种行为是因为在外部容器中的一些CSS样式,我有同样的问题,但我解决了它使用内部div添加一些填充它,我知道它很奇怪,但它解决了问题
<div id="fix_height">
<h2>Title</h2>
<p>Something</p>
</div>
在我的style.css
div#fix_height{
padding: 5px;
}
我在div
直接使用了内联元素(一个标记),其中style="overflow:auto"[...
将其包装在p
标记中并修复它。
看起来任何没有嵌套在infowindow内部的块元素中的内联元素都会导致这种情况。
使用domready事件并重新打开信息窗口并在domready事件触发两次后显示隐藏的内容,以确保已加载所有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);
}
}
我试着做一个setTimeout(/ * show infowin callback * /,100),但有时候如果内容(即:图像)花费的时间太长而无法加载。
希望这对你有用。
将以下内容添加到我的CSS中对我来说很有用:
white-space: nowrap;
只是总结一下在所有浏览器中对我有用的所有解决方案:
设置infowindow的最大宽度:
this.infowindow = new google.maps.InfoWindow({ maxWidth: 200 });
包裹infowindow的内容
<div style="overflow:hidden;line-height:1.35;min-width:200px;">*CONTENT*</div>
(更改在infowindow maxWidth上设置的值的最小宽度)
我测试了它,它适用于每个浏览器,我有超过400个标记...
我知道很多其他人已经找到适用于他们特定情况的解决方案,但由于它们都不适用于我的特定情况,我认为这可能对其他人有帮助。
一些细节:
我在一个项目中使用google maps API v3,其中内联CSS是我们真正想要避免的。 我的infowindows正在为除IE11之外的所有东西工作,其中宽度未正确计算。 这导致了div溢出,触发了滚动条。
我必须做三件事:
从infowindow内容中的任何内容中删除所有显示:内联块样式规则(我用display:block替换) - 我有一个想法是从一个线程(我找不到了)中尝试这个,其中有人有相同的IE6的问题。
将内容作为DOM节点而不是字符串传递。 我正在使用jQuery,所以我可以通过替换: infowindow.setContent(infoWindowDiv.html());
with infowindow.setContent($(infoWindowDiv.html())[0]);
这对我来说最简单,但还有很多其他方法可以获得相同的结果。
使用“setMaxWidth”hack - 在构造函数中设置MaxWidth选项 - 稍后设置该选项不起作用。 如果你真的不想要最大宽度,只需将它设置为一个非常大的数字。
我不知道为什么这些有效,我不确定它们中的一部分是否有效。 我知道它们都不能单独用于我的所有用例,并且2 + 3不起作用。 我没时间测试1 + 2或1 + 3。
我不能接受硬编码信息窗口的宽度和高度,或设置white-space: nowrap
, maxWidth
解决方案没有帮助我,其他一切都不起作用或者不适合我用例。
我的解决方案是设置内容,打开窗口,然后在触发domready
事件时,将内容的height
CSS属性设置为height
,然后强制Google Maps相应地调整InfoWindow的大小。
infoWindow
是InfoWindow对象, $infoWindowContents
是我要放在那里的内容的Jquery对象, map
是我的Map对象。 marker
是点击的标记。
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);
(我在类似的问题上发布了相同的解决方案如何让google-maps InfoWindow调整大小以适应放在其中的内容? )
在失去时间和阅读一段时间后,我只是想要一些简单的东西,这个css符合我的要求。
.gm-style-iw > div { overflow: hidden !important; }
也不是即时解决方案,但主题/评论问题可能会让他们修复它,因为他们认为它已修复: http : //code.google.com/p/gmaps-api-issues/issues/detail?id = 5713
那么这就是为我做的伎俩:
.gm-style-iw>div {
overflow: visible !important;
}
只设置overflow: visible
.gm-style-iw
上的overflow: visible
实际上使问题变得更糟! 我在Chrome开发者工具检查器中注意到.gm-style-iw
元素中有两个div,两个都有overflow: auto
默认情况下overflow: auto
设置。
我在InfoWindows中显示了很多HTML格式的文本,这可能就是为什么其他解决方案对我来说根本不起作用的原因。
我遇到了同样的问题,当我的<h2>
元素包裹到第二行时尤其明显。
我将一个类应用于infoWindow中的<div>
,并将字体更改为通用系统字体(在我的情况下,Helvetica)与已使用的@ font-face Web字体。 问题解决了。
//infowindow.setContent(response);
var infowindowopts = {
maxWidth: 274,
content: response
};
infowindow.setOptions(infowindowopts);
我的答案是添加一个监听器(使用addListenerOnce)来检查infoWindow是否已添加到DOM,然后再次打开infoWindow(无需关闭它)。
// 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);
});
在infoWindow类元素中添加min-height
。
如果您的infoWindows大小相同,这将解决问题。
如果没有,请将此行jQuery添加到infoWindow的click函数中:
//remove overflow scrollbars
$('#myDiv').parent().css('overflow','');
我不能让它以任何形式或形式工作,我在盒子里包括3个div。 我将它们包裹在外部div中,宽度和高度都设置正确,没有任何效果。
最后我通过将div设置为绝对左上角来固定它,然后在div之前,我设置了两个图像,一个300px宽,1px高,一个120px高,1px宽,一个透明的gif。
它适当缩放然后!
它很难看,但它很有效。
你也可以做一个图像并设置我期望的zindex,如果你的窗口没有交互,甚至只有一个图像,但这包含一个表单,所以,这不是一个选项......
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.