2016-05-16 8 views
2

D3のズーム動作の機能を利用したいと思いますが、変換メソッドの代わりにviewBoxプロパティを使用してSVGのすべての変換/スケーリングを行う必要がありますD3の例:http://bl.ocks.org/mbostock/3680999変換の代わりにViewBoxでD3ズームの動作を使用する方法

viewBoxのみを使用してこの同じスケール/変換を達成するにはどうすればよいですか?これまでのコードは、変換メソッドのようにはうまくいきません。

function zoomed(d) { 
    if (!scope.drawLine) { 
    var scale = d3.event.scale; 
    var translation = d3.event.translate; 

    //This works, but I can't use it for reason's I won't go into now 
    //mapSVG_G.attr("transform", "translate(" + d3.event.translate + ")scale(" + d3.event.scale + ")"); 

    var newViewBox = [ 
     initialViewBox[0] - translation[0], 
     initialViewBox[1] - translation[1], 
     initialViewBox[2]/scale, 
     initialViewBox[3]/scale 
     ]; 
     mapSVG.attr('viewBox', newViewBox); 
    } 
} 

答えて

0

少しオフが、スタートとしてあなたを提供できます。

主な作品:

var newViewBox = [ 
    -translate[0]/scale, 
    -translate[1]/scale, 
    width/scale, 
    height/scale 
].join(" "); 

全例:

var width = 960, 
 
    height = 500; 
 

 
var randomX = d3.random.normal(width/2, 80), 
 
    randomY = d3.random.normal(height/2, 80); 
 

 
var data = d3.range(2000).map(function() { 
 
    return [ 
 
    randomX(), 
 
    randomY() 
 
    ]; 
 
}); 
 

 
var svg = d3.select("body").append("svg") 
 
    .attr("width", width) 
 
    .attr("height", height) 
 
    .attr("viewBox", [0, 0, width, height].join(" ")) 
 

 
var vis = svg.append("g") 
 
    .call(d3.behavior.zoom().scaleExtent([1, 8]).on("zoom", zoom)) 
 
    .append("g"); 
 

 
vis.append("rect") 
 
    .attr("class", "overlay") 
 
    .attr("width", width) 
 
    .attr("height", height); 
 

 
vis.selectAll("circle") 
 
    .data(data) 
 
    .enter().append("circle") 
 
    .attr("r", 2.5) 
 
    .attr("transform", function(d) { 
 
    return "translate(" + d + ")"; 
 
    }); 
 

 
function zoom() { 
 
    var scale = d3.event.scale; 
 
    var translate = d3.event.translate; 
 

 
    var newViewBox = [ 
 
    -translate[0]/scale, 
 
    -translate[1]/scale, 
 
    width/scale, 
 
    height/scale 
 
    ].join(" "); 
 
    
 
    svg.attr('viewBox', newViewBox); 
 

 
}
.overlay { 
 
    fill: none; 
 
    pointer-events: all; 
 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>

+0

残念ながら、このソリューションの翻訳機能は正しくありません。 – Doughy

関連する問題