element.js 1.7 KB
Newer Older
K
Kamran Ahmed 已提交
1 2 3
import Position from './position';

export default class Element {
K
Kamran Ahmed 已提交
4 5 6
  /**
   * DOM element object
   * @param node
K
Kamran Ahmed 已提交
7
   * @param options
K
Kamran Ahmed 已提交
8
   */
K
Kamran Ahmed 已提交
9 10
  constructor(node, options) {
    this.node = node;
K
Kamran Ahmed 已提交
11
    this.document = document;
K
Kamran Ahmed 已提交
12 13
    this.window = window;
    this.options = options;
K
Kamran Ahmed 已提交
14 15
  }

K
Kamran Ahmed 已提交
16 17 18 19
  /**
   * Gets the screen co-ordinates (x,y) for the current dom element
   * @returns {{x: number, y: number}}
   */
K
Kamran Ahmed 已提交
20
  getScreenCoordinates() {
K
Kamran Ahmed 已提交
21
    let tempNode = this.node;
K
Kamran Ahmed 已提交
22 23 24 25 26 27 28 29 30 31 32 33 34 35

    let x = this.document.documentElement.offsetLeft;
    let y = this.document.documentElement.offsetTop;

    if (tempNode.offsetParent) {
      do {
        x += tempNode.offsetLeft;
        y += tempNode.offsetTop;
      } while (tempNode = tempNode.offsetParent);
    }

    return { x, y };
  }

K
Kamran Ahmed 已提交
36 37 38 39 40
  /**
   * Gets the calculated position on screen, around which
   * we need to draw
   */
  getCalculatedPosition() {
K
Kamran Ahmed 已提交
41 42 43 44 45 46 47 48 49 50
    const coordinates = this.getScreenCoordinates();
    const position = new Position({
      left: Number.MAX_VALUE,
      top: Number.MAX_VALUE,
      right: 0,
      bottom: 0,
    });

    // If we have the position for this element
    // and the element is visible on screen (has some height)
K
Kamran Ahmed 已提交
51
    if (typeof coordinates.x === 'number' && typeof coordinates.y === 'number' && (this.node.offsetWidth > 0 || this.node.offsetHeight > 0)) {
K
Kamran Ahmed 已提交
52 53
      position.left = Math.min(position.left, coordinates.x);
      position.top = Math.min(position.top, coordinates.y);
K
Kamran Ahmed 已提交
54 55
      position.right = Math.max(position.right, coordinates.x + this.node.offsetWidth);
      position.bottom = Math.max(position.bottom, coordinates.y + this.node.offsetHeight);
K
Kamran Ahmed 已提交
56 57 58 59
    }

    return position;
  }
60 61 62 63 64

  onHighlighted() {
    console.log('on highlighted');
    console.log(this.getScreenCoordinates());
  }
K
Kamran Ahmed 已提交
65
}