d3 ライブラリが提供するズーム機能を一時的に無効にする可能性を探しています。ズームが無効になっているときに現在のスケール/変換値を洞窟に保存し、ズームが再びアクティブになったときにズーム/変換値を設定しようとしました。残念ながら、これは機能しません。
これが私が作成したコード例です:
var savedTranslation = null;
var savedScale = null;
var body = d3.select("body");
var svg = body.append("svg");
var svgContainer = svg.append("svg:g");
var circle = svgContainer.append("svg:circle")
.attr('cx', 100)
.attr('cy', 100)
.attr('r',30)
.attr('fill', 'red');
circle.on('click', clickFn);
function clickFn(){
if (circle.attr('fill') === 'red'){
circle.attr('fill','blue')
}
else if (circle.attr('fill') === 'blue'){
circle.attr('fill','red')
}
};
svg.call(zoom = d3.behavior.zoom().on('zoom', redrawOnZoom)).on('dblclick.zoom', null);
function redrawOnZoom(){
if (circle.attr('fill') === 'red'){
if (savedScale !== null){
zoom.scale(savedScale)
savedScale = null
}
if (savedTranslation !== null){
zoom.translate(savedTranslation)
savedTranslation = null
}
// the actual "zooming"
svgContainer.attr('transform', 'translate(' + d3.event.translate + ')' + ' scale(' + d3.event.scale + ')');
}
else {
// save the current scales
savedScale = zoom.scale()
savedTranslation = zoom.translate()
}
};
jsfiddle の実際の例を次に示します。
編集:
この誤った動作は、次の手順で再現できます。
- 円をクリックすると、色が青に変わり、ズームが機能しません
- マウス ホイールを 1 方向に数回使用して、ズームするようにします (ズームインなど)。
- 円をもう一度クリックすると、色が赤に変わり、ズームが再び有効になります
- マウス ホイールを使用すると、円が大きく/小さくなります