Я столкнулся с этой проблемой много с D3. Много времени мне нравится накладывать HTML-объекты поверх SVG.
Моя текущая стратегия создает пустой DIV рядом с элементом SVG, который называется .html-overlay. Я размещаю его в соответствии с внутренним заполнением, которое я установил в 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