请考虑:http://jsfiddle.net/msNs5/3/
我有一个map div,在页面加载时会扩展为完整大小,另一个半透明div覆盖它的底部。在美学上,我真的很喜欢底部div看起来背后的地图,但我需要做到这一点,以便透明div未覆盖的区域是“活跃”区域。
即。当地图计算标记和多边形的边界并设置其视图时,它会计算到该曝光区域而不是整个地图本身。人们似乎认为这是可能的,但我正在努力实际实施。
小提琴的代码如下:
// JavaScript
var map = L.map('map', { center: [51.505, -0.09], zoom: 13 });
osm = L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', {});
map.addLayer(osm);
function initMap() {
$('#map').css({"height": $(window).height() + "px"});
map.setView(map.getCenter(),map.getZoom());
}
var id;
$(window).resize(function() {
clearTimeout(id);
id = setTimeout(initMap, 500);
});
$('#map').css({"height": $(window).height() + "px"});
map.setView(map.getCenter(),map.getZoom());
/* CSS */
#map { position: fixed; z-index: -1; width: 100%; }
#header { height: 40px; background: black; }
#otherstuff { position: fixed; bottom: 0px; width: 100%; background-color: rgba(255,255,255,0.6); height: 30%; }
<!-- HTML --->
<!DOCTYPE html>
<body>
<div id="header"></div>
<div id="map"></div>
<div id="otherstuff">xxx</div>
</body>
答案 0 :(得分:2)
感谢#levelet频道上的@mourner,我被引导到这个Github问题线程,特别是这个评论:
https://github.com/Leaflet/Leaflet/issues/859#issuecomment-11436202
它定义了一个用于抵消地图中心的mixin:
MapCenterOffsetMixin = {
UIOffset: [550, 0], // x, y
getBounds: function(){
var a=this.getPixelBounds(),
b=this.unproject(new L.Point(a.min.x+this.UIOffset[0],a.max.y+this.UIOffset[1]), this._zoom,!0),
c=this.unproject(new L.Point(a.max.x,a.min.y),this._zoom,!0);
return new L.LatLngBounds(b,c)
},
_latLngToNewLayerPoint: function (latlng, newZoom, newCenter) {
var targetPoint = this.project(newCenter, newCenter).subtract([this.UIOffset[0]/2, this.UIOffset[1]/2]),
newCenter = this.unproject(targetPoint, newZoom);
var topLeft = this._getNewTopLeftPoint(newCenter, newZoom).add(this._getMapPanePos());
return this.project(latlng, newZoom)._subtract(topLeft);
},
_getCenterLayerPoint: function () {
return this.containerPointToLayerPoint(this.getSize().divideBy(2).add([this.UIOffset[0]/2, this.UIOffset[1]/2]));
},
_resetView: function (a, b, c, d) {
var e = this._zoom !== b;
// Change the center
var targetPoint = this.project(a, b).subtract([this.UIOffset[0] / 2, this.UIOffset[1]/2]),
a = this.unproject(targetPoint, b);
d || (this.fire("movestart"), e && this.fire("zoomstart")), this._zoom = b, this._initialTopLeftPoint = this._getNewTopLeftPoint(a);
if (!c) L.DomUtil.setPosition(this._mapPane, new L.Point(0, 0));
else {
var f = L.DomUtil.getPosition(this._mapPane);
this._initialTopLeftPoint._add(f)
}
this._tileLayersToLoad = this._tileLayersNum, this.fire("viewreset", {
hard: !c
}), this.fire("move"), (e || d) && this.fire("zoomend"), this.fire("moveend"), this._loaded || (this._loaded = !0, this.fire("load"))
}
}
L.Map.include(MapCenterOffsetMixin);
这对我很有用。