Получить масштабное значение элемента?

#javascript #jquery #css

#javascript #jquery #css

Вопрос:

Мне интересно, как я могу получить масштабное значение элемента?

Я пробовал, $(element).css('-webkit-transform'); который возвращает matrix(scaleX,0,0,scaleY,0,0); Есть ли способ получить scaleX и scaleY только?

Ответ №1:

Самым простым решением для определения масштабного коэффициента между документом и элементом является следующее:

 var element = document.querySelector('...');
var scaleX = element.getBoundingClientRect().width / element.offsetWidth;
  

Это работает, потому что getBoundingClientRect возвращает фактический размер, в то время как offsetWidth / Height — это немасштабированный размер.

Комментарии:

1. Отличный ответ. Он отлично работает в Chrome, и сайт MDN предполагает, что он будет работать в IE9 — developer.mozilla.org/en-US/docs/Web/API/Element /…

2. Отличный ответ. Я не знал, что getBoundingClientRect получит фактический масштабированный размер.

3. В iOS Webview element.getBoundingClientRect().width не возвращает масштабированную ширину, только обычную ширину. Вместо этого я использовал window.screen.width .

4. Сработает ли это, если вы повернете элемент?

5. @AndyS нет, в этом случае это не сработало бы

Ответ №2:

Если оно было задано матрицей, я думаю, вы не сможете простым способом, но вы можете легко проанализировать значение:

 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 , верно?

Комментарии:

1. 1 за то, что заставил меня понять, что игра не стоит свеч. Я должен сделать что-нибудь попроще, прежде чем сойду с ума. ^_^

2. Если другие параметры не равны 0, мы можем использовать matrixRegex = /matrix(s*(-?d*.?d*),s*(-?d*.?d*),s*(-?d*.?d*),s*(-?d*.?d*),s*(-?d*.?d*),s*(-?d*.?d*))/

Ответ №3:

Если вам нужно настроить таргетинг только на 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 /

Ответ №4:

Вы могли бы использовать следующее:

 var element = document.getElementById("elementID");
// returns matrix(1,0,0,1,0,0)
var matrix = window.getComputedStyle(element).transform;
var matrixArray = matrix.replace("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 ")"
  

Комментарии:

1. Я полагаю, у вас есть дополнительная «матрица» в строке 3. Должен быть var matrixArray = matrix.replace(«матрица(«, «»).split(«,»);

Ответ №5:

Слишком поздно для операции, но может быть полезно в будущем. Есть простой способ сделать это с помощью разбиений:

 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, но может быть легко расширено для большего количества браузеров, модифицирующих первую строку.

Ответ №6:

Более надежный и универсальный способ получения масштаба :

 const { width, height } = element.getBoundingClientRect()
const scale = { x : element.offsetWidth / width, y : element.offsetHeight / height }
  

Он сравнивает визуальные размеры с немасштабированными размерами. Таким образом, это будет работать даже с вложенными масштабируемыми элементами.

Комментарии:

1. Интересно. Стоит упомянуть, что для возврата того же значения, которое использовалось в качестве масштаба, было бы интересно инвертировать деление. const scale = { x : width / element.offsetWidth, y : element / node.offsetHeight } .

Ответ №7:

Используя регулярное выражение

 element.style.transform.match(/scale(([1-9.]))/)[1]