UNPKG

animejs

Version:

JavaScript animation engine

66 lines (60 loc) 2.15 kB
/** * Anime.js - core - ESM * @version v4.3.6 * @license MIT * @copyright 2026 - Julian Garnier */ import { valueTypes, doc } from './consts.js'; import { isUnd, PI } from './helpers.js'; const angleUnitsMap = { 'deg': 1, 'rad': 180 / PI, 'turn': 360 }; const convertedValuesCache = {}; /** * @import { * DOMTarget, * TweenDecomposedValue, * } from '../types/index.js' */ /** * @param {DOMTarget} el * @param {TweenDecomposedValue} decomposedValue * @param {String} unit * @param {Boolean} [force] * @return {TweenDecomposedValue} */ const convertValueUnit = (el, decomposedValue, unit, force = false) => { const currentUnit = decomposedValue.u; const currentNumber = decomposedValue.n; if (decomposedValue.t === valueTypes.UNIT && currentUnit === unit) { // TODO: Check if checking against the same unit string is necessary return decomposedValue; } const cachedKey = currentNumber + currentUnit + unit; const cached = convertedValuesCache[cachedKey]; if (!isUnd(cached) && !force) { decomposedValue.n = cached; } else { let convertedValue; if (currentUnit in angleUnitsMap) { convertedValue = currentNumber * angleUnitsMap[currentUnit] / angleUnitsMap[unit]; } else { const baseline = 100; const tempEl = /** @type {DOMTarget} */(el.cloneNode()); const parentNode = el.parentNode; const parentEl = (parentNode && (parentNode !== doc)) ? parentNode : doc.body; parentEl.appendChild(tempEl); const elStyle = tempEl.style; elStyle.width = baseline + currentUnit; const currentUnitWidth = /** @type {HTMLElement} */(tempEl).offsetWidth || baseline; elStyle.width = baseline + unit; const newUnitWidth = /** @type {HTMLElement} */(tempEl).offsetWidth || baseline; const factor = currentUnitWidth / newUnitWidth; parentEl.removeChild(tempEl); convertedValue = factor * currentNumber; } decomposedValue.n = convertedValue; convertedValuesCache[cachedKey] = convertedValue; } decomposedValue.t === valueTypes.UNIT; decomposedValue.u = unit; return decomposedValue; }; export { convertValueUnit };