当容器稍微扩展时,一切工作都很好(显然,这是因为边界后面的图块已加载)。但是,当容器显着扩展时(在下面的示例中,宽度从300像素扩展到1000像素),剩下的空白空间。
如何使地图重绘并适应新的尺寸?
在所有图层上调用
redraw()
都无济于事。放大和缩小都没有。我用Opera,Chrome和Firefox中描述的结果对它进行了测试。
在IE8中,令人惊讶的是,问题没有发生,并且地图自动适应。
用于测试的简化网页:
<html>
<head>
<style>
#mapbox {
width: 300px;
height: 500px;
border: 1px solid black;
}
</style>
<script src="http://openlayers.org/api/OpenLayers.js"></script>
</head>
<body>
<div id="mapbox"></div>
<input type="button" id="test" value="resize">
<script>
var map = new OpenLayers.Map('mapbox');
map.addLayer(new OpenLayers.Layer.OSM());
map.setCenter(
new OpenLayers.LonLat(1000000, 7000000), 5);
document.getElementById('test').onclick = function() {
document.getElementById('mapbox').style.width = '1000px';
}
</script>
</body>
</html>
#1 楼
您需要调用API来更新地图尺寸。http://dev.openlayers.org/docs/files/OpenLayers/Map-js.html#OpenLayers.Map.updateSize
这是我们的操作方法
window.onresize = function()
{
setTimeout( function() { map.updateSize();}, 200);
}
您可以看到我们稍有延迟,但我不记得确切的原因,但是在调用API调整自身大小之前要稍等一下。
#2 楼
是的,使用Vadim所说的map.updateSize()(也不知道为什么会延迟!)地图容器的类,然后调用updateSize()function toggleFullScreen(mapContainer) {
if ($(mapContainer).hasClass("normal")) {
$(mapContainer).addClass("fullscreen").removeClass("normal");
} else {
$(mapContainer).addClass("normal").removeClass("fullscreen");
}
map.updateSize();
}
#3 楼
对第一个(正确)答案的另一条评论:如果您等待window.resize事件,则需要timeout-Event。否则,如果用户开始调整窗口大小,则地图将每毫秒调整大小(Firefox需要使用该大小)。因此,如果要检查“窗口大小”,则超时是非常有用的响应。需要。请参阅:https://stackoverflow.com/questions/5489946/jquery-how-to-wait-for-the-end-or-resize-event-and-only-then-perform-an-ac或jQuery调整大小结束事件
(对不起,我无法添加评论,因此有另一个答案)
#4 楼
不优雅,但对我来说很好用window.onresize = function(event)
{
map.zoomOut(); map.zoomIn();
}
评论
这是唯一对我有用的答案
–马修·洛克(Matthew Lock)
17年11月24日在10:11
#5 楼
我尝试了此处描述的所有内容,但对我没有任何帮助。因此,我意识到当我在地图上放置“全屏”类时,未触发resize事件。我使用以下方法解决此问题:
$(window).trigger('resize');
#6 楼
上面使用setTimeout的方式对我来说没有多大意义(可能是较旧的OL版本的解决方法),但是setTimeout可用于减少对map.updateSize()和其他相关代码的调用次数this:$(window).resize(function () {
if (window.resizeMapUpdateTimer) {
clearTimeout(window.resizeMapUpdateTimer)
}
window.resizeMapUpdateTimer= setTimeout(function () {
// Update container size
map.updateSize()
}, 200)
})
#7 楼
我认为自动更改地图div的样式会更改地图面板的大小。document.getElementById("map-panel").style.width = "500px";
我希望它可以帮助您...
评论
更改大小后,更改容器的大小属性仅适用于地图,但不适用于绘制的要素。添加updateSize()确保功能可见。
–科德
2012年12月21日在9:47
#8 楼
这对我有用:this.$nextTick(
function() {
OL_MAP_INSTANCE.updateSize();
}
);
$ nextTick很重要,因为它可以等待下一次刷新,然后再考虑新的地图容器大小。 br />
评论
好吧,我相信延迟是您的应用程序特定的。 ;)无论如何,谢谢,我再次错过了文档中的内容。
–Imp
2012年8月14日12:32
我也没有看到延迟的原因,因此将其排除在外。谢谢
–zod
13年1月14日在11:56
@Vadim Great anser,但不适用于我。我的代码就像body onload = init()一样,init初始化地图。是因为这个吗?另外,这将是响应式设计的好解决方案吗? window.onload = window.onresize = function(){//在这里调整大小。谢谢
– slevin
13年11月19日,0:07
我想知道setTimout是否试图使其仅每200ms调用一次。不幸的是,这有点复杂,需要有一个每200毫秒运行一次的setInterval,然后有一个布尔变量didResize,该值设置为true onresize(),并在调用map.updateSize()之后设置为false。
– andrewb
2014年2月4日在6:06
setTimeout可能会确保加载地图并渲染dom的其余部分。由于缺乏对木偶视图生命周期的了解,我目前正在使用相同的技巧。
–ca0v
2015年3月30日14:44