纯 CSS 方式实现 CSS 动画的暂停与播放!
开本系列,谈谈一些有趣的 CSS
题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节。
解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉到生僻的 CSS 属性,赶紧去补习一下吧。
不断更新,不断更新,不断更新,重要的事情说三遍。
谈谈一些有趣的CSS题目(二)-- 从条纹边框的实现谈盒子模型
谈谈一些有趣的CSS题目(三)-- 层叠顺序与堆栈上下文知多少
谈谈一些有趣的CSS题目(四)-- 从倒影说起,谈谈 CSS 继承 inherit
谈谈一些有趣的CSS题目(五)-- 单行居中,两行居左,超过两行省略
谈谈一些有趣的CSS题目(六)-- 全兼容的多列均匀布局问题
谈谈一些有趣的CSS题目(八)-- 纯CSS的导航栏Tab切换方案
谈谈一些有趣的CSS题目(九)-- 巧妙的实现 CSS 斜线
谈谈一些有趣的CSS题目(十一)-- reset.css知多少
谈谈一些有趣的CSS题目(十二)-- 深入探讨 CSS 特性检测 @supports 与 Modernizr
谈谈一些有趣的CSS题目(十三)-- 巧妙地制作背景色渐变动画!
所有题目汇总在我的 Github 。
正文从这里开始。
使用纯 CSS 的方法,能否暂停、播放 CSS 动画?看起来不可能,至少很麻烦。
我们知道,在 CSS3 animation 中,有这样一个属性可以暂停、播放动画:
1
2
3
|
{ animation-play-state: paused | running; } |
animation-play-state: 属性定义一个动画是否运行或者暂停。可以通过查询它来确定动画是否正在运行。另外,它的值可以被设置为暂停和恢复的动画的重放。
如果借助 Javascript,我们可以实现控制 CSS 动画的运行和播放,下面列出部分关键代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
< div class="btn">stop</ div > < div class="animation"></ div > < style > .animation { animation: move 2s linear infinite alternate; } @keyframes move { 0% { transform: translate(-100px, 0); } 100% { transform: translate(100px, 0); } } </ style > |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
document.querySelector( '.btn' ).addEventListener( 'click' , function () { let btn = document.querySelector( '.btn' ); let elem = document.querySelector( '.animation' ); let state = elem.style[ 'animationPlayState' ]; if (state === 'paused' ) { elem.style[ 'animationPlayState' ] = 'running' ; btn.innerText = 'stop' ; } else { elem.style[ 'animationPlayState' ] = 'paused' ; btn.innerText = 'play' ; } }); |
纯 CSS 实现
下面我们探讨下,使用纯 CSS 的方式能否实现。
hover 伪类实现
使用 hover 伪类,在鼠标悬停在按钮上面时,控制动画样式的暂停。
关键代码如下:
1
2
3
4
5
6
7
8
|
< div class="btn stop">stop</ div > < div class="animation"></ div > < style > .stop:hover ~ .animation { animation-play-state: paused; } </ style > |
Demo -- 纯 CSS 方式实现 CSS 动画的暂停与播放 (Hover):
当然,这个方法不够智能,如果释放鼠标的自由,点击一下暂停、再点击一下播放就好了。还有其他方法吗?
checked 伪类实现
之前的文章《谈谈一些有趣的CSS题目(八)-- 纯CSS的导航栏Tab切换方案》也谈过,使用 radio
标签的 checked
伪类,加上 <label for>
实现纯 CSS 捕获点击事情。
并且利用被点击的元素可以控制一些 CSS 样式。实现如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
< input id="stop" type="radio" name="playAnimation" /> < input id="play" type="radio" name="playAnimation" /> < div class="box"> < label for="stop"> < div class="btn">stop</ div > </ label > < label for="play"> < div class="btn">play</ div > </ label > </ div > < div class="animation"></ div > |
部分关键 CSS 代码:
1
2
3
4
5
6
7
8
9
10
11
|
.animation { animation: move 2 s linear infinite alternate; } # stop :checked ~ .animation { animation-play-state: paused; } #play:checked ~ .animation { animation-play-state: running; } |
我们希望当 #stop
和 #play
两个 radio 被击时,给 .animation
元素分别赋予 animation-play-state: paused
或是 animation-play-state: running
。
DEMO -- 纯 CSS 方式实现 CSS 动画的暂停与播放:
上面的示例 Demo 中,实现了纯 CSS 方式实现 CSS 动画的暂停与播放。
当然,还有一些其他方法,例如 radio 替换成 checkbox ,或者使用 :target
伪类选择器也能实现上面同样的效果,感兴趣的可以尝试一下。
到此本文结束,如果还有什么疑问或者建议,可以多多交流,原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知。