使用 JavaScript 手动单步执行 CSS 动画

2024-01-08

如果我有一个像这样的 CSS 关键帧动画

@keyframes flash-red {
  50% {
    background: #f00;
  }
}

#goflash.anm-flash {
  animation-name: flash-red;
  animation-duration: .5s;
  background: rgba(255, 0, 0, 0);
}

然后我总是可以像这样触发动画:

var gf = document.querySelector("#goflash");
gf.classList.remove("anm-flash");
setTimeout(function() {
  gf.classList.add("anm-flash");
}, 50);

有什么方法可以覆盖动画持续时间/动画计时函数以依赖于 JavaScript?我希望能够说这样的话gf.animate("flash-red", "50%")来制作背景gf红色,或gf.animate("flash-red", "75%")让背景更像rgba(255, 0, 0, .5).

理想情况下,相同的技术也适用于过渡。gf.transitionTo("new-class", "50%")会将元素显示为已过渡一半。

显然flash-red这只是一个例子——我希望能够对任何动画做到这一点。


使用内置动画:

很不幸的是,不行

JavaScript 不会公开转换的内部结构,因此您无法利用它来设置或获取数据。这是有目的的 - 如果数据were暴露它意味着效率降低,因为 JavaScript 事件队列必须更新。由于 JS 是单线程的,并且动画在单独的线程上运行,因此您很快就会失去它在单独线程上内部编译的代码中运行的好处。

不过,您可以自行进行转换。这涉及到你自己的计算转换。

这并不像听起来那么复杂,因为您只需使用插值公式来实现您想要的动画效果:

current = source + (destination - source) * fraction;

例如,对于颜色,您可以将其与颜色组件一起使用。假设我们有具有属性的颜色对象r, g, b:

var color1 = {r: 100, g: 200, b: 55};  //some random color
var color2 = {r: 0,   g: 100, b: 100};

var fraction = 0.5; //0-1

当前的 RGB 为:

r = color1.r + (color2.r - color1.r) * fraction;
g = color1.g + (color2.g - color1.g) * fraction;
b = color1.b + (color2.b - color1.b) * fraction;

对于职位:

 var pos1x = 100;
 var pos1y = 100;
 var pos2x = 500;
 var pos2y = 250;

var fraction = 1; //0-1

posX = pos1x + (pos2x - pos1x) * fraction;
posY = pos1y + (pos2y - pos1y) * fraction;

等等。

通过创建包装函数,您可以轻松计算这些函数,甚至将它们放入循环中以对其进行动画处理。

设置颜色 1 和颜色 2 之间的过渡的示例函数。 风格可以是ie。backgroundColor, color etc.:

function setColor(element, style, color1, color2, fraction) {

    var r = color1.r + (color2.r - color1.r) * fraction;
    var g = color1.g + (color2.g - color1.g) * fraction;
    var b = color1.b + (color2.b - color1.b) * fraction;

    element.style[style] = 'rgb(' + (r|0) + ',' + (g|0) + ',' + (b|0) + ')';
}

(the r|0只是去掉小数部分)。

对于位置,例如:

var pos1 = {x: 0, y: 0};
var pos2 = {x: 200, y: 0};

function setPosition(element, pos1, pos2, fraction) {

    var x = pos1.x + (pos2.x - pos1.x) * fraction;
    var y = pos1.y + (pos2.y - pos1.y) * fraction;

    element.style.left = x + 'px';
    element.style.top = y + 'px';
}

一个简单的演示(使用 Chrome 或 Aurora 23 查看滑块,滑块在 FF 23 的下一版本中出现)。

Fiddle http://jsfiddle.net/epistemex/gsd8809b/

在源和目标之间的任何点手动设置过渡,或为它们设置动画。

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

使用 JavaScript 手动单步执行 CSS 动画 的相关文章

随机推荐

  • MDX - NON EMPTY 函数更快?

    我当时的假设是NON EMPTY必须尽可能避免使用该子句 因此 当我意外地发现它实际上使查询速度更快时 我感到震惊 示例如下 select Measures Count Of Requests on 0 Client Client Numb
  • Laravel - 与软删除数据的隐式路由模型绑定

    我有一个小问题 有两种用户角色 一种是普通成员 一种是管理员 成员可以删除博客 并且在删除 软删除 博客后他们将无法看到该博客 而管理员仍然可以看到该博客 即使它是软删除的 示例代码 Route file Route get blog bl
  • AngularJS 指令链接函数未被调用

    我正在尝试将 Angular http auth 库与引导模式窗口一起使用 模态框工作正常 但我在指令方面遇到问题 这是一个 jsfiddle 链接 http jsfiddle net jCUSh 85 http jsfiddle net
  • Android - 从Webview调用Java

    我想从Webview调用Java I have JavaScriptInterface below class JavaScriptInterface private Activity activity public JavaScriptI
  • Rails 4.0.1 中的新记录“没有将符号显式转换为字符串”(仅限)

    在我升级 Rails 4 后 尝试为我的任何 ActiveRecord 类创建新记录会给出 No explicit conversion of Symbol into String 例如 这是我的 links links params 方法
  • 在 FLASK 中运行 pypupeteer 会出现 ValueError: signal only Works in main thread

    我正在尝试将 pyppeteer 集成到 Flask 应用程序中 我有一个运行 pyppeteer 并截取页面屏幕截图的 python 脚本 如果我单独运行该脚本 这是工作文件 The PROBLEM当我在 FLASK 应用程序中运行它时
  • c++ - 不命名类型

    我有一个问题 当我尝试构建以下代码时 我得到 keywords does not name a type whitespace does not name a type 第 18 19 行和第 22 24 行 有人可以帮忙吗 这是代码 cp
  • 我如何解释这个输入?

    我目前使用 ANTLR 在 Java 中实现了一种可用的 简单的语言 我想做的是将其嵌入纯文本中 与 PHP 类似 例如 Lorem ipsum dolor sit amet Phasellus volutpat dignissim sap
  • Woocommerce/Wordpress - 将用户登录重定向到主页

    我已经搜索了这个问题的答案 使用了插件 但仍然没有任何效果 我希望我的网站的用户在登录 注册后被重定向到主页 目前 用户登录并被重定向到我的帐户页面 Woocommerce 提供了此代码 但它对我不起作用 goes in theme fun
  • 如何减少/消除 Angular 应用程序中的内存泄漏

    我正在优化我的大Angular App 当我发现一个Google DevTools非常好发现问题 由于我刚刚开始学习DevTools 我对内存泄漏很困惑 当我在应用程序中的不同页面之间来回移动时 配置文件堆快照大小一次又一次地增加 因此我认
  • 如何在 Java 中为 Swing 组件设置字体粗细

    我想设置不同字体粗细我的 JFrame 对话框上的组件 我该怎么做呢 在下面的Java语句中 setFont new Font Dialog Font BOLD 12 当我使用 Font BOLD 时 它太粗体 当我使用 Font Plai
  • Spark 设置为从最早的偏移量读取 - 在尝试使用 Kafka 上不再可用的偏移量时抛出错误

    我目前正在 Dataproc 上运行 Spark 作业 在尝试重新加入组并从 kafka 主题读取数据时遇到错误 我做了一些挖掘 但不确定问题是什么 我有auto offset reset set to earliest所以它应该从最早可用
  • 将 JSON 对象的一部分存储在 pandas df 中[重复]

    这个问题在这里已经有答案了 我正在尝试将以下内容存储到 pandas 数据框中 page 1 results poster path null adult false overview Go behind the scenes during
  • 使用 koa.js 显示静态 html 文件

    我想要做的是在调用索引路由 即 localhost 3000 时提供 index html 文件 我使用 koa router 进行路由 所以我的路线如下所示 app all function next Send the file here
  • 我在 Matter.js 中自己的模型

    我正在使用 Matter js 编写一个简单的游戏 我无法弄清楚如何最好地将我的模型挂接到 Matter js 中 我的游戏以细菌为特色 我想上一堂课Bacterium这样我就可以管理这些人了 在我当前的实现中 此类创建并存储自己的Matt
  • char 160 在我的源代码中意味着什么?

    我正在使用以下格式字符串 将数字格式化为字符串 在某些时候我需要将这些数字字符串 1 234 567 转回类似 1234567 的内容 我正在尝试删除空字符但发现 value value Replace 由于某种原因 该字符串仍然是 1 2
  • 通过智能感知支持从文件动态生成枚举

    我听说了很多关于 Roslyn 的事情 我只是想是否可以从 xml 文件动态生成代码 这样对于开发人员来说它是透明的 他可以使用 IntelliSense 枚举代码 就像代码是在项目中编写的一样 我正在编写一个框架 其中通过配置文件完成了很
  • SPARK 整数溢出检查

    我有以下程序 procedure Main with SPARK Mode is F array 0 10 of Integer 0 1 others gt 0 begin for I in 2 F Last loop F I F I 1
  • 单个应用程序的 REST 和 SOAP Web 服务

    我们使用 Spring 构建了一个应用程序 并使用 Tomcat 部署了它 我们有一个可用的 REST 接口 但是我们的一个客户端只有一个 SOAP 客户端 我的理解是 SOAP Web 服务和 REST Web 服务不能在同一端口或应用程
  • 使用 JavaScript 手动单步执行 CSS 动画

    如果我有一个像这样的 CSS 关键帧动画 keyframes flash red 50 background f00 goflash anm flash animation name flash red animation duration