原生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中this关键字使用方法详解
Mar 08 Javascript
js 多浏览器分别判断代码
Apr 01 Javascript
Jquery实现的tab效果可以指定默认显示第几页
Oct 16 Javascript
一张Web前端的思维导图分享
Jul 03 Javascript
js实现的tab标签切换效果代码分享
Aug 25 Javascript
Javascript实现图片轮播效果(一)让图片跳动起来
Feb 17 Javascript
AngularJS入门教程之路由机制ngRoute实例分析
Dec 13 Javascript
解决给dom元素绑定click等事件无效问题的方法
Feb 17 Javascript
浅谈node中的exports与module.exports的关系
Aug 01 Javascript
详解vuex结合localstorage动态监听storage的变化
May 03 Javascript
Vue单页及多页应用全局配置404页面实践记录
May 22 Javascript
js正则取值的结果数组调试方法
Oct 10 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
Thinkphp搜索时首页分页和搜索页保持条件分页的方法
2014/12/05 PHP
php遍历目录方法小结
2015/03/10 PHP
一张表搞清楚php is_null、empty、isset的区别
2015/07/07 PHP
PHP 访问数据库配置通用方法(json)
2018/05/20 PHP
用js判断用户浏览器是否是XP SP2的IE6
2007/03/08 Javascript
jQuery图片的展开和收缩实现代码
2013/04/16 Javascript
javascript中定义私有方法说明(private method)
2014/01/27 Javascript
如何判断微信内置浏览器(通过User Agent实现)
2014/09/01 Javascript
教你如何使用node.js制作代理服务器
2014/11/26 Javascript
javascript arguments使用示例
2014/12/16 Javascript
jQuery 1.9.1源码分析系列(十)事件系统之主动触发事件和模拟冒泡处理
2015/11/24 Javascript
网页前端登录js按Enter回车键实现登陆的两种方法
2016/05/10 Javascript
JS简单实现点击复制链接的方法
2016/08/03 Javascript
遍历json 对象的属性并且动态添加属性的实现
2016/12/02 Javascript
vue裁切预览组件功能的实现步骤
2018/05/04 Javascript
移动端底部导航固定配合vue-router实现组件切换功能
2019/06/13 Javascript
JS将时间秒转换成天小时分钟秒的字符串
2019/07/10 Javascript
vue+echarts+datav大屏数据展示及实现中国地图省市县下钻功能
2020/11/16 Javascript
[01:02]DOTA2辉夜杯决赛日 CDEC.Y对阵VG赛前花絮
2015/12/27 DOTA
Python兔子毒药问题实例分析
2015/03/05 Python
python Socket之客户端和服务端握手详解
2017/09/18 Python
Pytorch: 自定义网络层实例
2020/01/07 Python
python下载卫星云图合成gif的方法示例
2020/02/18 Python
CSS实现雨滴动画效果的实例代码
2019/10/08 HTML / CSS
Java Servlet API中forward() 与redirect()的区别
2014/04/20 面试题
优秀的教师个人的中文求职信
2013/09/21 职场文书
小学生获奖感言范文
2014/02/02 职场文书
演讲稿祖国在我心中
2014/05/04 职场文书
知识就是力量演讲稿
2014/09/13 职场文书
党员教师个人对照检查材料(群众路线)
2014/09/26 职场文书
初中生散播谣言检讨书
2014/11/17 职场文书
2014年学校体育工作总结
2014/12/08 职场文书
文员岗位职责
2015/02/04 职场文书
学前班教学反思
2016/02/24 职场文书
聊聊pytorch测试的时候为何要加上model.eval()
2021/05/23 Python
MySQL 原理优化之Group By的优化技巧
2022/08/14 MySQL