我已设法在基本地图上添加一个图层,它看起来像这样:
我用jQuery直接修改了这个矩形 – 宽度,高度和溢出:隐藏.我不确定这是一个正确的方法,请告知是否有更好的方法.
我需要做的是当我通过鼠标拖动平移地图时,我希望顶部矩形图层保持在相同的位置但内容要分别更改,以便此矩形看起来像底图顶部的蒙版.正如我所看到的,正在应用Leaflet中的平移
-webkit-transform:translate3d(185px,178px,0)(我在Chrome中)
所以设置top:0和left:0没有帮助,矩形随着地图移动,就像它贴在地图上一样.
我相信有人处理了同样的任务,所以请告诉我.
更新:我添加了一个更好地说明我的问题的fiddle:
解决方法:
建议#1
你可以创建一个剪辑蒙版并在平移的相反方向上改变它的矩形.
像http://jsfiddle.net/gaby/dgWZk/23/这样的东西
var overlay = {
top: 50,
left: 50,
width: 200,
height: 200
}
map.on('move', repositionMask) ;
map.fire('move');
function repositionMask() {
var po = map.getPixelOrigin(),
pb = map.getPixelBounds(),
offset = map.getPixelOrigin().subtract(map.getPixelBounds().min);
$(layer02._container).css({
clip: 'rect(' + (overlay.top - offset.y) + 'px,' + (overlay.left + overlay.width - offset.x) + 'px,' + (overlay.top + overlay.height - offset.y) + 'px,' + (overlay.left - offset.x) + 'px)'
});
}
一个问题是传单方法在使用惯性进行平移时不会暴露动画变量,所以我们无法模仿那个..所以我已经禁用了地图的惯性..
放大/缩小时的另一个问题是,在动画期间,蒙版也会放大/缩小(但是一旦动画完成就会固定,或者你也可以设置zoomAnimation:false)
建议#2
另一种解决方案是创建第二个地图并叠加/同步它
像http://jsfiddle.net/gaby/dgWZk/24/这样的东西
<div id="container">
<div id="map"></div>
<div id="overlay"></div>
</div>
同
#container {
position:relative;
height:500px;
}
#map {
height: 500px;
position:absolute;
top:0;
left:0;
right:0;
bottom:0;
}
#overlay {
width: 200px;
height: 200px;
position:absolute;
top:50%;
left:50%;
margin-left:-200px;
margin-top:-200px;
outline:1px solid green;
pointer-events:none;
}
和
var map = new L.map('map',{
inertia:false
}).setView([51.505, -0.09], 13);
var overlay = new L.map('overlay', {
zoomControl: false,
inertia: false,
keyboard: false,
dragging: false,
scrollWheelZoom: false,
attributionControl:false,
zoomAnimation:false
}).setView([51.505, -0.09], 13);
var layer01 = L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png').addTo(map);
var layer02 = L.tileLayer('http://{s}.tile.stamen.com/watercolor/{z}/{x}/{y}.jpg').addTo(overlay);
map.on('move', function () {
var offset = overlay._getNewTopLeftPoint(map.getCenter()).subtract(overlay._getTopLeftPoint()).subtract([100,100]);
overlay.fire('movestart');
overlay._rawPanBy(offset);
overlay.fire('move');
overlay.fire('moveend');
}).on('zoomend', function () {
overlay.setView(map.getCenter(), map.getZoom(), true);
map.fire('move');
});
$(window).resize(function () {
overlay.setView(map.getCenter(), map.getZoom());
map.fire('move');
});
map.fire('move');