2013-03-18 53 views
2

請考慮:http://jsfiddle.net/msNs5/3/如何指定傳單地圖的「活動」區域?

我有一個地圖div在頁面加載時擴大到全尺寸,另一個半透明div覆蓋它的底部。美學上,我真的很喜歡底部div如何與背後的地圖一起看,但我需要做到這一點,以便未被透明div覆蓋的區域是「活動」區域。

I.E.當地圖計算標記和多邊形的界限並設置它的視圖時,它會計算出該地圖區域,而不是整個地圖本身。人們似乎認爲這是可能的,但我正在努力與實際的實施。

代碼從小提琴低於:

// 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> 

回答

2

由於在#leaflet通道@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); 

這個工作對我非常好。