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

LarryMDKJ 2年前
   <p style="text-align:center"><img src="https://simg.open-open.com/show/43caec9e298cf0a9968e8a34c9fe2c54.jpg"></p>    <p>使用纯 CSS 的方法,能否暂停、播放 CSS 动画?看起来不可能,至少很麻烦。</p>    <p>我们知道,在 CSS3 animation 中,有这样一个属性可以暂停、播放动画:</p>    <pre>  <code class="language-css">{          animation-play-state: paused | running;      }   </code></pre>    <p>animation-play-state: 属性定义一个动画是否运行或者暂停。可以通过查询它来确定动画是否正在运行。另外,它的值可以被设置为暂停和恢复的动画的重放。</p>    <p>如果借助 Javascript,我们可以实现控制 CSS 动画的运行和播放,下面列出部分关键代码:</p>    <pre>  <code class="language-css"><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>   </code></pre>    <pre>  <code class="language-css">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';          }                });   </code></pre>    <p>Demo — pause CSS Animation(https://codepen.io/Chokcoco/pen/GWYBdM)</p>    <p>纯 CSS 实现</p>    <p>下面我们探讨下,使用纯 CSS 的方式能否实现。</p>    <p>hover 伪类实现</p>    <p>使用 hover 伪类,在鼠标悬停在按钮上面时,控制动画样式的暂停。</p>    <p>关键代码如下:</p>    <pre>  <code class="language-css"><div class="btn stop">stop</div>      <div class="animation"></div>      <style>      .stop:hover ~ .animation {          animation-play-state: paused;      }      </style>   </code></pre>    <p>Demo — 纯 CSS 方式实现 CSS 动画的暂停与播放 (Hover):(https://codepen.io/Chokcoco/pen/PpxKBX)</p>    <p>当然,这个方法不够智能,如果释放鼠标的自由,点击一下暂停、再点击一下播放就好了。还有其他方法吗?</p>    <p>checked 伪类实现</p>    <p>之前的文章《有趣的 CSS 题目(8):纯CSS的导航栏Tab切换方案》也谈过,使用 radio 标签的 checked 伪类,加上 实现纯 CSS 捕获点击事情。</p>    <p>并且利用被点击的元素可以控制一些 CSS 样式。实现如下:</p>    <pre>  <code class="language-css"><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>   </code></pre>    <p>部分关键 CSS 代码:</p>    <pre>  <code class="language-css">.animation {          animation: move 2s linear infinite alternate;      }             #stop:checked ~ .animation {          animation-play-state: paused;      }             #play:checked ~ .animation {          animation-play-state: running;      }   </code></pre>    <p>我们希望当 #stop 和 #play 两个 radio 被点击时,给 .animation 元素分别赋予 animation-play-state: paused 或是 animation-play-state: running 。而且二者只能生效其一,所以需要给两个 radio 标签赋予相同的 name 属性。</p>    <p>DEMO — 纯 CSS 方式实现 CSS 动画的暂停与播放:(https://codepen.io/Chokcoco/pen/QpJwBW)</p>    <p>上面的示例 Demo 中,实现了纯 CSS 方式实现 CSS 动画的暂停与播放。</p>    <p>当然,还有一些其他方法,例如 radio 替换成 checkbox ,或者使用 :target 伪类选择器也能实现上面同样的效果,感兴趣的可以尝试一下。</p>    <p>到此本文结束,如果还有什么疑问或者建议,可以多多交流,原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知。</p>    <p>开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节。</p>    <p>解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉到生僻的 CSS 属性,赶紧去补习一下吧。</p>    <p>不断更新,不断更新,不断更新,重要的事情说三遍。</p>    <p> </p>    <p>来自:http://developer.51cto.com/art/201704/538257.htm</p>    <p> </p>