Skip to content

Instantly share code, notes, and snippets.

@vincentorback
Last active January 8, 2017 13:31
Show Gist options
  • Save vincentorback/322ba1c91bfac7325b168383c70b2a9d to your computer and use it in GitHub Desktop.
Save vincentorback/322ba1c91bfac7325b168383c70b2a9d to your computer and use it in GitHub Desktop.
Get element offset within viewport
/**
* Get element offset
* @param {Element} obj
* @return {Boolean}
*/
export function getElementViewportOffset (element) {
let left = element.offsetLeft,
top = element.offsetTop,
elementParent = element.parentNode
do {
let styles = getComputedStyle(elementParent)
if (styles) {
let position = styles.getPropertyValue('position')
left -= elementParent.scrollLeft
top -= elementParent.scrollTop
if (/relative|absolute|fixed/.test(position)) {
left += parseInt(styles.getPropertyValue('border-left-width'), 10)
top += parseInt(styles.getPropertyValue('border-top-width'), 10)
left += elementParent.offsetLeft
top += elementParent.offsetTop
}
elementParent = position === 'fixed' ? null : elementParent.parentNode
} else {
elementParent = elementParent.parentNode
}
} while (elementParent && isElement(elementParent))
return {
left: left,
top: top
}
}
/**
* Check if variable is element
* @param {Anything}
* @return {Boolean}
*/
export function isElement (obj) {
try {
return obj instanceof HTMLElement
}
catch(e) {
return
(typeof obj === 'object') &&
(obj.nodeType === 1) &&
(typeof obj.style === 'object') &&
(typeof obj.ownerDocument ==='object')
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment