diff --git a/src/canvas/index.js b/src/canvas/index.js index 80ab9c642..38ed97296 100644 --- a/src/canvas/index.js +++ b/src/canvas/index.js @@ -402,7 +402,7 @@ export default () => { return result; }, - canvasRectOffset(el, pos) { + canvasRectOffset(el, pos, opts = {}) { const getFrameElFromDoc = doc => { const { defaultView } = doc; return defaultView && defaultView.frameElement; @@ -412,11 +412,17 @@ export default () => { const zoom = this.em.getZoomDecimal(); const side = top ? 'top' : 'left'; const doc = el.ownerDocument; - const { offsetTop = 0, offsetLeft = 0 } = getFrameElFromDoc(doc); + const { offsetTop = 0, offsetLeft = 0 } = opts.offset + ? getFrameElFromDoc(doc) + : {}; const { scrollTop = 0, scrollLeft = 0 } = doc.body || {}; const scroll = top ? scrollTop : scrollLeft; const offset = top ? offsetTop : offsetLeft; + // if (!top) { + // console.log('LEFT', { posLeft: pos[side], scroll, offset }, el); + // } + return pos[side] - (scroll - offset) * zoom; }; @@ -434,7 +440,7 @@ export default () => { const elRight = pos.left + pos.width; const cv = this.getCanvasView(); const frCvOff = cv.getPosition(); - const frameOffset = cv.getFrameOffset(); + const frameOffset = cv.getFrameOffset(el); const { event } = opts; let top = -toolbarH; @@ -565,7 +571,7 @@ export default () => { startAutoscroll() { this.dragging = 1; let toListen = this.getScrollListeners(); - frameRect = CanvasView.getFrameOffset(1); + frameRect = CanvasView.getFrameOffset(); // By detaching those from the stack avoid browsers lags // Noticeable with "fast" drag of blocks diff --git a/src/canvas/view/CanvasView.js b/src/canvas/view/CanvasView.js index 7f052ecda..82dc4adf2 100644 --- a/src/canvas/view/CanvasView.js +++ b/src/canvas/view/CanvasView.js @@ -118,8 +118,9 @@ export default Backbone.View.extend({ * @return {Boolean} */ isElInViewport(el) { - const rect = getElRect(getElement(el)); - const frameRect = this.getFrameOffset(); + const elem = getElement(el); + const rect = getElRect(elem); + const frameRect = this.getFrameOffset(elem); const rTop = rect.top; const rLeft = rect.left; return ( @@ -356,8 +357,13 @@ export default Backbone.View.extend({ * @return {Object} * @private */ - getFrameOffset(force = 0) { - if (!this.frmOff || force) this.frmOff = this.offset(this.frame.el); + getFrameOffset(el) { + if (!this.frmOff || el) { + const frEl = el + ? el.ownerDocument.defaultView.frameElement + : this.frame.el; + this.frmOff = this.offset(frEl); + } return this.frmOff; }, @@ -380,7 +386,7 @@ export default Backbone.View.extend({ getElementPos(el, opts) { const zoom = this.getZoom(); var opt = opts || {}; - var frmOff = this.getFrameOffset(); + var frmOff = this.getFrameOffset(el); var cvsOff = this.getCanvasOffset(); var eo = this.offset(el, opts);