2016-04-11 21 views
6

Uso il plug-in d3-tip per mostrare suggerimenti per paesi. I paesi sono uno strato svg che si trova sulla parte superiore del livello base Leaflet. Desidero che i suggerimenti siano centrati all'interno di ogni stato. Ciò che attualmente funziona è ottimo per tutti i browser ad eccezione di Firefox. Firefox è lontano. Ho provato a regolare per Firefox, ma viene eliminato a seconda delle dimensioni della finestra del browser.offset d3-tip su svgs all'interno di Leaflet, solo Firefox, non funzionante

Qualche idea su come posso risolvere questo problema?

Ecco un Plunker: https://plnkr.co/edit/1FLMkbMSZmF59dxloIlY?p=preview

Schermata di come appare in Firefox quando si libra sopra il Texas: screenshot

Codice:

<!DOCTYPE html> 
    <html> 
     <head> 
     <meta charset="utf-8"> 
     <script src="http://d3js.org/d3.v3.min.js"></script> 
     <link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet-0.5/leaflet.css" /> 
      <!--[if lte IE 8]> 
      <link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet-0.5/leaflet.ie.css" /> 
      <![endif]--> 
     <script src="http://cdn.leafletjs.com/leaflet-0.5/leaflet-src.js"></script> 
     <script src="d3.tip.js"></script> 
     <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script> 
     <style> 
      body{ 
       margin: 0px; 
       font-family:Arial, sans-serif; 
      } 
      /* geojson components */ 
      #map { 
       width: 100%; 
       height: 100%; 
       position:absolute; 
       top:0; 
       left:0; 
       z-index:0; 
      } 
      path.states { fill: #ff3300; fill-opacity: .65; stroke: #fff; stroke-width: 3px;} 
      path.states:hover { 
       fill-opacity: 1; 
      } 
      /* Leaflet */ 
      .leaflet-container { 
       background: #ccc !important; 
      } 
      .leaflet-right { 
       right: 10px !important; 
      } 
      .leaflet-top { 
       top: 10px !important; 
      } 
      /* D3 tips for states*/ 
      .d3-tip-state { 
       line-height:130%; 
       font-weight: normal; 
       font-family: Helvetica, Arial, sans-serif; 
       font-size:13px; 
       padding: 12px; 
       background: rgba(205, 72, 122, 0.9); 
       color: #fff; 
       border-radius: 5px; 
       position:relative; 
       z-index:101; 
      } 
      /* Firefox styles */ 
      @-moz-document url-prefix() { 
       .d3-tip-state { 
       margin-left:-100px; 
       } 
      } 
     </style> 
     </head> 
    <body> 
    <div id="map"></div> 

    <script> 
    //tiles 
    var map = new L.Map("map", {zoomControl: true, center: [29, -92], zoom: 6}) 
     .addLayer(new L.tileLayer('http://server.arcgisonline.com/ArcGIS/rest/services/Ocean_Basemap/MapServer/tile/{z}/{y}/{x}', { 
     attribution: 'Tiles &copy; Esri &mdash; Sources: GEBCO, NOAA, CHS, OSU, UNH, CSUMB, National Geographic, DeLorme, NAVTEQ, and Esri', 
     maxZoom: 13 
     })); 

    /* Initialize the SVG layer */ 
    map._initPathRoot(); 

    var svg = d3.select("#map").select("svg"), 
     g = svg.append("g"); 

    /* Define the d3 projection */ 
    var path = d3.geo.path().projection(function project(x) { 
     var point = map.latLngToLayerPoint(new L.LatLng(x[1], x[0])); 
     return [point.x, point.y]; 
     }); 

     var firefox = /Firefox/i.test(navigator.userAgent); 

     var statetip = d3.tip() 
     .attr('class', 'd3-tip-state') 
     .offset(function(){ 
     if (firefox) { 
      return [(this.getBBox().height/6) - 200, -800] 
     }else{ 
      return [this.getBBox().height/2, 0] 
     } 
     }) 
     .html(function(d,i) { 
      return d.properties.name; 
     }); 

     g.call(statetip); 

     // Add states 
     d3.json("states.json", function(states) { 

     var states = g.selectAll("path") 
      .data(states.features) 
      .enter() 
      .append("path") 
      .attr("class", function(d){ return "states " + d.properties.postal;}) 
      .attr("d", path) 
      .on('mouseover', statetip.show) 
      .on('mouseout', statetip.hide); 

     map.on("viewreset", function reset() { 
      states.attr("d",path) 
     }) 
     }); 
    </script> 
    </body> 
    </html> 
+1

può essere correlato: https://bugzilla.mozilla.org/show_bug.cgi?id=612118 – paradite

risposta

5

analizzato il codice e modificate per l'atteso produzione. Controllare questo plunker:

Click here to view plunker page

We have achieved through Leaflet marker with Popup without d3.tip 

**OnMouseOver**: I get necessary info like latitude & longitude, 
tooltip text from data point and placed Leaflet marker with empty 
icon, then bind popup and opened it 

**OnMouseOut**: I have removed Leaflet marker layer from Map. 

Si prega di verificare il collegamento, il codice e fammi sapere il tuo feedback.

+0

Questa è una buona soluzione. Grazie mille per il vostro aiuto! – sprucegoose