原生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 伪数组实现方法
Oct 11 Javascript
浅谈轻量级js模板引擎simplite
Feb 13 Javascript
js实现文字跟随鼠标移动而移动的方法
Feb 28 Javascript
JS实现获取键盘按下的按键并显示在页面上的方法
Nov 04 Javascript
如何用angularjs制作一个完整的表格
Jan 21 Javascript
AngularJS基础 ng-keypress 指令简单示例
Aug 02 Javascript
微信小程序实现图片自适应(支持多图)
Jan 25 Javascript
详解在vue-cli项目中安装node-sass
Jun 21 Javascript
IScroll5实现下拉刷新上拉加载的功能实例
Aug 11 Javascript
vue中如何创建多个ueditor实例教程
Nov 14 Javascript
详解Angular6 热加载配置方案
Aug 18 Javascript
vue实现下拉菜单树
Oct 22 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
用libtemplate实现静态网页生成
2006/10/09 PHP
php部分常见问题总结
2008/03/27 PHP
PHP中的cookie不用刷新就生效的方法
2012/02/04 PHP
深入PHP数据缓存的使用说明
2013/05/10 PHP
[原创]php实现 data url的图片生成与保存
2016/12/04 PHP
php+Memcached实现简单留言板功能示例
2017/02/15 PHP
Laravel 实现在Blade模版中使用全局变量代替路径的例子
2019/10/22 PHP
imgAreaSelect 中文文档帮助说明
2011/10/08 Javascript
js判断60秒以及倒计时示例代码
2014/01/24 Javascript
javascript将url中的参数加密解密代码
2014/11/17 Javascript
Backbone.js中的集合详解
2015/01/14 Javascript
jQuery源码解读之hasClass()方法分析
2015/02/20 Javascript
JS实现跟随鼠标立体翻转图片的方法
2015/05/04 Javascript
浅析js中substring和substr的方法
2015/11/09 Javascript
详解JavaScript基于面向对象之创建对象(1)
2015/12/10 Javascript
vue-router:嵌套路由的使用方法
2017/02/21 Javascript
mui上拉加载更多下拉刷新数据的封装过程
2017/11/03 Javascript
vue项目总结之文件夹结构配置详解
2017/12/13 Javascript
Python socket C/S结构的聊天室应用实现
2014/11/30 Python
Python自动化构建工具scons使用入门笔记
2015/03/10 Python
python 处理dataframe中的时间字段方法
2018/04/10 Python
python抓取网页内容并进行语音播报的方法
2018/12/24 Python
python使用Plotly绘图工具绘制散点图、线形图
2019/04/02 Python
Python AutoCAD 系统设置的实现方法
2020/04/01 Python
Python 通过爬虫实现GitHub网页的模拟登录的示例代码
2020/08/17 Python
python+selenium 简易地疫情信息自动打卡签到功能的实现代码
2020/08/22 Python
Django如何继承AbstractUser扩展字段
2020/11/27 Python
前端隐藏出边界内容的实现方法
2016/04/14 HTML / CSS
全球游戏Keys和卡片市场:GamesDeal
2018/03/28 全球购物
美国婴儿和儿童服装购物网站:PatPat
2020/10/01 全球购物
制冷与电控专业应届生求职信
2013/11/11 职场文书
自我鉴定书面格式
2014/01/13 职场文书
教师远程培训感言
2014/03/06 职场文书
可口可乐广告词
2014/03/20 职场文书
python 爬取京东指定商品评论并进行情感分析
2021/05/27 Python
mysql创建存储过程及函数详解
2021/12/04 MySQL