devextreme
Version:
HTML5 JavaScript Component Suite for Responsive Web Development
135 lines (108 loc) • 3.57 kB
JavaScript
var dataUtils = require("../core/element_data"),
type = require("../core/utils/type").type;
var TRANSLATOR_DATA_KEY = "dxTranslator",
TRANSFORM_MATRIX_REGEX = /matrix(3d)?\((.+?)\)/,
TRANSLATE_REGEX = /translate(?:3d)?\((.+?)\)/;
var locate = function locate($element) {
var translate = getTranslate($element);
return {
left: translate.x,
top: translate.y
};
};
var move = function move($element, position) {
var left = position.left,
top = position.top,
translate;
if (left === undefined) {
translate = getTranslate($element);
translate.y = top || 0;
} else if (top === undefined) {
translate = getTranslate($element);
translate.x = left || 0;
} else {
translate = { x: left || 0, y: top || 0, z: 0 };
cacheTranslate($element, translate);
}
$element.css({
transform: getTranslateCss(translate)
});
if (isPercentValue(left) || isPercentValue(top)) {
clearCache($element);
}
};
var isPercentValue = function isPercentValue(value) {
return type(value) === "string" && value[value.length - 1] === "%";
};
var getTranslate = function getTranslate($element) {
var result = $element.length ? dataUtils.data($element.get(0), TRANSLATOR_DATA_KEY) : null;
if (!result) {
var transformValue = $element.css("transform") || getTranslateCss({ x: 0, y: 0 }),
matrix = transformValue.match(TRANSFORM_MATRIX_REGEX),
is3D = matrix && matrix[1];
if (matrix) {
matrix = matrix[2].split(",");
if (is3D === "3d") {
matrix = matrix.slice(12, 15);
} else {
matrix.push(0);
matrix = matrix.slice(4, 7);
}
} else {
matrix = [0, 0, 0];
}
result = {
x: parseFloat(matrix[0]),
y: parseFloat(matrix[1]),
z: parseFloat(matrix[2])
};
cacheTranslate($element, result);
}
return result;
};
var cacheTranslate = function cacheTranslate($element, translate) {
if ($element.length) {
dataUtils.data($element.get(0), TRANSLATOR_DATA_KEY, translate);
}
};
var clearCache = function clearCache($element) {
if ($element.length) {
dataUtils.removeData($element.get(0), TRANSLATOR_DATA_KEY);
}
};
var resetPosition = function resetPosition($element) {
$element.css({
left: 0,
top: 0,
transform: "none"
});
clearCache($element);
};
var parseTranslate = function parseTranslate(translateString) {
var result = translateString.match(TRANSLATE_REGEX);
if (!result || !result[1]) {
return;
}
result = result[1].split(",");
result = {
x: parseFloat(result[0]),
y: parseFloat(result[1]),
z: parseFloat(result[2])
};
return result;
};
var getTranslateCss = function getTranslateCss(translate) {
translate.x = translate.x || 0;
translate.y = translate.y || 0;
var xValueString = isPercentValue(translate.x) ? translate.x : translate.x + "px";
var yValueString = isPercentValue(translate.y) ? translate.y : translate.y + "px";
return "translate(" + xValueString + ", " + yValueString + ")";
};
exports.move = move;
exports.locate = locate;
exports.clearCache = clearCache;
exports.parseTranslate = parseTranslate;
exports.getTranslate = getTranslate;
exports.getTranslateCss = getTranslateCss;
exports.resetPosition = resetPosition;
;