Как установить одно значение transform, оставляя другие значения?
Если у вас есть элемент со многими значениями для преобразования, как изменить только одно из этих значений без изменения других значений?
вы можете переписывать их каждый раз, но в некоторых ситуациях это означает, что вам придется разбирать css для преобразования в разные его части. Например:
-webkit-transform:rotateY(45deg) rotate(45deg);
вам нужно будет получить свойство и значение для rotate и rotateY. Разве нет способа получить и установить просто поворот без изменения значения для rotateY?
проблема иллюстрируется здесь.
5 ответов
нет способа напрямую изменить один компонент преобразования. К сожалению, различные возможные преобразования были реализованы как значения на transform
атрибут, а не сами атрибуты. Нет объектной модели для значений атрибутов CSS-значения атрибутов всегда являются просто строкой, насколько это касается JavaScript. Было бы здорово, если бы ... --2--> рассматривался как атрибут стенографии для, например,transform-rotate-y
, transform-*
и т. д., Так же, как background
- это стенография атрибут для всех background-*
атрибуты. Это позволило бы нам получить прямой доступ к значениям через JavaScript, но это не было реализовано таким образом, поэтому нам не повезло.
Edit: самый простой способ сделать это (без изучения спецификации и выполнения кучу математики) было бы вложите свои элементы, применяя различные преобразования к каждому. Если вы применяете несколько преобразований, которые не изменятся, продолжайте и объедините их в одно элемент. Любое преобразование, которое вы хотите изменить, используйте отдельный элемент:
работает здесь:jsfiddle.net/mkTKH/15
Edit: мое оригинальное решение ниже не будет работать. Проверяя его, я обнаружил, что getComputedStyle()
преобразует преобразование в matrix()
. Ан ранний проект спецификации говорит:
на
transform
свойство объекта style, возвращаемоеgetComputedStyle
содержит одно CSSTransformValue с типом CSS_MATRIX. 6 параметров представляют матрицу 3x2, которая является результатом применения отдельных функций, перечисленных вtransform
собственность.
Итак, вы должны разобрать его. Если вы хотите изменить только одну часть значения атрибута, вы можете использовать регулярное выражение для анализа значения:
var rotateY = "rotateY(" + deg + "deg)";
var transform = el.style.webkitTransform.replace(/\brotateY([^)]+)\b/, rotateY);
el.style.webkitTransform = transform;
Я бы создал многоразовый функция:
function setTransformValue(el, name, value) {
var currentValue = new RegExp(name + "([^)]+)");
var style = window.getComputedStyle ? getComputedStyle(el) : el.currentStyle;
var currentTransform = style.transform ||
style.webkitTransform ||
style.MozTransform ||
style.msTransform ||
style.OTransform;
var transform;
if (currentValue.test(currentTransform )) {
transform = currentTransform.replace(currentValue, name + "(" + value + ")");
}
else {
transform = currentTransform + " " + name + "(" + value + ")";
}
el.style.transform = transform;
}
непроверенными.
итак, @gilly3 был прав, что вы не можете этого сделать, но вот как вы можете это подделать.
- запомнить текущее значение в объекте
- измените одну часть значения в этом объекте.
- есть функция, которая преобразует объект в строку.
- применить строку.
var el = document.getElementById('blablabla');
var transform = {
rotate: 45,
rotateY: 45
}
function getTransform() {
var str = '':
for (var key in transform) {
str += key + '(' + transform[key] + 'deg)'
}
return str;
}
function applyTransform() {
var transform = getTransform();
el.style.webkitTransform = el.style.mozTransform = el.style.transform = transform;
}
function rotateABit() {
transform.rotate += 20;
applyTransform();
}
Это то, что я сделал, и она работала очень просто:
1. преобразование свойства преобразования объекта в строку
var currentTransformation = String(myobject.style.transform);
2. замените значение, которое вы хотите преобразовать
var finalTransformation = currentTransformation.replace("translateZ(100px)", "translateZ(YOURVALUEpx)");
3. назначить новое преобразование
myobject.style.transform = finalTransformation;
готово!
var spinner = (function transform() {
var rotateX = 0;
var rotateY = 0;
var rotateZ = 0;
var translateX = 0;
var translateY = 0;
var translateZ = 0;
var scaleX = 1;
var scaleY = 1;
var scaleZ = 1;
function transform(props) {
rotateX = props.rotateX ? props.rotateX : rotateX;
rotateY = props.rotateY ? props.rotateY : rotateY;
rotateZ = props.rotateZ ? props.rotateZ : rotateZ;
translateX = props.translateX ? props.translateX : translateX;
translateY = props.translateY ? props.translateY : translateY;
translateZ = props.translateZ ? props.translateZ : translateZ;
scaleX = props.scaleX ? props.scaleX : scaleX;
scaleY = props.scaleY ? props.scaleY : scaleY;
scaleZ = props.scaleZ ? props.scaleZ : scaleZ;
var css = "";
css += "rotateX(" + rotateX + "deg) ";
css += "rotateY(" + rotateY + "deg) ";
css += "rotateZ(" + rotateZ + "deg) ";
css += "translateX(" + translateX + "px) ";
css += "translateY(" + translateY + "px) ";
css += "translateZ(" + translateZ + "px) ";
css += "scaleX(" + scaleX + ") ";
css += "scaleY(" + scaleY + ") ";
css += "scaleZ(" + scaleZ + ") ";
spinner.Spinner.css("-webkit-transform", css);
}
return {
Spinner: $("#spinner"),
Transform: transform
}
})();