首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么我不能修改应用于元素的js动画()属性?

为什么我不能修改应用于元素的js动画()属性?
EN

Stack Overflow用户
提问于 2022-08-08 21:35:42
回答 2查看 159关注 0票数 0

动画完成后,单击事件将不再工作,实际上,从dev工具中更改值也将无法工作。使用fill: 'none'是可行的,但我想使用动画应用的样式。

这是预期的行为吗?动画完成并将样式作为内联style应用于元素(或者说是吗?),为什么在这种情况下不能修改它呢?有没有办法保持动画应用的样式,然后修改它?

示例:事件侦听器在动画完成后不再工作。

代码语言:javascript
运行
复制
let square = document.querySelector('.circle')

square.addEventListener('click', () => {
    square.style.transform = 'translateY(50px)'
})

let animation = [
    {transform: 'translateY(100px)'}
]

square.animate(animation, {duration: 2000, fill: 'both'})
代码语言:javascript
运行
复制
.circle {
  width: 100px;
  height: 100px;
  background-color: #c965a6;
  border-radius: 50%;
}
代码语言:javascript
运行
复制
<div class='circle'></div>

编辑:找到解决方案

使用fill: 'none',侦听动画完成时的内容,并手动将最后的样式应用于元素。

代码语言:javascript
运行
复制
let anim = square.animate(animation, {duration: 2000, fill: 'none'})
anim.addEventListener('finish', () => {
  square.style.transform = 'translateX(0px)'
})

虽然这看起来更像是一种解决办法,但我仍然想知道为什么不能修改动画应用的属性

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-08-11 13:16:20

这就是Web动画API (WAAPI)的作用方式。API应用的样式优先于所有其他css样式,甚至内联样式,除非应用了important。请参阅规范的"组合效应“一节。(顺便说一句,API没有更改样式属性,而是在WAAPI上下文中应用样式。您可以通过调用el.getAnimations()获得动画API应用的样式。)

有两种方法可以在应用WAAPI样式之后应用样式:

  1. 使用important,如下所示:

square.style.setProperty( 'transform', 'translateY(0px)', 'important' );

  1. 取消整个动画,然后应用样式:anim.cancel();

代码语言:javascript
运行
复制
let square = document.querySelector('.circle');
let anim;
square.style.transform = 'translateY(50px)';
square.addEventListener('click', () => {
    anim.cancel();
    square.style.transform = 'translateY(0px)';
});
let animation = [
    {transform: 'translateY(100px)'}
];
anim = square.animate(animation, {duration: 2000, fill: 'both'});
代码语言:javascript
运行
复制
.circle {
  width: 100px;
  height: 100px;
  background-color: #c965a6;
  border-radius: 50%;
}
代码语言:javascript
运行
复制
<div class='circle' ></div>

票数 2
EN

Stack Overflow用户

发布于 2022-08-11 12:23:03

您可以cancel()您的动画,以便它的影响被删除。

代码语言:javascript
运行
复制
// Beware I renamed your variables so they match better (except for the triangle of course :P)
const square = document.querySelector('.circle')

const keyframes = [
    {transform: 'translateY(100px)'}
]

const animation = square.animate(keyframes, {duration: 2000, fill: 'both'})

square.addEventListener('click', () => {
    animation.cancel();
    square.style.transform = 'translateY(50px)'
})
代码语言:javascript
运行
复制
.circle {
  width: 100px;
  height: 100px;
  background-color: #c965a6;
  border-radius: 50%;
}
代码语言:javascript
运行
复制
<div class='circle'></div>

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73284271

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档