纯CSS方式实现CSS动画的暂停与播放!

使用纯 CSS 的方法,能否暂停、播放 CSS 动画?看起来不可能,至少很麻烦。

我们知道,在 CSS3 animation 中,有这样一个属性可以暂停、播放动画:


  1.  
  2.     animation-play-state: paused | running; 
  3.  

animation-play-state: 属性定义一个动画是否运行或者暂停。可以通过查询它来确定动画是否正在运行。另外,它的值可以被设置为暂停和恢复的动画的重放。

如果借助 Javascript,我们可以实现控制 CSS 动画的运行和播放,下面列出部分关键代码:


  1. <div class="btn">stop</div> 
  2.  
  3. <div class="animation"></div> 
  4.  
  5. <style> 
  6.  
  7. .animation { 
  8.  
  9.     animation: move 2s linear infinite alternate; 
  10.  
  11.  
  12. @keyframes move { 
  13.  
  14.     0% { 
  15.  
  16.         transform: translate(-100px, 0); 
  17.  
  18.     } 
  19.  
  20.     100% { 
  21.  
  22.         transform: translate(100px, 0); 
  23.  
  24.     } 
  25.  
  26.  
  27. </style> 

  1. document.querySelector('.btn').addEventListener('click', function() { 
  2.  
  3.     let btn = document.querySelector('.btn'); 
  4.  
  5.     let elem = document.querySelector('.animation'); 
  6.  
  7.     let state = elem.style['animationPlayState']; 
  8.  
  9.      
  10.  
  11.     if(state === 'paused') { 
  12.  
  13.         elem.style['animationPlayState'] = 'running'; 
  14.  
  15.         btn.innerText = 'stop'; 
  16.  
  17.     } else { 
  18.  
  19.         elem.style['animationPlayState'] = 'paused'; 
  20.  
  21.         btn.innerText = 'play'; 
  22.  
  23.     } 
  24.  
  25.      
  26.  
  27. }); 

Demo — pause CSS Animation(https://codepen.io/Chokcoco/pen/GWYBdM)

纯 CSS 实现

下面我们探讨下,使用纯 CSS 的方式能否实现。

hover 伪类实现

使用 hover 伪类,在鼠标悬停在按钮上面时,控制动画样式的暂停。

关键代码如下:


  1. <div class="btn stop">stop</div> 
  2.  
  3. <div class="animation"></div> 
  4.  
  5. <style> 
  6.  
  7. .stop:hover ~ .animation { 
  8.  
  9.     animation-play-state: paused; 
  10.  
  11.  
  12. </style> 

Demo — 纯 CSS 方式实现 CSS 动画的暂停与播放 (Hover):(https://codepen.io/Chokcoco/pen/PpxKBX)

当然,这个方法不够智能,如果释放鼠标的自由,点击一下暂停、再点击一下播放就好了。还有其他方法吗?

checked 伪类实现

之前的文章《有趣的 CSS 题目(8):纯CSS的导航栏Tab切换方案》也谈过,使用 radio 标签的 checked 伪类,加上 实现纯 CSS 捕获点击事情。

并且利用被点击的元素可以控制一些 CSS 样式。实现如下:


  1. <input id="stop" type="radio" name="playAnimation" /> 
  2.  
  3. <input id="play" type="radio" name="playAnimation" /> 
  4.  
  5. <div class="box"> 
  6.  
  7.     <label for="stop"> 
  8.  
  9.         <div class="btn">stop</div> 
  10.  
  11.     </label> 
  12.  
  13.     <label for="play"> 
  14.  
  15.         <div class="btn">play</div> 
  16.  
  17.     </label> 
  18.  
  19. </div> 
  20.  
  21. <div class="animation"></div> 

部分关键 CSS 代码:


  1. .animation { 
  2.  
  3.     animation: move 2s linear infinite alternate; 
  4.  
  5.  
  6.   
  7.  
  8. #stop:checked ~ .animation { 
  9.  
  10.     animation-play-state: paused; 
  11.  
  12.  
  13.   
  14.  
  15. #play:checked ~ .animation { 
  16.  
  17.     animation-play-state: running; 
  18.  

我们希望当 #stop 和 #play 两个 radio 被点击时,给 .animation 元素分别赋予
animation-play-state: paused 或是 animation-play-state: running
。而且二者只能生效其一,所以需要给两个 radio 标签赋予相同的 name 属性。

DEMO — 纯 CSS 方式实现 CSS 动画的暂停与播放:(https://codepen.io/Chokcoco/pen/QpJwBW)

上面的示例 Demo 中,实现了纯 CSS 方式实现 CSS 动画的暂停与播放。

当然,还有一些其他方法,例如 radio 替换成 checkbox ,或者使用 :target 伪类选择器也能实现上面同样的效果,感兴趣的可以尝试一下。

到此本文结束,如果还有什么疑问或者建议,可以多多交流,原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知。

开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节。

解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉到生僻的 CSS 属性,赶紧去补习一下吧。

不断更新,不断更新,不断更新,重要的事情说三遍。

作者:伯乐专栏/coco

来源:51CTO

时间: 2024-08-03 22:47:00

纯CSS方式实现CSS动画的暂停与播放!的相关文章

谈谈一些有趣的CSS题目(十四)-- 纯 CSS 方式实现 CSS 动画的暂停与播放!

开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉到生僻的 CSS 属性,赶紧去补习一下吧. 不断更新,不断更新,不断更新,重要的事情说三遍. 谈谈一些有趣的CSS题目(一)-- 左边竖条的实现方法 谈谈一些有趣的CSS题目(二)-- 从条纹边框的实现谈盒子模型 谈谈一些有趣的CSS题目(三)-- 层叠顺序与堆栈上下文知多少 谈谈一些有趣

纯CSS如何实现带动画的天气图标

静态的天气图标看久了显得呆板,那么下面就分享一个很有才创意的用CSS实现天气带动画的天气图标,代码都分享出来,以这个例子作为参考希望你能得到启发.enjoy! 下面我们来做一个会下雨的天气图标实例,过程其实很简单哦. STEP1: 整体HTML架构 <div class="icon rainy"> <div class="cloud"></div> <div class="rain"></di

CSS 实现加载动画之一-菊花旋转

原文:CSS 实现加载动画之一-菊花旋转 最近打算整理几个动画样式,最常见的就是我们用到的加载动画.加载动画的效果处理的好,会给页面带来画龙点睛的作用,而使用户愿意去等待.而页面中最常用的做法是把动画做成gif格式,当做背景图或是img标签来引用,这种方式最简单,也不会有兼容性的问题.不过本人有时爱折腾,看到一些动画的效果,不管是简单也好,复杂也好,也想尝试用代码来实现它,换一种思维方式,就算在项目中用到的可能性很小,自己多动手多写写总归不会有坏处. CSS3新增了很多强大的功能,虽然会有兼容性

CSS 实现加载动画之四-圆点旋转

原文:CSS 实现加载动画之四-圆点旋转 圆点旋转也是加载动画中经常用到的.其实现方式和菊花旋转一样,只不过一个是线条形式,一个是圆点形式.圆点按照固定的旋转角度排列,加上延时的改变透明度的动画就可以实现.这个实现也比较简单.   1. 动画截图     2. 案例源代码 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta http-equiv="Content-Type" Content="tex

CSS 实现加载动画之五-光盘旋转

原文:CSS 实现加载动画之五-光盘旋转 今天做的这个动画叫光盘旋转,名字自己取的.动画的效果估计很多人都很熟悉,就是微信朋友圈里的加载动画.做过前面几个动画,发现其实都一个原理,就是如何将动画的元素如何分离出来.这个动画的实现也很简单,关键点在于如何将元素拼凑成风车形状.然后定义动画的关键帧为rotate 360度,应用于整个元素上,就可以使整个元素旋转起来.案例在请在chrome中查看.   1. 先看截图   2. 代码实现思路 2.1 首先还是定义四个元素,元素的中心为这四个元素组成的圆

纯语义化XHTML CSS设计表单方法

  很多CSS爱好者不喜欢HTML表格,尤其是在制作表单的时候,虽然现在已经是XHTML CSS的年代,但表单的设计大多还在采用table来布局.那么,有没有更好的使用纯语义化XHTML CSS设计表单方法呢?今天让我们一起来尝试这种更符合语义化的方法来代替Table嵌套的表单元素吧!  在这里要说,并不是要完全摒弃table的使用,它有它的语义化布局作用,尤其是在存储数据的时候.我在大多数情况下会使用纯CSS来设计表单,但是,我也很喜欢表格,只要我们能在正确的地方使用正确的元素就可以了,不要太

纯JS实现根据CSS的class选择DOM

 这篇文章主要介绍了纯JS实现根据CSS的class选择DOM,需要的朋友可以参考下 // 网上参考的,自己修改了一部分  // 代码如下,纯JS,要求浏览器支持 getElementsByClassName 方法   代码如下: <script type="text/javascript">  function getElementsByClassName(classname,node){  node = node || window.document;  if(node

CSS 实现加载动画之三-钢琴按键

原文:CSS 实现加载动画之三-钢琴按键 今天做的这个动画实现也是非常简单,简单数几行代码就可以搞定.给这个动画取了个优雅的名字--钢琴按键,也实在是想不出什么更形象的名字了.废话不多说,直接上图.   1. 先看gif图   2. 代码实现思路 2.1 定义五个方块的元素. 2.2 对方块元素使用动画,延时改变透明度.   3. 主要使用的技术 主要用到了animation动画 @-webkit-keyframes load{ 0%{opacity:1;} 100%{opacity:0;}}.

CSS 实现加载动画之二-圆环旋转

原文:CSS 实现加载动画之二-圆环旋转 上次简单的介绍了下如何用代码实现菊花旋转的加载动画,动画点击,这次继续我们的动画系列,实现另外一种加载动画,圆环旋转.与上次不同的是,菊花旋转是通过改变元素透明度来实现动画,这次因为考虑到元素叠加,加上元素本身带有背景色,如果改变透明度会影响效果,所以直接改变元素的背景颜色,加上适当的延时,就可以实现这种圆环的效果.动画实现的根本原理就是将每个需要变化的元素以及变化的过程分离出来. 所有的动画在chrome中调试,未考虑到兼容性以及性能问题,只是单纯的介