私はD3でこの問題に何度も遭遇しました。多くの場合、SVG上にHTMLオブジェクトをオーバーレイするのが好きです。
私の現在の戦略は、.html-overlayと呼ばれるSVG要素の横に空のDIVを作成することです。メイングラフィックのSVGで設定した内部パディング(例:20px)に従って配置します。次に、次の関数(jQueryを使用)を使用して、HTML要素をどこに配置するかを判断します。
//element is the object returned by D3 .append()
var getOffset: function(element) {
var $element = $(element[0][0]);
return {
left: $element.offset().left - $('.html-overlay').offset().left,
top: $element.offset().top - $('.html-overlay').offset().top
};
}
要素のオフセットをすばやく取得するには、内部(jQueryに依存しない)方法が必要だと思います。これは非常に便利です(特に、要素が複数の平行移動、回転、スケールなどを通過した後)。
また、要素の「中心」のオフセット、要素の最上点、最下部、左端、右端などを把握するための機能があると便利です。
ノート:
getBoundingClientRect()は、何らかの理由で正しい番号を提供しません。
var $element = $(element[0][0]);
console.log($element.offset(), element[0][0].getBoundingClientRect())
Object
left: 328
top: 248.8333282470703
__proto__: Object
ClientRect
bottom: 376.83331298828125
height: 139.99998474121094
left: 328
right: 478
top: 236.8333282470703
width: 150