UNPKG

@antv/x6

Version:

JavaScript diagramming library that uses SVG and HTML for rendering

57 lines (49 loc) 1.64 kB
import { computeStyle, computeStyleInt } from './css' import { isElement } from './elem' export function offset(elem: Element) { const rect = elem.getBoundingClientRect() const win = elem.ownerDocument.defaultView! return { top: rect.top + win.pageYOffset, left: rect.left + win.pageXOffset, } } export function width(elem: Element) { const rect = elem.getBoundingClientRect() return rect.width } export function height(elem: Element) { const rect = elem.getBoundingClientRect() return rect.height } export function position(elem: Element) { const isFixed = computeStyle(elem, 'position') === 'fixed' let offsetValue: ReturnType<typeof offset> if (isFixed) { const rect = elem.getBoundingClientRect() offsetValue = { left: rect.left, top: rect.top } } else { offsetValue = offset(elem) } if (!isFixed) { const doc = elem.ownerDocument let offsetParent = (elem as any).offsetParent || doc.documentElement while ( (offsetParent === doc.body || offsetParent === doc.documentElement) && computeStyle(offsetParent, 'position') === 'static' ) { offsetParent = offsetParent.parentNode } if (offsetParent !== elem && isElement(offsetParent)) { const parentOffset = offset(offsetParent) offsetValue.top -= parentOffset.top + computeStyleInt(offsetParent, 'borderTopWidth') offsetValue.left -= parentOffset.left + computeStyleInt(offsetParent, 'borderLeftWidth') } } return { top: offsetValue.top - computeStyleInt(elem, 'marginTop'), left: offsetValue.left - computeStyleInt(elem, 'marginLeft'), } }