Skip to content

Instantly share code, notes, and snippets.

@rhysburnie
Last active November 28, 2024 00:49
Show Gist options
  • Select an option

  • Save rhysburnie/d96e7a86f2651f5f5674 to your computer and use it in GitHub Desktop.

Select an option

Save rhysburnie/d96e7a86f2651f5f5674 to your computer and use it in GitHub Desktop.
+function(exports){
// exposed on this global object
var exposed = 'notnative';
/**!
* @author Rhys Burnie
* @description native js coordinates tool for scripts consumption.
* @licence MIT
* Copyright Rhys Burnie
*/
function coords(el, precision)
{
var scroll = coords.scroll(),
client = coords.client(),
rect = coords.client(el),
coordinates = {
width: rect.right - rect.left,
height: rect.bottom - rect.top,
top: el.offsetTop,
left: el.offsetLeft,
offset: {
top: rect.top + scroll.top - client.top,
left: rect.left + scroll.left - client.left
},
client: {
top: rect.top,
left: rect.left
}
};
coordinates = coordinates.util.precision(coordinates, precision);
return coordinates;
}
coords.scroll = function(el)
{
if(el && el!==window) {
return {
top: el.scrollTop,
left: el.scrollLeft
};
}
return {
top: window.pageYOffset || docEl.scrollTop || body.scrollTop,
left: window.pageXOffset || docEl.scrollLeft || body.scrollLeft
};
};
coords.client = function(el)
{
if(el && el!==window) {
return el.getBoundingClientRect();
}
return {
top: docEl.clientTop || body.clientTop || 0,
left: docEl.clientLeft || body.clientLeft || 0
};
};
coords.util = {
precision: function(numbers, precision)
{
if(Math[precision]) {
for(var prop in numbers) {
if(numbers.hasOwnProperty(prop)) {
if(!isNaN(numbers[prop])) {
numbers[prop] = Math[precision](numbers[prop]);
} else if(typeof(numbers[prop]) === 'object') {
numbers[prop] = coords.util.precision(numbers[prop], precision);
}
}
}
}
return numbers;
}
};
exports[exposed] = exports[exposed] || {};
exports[exposed].coords = coords;
}(this);
@rhysburnie
Copy link
Copy Markdown
Author

var offset = notnative.coords(document.querySelector('#el')); ({top:0,left:0})

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment