Старый, но интересный вопрос и ни один предыдущий ответ не пытался ответить на него.
К сожалению, для общего случая не существует двухслойного решения, и мы не знаем о том, какое разнообразие шагов преобразования (поворот, преобразование и т. Д.) Необходимо реверсировать;чем меньше, тем проще.
В последних браузерах на основе webkit можно просто запросить ранее назначенное свойство:
var element = document.querySelector('div.slipping');
element.style.webkitTransform
-> "translate(-464px, 0px)"
Давайте продолжим с предположением, что необходимо использовать вычисленный стиль.Необходимость возникает, например, если элемент находится в середине перехода CSS или анимации CSS, то есть текущее преобразование не является тем, которое было установлено напрямую.
Строка дескриптора матрицы, возвращаемая getComputedStyle, действительно может бытьанализируется с помощью регулярных выражений, но не все версии выше надежны, и они слишком непрозрачны.Простой способ сломать строку, если только он не находится в очень узком цикле, чтобы гарантировать регулярное регулярное выражение, это:
var matrixString = window.getComputedStyle(element).webkitTransform;
var matrix = matrixString
.split('(')[1]
.split(')')[0]
.split(',')
.map(parseFloat);
Но другой способ - просто использовать это, которое не упоминалосьbefore:
var cssMatrix = new WebKitCSSMatrix(matrixString);
Преимущество последнего подхода состоит в том, что вы также получаете матрицу 4x4, которая является стандартным представлением для аффинных преобразований , и недостатком является то, чтоКонечно, WebKit специфичен.Если вы продолжите работать с кортежем из шести значений, как в вопросе, это определено в этой части стандарта CSS .
Затем преобразование, например вращение, должно быть выполнено в обратном порядке.Может быть много простых преобразований, непосредственно поддерживаемых CSS, например, перевод, масштабирование, поворот, наклон и перспектива.Если применяется только один из них, то вам просто нужно отменить процесс вычисления матрицы преобразования .
Альтернативой является поиск или перевод кода, который делает это за вас в JS, например, тот же документ или Раздел 7.1 стандарта CSS содержит такие аннотированные алгоритмы.Преимущество состоит в том, что подход unmatrix может с некоторыми ограничениями возвращать «атомные» преобразования, даже если применяется более одного из них (перевод, вращение и т. Д.).Поскольку невозможно гарантировать успешное обратное проектирование шагов преобразования для общего случая, полезно подумать о том, какие типы преобразований возможно применяются, и были ли предотвращены вырожденные или другие проблемные случаи.Т.е. вам нужно построить решение так, как вы считаете нужным для вашей проблемы.
В частности, матричные версии всех 2D CSS-преобразований задокументированы и здесь , ниже значения шести значений.в векторе 2D-преобразования CSS.
Еще одно предостережение заключается в том, что существуют другие вещи, которые влияют на визуальный результат с точки зрения геометрических операций, например, transform-origin .