热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

切换标签时暂停/恢复CSS动画

如何解决《切换标签时暂停/恢复CSS动画》经验,为你挑选了1个好方法。

我在页面上有一堆长时间运行的CSS动画.我想在用户切换到另一个选项卡时暂停它们,并在用户再次返回原始选项卡时恢复它们.为简单起见,我不打算在此时使用跨浏览器解决方案; 让它在Chrome中运行应该足够了.

document.addEventListener("visibilitychange", function() {
  if (document.hidden) {
    document.querySelector("#test").classList.add("paused");
  } else {
    document.querySelector("#test").classList.remove("paused");    
  }
});
div#test {
  width: 50px;
  height: 50px;
  background-color: red;
  position: absolute;
  left: 10vw;
  animation-name: move;
  animation-duration: 5s;
  animation-fill-mode: forwards;
  animation-timing-function: linear;
}

@keyframes move {
  to {
    left: 90vw
  }
}

.paused {
  animation-play-state: paused !important;
  -webkit-animation-play-state: paused !important;
  -moz-animation-play-state: paused !important;
}

上面的代码水平移动一个红色矩形.矩形完成动画需要5秒钟.

问题:动画启动后,切换到另一个浏览器选项卡; 经过一段时间(超过5秒)后切换回第一个标签.

预期结果:矩形从其停止的位置继续其路径.

实际结果:矩形出现在最终目的地并停止的大部分时间.有时它按预期工作.视频演示了这个问题.

我打了不同的价值观animation-fill-modeanimation-timing-function,但结果总是相同的.正如rv7 指出的那样,在CodePen,JSFiddle,JSBin和stackoverflow JS工具中共享示例会影响结果,因此最好直接针对本地HTTP服务器上的静态页面进行测试(或使用下面的链接).

为方便起见,我已将上面的代码部署到Heroku.该应用程序是一个静态nodejs HTTP服务器,它运行在免费订阅上,因此第一次加载页面最多可能需要5分钟.针对此页面的测试结果:

FAIL Chrome 64.0.3282.167(官方版)(64位)Linux Debian Stretch(PC)
FAIL Chrome 70.0.3538.67(官方版)(64位)Windows 10(PC)
FAIL Chrome 70.0.3538.77(官方版)(32 -bit)Windows 7(PC)
FAIL Chrome 70.0.3538.77(官方版)(64位)OSX 10.13.5(Mac mini)
FAIL FF Quantum 60.2.2esr(64位)Linux Debian Stretch(PC)
OK Safari 11.1 .1(13605.2.8)(Mac mini)

该网页的曝光率API可以用窗口来代替focusblur事件是这样的:

window.addEventListener("focus", function() {
    document.querySelector("#test").classList.remove("paused");        
});

window.addEventListener("blur", function() {
    document.querySelector("#test").classList.add("paused");
});

然而,这种替换并不等同.如果页面包含IFRAME,则与其内容进行交互将触发主窗口上的事件focusblur事件.在这种情况下执行任何制表符切换代码是不正确的.在某些情况下,这可能仍然是一个选项,所以我在这里部署了一个测试页面.结果略好一些:

FAIL Chrome 64.0.3282.167(官方版)(64位)Linux Debian Stretch(PC)
FAIL Chrome 70.0.3538.67(官方版)(64位)Windows 10(PC)
FAIL Chrome 70.0.3538.77(官方版)(32 -bit)Windows 7(PC)
FAIL Chrome 70.0.3538.77(官方版)(64位)OSX 10.13.5(Mac mini)
OK FF Quantum 60.2.2esr(64位)Linux Debian Stretch(PC)
OK Safari 11.1 .1(13605.2.8)(Mac mini)
此版本在Chrome 64位中比在Chrome 32位中更常失败.在Chrome 32位中,我在成功尝试20次后失败了1次.这可能与Chrome 32位安装在较旧的硬件上有关.

问题是:有没有办法在切换标签时可靠地暂停/恢复CSS动画?



1> rv7..:

您可以使用focusblur事件而不是visibilitychange事件,因为前者有更好的浏览器支持!

let box = document.querySelector('#test');

window.addEventListener('focus', function() {
  box.style.animatiOnPlayState= 'paused';
});

window.addEventListener('blur', function() {
  box.style.animatiOnPlayState= 'running';
});

或者,您也可以使用CSS类来执行此操作:

.paused {
  animation-play-state: paused !important;
  -webkit-animation-play-state: paused !important;
  -moz-animation-play-state: paused !important;
}
let box = document.querySelector('#test');

window.addEventListener('focus', function() {
  box.classList.remove('paused');
});

window.addEventListener('blur', function() {
  box.classList.add('paused');
});

以上两种方式在CodePen,JSFiddle,JSBin等的iframe中不起作用; 在帖子结尾提供了一个可能的原因.但是,这是一个视频链接,显示代码如何在CodePen的调试模式下工作.

实例

确认:

    谷歌浏览器v70.0.3538.67(官方版)(32位)

    Firefox Quantum v62.0.3(32位)

    Internet Explorer v11 +


代码无法在其中运行的可能原因iframe:

当我尝试访问root window(又名parent对象,请注意它不是iframe window)时,控制台中记录以下错误:

在此输入图像描述

这意味着我无法访问root windowCodePen和其他人.因此,如果我无法访问它,我无法向其添加任何事件侦听器.


推荐阅读
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • ECMA262规定typeof操作符的返回值和instanceof的使用方法
    本文介绍了ECMA262规定的typeof操作符对不同类型的变量的返回值,以及instanceof操作符的使用方法。同时还提到了在不同浏览器中对正则表达式应用typeof操作符的返回值的差异。 ... [详细]
  • 本文整理了常用的CSS属性及用法,包括背景属性、边框属性、尺寸属性、可伸缩框属性、字体属性和文本属性等,方便开发者查阅和使用。 ... [详细]
  • css元素可拖动,如何使用CSS禁止元素拖拽?
    一、用户行为三剑客以下3个CSS属性:user-select属性可以设置是否允许用户选择页面中的图文内容;user-modify属性可以设置是否允许输入 ... [详细]
  • 深入理解CSS中的margin属性及其应用场景
    本文主要介绍了CSS中的margin属性及其应用场景,包括垂直外边距合并、padding的使用时机、行内替换元素与费替换元素的区别、margin的基线、盒子的物理大小、显示大小、逻辑大小等知识点。通过深入理解这些概念,读者可以更好地掌握margin的用法和原理。同时,文中提供了一些相关的文档和规范供读者参考。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • 本文讨论了编写可保护的代码的重要性,包括提高代码的可读性、可调试性和直观性。同时介绍了优化代码的方法,如代码格式化、解释函数和提炼函数等。还提到了一些常见的坏代码味道,如不规范的命名、重复代码、过长的函数和参数列表等。最后,介绍了如何处理数据泥团和进行函数重构,以提高代码质量和可维护性。 ... [详细]
  • macOS Big Sur全新设计大版本更新,10+个值得关注的新功能
    本文介绍了Apple发布的新一代操作系统macOS Big Sur,该系统采用全新的界面设计,包括图标、应用界面、程序坞和菜单栏等方面的变化。新系统还增加了通知中心、桌面小组件、强化的Safari浏览器以及隐私保护等多项功能。文章指出,macOS Big Sur的设计与iPadOS越来越接近,结合了去年iPadOS对鼠标的完善等功能。 ... [详细]
  • css,背景,位置,y,background, ... [详细]
  • DOM事件大全
    1.事件:js与html的交互就是通过事件的,观察者模式2.事件流:从页面中接收事件的顺序IE::事件冒泡流,事件冒泡,事件从最具体的元素接收,然后逐级向上传播,主流浏览器都支持N ... [详细]
  • pyecharts 介绍
    一、pyecharts介绍ECharts,一个使用JavaScript实现的开源可视化库,可以流畅的运行在PC和移动设备上,兼容当前绝大部 ... [详细]
  • 文章目录简介HTTP请求过程HTTP状态码含义HTTP头部信息Cookie状态管理HTTP请求方式简介HTTP协议(超文本传输协议)是用于从WWW服务 ... [详细]
  • Scrapy 爬取图片
    1.创建Scrapy项目scrapystartprojectCrawlMeiziTuscrapygenspiderMeiziTuSpiderhttps:movie.douban.c ... [详细]
  • 目录爬虫06scrapy框架1.scrapy概述安装2.基本使用3.全栈数据的爬取4.五大核心组件对象5.适当提升scrapy爬取数据的效率6.请求传参爬虫06scrapy框架1. ... [详细]
author-avatar
人心城府深我如z何故做清纯
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有