首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >暂停/播放每个子元素的所有CSS动画

问暂停/播放每个子元素的所有CSS动画
EN

Stack Overflow用户
提问于 2017-11-07 14:20:17
回答 2查看 2K关注 0票数 1

我正在创建一个仪表板页面,里面充满了CSS动画。从启动(动画进度条)到自定义动画。

当您单击某些元素时,会触发一个接近全屏的模式,该模式与所有动画重叠,因此我希望通过在顶部元素中添加/移除类,并在设置该类时使用CSS暂停所有动画,从而暂时暂停它们(因为可能的性能问题)。

这个解决方案只需使用一行js,就可以在打开模式时切换类。

我的模板看起来有点像这样:

代码语言:javascript
复制
<body>
    <div class="modal">
        <!-- Modal code -->
    </div>
    <div class="app">
        <!-- Template -->
    </div>
</div>

是否可以向.app 中添加类,该类会暂停每个子元素中的每个CSS动画?

附注1:

我知道,您可以使用与我所请求的完全相反的方法:即,将默认的.animation-play类设置为顶级元素之一,并在每个子元素前面加上这个类,然后删除这个类以暂停每个动画。就像:

代码语言:javascript
复制
app.animation-play .somediv .somediv .element {
    // animation code
}
app.animation-play .somediv .element {
    // animation code
}
app.animation-play .somediv .somediv .somediv .somediv .element {
    // animation code
}

但是我必须编辑大量的CSS代码,而且看起来也不太好。

附注2:

我也对JS解决方案开放,但我非常希望采用一种纯CSS的方式来实现这一点。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-07 14:47:18

当将“暂停”类添加到应用程序包装器中时,您可以使用通用选择器来锁定所有内容,但是由于性能影响,仍有许多CSS指针警告不要使用这些选项。

老实说,这些天的影响可能很小,例如,许多CSS重置都会使用它们。

你可以使用这样的东西:

代码语言:javascript
复制
.app.paused * { 
    animation: none; 
}

编辑:

从上面的注释来看,上面的选择器似乎没有足够的优先级覆盖动画,所以添加了‘!重要’。

代码语言:javascript
复制
.app.paused * { 
    animation: none !important;
    transition: none !important; 
}

然而,这通常不是一个好主意,我总是试图避免使用‘!重要’不惜一切代价,因为很难维护样式表与这些选择器到位。如果您可以以更大的优先级覆盖动画,那么最好这样做,而不是使用‘!重要’。

编辑2:

正如您提到的,您对JS解决方案是开放的,这里有一些JS应该清除给定选择器中的所有动画。我不知道这样做对性能的影响是什么,但我在这里添加了它,以防其他人喜欢只使用JS:

代码语言:javascript
复制
let stopAnimationsWrap = document.querySelector('.app');
let stoppedAnims = [];

// Stop animations
document.querySelector('.stop').addEventListener('click', () => {
  let appAllEls = stopAnimationsWrap.querySelectorAll('*');
  let allElsAr = Array.prototype.slice.call(appAllEls);

  allElsAr.forEach((thisEl) => {
    let elClass = thisEl.classList[0];
        let cs = getComputedStyle(thisEl, null);
    let thisAnimation = cs.getPropertyValue('animation-name');

    if (thisAnimation !== 'none') {

      stoppedAnims.push([elClass, {
        'animationName': thisAnimation
      }]);

      thisEl.style.animationName = 'none';
    }
  });
});

// Start animations
document.querySelector('.start').addEventListener('click', () => {

  stoppedAnims.forEach((thisEl) => {
    let domEl = '.' + thisEl[0];

    stopAnimationsWrap.querySelector(domEl).style.animationName = thisEl[1].animationName;
  });
});

Fiddle:

https://jsfiddle.net/vu6javb2/14/

票数 2
EN

Stack Overflow用户

发布于 2017-11-07 14:24:12

代码语言:javascript
复制
.app {
    -webkit-animation-play-state: paused; /* Safari 4.0 - 8.0 */
    animation-play-state: paused;
}

悬停时:

代码语言:javascript
复制
.app:hover {
    -webkit-animation-play-state: paused; /* Safari 4.0 - 8.0 */
    animation-play-state: paused;
}
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47160197

复制
相关文章

相似问题

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