Google Maps API v3:InfoWindow没有正确调整大小

Jac*_*obT 82 html javascript css google-maps

当您单击我的Google Maps v3上的主页图标时,我的InfoWindow似乎无法自动调整InfoWindow的内容.

当它不应该时,它给滚动条.InfoWindow应该正确自动调整大小.

有什么想法吗?

根据请求,为InfoWindow注入HTML的相关JavaScript:

listing = '<div>Content goes here</div>';
Run Code Online (Sandbox Code Playgroud)

UPDATE

此错误由Google负责处理

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

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

Har*_*rry 32

在你的infowindow中添加一个div

<div id=\"mydiv\">YourContent</div>
Run Code Online (Sandbox Code Playgroud)

然后使用css设置大小.适合我.这假设所有的infowindows都是相同的大小!

#mydiv{
width:500px;
height:100px;
}
Run Code Online (Sandbox Code Playgroud)


for*_*ise 30

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

更长的故事:将v2地图迁移到v3,我看到了所描述的问题.Windows的宽度和高度各不相同,有些有垂直滚动条,有些没有.有些已经嵌入数据中,但至少有一个具有那么大的OK.

我没想到InfoWindowsOptions.maxWidth财产是相关的,因为我不在乎限制 ......但通过与信息窗口构造设置它的宽度,我得到了我想要的东西,而现在的Windows自动调整(垂直)和显示没有垂直滚动条的完整内容.对我来说没有多大意义,但它确实有效!

见:http://fortboise.org/maps/sailing-spots.html

  • **这可能在2010年有效,但截至2014年没有帮助.** (14认同)
  • 如果其他人试图将'maxWidth`设置为百分比,谷歌地图将识别浮动作为父项的百分比,并将其转换为像素等效:声明`{"maxWidth":0.25}`,父元素宽度为1000px,InfoWindow的宽度为:250px.我不认为可以强制InfoWindow的宽度保持一个百分比(`maxWidth`的值必须是一个数字,所以`{"maxWidth":"25%"}`将不起作用和`{"maxWidth": 25%}`被处理25模数未定义并触发语法错误). (2认同)

小智 24

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

var $infoWindowContent = $("<div class='infowin-content'>Content goes here</div>");
var infoWindow = new google.maps.InfoWindow();
infowindow.setContent($infoWindowContent[0]);
Run Code Online (Sandbox Code Playgroud)

  • 好的,这工作得很好,非常感谢...现在我想知道为什么:) (4认同)
  • 出于某种原因,当您传入DOM节点而不是字符串时,map API似乎不会在InfoWindow DIV上放置`overflow:auto`.如果内容仅超出1-2px,则可解决此问题.不幸的是,这意味着更长的内容实际上*挂起了InfoWindow*,而不是添加了滚动条. (3认同)
  • 这是我见过的最奇怪的修复之一.除了这个,这个问题的其他任何一个黑客都没有为我工作.难以置信的. (2认同)

Rej*_*ath 21

.gm-style-iw{
    height: 100% !important;
    overflow: hidden !important;
}
Run Code Online (Sandbox Code Playgroud)

这个对我有用


Ada*_*dam 21

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

好的,所以我知道这个帖子已经老了,并且有一千个答案,但是没有一个是正确的,我觉得需要发布正确的答案.

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

其次,谷歌地图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);
Run Code Online (Sandbox Code Playgroud)

出于所有意图和目的,谷歌地图临时放置div在页面的末尾(实际上它创建了一个detached DOM tree- 但在概念上更容易理解,如果我说你想象一个div位于页面末尾的地方)与你的HTML内容指定.然后它测量div(这意味着,在这个例子中,我的文档中的任何CSS规则都适用于它h1并且p标签将被应用于它)以获得它widthheight.然后,谷歌div会对其进行测量,将测量结果附加到页面上,并将其放置在您指定位置的地图上.

这是许多人遇到问题的地方 - 他们可能有这样的HTML:

<body>
 <div id="map-canvas"><!-- google map goes here --></div>
</body>
Run Code Online (Sandbox Code Playgroud)

并且,无论出于何种原因,CSS看起来像这样:

h1 { font-size: 18px; }
#map-canvas h1 { font-size: 32px; }
Run Code Online (Sandbox Code Playgroud)

你能看到问题吗?当API尝试为您进行测量时infoWindow(在显示它之前),h1内容的一部分将具有大小18px(因为临时"测量div"附加到正文),但是当API实际放置infoWindow时在地图中,#map-canvas h1选择器将优先使字体大小与API测量大小时的字体大小大不相同infoWindow,在这种情况下,您将始终获得滚动条.

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

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

所以我一直这样做,是这样的:

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

在我的CSS中:

.info-window-content { ... }
.info-window-content h1 { .... }
.info-window-content p { ... }
etc...
Run Code Online (Sandbox Code Playgroud)

所以无论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
 ...
}
Run Code Online (Sandbox Code Playgroud)

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


小智 12

我尝试了列出的每个答案.没有人为我工作.这终于永久修复了它.我继承的代码包含DIV了所有<h#><p>条目的包装器.我只是在同一个DIV中强制一些"风格",考虑到所需的最大宽度,投入线高度变化以防万一(别人的修复)和我自己的white-space: nowrap,然后使自动溢出进行正确的调整.没有滚动条,没有截断,没有问题!

html = '<div class="map-overlay" style="max-width: 400px;
                                        line-height: normal;
                                        white-space: nowrap;
                                        overflow: auto;
                                       ">';
Run Code Online (Sandbox Code Playgroud)

  • 这个!在我到达这里之前,我的所有答案都没有成功.在我的情况下,它是具有魔力的`white-space:nowrap` - 其他样式是不必要的.干杯! (7认同)

Mik*_*ike 9

我知道这是一个旧线程,但我刚遇到同样的问题.我在InfoWindow中有<h2><p>元素,这些都有底部边缘.我删除了边距,InfoWindow的大小正确.没有其他建议的修复工作.我怀疑InfoWindow大小计算没有考虑边距.

  • 我仍然有问题,但只是把所有东西都包裹在`<div style ='overflow:hidden;'> </ div>中.现在看起来很好. (2认同)

Jen*_*Jen 9

要将我的答案添加到列表中,因为这些都没有解决我的问题.我最终将我的内容包装在div中,给div一个类,并min-width在div上指定,maxWidth并在infoWindow上指定它们,并且它们都需要是相同的大小,否则宽度或高度将溢出在包含错误内容的盒子上.

使用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
});
Run Code Online (Sandbox Code Playgroud)

CSS:

div.infowindow-content {
    min-width: 350px;
}
Run Code Online (Sandbox Code Playgroud)

  • 在内容上设置"min-width"也是唯一对我有用的东西.不必在infoWindow上设置`maxWidth`. (2认同)

小智 7

我已经尝试了所有这些解决方案,没有一个工作.经过一些试验和错误,我想出来了.

<style type="text/css">
#map_canvas {
    line-height:normal;
}
</style>
Run Code Online (Sandbox Code Playgroud)

设置line-height:地图canvas div的normal.


Con*_*211 7

似乎问题出在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>
Run Code Online (Sandbox Code Playgroud)


Hou*_*and 5

有趣的是,以下代码将纠正 WIDTH 滚动条:

.gm-style-iw
{
    overflow: hidden !important;
    line-height: 1.35;

}
Run Code Online (Sandbox Code Playgroud)

用这个来纠正 HEIGHT 滚动条:

    .gm-style-iw div
    {
        overflow: hidden !important;
    }
Run Code Online (Sandbox Code Playgroud)

编辑: 添加空格:nowrap; 任何一种风格都可能纠正移除滚动条时似乎仍然存在的间距问题。伟大的点内森。


Ste*_*nby 0

使用 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我尝试只执行 setTimeout(/* show infowin callback */, 100),但有时如果内容(即:图像)加载时间太长,则仍然不起作用。

希望这对你有用。