d3.js V 4.0を使用して、SVGでズームとパンを提供しています。私はリセットボタンを実装して画像の中央に戻しています。動作していますが、デフォルトのd3.interpolateZoomを使用しているため、トランジション中に画像がズームアウトします。スケーリングで標準の補間をしたいだけですが、ズーム動作のためにインターポレータを変更する方法はわかりません。d3.jsのズーム動作の補間方法を変更するには
var map = document.querySelector('#map');
var everything = d3.select('#everything');
var zoomBehavior = d3.zoom();
zoomBehavior.scaleExtent([0.5, 10])
.on('zoom', zoomed);
d3.select(map).call(zoomBehavior);
function zoomed() {
everything.attr('transform', d3.event.transform);
}
function reset() {
d3.select(this.map)
.transition()
.duration(1000)
.call(zoomBehavior.transform, d3.zoomIdentity);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.1.0/d3.min.js"></script>
<svg id="map" version="1.1" xmlns="http://www.w3.org/2000/svg">
<g id="everything">
<circle r="5" cx="50" cy="15"></circle>
</g>
</svg>
<button onclick="reset()">reset</button>
残念ながら、これは私が見てい挙動を示すされていません。ここで は、コードの簡略版です。 (私の実際のバージョンでは、スケールkはvan Wijk smooth zoomingを使って0を補間します)しかし、問題はまだ有効です。このズーム動作のためにインターポレータを変更する場合、どのように、どこでそれを行うのですか?ドキュメントが示唆していると思われるzoomBehavior.interpolate(d3.interpolate)を呼び出そうとしましたが、zoomBehavior.interpolateが関数ではないことを示すエラーが表示されます。
私は私の中でそれをしようとすると、あなたの例では、コードスニペットで素晴らしい作品ながらトゥイーンで返された関数は一度しか呼び出されないので、変換doe snotが実際に発生します。どんなアイデアでも、これが何度も繰り返し実行されるのではなく、一回だけ起動する原因になるでしょうか? – EricJ
@EricJ、あなたが与えた限られた情報では非常に難しいです。特定のコードで再現可能な例を作成できますか? – Mark
スニペットやその他のシステムで問題を再現できないようです。そのシステムに何か問題があるはずです。 – EricJ