原生JS检测CSS3动画是否结束的方法详解


Posted in Javascript onJanuary 27, 2019

本文实例讲述了原生JS检测CSS3动画是否结束的方法。分享给大家供大家参考,具体如下:

不知道大家在做网页的时候有没有碰到这种情况:当你使用CSS3的动画属性时,想要在动画结束后添加一系列操作,但往往这些操作可能会发生在与动画同时出现或者是在动画还没结束时就发生了。

针对这种情况我们会使用js来监听动画是否结束即它的style的transition属性是否为transitionend;下面我们通过一个简单的例子来理解一下我这句话的含义:

代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>通过原生js检测CSS3的动画结束</title>
  <style>
  *{padding: 0;margin: 0;}
  .test{
    width: 200px;
    height: 200px;
    border: 1px soli black;
    background: red;
    transition-property:width;
    transition-duration: 3s;
  }
  /* 动画 */
  .test.move{
    width:600px;
  }
  button{
    width: 80px;
    height: 25px;
    font-size: 16px;
    text-align: center;
    line-height: 25px;
  }
  </style>
</head>
<body>
  <div class="test" id="main">
  </div>
  <button id="play">开始运动</button>
</body>
<script>
  // 示例动画主要是改变div的宽度
  // 主要是通过检测transition的值是否为transitionend
  function init() {
    var main = document.getElementById('main');
    var play = document.getElementById('play');
    var test = document.getElementsByClassName('test')[0];
    // 兼容性写法
    transitions = {
      // 兼容IE
      'transition': 'transitionend',
      // 兼容Opera
      'OTransition': 'oTransitionEnd',
      // 兼容Firefox
      'MozTransition': 'transitionend',
      // 兼容Google
      'WebkitTransition': 'webkitTransitionEnd'
    };
    function getTransitions() {
      var t;
      for (t in transitions) {
        // t即transition,OTransition,MozTransition,WebkitTransition
        if (main.style[t] !== undefined) {
          return transitions[t];
        }
      }
    }
    // 按钮添加click事件
    play.onclick = function () {
      main.classList.add('move');
    };
    // 接收返回的当前浏览器的transition的值
    var setTransitions = getTransitions();
    // 添加监听事件
    setTransitions && main.addEventListener(setTransitions,function (params) {
      alert('动画结束');
      // 删除类名move
      main.classList.remove('move');
    },false)
  }
  init();
</script>
</html>

效果如下:

原生JS检测CSS3动画是否结束的方法详解

可以看到当动画结束时才弹出弹框可以验证方法的可行性。

最后提一下,这个方法仍存在一些问题,比如你改变两个属性:宽度和高度,可能就会触发这个方法两次或者多次,所以使用的时候要注意一下。

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试一下运行效果。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
用javascript将数据库中的TEXT类型数据动态赋值到TEXTAREA中
Apr 20 Javascript
js字符编码函数区别分析
Jun 05 Javascript
js 效率组装字符串 StringBuffer
Dec 23 Javascript
jQuery创建自己的插件(自定义插件)的方法
Jun 10 Javascript
jQuery链式操作如何实现以及为什么要用链式操作
Jan 17 Javascript
js实现分享到随页面滚动而滑动效果的方法
Apr 10 Javascript
基于Turn.js 实现翻书效果实例解析
Jun 20 Javascript
js removeChild 方法深入理解
Aug 16 Javascript
jQuery+CSS3实现四种应用广泛的导航条制作实例详解
Sep 17 Javascript
webpack-mvc 传统多页面组件化开发详解
May 07 Javascript
微信小程序如何调用新闻接口实现列表循环
Jul 02 Javascript
vuejs实现下拉框菜单选择
Oct 23 Javascript
原生JS实现的跳一跳小游戏完整实例
Jan 27 #Javascript
nuxt中使用路由守卫的方法步骤
Jan 27 #Javascript
vue-cli构建vue项目的步骤详解
Jan 27 #Javascript
vue实现的仿淘宝购物车功能详解
Jan 27 #Javascript
详解vue路由篇(动态路由、路由嵌套)
Jan 27 #Javascript
实例讲解JS中pop使用方法
Jan 27 #Javascript
Vue.js实现的购物车功能详解
Jan 27 #Javascript
You might like
PHP安全技术之 实现php基本安全
2010/09/04 PHP
phpstorm配置Xdebug进行调试PHP教程
2014/12/01 PHP
php使用GD2绘制几何图形示例
2017/02/15 PHP
一个JavaScript用逗号分割字符串实例
2014/09/22 Javascript
Node.js实现的简易网页抓取功能示例
2014/12/05 Javascript
jQuery实现按键盘方向键翻页特效
2015/03/18 Javascript
js实现人才网站职位选择功能的方法
2015/08/14 Javascript
JavaScript实现Base64编码转换
2016/04/23 Javascript
nodejs加密Crypto的实例代码
2016/07/07 NodeJs
微信小程序 绘图之饼图实现
2016/10/24 Javascript
Canvas 绘制粒子动画背景
2017/02/15 Javascript
vue构建单页面应用实战
2017/04/10 Javascript
angular-cli修改端口号【angular2】
2017/04/19 Javascript
JS实现网页抢购功能(触发,终止脚本)
2017/11/27 Javascript
Javascript实现单选框效果
2020/12/09 Javascript
使用python Django做网页
2013/11/04 Python
状态机的概念和在Python下使用状态机的教程
2015/04/11 Python
Python安装Numpy和matplotlib的方法(推荐)
2017/11/02 Python
破解安装Pycharm的方法
2018/10/19 Python
python numpy 反转 reverse示例
2019/12/04 Python
python读取与处理netcdf数据方式
2020/02/14 Python
基于python检查SSL证书到期情况代码实例
2020/04/04 Python
在python中使用nohup命令说明
2020/04/16 Python
python怎么自定义捕获错误
2020/06/29 Python
C#中有没有运算符重载?能否使用指针?
2014/05/05 面试题
linux面试题参考答案(11)
2012/05/01 面试题
出口公司经理求职简历中的自我评价
2013/10/13 职场文书
党员公开承诺书范文
2014/03/25 职场文书
会计系毕业求职信
2014/08/07 职场文书
小学安全汇报材料
2014/08/14 职场文书
学校四风问题对照检查材料思想汇报
2014/09/26 职场文书
给病人的慰问信
2015/03/23 职场文书
2016年党员学习廉政准则心得体会
2016/01/20 职场文书
《假如》教学反思
2016/02/17 职场文书
nginx proxy_cache 缓存配置详解
2021/03/31 Servers
Python中np.random.randint()参数详解及用法实例
2022/09/23 Python