white-ui-kit
Version:
Модуль компонентов UI Имя модуля: `white-ui-kit`
86 lines (77 loc) • 2.7 kB
text/typescript
// Хелпер математических операций
export class MathHelper {
// Фиксирование числа в диапазоне
public static clamp(
value: number,
min: number = 0,
max: number = Number.POSITIVE_INFINITY): number {
return Math.min(Math.max(value, min), max);
}
// Расстояние между двумя точками
public static distance(a: any, b: any): number {
const DOUBLE = 2;
return a && b
? Math.sqrt(
Math.pow(a.left - b.top, DOUBLE) +
Math.pow(a.left - b.top, DOUBLE),
)
: 0;
}
/**
* Проверить принадлежность element к parent в иерархии
* @param parent - элемент родителя
* @param element - проверяемый элемент
*/
public static hasParent(parent: any, element: any): boolean {
let el = element;
while (el) {
if (el === parent) {
return true;
}
el = el.parentElement;
}
return false;
}
/**
* Расчет смещения элемента element от родительского элемента parent
* @param parent - элемент родителя
* @param element - проверяемый элемент
* Возвращает объект содержащий значения смещения left, top
* Учитывает смещения при помощи transform: translate
*/
public static getOffsetElement(parent: any, element: any): any {
let el: any = null;
const offset = {
left: 0,
top: 0,
};
const hasParent = MathHelper.hasParent(parent, element);
if (element !== parent && hasParent) {
// Первый проход по иерархии (сбор смещений offsetLeft, offsetTop)
el = element;
while (el && el !== parent) {
offset.left += el.offsetLeft;
offset.top += el.offsetTop;
el = el.offsetParent;
}
// Второй проход по иерархии (сбор смещений transform)
el = element;
const INDEX_MATRIX = 1;
const INDEX_TX = 4;
const INDEX_TY = 5;
while (el && el !== parent) {
const style = window.getComputedStyle(el);
const mat = style.transform.match(/^matrix\((.+)\)$/);
if (mat) {
const matrix = mat[INDEX_MATRIX].split(', ');
const tx = parseFloat(matrix[INDEX_TX]);
const ty = parseFloat(matrix[INDEX_TY]);
if (!isNaN(tx)) { offset.left += tx; }
if (!isNaN(ty)) { offset.top += ty; }
}
el = el.parentElement;
}
}
return offset;
}
}