如何在 CSS 中组合变换?

2024-03-08

我有一个 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)";

EDIT:

这不是问题的重复:如何结合CSS变换 https://stackoverflow.com/questions/10765755。这个问题的要点是,一个元素可能已经有一个我不想覆盖的转换。我想添加它,但实际上不知道当前的变换状态是什么。


正如评论中所说,我建议您为此使用动画库,一个很好的例子是速度JS http://velocityjs.org/.

如果无法选择建议的库,请继续阅读!

如果您希望在之前的转换之上进行多次转换,那么您需要使用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 + ')');

如果你想开始操纵旋转角度,事情就会变得如此甚至更复杂。为了避免这个答案陷入困境,问题的这一部分在以下链接中有一个解决方案:在 jQuery 中获取元素 -moz-transform:rotate 值 https://stackoverflow.com/questions/8270612/get-element-moz-transformrotate-value-in-jquery/11840120#11840120

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 CSS 中组合变换? 的相关文章

  • 如何使用 JavaScript 中的值填充下拉列表?

    我在 Tridion CMS 扩展中的功能区工具栏按钮中添加了一个按钮 单击该按钮后 将显示一个弹出页面 其中包含两个下拉菜单 通过更改第一个下拉控件中的值 我应该填充第二个下拉控件的值 就我而言 我正在使用ASP drop down li
  • 非 DOM 对象上的 jQuery 自定义事件

    我最近阅读了一些代码 其功能如下 bob name Bob Smith rank 7 bob bind nameChanged function bob trigger nameChanged 这似乎有效 但我在 jQuery 文档或源代码
  • 消息“在 jest.setTimeout 指定的 5000 毫秒超时内未调用异步回调”

    我正在使用 Puppeteer 和 Jest 来运行一些前端测试 我的测试如下 describe Profile Tab Exists and Clickable settings user gt test Assert that you
  • 在网页上的文本框中键入内容时删除所有空格

    我如何在用户打字时即时删除输入到文本框中的空格 function var txt myTextbox var func function txt val txt val replace s g txt keyup func blur fun
  • jquery 验证错误位置

    这看起来很简单 但我无法弄清楚 我正在使用 jquery 验证插件 我验证所有文件 但我想要的是在输入文本行中显示验证消息警报 例如在电子邮件输入中 请填写电子邮件地址 但现在它出现在所有字段下 在我的html中
  • 防止浮动换行,直到元素达到最小宽度

    我有可变宽度的 HTML 布局 内容左侧有一个固定宽度的菜单 div 可变宽度 由 css max width 和 min width 设置 对于非常窄的浏览器窗口 我希望内容包裹在菜单下方 我目前通过设置来实现这一点float left在
  • 使用 moment.js 检查输入日期是否为星期一

    好吧 我想检查日期是否是星期一 例如 var myDate new Date moment myDate DD MM YYYY dayIs monday 在我的国家 一周的第一天是星期一 所以 我真的想检查输入日期是否是一周的开始 我尝试使
  • 如何使用 jest 模拟第三方库

    我正在开发一个node js应用程序使用nestjs我有一堂课叫LoggerService如下 export class LoggerService private logger Rollbar constructor this logge
  • 如何为背景图像添加边距?

    我想向背景图像添加边距 以便将其与屏幕中间保持距离 但将其添加到该类中会为整个主体添加边距 body poppage background url Imagenes tip3 png 50 200px no repeat E2E4E9 我怎
  • 按百分比设置 bootstrap 模态身高

    我正在尝试制作一个带有主体的模态 当内容变得太大时 该主体会滚动 但是 我希望模式能够响应屏幕尺寸 当我将最大高度设置为 40 时 它没有任何效果 但是 如果我将最大高度设置为 400px 它会按预期工作 但不会响应 我确信我只是错过了一些
  • JavaScript 中数组的 HTML 数据列表值

    我有一个简单的程序 它必须从服务器上的文本文件中获取值 然后将数据列表填充为输入文本字段中的选择 为此 我想要采取的第一步是我想知道如何动态地将 JavaScript 数组用作数据列表选项 我的代码是
  • 如何使JavaScript函数在Eclipse“大纲视图”中可见?

    我有这样的代码 但如果它在匿名函数中定义 则无法打开函数大纲 类没有问题 我该如何概述something2 请分享一些提示 我可以将所有函数标记为构造函数 但这是无效的方法 start of track event required deb
  • 如何将送货地址复制到帐单地址

    我想知道是否可以将送货地址复制到帐单地址 当用户单击与送货地址相同的复选框时 送货地址值将被复制到账单输入字段 我完成了大部分部分 但我不确定如何将选择菜单 状态 值复制到帐单地址 我真的很感谢任何帮助 My code document r
  • Twitter 嵌入时间轴小部件

    我继续下载http platform twitter com widgets js http platform twitter com widgets js And the http platform twitter com embed t
  • Chartjs刻度标签位置

    尝试让 Y 轴刻度标签看起来像image https i stack imgur com XgoxX png 位于秤顶部且不旋转 缩放选项当前如下所示 scales yAxes id temp scaleLabel display true
  • JavaScript onresize 事件多次触发

    我在尝试仅在触发 onresize 事件时运行一次函数时遇到一些麻烦 我已经看过这个问题DOM onresize 事件 https stackoverflow com questions 1500312 javascript onresiz
  • 如何获取 UIWebView 中元素的位置?

    我在 iPad 程序中加载了 html 的 UIWebView 通过使用 webkit column width 我将 html 分为几列 padding 0px height 1024px webkit column gap 0px we
  • Jquery - 通过在字符串中构建 id 的 id 获取元素

    我在使用 jquery 元素时遇到问题 我正在 var 中构造名称 例如 var myId myGotId myId attr title changed myId 返回空 我想通过 id 获取我的元素 但动态构建我的 Id 连接字符串 编
  • 三级十进制有序列表 CSS

    我有一个 html 中的三级有序列表 我想为其提供如下样式 1 Item 1 1 1 Item 2 1 1 1 Item 3 下一个 plunker 中有一个 html 示例 http plnkr co edit DqhZ5pJILTUHG
  • HTML 默认图像大小

    我在我的代码上显示 3 张图片 图片具有不同的尺寸 宽度和高度 div class row div class col lg 12 h2 class page header Gallery h2 div div class col md 4

随机推荐

  • PyInstaller 和 Enthought 套件

    我想知道是否有人成功使用 pyinstaller 和考虑导入的脚本创建独立的可执行文件 我已经尝试这样做几天了 但是我不断收到导入错误 通过一些挖掘 我相信我可能需要添加一些隐藏的导入并创建我自己的钩子 然而 我还没有听说有人在这方面取得了
  • 人行横道项目错误“构建 ABI 'armeabi-v7a' 失败”

    我使用 ubuntu 16 04 和 crosswalk project 以及 Phonegap Cordova 来制作我的混合应用程序 我正在编译示例 https crosswalk project org documentation a
  • 在 Scala 中制作一个非常基本的二叉树

    我正在尝试在 Scala 中制作一个非常简单的二叉树 用于数据存储和遍历 现在我有 trait Tree case class Node left Tree value String right Tree extends Tree 我的问题
  • Angular 2 过滤器/搜索列表

    我正在寻找 Angular 2 的方法this http www w3schools com howto howto js filter lists asp 我只有一个项目列表 我想进行一个输入 其工作是过滤该列表
  • 如何在android中用不透明度填充矩形

    我可以用画布绘制矩形填充矩形 Rect rt new Rect 0 0 getWidth getHeight myPaint setColor myColor myPaint setStyle Style FILL canvas drawR
  • 编写可在 Window 上运行的 Firefox、Chrome 和 IE 上移植的自定义协议处理程序

    我正在编写一个协议处理程序来启动 java 应用程序 调用 java jar myApp 1 等命令 目前我已经为 Chrome 实现了它 它看起来工作正常 不幸的是 我对 Firefox 和 IE 没有相同的行为 奇怪呃 X D 这是我的
  • 如何在 Matlab 中使用 Unix 时间戳?

    我有一些带有 Unix 时间戳的数据文件 在本例中 是自 1970 年 1 月 1 日 00 00 UTC 以来的毫秒数 我想在 Matlab 中将它们转换为人类友好的日期 时间字符串 例如 2012 年 8 月 31 日 11 36 24
  • wamp 2.2 中调用未定义函数curl_init() 错误

    当我尝试实施 google 和 facebook 身份验证时出现以下错误在 Windows 7 中使用 wamp 服务器 致命错误 调用未定义的函数curl init E wamp www mysite protected extensio
  • cabal 沙盒安装仍然失败,并显示“软件包可能会因重新安装而损坏”

    我正在尝试建立榆树平台 http elm lang org 使用阴谋集团沙箱 但是安装失败 并显示消息 软件包可能会因重新安装而损坏 在我看来 这似乎与沙盒的整个目的相矛盾 我曾相信沙盒应该避免这种错误 任何人都可以为我解释这个错误 甚至更
  • Scala 中的“上下文绑定”是什么?

    Scala 2 8 的新功能之一是上下文边界 什么是上下文绑定以及它在哪里有用 当然 我首先搜索了 并发现例如this https stackoverflow com questions 2961986 how do you write a
  • 以编程方式更改 iPhone 中的设备方向

    我有基于导航的应用程序 当我单击根视图中的任何行时 下一个视图应该处于横向模式 我无法找到适当的方法来实现这一点 我尝试的是 BOOL shouldAutorotateToInterfaceOrientation UIInterfaceOr
  • 按绝对值排序而不改变数据

    我正在寻找一种简单的方法来按特定列的绝对值对 pandas 数据框进行排序 但实际上不更改数据框中的值 类似的东西sorted df key abs 所以如果我有一个像这样的数据框 a b 0 1 3 1 2 5 2 3 1 3 4 2 4
  • 在 ES6 模块中通过字符串访问导出函数

    考虑以下 exports handleEvent event export function handleEvent event do something with event 这在使用 babel 转译节点模块时有效 因为它将所有内容粘贴
  • 在 XSLT 1.0 中将 EDT 转换为 GMT

    我的输入值为 2017 年 9 月 12 日星期二 15 03 22 EDT 或 2017 09 12T15 03 22 0000000 我需要类似 2017 09 12T19 03 22Z 是否可以在 XSLT 1 0 中将 EDT 日期
  • 在 Android 中隐藏键盘的最佳方法

    我想知道在 EditText 输入文本后隐藏键盘的最佳方法 1 setonfocuschangelistener 是否仅在按下完成按钮或焦点从一个 EditText 更改为另一个时触发此侦听器 当我使用这个方法时 我无法隐藏键盘 2 set
  • SSMS 2012 智能感知行为

    SSMS 2012 中智能感知的行为似乎已更改 因此它的行为与 Visual Studio 或 SSMS 2008 不同 以前我总是按空格键 这会插入智能感知中当前突出显示的单词 但在 SSMS 2012 中我必须按 TAB 或按向下键然后
  • 如何使用 python 传递字符串+ web url并接收响应[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在使用 Python 和谷歌翻译
  • iOS 的 BLE 外设名称不正确

    我正在编写一个 iOS 应用程序来与 BLE 设备通信 设备可以在连接之间更改名称 不能在 BLE 连接期间 但 iOS 拒绝更改设备名称 例如 当设备名称为 SadName 时 我可以连接到该设备 我断开连接 关闭应用程序等 然后将设备的
  • 检查空值并在不存在时分配另一个值的最短方法

    我拉着varchar值来自数据库并想要设置string如果它们是 我将它们分配为 null 我目前正在这样做 if string IsNullOrEmpty planRec approved by true this approved by
  • 如何在 CSS 中组合变换?

    我有一个 CSS 动画 它使用变换来相对于其当前位置移动 CSS fish animation fishanimation 4s ease in out infinite alternate keyframes fishanimation