Skip to content

Commit e32683e

Browse files
committed
Generalize toolbox positioning to support relative-offset context elements
1 parent b9e720f commit e32683e

File tree

1 file changed

+17
-2
lines changed

1 file changed

+17
-2
lines changed

js/menu.js

+17-2
Original file line numberDiff line numberDiff line change
@@ -875,6 +875,21 @@ let referencePane = {
875875
},
876876
};
877877

878+
function getAbsoluteOffset(el, offsetName) {
879+
// "offsetTop" => "borderTopWidth", "offsetLeft" => "borderLeftWidth"
880+
const borderWidthName = offsetName.replace(/offset(.*)/, 'border$1Width');
881+
let d = el[offsetName];
882+
for (let parent = el.offsetParent; parent; parent = parent.offsetParent) {
883+
if (!parent.offsetParent) {
884+
break;
885+
}
886+
const parentStyle = getComputedStyle(parent);
887+
const parentBorderWidth = parentStyle[borderWidthName];
888+
d += (parseFloat(parentBorderWidth) || 0) + parent[offsetName];
889+
}
890+
return d;
891+
}
892+
878893
let Toolbox = {
879894
init() {
880895
this.$outer = document.createElement('div');
@@ -914,8 +929,8 @@ let Toolbox = {
914929
this.entry = entry;
915930
this.$pinLink.textContent = menu._pinnedIds[entry.id] ? 'Unpin' : 'Pin';
916931
this.$outer.classList.add('active');
917-
this.top = el.offsetTop - this.$outer.offsetHeight;
918-
this.left = el.offsetLeft - 10;
932+
this.top = getAbsoluteOffset(el, 'offsetTop') - this.$outer.offsetHeight;
933+
this.left = getAbsoluteOffset(el, 'offsetLeft') - 10;
919934
this.$outer.setAttribute('style', 'left: ' + this.left + 'px; top: ' + this.top + 'px');
920935
this.updatePermalink();
921936
this.updateReferences();

0 commit comments

Comments
 (0)