Browse Source

Update offset scroll coordinates

pull/5106/head
Artur Arseniev 3 years ago
parent
commit
55fb6b455e
  1. 16
      src/canvas/view/CanvasView.ts
  2. 2
      src/commands/view/SelectComponent.ts
  3. 14
      src/utils/dom.ts

16
src/canvas/view/CanvasView.ts

@ -1,7 +1,7 @@
import { bindAll } from 'underscore'; import { bindAll } from 'underscore';
import { ModuleView } from '../../abstract'; import { ModuleView } from '../../abstract';
import { on, off, getElement, getKeyChar, isTextNode, getElRect, getUiClass } from '../../utils/mixins'; import { on, off, getElement, getKeyChar, isTextNode, getElRect, getUiClass } from '../../utils/mixins';
import { createEl } from '../../utils/dom'; import { createEl, getDocumentScroll } from '../../utils/dom';
import FramesView from './FramesView'; import FramesView from './FramesView';
import Canvas from '../model/Canvas'; import Canvas from '../model/Canvas';
import FrameView from './FrameView'; import FrameView from './FrameView';
@ -19,7 +19,7 @@ export interface MarginPaddingOffsets {
paddingLeft?: number; paddingLeft?: number;
} }
export type ElementPosOpts = { export type ElementPosOpts = {
avoidFrameOffset?: boolean; avoidFrameOffset?: boolean;
avoidFrameZoom?: boolean; avoidFrameZoom?: boolean;
noScroll?: boolean; noScroll?: boolean;
@ -199,13 +199,13 @@ export default class CanvasView extends ModuleView<Canvas> {
* @return { {top: number, left: number, width: number, height: number} } * @return { {top: number, left: number, width: number, height: number} }
*/ */
offset(el?: HTMLElement, opts: ElementPosOpts = {}) { offset(el?: HTMLElement, opts: ElementPosOpts = {}) {
const rect = getElRect(el);
const docBody = el?.ownerDocument.body;
const { noScroll } = opts; const { noScroll } = opts;
const rect = getElRect(el);
const scroll = noScroll ? { x: 0, y: 0 } : getDocumentScroll(el);
return { return {
top: rect.top + (noScroll ? 0 : docBody?.scrollTop ?? 0), top: rect.top + scroll.y,
left: rect.left + (noScroll ? 0 : docBody?.scrollLeft ?? 0), left: rect.left + scroll.x,
width: rect.width, width: rect.width,
height: rect.height, height: rect.height,
}; };
@ -264,8 +264,8 @@ export default class CanvasView extends ModuleView<Canvas> {
const elTop = opts.avoidFrameZoom ? elRect.top : elRect.top * zoom; const elTop = opts.avoidFrameZoom ? elRect.top : elRect.top * zoom;
const elLeft = opts.avoidFrameZoom ? elRect.left : elRect.left * zoom; const elLeft = opts.avoidFrameZoom ? elRect.left : elRect.left * zoom;
const top = opts.avoidFrameOffset ? elTop : (elTop + frameTop - canvasOffset.top + canvasEl.scrollTop); const top = opts.avoidFrameOffset ? elTop : elTop + frameTop - canvasOffset.top + canvasEl.scrollTop;
const left = opts.avoidFrameOffset ? elLeft : (elLeft + frameLeft - canvasOffset.left + canvasEl.scrollLeft); const left = opts.avoidFrameOffset ? elLeft : elLeft + frameLeft - canvasOffset.left + canvasEl.scrollLeft;
const height = opts.avoidFrameZoom ? elRect.height : elRect.height * zoom; const height = opts.avoidFrameZoom ? elRect.height : elRect.height * zoom;
const width = opts.avoidFrameZoom ? elRect.width : elRect.width * zoom; const width = opts.avoidFrameZoom ? elRect.width : elRect.width * zoom;

2
src/commands/view/SelectComponent.ts

@ -690,7 +690,7 @@ export default {
* @private * @private
*/ */
getElementPos(el: HTMLElement) { getElementPos(el: HTMLElement) {
return this.canvas.getCanvasView().getElementPos(el); return this.canvas.getCanvasView().getElementPos(el, { noScroll: true });
}, },
/** /**

14
src/utils/dom.ts

@ -121,3 +121,17 @@ export const appendVNodes = (node: HTMLElement, vNodes: vNode | vNode[] = []) =>
node.appendChild(el); node.appendChild(el);
}); });
}; };
/**
* Get document scroll coordinates
*/
export const getDocumentScroll = (el?: HTMLElement) => {
const doc = el?.ownerDocument || document;
const docEl = doc.documentElement;
const win = doc.defaultView || window;
return {
x: (win.pageXOffset || docEl.scrollLeft || 0) - (docEl.clientLeft || 0),
y: (win.pageYOffset || docEl.scrollTop || 0) - (docEl.clientTop || 0),
};
};

Loading…
Cancel
Save