javascript - 如何在 CSS 中组合变换?

标签 javascript css transform css-animations

我有一个 CSS 动画,它使用变换相对于当前位置四处移动。

CSS

fish {
    animation: fishanimation 4s ease-in-out infinite alternate;
}

@keyframes fishanimation {
  0% {
    transform: translateY(20px);
  }

  100% {
    transform: translateY(80px);
  }
}

现在我想使用 javascript 动态调整缩放和旋转,但这会被正在运行的 css 动画覆盖。转换没有组合:(

Javascript

this.div.style.transform = "scale(0.4) rotate(45deg)";

是否可以将缩放和旋转应用于已经存在的转换?像这样的东西:

element.transform = element.transform + "scale(0.4) rotate(34deg)";

编辑:

这不是问题的重复:how to combine css transforms .这个问题的要点是一个元素可能已经有一个我不想覆盖的转换。我想添加到它,但实际上并不知道当前的转换状态是什么。

最佳答案

如评论所述,我建议您为此使用动画库,一个很好的例子是Velocity JS .

如果建议的库不是一个选项,请继续阅读!

如果您希望在之前的转换之上进行多次转换,那么您需要使用 matrix 值进行转换。矩阵让事情变得有点复杂。矩阵的参数按以下顺序排列:-

matrix(scaleX(),skewY(),skewX(),scaleY(),translateX(),translateY());

让我们以您提到的初始鱼动画开始为例:-

fish {
    animation: fishanimation 4s ease-in-out infinite alternate;
}

@keyframes fishanimation {
  0% {
    transform: matrix(1, 0, 0, 1, 0, 20);
  }

  100% {
    transform: matrix(1, 0, 0, 1, 0, 80);
  }
}

要在 JavaScript 中动态更改它,需要进行一些令人不快的字符串操作和获取元素的转换属性(这比您想象的要笨拙)。下面是您可以如何执行此操作的示例。

function getTransformValues(obj) {
    var transform = {
        scaleX: 1,
        skewX: 0,
        skewY: 0,
        scaleY: 1,
        translateX: 0,
        translateY: 0
    };

    var matrix = obj.css("-webkit-transform") ||
                 obj.css("-moz-transform")    ||
                 obj.css("-ms-transform")     ||
                 obj.css("-o-transform")      ||
                 obj.css("transform");

    if (matrix && matrix !== 'none') {
        var values = matrix.split('(')[1].split(')')[0].split(',');
        transform.scaleX = parseFloat(values[0]);
        transform.skewY = parseFloat(values[1]);
        transform.skewX = parseFloat(values[2]);
        transform.scaleY = parseFloat(values[3]);
        transform.translateX = parseFloat(values[4]);
        transform.translateY = parseFloat(values[5]);
    }

    return transform;
}

var values = getTransformValues($('#test'));
console.log(values);
// Object {scaleX: 1, skewX: 0, skewY: 0, scaleY: 2, translateX: 50, translateY: 40}

现在您已经获得了这些值,您可以通过仅更改所需的值来开始创建新矩阵,例如:-

var old = {
    scaleX: 1,
    skewX: 0,
    skewY: 0,
    scaleY: 2,
    translateX: 50,
    translateY: 40
};

$('#test').css('transform', 'matrix(' + old.scaleX + ', ' + old.skewY + ', ' + old.skewX + ', ' + old.scaleY + ', ' + old.translateX + ', ' + old.translateY + ')');

如果您想开始操纵旋转 Angular ,事情会变得更加复杂。为了避免让这个答案陷入如此困境,这部分问题在以下链接中有一个解决方案:Get element -moz-transform:rotate value in jQuery

希望您能明白为什么采用 Velocity JS 等库,至少在撰写本文时,是实现快速、简单、干净和流畅的跨浏览器动画的最佳方式。

关于javascript - 如何在 CSS 中组合变换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36599072/

相关文章:

jquery - 如何更改 CKEDITOR 中的 css 样式规则(例如通过 jQuery)

jquery - 删除类 Jquery

html - 转换元素后如何删除空格?

javascript - stub 函数在被另一个函数调用时不会返回正确的值

javascript - 在 D3.js 中对大型 CSV 进行排序

javascript - 为什么即使在设置 "esponse.addHeader("Access-Control-Allow-Origin", "*");"在 servlet 中,CORS 请求也会失败?

javascript - jQuery ajax POST 登录请求

css - 如何修改 firebase 提供给我的 auth 按钮的默认 css/样式?

css - IE 中的动画转换 CSS 无法按预期工作

css - 展开带有动画的左侧 div 导致 "shakeness"