Получить значение масштаба элемента?
Мне интересно, как я могу получить значение масштаба элемента?
я пытался $(element).css('-webkit-transform');
который возвращается matrix(scaleX,0,0,scaleY,0,0);
Есть ли способ получить scaleX
а также scaleY
только?
7 ответов
Если это было определено матрицей, я думаю, что вы не можете простым способом, но вы можете легко проанализировать значение:
var matrixRegex = /matrix\((-?\d*\.?\d+),\s*0,\s*0,\s*(-?\d*\.?\d+),\s*0,\s*0\)/,
matches = $(element).css('-webkit-transform').match(matrixRegex);
matches[1]
будет содержать scaleX и matches[2]
будет содержать scaleY. Если возможно, что были применены и другие преобразования, вам нужно немного настроить регулярное выражение, поскольку теперь предполагается, что все остальные параметры равны 0.
Можно просто получить значения шкалы, чтобы удалить любые преобразования, измерить вычисленную ширину / высоту элемента, а затем добавить их обратно и измерить снова. Затем разделите новые / старые значения. Не пробовал, но это может сработать. Сам jQuery использует аналогичный подход для многих измерений, он даже имеет недокументированный $.swap()
Функция только для этого.
PS: вы используете -o-transform
-moz-transform
а также -ms-transform
тоже верно?
Самым простым решением для определения масштабного коэффициента между документом и элементом является следующее:
var element = document.querySelector('...');
var scaleX = element.getBoundingClientRect().width / element.offsetWidth;
Это работает, потому что getBoundingClientRect возвращает фактическое измерение, а offsetWidth/Height - это немасштабированный размер.
Если вам нужно настроить таргетинг только на webkit (потому что это для iPhone или iPad), самый надежный и быстрый способ - использовать нативный javascript webkit:
node = $("#yourid")[0];
var curTransform = new WebKitCSSMatrix(window.getComputedStyle(node).webkitTransform);
alert(curTransform.a); // curTransform is an object,
alert(curTransform.d); // a through f represent all values of the transformation matrix
Вы можете посмотреть демо здесь: http://jsfiddle.net/umZHA/
Вы можете использовать следующее:
var element = document.getElementById("elementID");
// returns matrix(1,0,0,1,0,0)
var matrix = window.getComputedStyle(element).transform;
var matrixArray = matrix.replace("matrix(", "").matrix.split(",");
var scaleX = parseFloat(matrixArray[0]); // convert from string to number
var scaleY = parseFloat(matrixArray[3]);
// bonus round - gets translate values
var translateX = parseFloat(matrixArray[4]);
var translateY = parseFloat(matrixArray[5]); // parseFloat ignores ")"
Более надежный и общий способ получить шкалу:
const { width, height } = element.getBoundingClientRect()
const scale = { x : element.offsetWidth / width, y : element.offsetHeight / height }
Он сравнивает визуальные размеры с немасштабированными размерами. Так что он будет работать даже с вложенными масштабируемыми элементами.
Слишком поздно для OP, но может быть полезно в будущем. Существует простой способ сделать это с помощью сплитов:
function getTransformValue(element,property){
var values = element[0].style.webkitTransform.split(")");
for (var key in values){
var val = values[key];
var prop = val.split("(");
if (prop[0].trim() == property)
return prop[1];
}
return false;
}
Это специфично для webkit, но может быть легко расширено для большего количества браузеров, изменяющих первую строку.
Использование регулярного выражения
element.style.transform.match(/scale\(([1-9\.])\)/)[1]